@milkio/vite-plugin-milkio 1.0.0-beta.21 → 1.0.0-beta.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +1 -1
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -9783,4 +9783,4 @@ export {
9783
9783
  };
9784
9784
 
9785
9785
  //# debugId=04356C7655B5200764756E2164756E21
9786
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxAaWFybmFcXHRvbWxcXGxpYlxccGFyc2VyLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcQGlhcm5hXFx0b21sXFxsaWJcXGNyZWF0ZS1kYXRldGltZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXEBpYXJuYVxcdG9tbFxcbGliXFxmb3JtYXQtbnVtLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcQGlhcm5hXFx0b21sXFxsaWJcXGNyZWF0ZS1kYXRldGltZS1mbG9hdC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXEBpYXJuYVxcdG9tbFxcbGliXFxjcmVhdGUtZGF0ZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXEBpYXJuYVxcdG9tbFxcbGliXFxjcmVhdGUtdGltZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXEBpYXJuYVxcdG9tbFxcbGliXFx0b21sLXBhcnNlci5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXEBpYXJuYVxcdG9tbFxccGFyc2UtcHJldHR5LWVycm9yLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcQGlhcm5hXFx0b21sXFxwYXJzZS1zdHJpbmcuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxAaWFybmFcXHRvbWxcXHBhcnNlLWFzeW5jLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcQGlhcm5hXFx0b21sXFxwYXJzZS1zdHJlYW0uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxAaWFybmFcXHRvbWxcXHBhcnNlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcQGlhcm5hXFx0b21sXFxzdHJpbmdpZnkuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxAaWFybmFcXHRvbWxcXHRvbWwuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxiYWxhbmNlZC1tYXRjaFxcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxicmFjZS1leHBhbnNpb25cXGluZGV4LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcdW5pdmVyc2FsaWZ5XFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGdyYWNlZnVsLWZzXFxwb2x5ZmlsbHMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxncmFjZWZ1bC1mc1xcbGVnYWN5LXN0cmVhbXMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxncmFjZWZ1bC1mc1xcY2xvbmUuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxncmFjZWZ1bC1mc1xcZ3JhY2VmdWwtZnMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxmc1xcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxta2RpcnNcXHV0aWxzLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcbWtkaXJzXFxtYWtlLWRpci5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXG1rZGlyc1xcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxwYXRoLWV4aXN0c1xcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFx1dGlsXFx1dGltZXMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFx1dGlsXFxzdGF0LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcY29weVxcY29weS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGNvcHlcXGNvcHktc3luYy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGNvcHlcXGluZGV4LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxccmVtb3ZlXFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGVtcHR5XFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGVuc3VyZVxcZmlsZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGVuc3VyZVxcbGluay5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGVuc3VyZVxcc3ltbGluay1wYXRocy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGVuc3VyZVxcc3ltbGluay10eXBlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcZW5zdXJlXFxzeW1saW5rLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcZW5zdXJlXFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGpzb25maWxlXFx1dGlscy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGpzb25maWxlXFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGpzb25cXGpzb25maWxlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcb3V0cHV0LWZpbGVcXGluZGV4LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcanNvblxcb3V0cHV0LWpzb24uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxqc29uXFxvdXRwdXQtanNvbi1zeW5jLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcanNvblxcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxtb3ZlXFxtb3ZlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcbW92ZVxcbW92ZS1zeW5jLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcbW92ZVxcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxpbmRleC5qcyIsICIuLlxcaW5kZXgudHMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxtaW5pbWF0Y2hcXGRpc3RcXGVzbVxcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxtaW5pbWF0Y2hcXGRpc3RcXGVzbVxcYXNzZXJ0LXZhbGlkLXBhdHRlcm4uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxtaW5pbWF0Y2hcXGRpc3RcXGVzbVxcYnJhY2UtZXhwcmVzc2lvbnMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxtaW5pbWF0Y2hcXGRpc3RcXGVzbVxcdW5lc2NhcGUuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxtaW5pbWF0Y2hcXGRpc3RcXGVzbVxcYXN0LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcbWluaW1hdGNoXFxkaXN0XFxlc21cXGVzY2FwZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGdsb2JcXGRpc3RcXGVzbVxcZ2xvYi5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGxydS1jYWNoZVxcZGlzdFxcZXNtXFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXHBhdGgtc2N1cnJ5XFxkaXN0XFxlc21cXGluZGV4LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcbWluaXBhc3NcXGRpc3RcXGVzbVxcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxnbG9iXFxkaXN0XFxlc21cXHBhdHRlcm4uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxnbG9iXFxkaXN0XFxlc21cXGlnbm9yZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGdsb2JcXGRpc3RcXGVzbVxccHJvY2Vzc29yLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZ2xvYlxcZGlzdFxcZXNtXFx3YWxrZXIuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxnbG9iXFxkaXN0XFxlc21cXGhhcy1tYWdpYy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGdsb2JcXGRpc3RcXGVzbVxcaW5kZXguanMiLCAiLi5cXGFkYXB0ZXJzXFxlZGdlLW9uZS50cyIsICIuLlxcYWRhcHRlcnNcXGluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIid1c2Ugc3RyaWN0J1xuY29uc3QgUGFyc2VyRU5EID0gMHgxMTAwMDBcbmNsYXNzIFBhcnNlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdHJ1Y3RvciAobXNnLCBmaWxlbmFtZSwgbGluZW51bWJlcikge1xuICAgIHN1cGVyKCdbUGFyc2VyRXJyb3JdICcgKyBtc2csIGZpbGVuYW1lLCBsaW5lbnVtYmVyKVxuICAgIHRoaXMubmFtZSA9ICdQYXJzZXJFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnUGFyc2VyRXJyb3InXG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBQYXJzZXJFcnJvcilcbiAgfVxufVxuY2xhc3MgU3RhdGUge1xuICBjb25zdHJ1Y3RvciAocGFyc2VyKSB7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXJcbiAgICB0aGlzLmJ1ZiA9ICcnXG4gICAgdGhpcy5yZXR1cm5lZCA9IG51bGxcbiAgICB0aGlzLnJlc3VsdCA9IG51bGxcbiAgICB0aGlzLnJlc3VsdFRhYmxlID0gbnVsbFxuICAgIHRoaXMucmVzdWx0QXJyID0gbnVsbFxuICB9XG59XG5jbGFzcyBQYXJzZXIge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5wb3MgPSAwXG4gICAgdGhpcy5jb2wgPSAwXG4gICAgdGhpcy5saW5lID0gMFxuICAgIHRoaXMub2JqID0ge31cbiAgICB0aGlzLmN0eCA9IHRoaXMub2JqXG4gICAgdGhpcy5zdGFjayA9IFtdXG4gICAgdGhpcy5fYnVmID0gJydcbiAgICB0aGlzLmNoYXIgPSBudWxsXG4gICAgdGhpcy5paSA9IDBcbiAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKHRoaXMucGFyc2VTdGFydClcbiAgfVxuXG4gIHBhcnNlIChzdHIpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChzdHIubGVuZ3RoID09PSAwIHx8IHN0ci5sZW5ndGggPT0gbnVsbCkgcmV0dXJuXG5cbiAgICB0aGlzLl9idWYgPSBTdHJpbmcoc3RyKVxuICAgIHRoaXMuaWkgPSAtMVxuICAgIHRoaXMuY2hhciA9IC0xXG4gICAgbGV0IGdldE5leHRcbiAgICB3aGlsZSAoZ2V0TmV4dCA9PT0gZmFsc2UgfHwgdGhpcy5uZXh0Q2hhcigpKSB7XG4gICAgICBnZXROZXh0ID0gdGhpcy5ydW5PbmUoKVxuICAgIH1cbiAgICB0aGlzLl9idWYgPSBudWxsXG4gIH1cbiAgbmV4dENoYXIgKCkge1xuICAgIGlmICh0aGlzLmNoYXIgPT09IDB4MEEpIHtcbiAgICAgICsrdGhpcy5saW5lXG4gICAgICB0aGlzLmNvbCA9IC0xXG4gICAgfVxuICAgICsrdGhpcy5paVxuICAgIHRoaXMuY2hhciA9IHRoaXMuX2J1Zi5jb2RlUG9pbnRBdCh0aGlzLmlpKVxuICAgICsrdGhpcy5wb3NcbiAgICArK3RoaXMuY29sXG4gICAgcmV0dXJuIHRoaXMuaGF2ZUJ1ZmZlcigpXG4gIH1cbiAgaGF2ZUJ1ZmZlciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWkgPCB0aGlzLl9idWYubGVuZ3RoXG4gIH1cbiAgcnVuT25lICgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5wYXJzZXIuY2FsbCh0aGlzLCB0aGlzLnN0YXRlLnJldHVybmVkKVxuICB9XG4gIGZpbmlzaCAoKSB7XG4gICAgdGhpcy5jaGFyID0gUGFyc2VyRU5EXG4gICAgbGV0IGxhc3RcbiAgICBkbyB7XG4gICAgICBsYXN0ID0gdGhpcy5zdGF0ZS5wYXJzZXJcbiAgICAgIHRoaXMucnVuT25lKClcbiAgICB9IHdoaWxlICh0aGlzLnN0YXRlLnBhcnNlciAhPT0gbGFzdClcblxuICAgIHRoaXMuY3R4ID0gbnVsbFxuICAgIHRoaXMuc3RhdGUgPSBudWxsXG4gICAgdGhpcy5fYnVmID0gbnVsbFxuXG4gICAgcmV0dXJuIHRoaXMub2JqXG4gIH1cbiAgbmV4dCAoZm4pIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBQYXJzZXJFcnJvcignVHJpZWQgdG8gc2V0IHN0YXRlIHRvIG5vbi1leGlzdGVudCBzdGF0ZTogJyArIEpTT04uc3RyaW5naWZ5KGZuKSlcbiAgICB0aGlzLnN0YXRlLnBhcnNlciA9IGZuXG4gIH1cbiAgZ290byAoZm4pIHtcbiAgICB0aGlzLm5leHQoZm4pXG4gICAgcmV0dXJuIHRoaXMucnVuT25lKClcbiAgfVxuICBjYWxsIChmbiwgcmV0dXJuV2l0aCkge1xuICAgIGlmIChyZXR1cm5XaXRoKSB0aGlzLm5leHQocmV0dXJuV2l0aClcbiAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5zdGF0ZSlcbiAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKGZuKVxuICB9XG4gIGNhbGxOb3cgKGZuLCByZXR1cm5XaXRoKSB7XG4gICAgdGhpcy5jYWxsKGZuLCByZXR1cm5XaXRoKVxuICAgIHJldHVybiB0aGlzLnJ1bk9uZSgpXG4gIH1cbiAgcmV0dXJuICh2YWx1ZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID09PSAwKSB0aHJvdyB0aGlzLmVycm9yKG5ldyBQYXJzZXJFcnJvcignU3RhY2sgdW5kZXJmbG93JykpXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHZhbHVlID0gdGhpcy5zdGF0ZS5idWZcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGFjay5wb3AoKVxuICAgIHRoaXMuc3RhdGUucmV0dXJuZWQgPSB2YWx1ZVxuICB9XG4gIHJldHVybk5vdyAodmFsdWUpIHtcbiAgICB0aGlzLnJldHVybih2YWx1ZSlcbiAgICByZXR1cm4gdGhpcy5ydW5PbmUoKVxuICB9XG4gIGNvbnN1bWUgKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuY2hhciA9PT0gUGFyc2VyRU5EKSB0aHJvdyB0aGlzLmVycm9yKG5ldyBQYXJzZXJFcnJvcignVW5leHBlY3RlZCBlbmQtb2YtYnVmZmVyJykpXG4gICAgdGhpcy5zdGF0ZS5idWYgKz0gdGhpcy5fYnVmW3RoaXMuaWldXG4gIH1cbiAgZXJyb3IgKGVycikge1xuICAgIGVyci5saW5lID0gdGhpcy5saW5lXG4gICAgZXJyLmNvbCA9IHRoaXMuY29sXG4gICAgZXJyLnBvcyA9IHRoaXMucG9zXG4gICAgcmV0dXJuIGVyclxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHBhcnNlU3RhcnQgKCkge1xuICAgIHRocm93IG5ldyBQYXJzZXJFcnJvcignTXVzdCBkZWNsYXJlIGEgcGFyc2VTdGFydCBtZXRob2QnKVxuICB9XG59XG5QYXJzZXIuRU5EID0gUGFyc2VyRU5EXG5QYXJzZXIuRXJyb3IgPSBQYXJzZXJFcnJvclxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5tb2R1bGUuZXhwb3J0cyA9IHZhbHVlID0+IHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzTmFOKGRhdGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBEYXRldGltZScpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRhdGVcbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcbm1vZHVsZS5leHBvcnRzID0gKGQsIG51bSkgPT4ge1xuICBudW0gPSBTdHJpbmcobnVtKVxuICB3aGlsZSAobnVtLmxlbmd0aCA8IGQpIG51bSA9ICcwJyArIG51bVxuICByZXR1cm4gbnVtXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuY29uc3QgZiA9IHJlcXVpcmUoJy4vZm9ybWF0LW51bS5qcycpXG5cbmNsYXNzIEZsb2F0aW5nRGF0ZVRpbWUgZXh0ZW5kcyBEYXRlIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgc3VwZXIodmFsdWUgKyAnWicpXG4gICAgdGhpcy5pc0Zsb2F0aW5nID0gdHJ1ZVxuICB9XG4gIHRvSVNPU3RyaW5nICgpIHtcbiAgICBjb25zdCBkYXRlID0gYCR7dGhpcy5nZXRVVENGdWxsWWVhcigpfS0ke2YoMiwgdGhpcy5nZXRVVENNb250aCgpICsgMSl9LSR7ZigyLCB0aGlzLmdldFVUQ0RhdGUoKSl9YFxuICAgIGNvbnN0IHRpbWUgPSBgJHtmKDIsIHRoaXMuZ2V0VVRDSG91cnMoKSl9OiR7ZigyLCB0aGlzLmdldFVUQ01pbnV0ZXMoKSl9OiR7ZigyLCB0aGlzLmdldFVUQ1NlY29uZHMoKSl9LiR7ZigzLCB0aGlzLmdldFVUQ01pbGxpc2Vjb25kcygpKX1gXG4gICAgcmV0dXJuIGAke2RhdGV9VCR7dGltZX1gXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2YWx1ZSA9PiB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRmxvYXRpbmdEYXRlVGltZSh2YWx1ZSlcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc05hTihkYXRlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgRGF0ZXRpbWUnKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBkYXRlXG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5jb25zdCBmID0gcmVxdWlyZSgnLi9mb3JtYXQtbnVtLmpzJylcbmNvbnN0IERhdGVUaW1lID0gZ2xvYmFsLkRhdGVcblxuY2xhc3MgRGF0ZSBleHRlbmRzIERhdGVUaW1lIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgc3VwZXIodmFsdWUpXG4gICAgdGhpcy5pc0RhdGUgPSB0cnVlXG4gIH1cbiAgdG9JU09TdHJpbmcgKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmdldFVUQ0Z1bGxZZWFyKCl9LSR7ZigyLCB0aGlzLmdldFVUQ01vbnRoKCkgKyAxKX0tJHtmKDIsIHRoaXMuZ2V0VVRDRGF0ZSgpKX1gXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2YWx1ZSA9PiB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc05hTihkYXRlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgRGF0ZXRpbWUnKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBkYXRlXG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5jb25zdCBmID0gcmVxdWlyZSgnLi9mb3JtYXQtbnVtLmpzJylcblxuY2xhc3MgVGltZSBleHRlbmRzIERhdGUge1xuICBjb25zdHJ1Y3RvciAodmFsdWUpIHtcbiAgICBzdXBlcihgMDAwMC0wMS0wMVQke3ZhbHVlfVpgKVxuICAgIHRoaXMuaXNUaW1lID0gdHJ1ZVxuICB9XG4gIHRvSVNPU3RyaW5nICgpIHtcbiAgICByZXR1cm4gYCR7ZigyLCB0aGlzLmdldFVUQ0hvdXJzKCkpfToke2YoMiwgdGhpcy5nZXRVVENNaW51dGVzKCkpfToke2YoMiwgdGhpcy5nZXRVVENTZWNvbmRzKCkpfS4ke2YoMywgdGhpcy5nZXRVVENNaWxsaXNlY29uZHMoKSl9YFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWUgPT4ge1xuICBjb25zdCBkYXRlID0gbmV3IFRpbWUodmFsdWUpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoaXNOYU4oZGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIERhdGV0aW1lJylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGF0ZVxuICB9XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmV3LXdyYXBwZXJzLCBuby1ldmFsLCBjYW1lbGNhc2UsIG9wZXJhdG9yLWxpbmVicmVhayAqL1xubW9kdWxlLmV4cG9ydHMgPSBtYWtlUGFyc2VyQ2xhc3MocmVxdWlyZSgnLi9wYXJzZXIuanMnKSlcbm1vZHVsZS5leHBvcnRzLm1ha2VQYXJzZXJDbGFzcyA9IG1ha2VQYXJzZXJDbGFzc1xuXG5jbGFzcyBUb21sRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtc2cpIHtcbiAgICBzdXBlcihtc2cpXG4gICAgdGhpcy5uYW1lID0gJ1RvbWxFcnJvcidcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgVG9tbEVycm9yKVxuICAgIHRoaXMuZnJvbVRPTUwgPSB0cnVlXG4gICAgdGhpcy53cmFwcGVkID0gbnVsbFxuICB9XG59XG5Ub21sRXJyb3Iud3JhcCA9IGVyciA9PiB7XG4gIGNvbnN0IHRlcnIgPSBuZXcgVG9tbEVycm9yKGVyci5tZXNzYWdlKVxuICB0ZXJyLmNvZGUgPSBlcnIuY29kZVxuICB0ZXJyLndyYXBwZWQgPSBlcnJcbiAgcmV0dXJuIHRlcnJcbn1cbm1vZHVsZS5leHBvcnRzLlRvbWxFcnJvciA9IFRvbWxFcnJvclxuXG5jb25zdCBjcmVhdGVEYXRlVGltZSA9IHJlcXVpcmUoJy4vY3JlYXRlLWRhdGV0aW1lLmpzJylcbmNvbnN0IGNyZWF0ZURhdGVUaW1lRmxvYXQgPSByZXF1aXJlKCcuL2NyZWF0ZS1kYXRldGltZS1mbG9hdC5qcycpXG5jb25zdCBjcmVhdGVEYXRlID0gcmVxdWlyZSgnLi9jcmVhdGUtZGF0ZS5qcycpXG5jb25zdCBjcmVhdGVUaW1lID0gcmVxdWlyZSgnLi9jcmVhdGUtdGltZS5qcycpXG5cbmNvbnN0IENUUkxfSSA9IDB4MDlcbmNvbnN0IENUUkxfSiA9IDB4MEFcbmNvbnN0IENUUkxfTSA9IDB4MERcbmNvbnN0IENUUkxfQ0hBUl9CT1VOREFSWSA9IDB4MUYgLy8gdGhlIGxhc3Qgbm9uLWNoYXJhY3RlciBpbiB0aGUgbGF0aW4xIHJlZ2lvbiBvZiB1bmljb2RlLCBleGNlcHQgREVMXG5jb25zdCBDSEFSX1NQID0gMHgyMFxuY29uc3QgQ0hBUl9RVU9UID0gMHgyMlxuY29uc3QgQ0hBUl9OVU0gPSAweDIzXG5jb25zdCBDSEFSX0FQT1MgPSAweDI3XG5jb25zdCBDSEFSX1BMVVMgPSAweDJCXG5jb25zdCBDSEFSX0NPTU1BID0gMHgyQ1xuY29uc3QgQ0hBUl9IWVBIRU4gPSAweDJEXG5jb25zdCBDSEFSX1BFUklPRCA9IDB4MkVcbmNvbnN0IENIQVJfMCA9IDB4MzBcbmNvbnN0IENIQVJfMSA9IDB4MzFcbmNvbnN0IENIQVJfNyA9IDB4MzdcbmNvbnN0IENIQVJfOSA9IDB4MzlcbmNvbnN0IENIQVJfQ09MT04gPSAweDNBXG5jb25zdCBDSEFSX0VRVUFMUyA9IDB4M0RcbmNvbnN0IENIQVJfQSA9IDB4NDFcbmNvbnN0IENIQVJfRSA9IDB4NDVcbmNvbnN0IENIQVJfRiA9IDB4NDZcbmNvbnN0IENIQVJfVCA9IDB4NTRcbmNvbnN0IENIQVJfVSA9IDB4NTVcbmNvbnN0IENIQVJfWiA9IDB4NUFcbmNvbnN0IENIQVJfTE9XQkFSID0gMHg1RlxuY29uc3QgQ0hBUl9hID0gMHg2MVxuY29uc3QgQ0hBUl9iID0gMHg2MlxuY29uc3QgQ0hBUl9lID0gMHg2NVxuY29uc3QgQ0hBUl9mID0gMHg2NlxuY29uc3QgQ0hBUl9pID0gMHg2OVxuY29uc3QgQ0hBUl9sID0gMHg2Q1xuY29uc3QgQ0hBUl9uID0gMHg2RVxuY29uc3QgQ0hBUl9vID0gMHg2RlxuY29uc3QgQ0hBUl9yID0gMHg3MlxuY29uc3QgQ0hBUl9zID0gMHg3M1xuY29uc3QgQ0hBUl90ID0gMHg3NFxuY29uc3QgQ0hBUl91ID0gMHg3NVxuY29uc3QgQ0hBUl94ID0gMHg3OFxuY29uc3QgQ0hBUl96ID0gMHg3QVxuY29uc3QgQ0hBUl9MQ1VCID0gMHg3QlxuY29uc3QgQ0hBUl9SQ1VCID0gMHg3RFxuY29uc3QgQ0hBUl9MU1FCID0gMHg1QlxuY29uc3QgQ0hBUl9CU09MID0gMHg1Q1xuY29uc3QgQ0hBUl9SU1FCID0gMHg1RFxuY29uc3QgQ0hBUl9ERUwgPSAweDdGXG5jb25zdCBTVVJST0dBVEVfRklSU1QgPSAweEQ4MDBcbmNvbnN0IFNVUlJPR0FURV9MQVNUID0gMHhERkZGXG5cbmNvbnN0IGVzY2FwZXMgPSB7XG4gIFtDSEFSX2JdOiAnXFx1MDAwOCcsXG4gIFtDSEFSX3RdOiAnXFx1MDAwOScsXG4gIFtDSEFSX25dOiAnXFx1MDAwQScsXG4gIFtDSEFSX2ZdOiAnXFx1MDAwQycsXG4gIFtDSEFSX3JdOiAnXFx1MDAwRCcsXG4gIFtDSEFSX1FVT1RdOiAnXFx1MDAyMicsXG4gIFtDSEFSX0JTT0xdOiAnXFx1MDA1Qydcbn1cblxuZnVuY3Rpb24gaXNEaWdpdCAoY3ApIHtcbiAgcmV0dXJuIGNwID49IENIQVJfMCAmJiBjcCA8PSBDSEFSXzlcbn1cbmZ1bmN0aW9uIGlzSGV4aXQgKGNwKSB7XG4gIHJldHVybiAoY3AgPj0gQ0hBUl9BICYmIGNwIDw9IENIQVJfRikgfHwgKGNwID49IENIQVJfYSAmJiBjcCA8PSBDSEFSX2YpIHx8IChjcCA+PSBDSEFSXzAgJiYgY3AgPD0gQ0hBUl85KVxufVxuZnVuY3Rpb24gaXNCaXQgKGNwKSB7XG4gIHJldHVybiBjcCA9PT0gQ0hBUl8xIHx8IGNwID09PSBDSEFSXzBcbn1cbmZ1bmN0aW9uIGlzT2N0aXQgKGNwKSB7XG4gIHJldHVybiAoY3AgPj0gQ0hBUl8wICYmIGNwIDw9IENIQVJfNylcbn1cbmZ1bmN0aW9uIGlzQWxwaGFOdW1RdW90ZUh5cGhlbiAoY3ApIHtcbiAgcmV0dXJuIChjcCA+PSBDSEFSX0EgJiYgY3AgPD0gQ0hBUl9aKVxuICAgICAgfHwgKGNwID49IENIQVJfYSAmJiBjcCA8PSBDSEFSX3opXG4gICAgICB8fCAoY3AgPj0gQ0hBUl8wICYmIGNwIDw9IENIQVJfOSlcbiAgICAgIHx8IGNwID09PSBDSEFSX0FQT1NcbiAgICAgIHx8IGNwID09PSBDSEFSX1FVT1RcbiAgICAgIHx8IGNwID09PSBDSEFSX0xPV0JBUlxuICAgICAgfHwgY3AgPT09IENIQVJfSFlQSEVOXG59XG5mdW5jdGlvbiBpc0FscGhhTnVtSHlwaGVuIChjcCkge1xuICByZXR1cm4gKGNwID49IENIQVJfQSAmJiBjcCA8PSBDSEFSX1opXG4gICAgICB8fCAoY3AgPj0gQ0hBUl9hICYmIGNwIDw9IENIQVJfeilcbiAgICAgIHx8IChjcCA+PSBDSEFSXzAgJiYgY3AgPD0gQ0hBUl85KVxuICAgICAgfHwgY3AgPT09IENIQVJfTE9XQkFSXG4gICAgICB8fCBjcCA9PT0gQ0hBUl9IWVBIRU5cbn1cbmNvbnN0IF90eXBlID0gU3ltYm9sKCd0eXBlJylcbmNvbnN0IF9kZWNsYXJlZCA9IFN5bWJvbCgnZGVjbGFyZWQnKVxuXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbmNvbnN0IGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5XG5jb25zdCBkZXNjcmlwdG9yID0ge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWR9XG5cbmZ1bmN0aW9uIGhhc0tleSAob2JqLCBrZXkpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXR1cm4gdHJ1ZVxuICBpZiAoa2V5ID09PSAnX19wcm90b19fJykgZGVmaW5lUHJvcGVydHkob2JqLCAnX19wcm90b19fJywgZGVzY3JpcHRvcilcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IElOTElORV9UQUJMRSA9IFN5bWJvbCgnaW5saW5lLXRhYmxlJylcbmZ1bmN0aW9uIElubGluZVRhYmxlICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHt9LCB7XG4gICAgW190eXBlXToge3ZhbHVlOiBJTkxJTkVfVEFCTEV9XG4gIH0pXG59XG5mdW5jdGlvbiBpc0lubGluZVRhYmxlIChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIG9ialtfdHlwZV0gPT09IElOTElORV9UQUJMRVxufVxuXG5jb25zdCBUQUJMRSA9IFN5bWJvbCgndGFibGUnKVxuZnVuY3Rpb24gVGFibGUgKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoe30sIHtcbiAgICBbX3R5cGVdOiB7dmFsdWU6IFRBQkxFfSxcbiAgICBbX2RlY2xhcmVkXToge3ZhbHVlOiBmYWxzZSwgd3JpdGFibGU6IHRydWV9XG4gIH0pXG59XG5mdW5jdGlvbiBpc1RhYmxlIChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIG9ialtfdHlwZV0gPT09IFRBQkxFXG59XG5cbmNvbnN0IF9jb250ZW50VHlwZSA9IFN5bWJvbCgnY29udGVudC10eXBlJylcbmNvbnN0IElOTElORV9MSVNUID0gU3ltYm9sKCdpbmxpbmUtbGlzdCcpXG5mdW5jdGlvbiBJbmxpbmVMaXN0ICh0eXBlKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhbXSwge1xuICAgIFtfdHlwZV06IHt2YWx1ZTogSU5MSU5FX0xJU1R9LFxuICAgIFtfY29udGVudFR5cGVdOiB7dmFsdWU6IHR5cGV9XG4gIH0pXG59XG5mdW5jdGlvbiBpc0lubGluZUxpc3QgKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiAob2JqKSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZVxuICByZXR1cm4gb2JqW190eXBlXSA9PT0gSU5MSU5FX0xJU1Rcbn1cblxuY29uc3QgTElTVCA9IFN5bWJvbCgnbGlzdCcpXG5mdW5jdGlvbiBMaXN0ICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFtdLCB7XG4gICAgW190eXBlXToge3ZhbHVlOiBMSVNUfVxuICB9KVxufVxuZnVuY3Rpb24gaXNMaXN0IChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIG9ialtfdHlwZV0gPT09IExJU1Rcbn1cblxuLy8gaW4gYW4gZXZhbCwgdG8gbGV0IGJ1bmRsZXJzIG5vdCBzbHVycCBpbiBhIHV0aWwgcHJveHlcbmxldCBfY3VzdG9tXG50cnkge1xuICBjb25zdCB1dGlsSW5zcGVjdCA9IGV2YWwoXCJyZXF1aXJlKCd1dGlsJykuaW5zcGVjdFwiKVxuICBfY3VzdG9tID0gdXRpbEluc3BlY3QuY3VzdG9tXG59IGNhdGNoIChfKSB7XG4gIC8qIGV2YWwgcmVxdWlyZSBub3QgYXZhaWxhYmxlIGluIHRyYW5zcGlsZWQgYnVuZGxlICovXG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29uc3QgX2luc3BlY3QgPSBfY3VzdG9tIHx8ICdpbnNwZWN0J1xuXG5jbGFzcyBCb3hlZEJpZ0ludCB7XG4gIGNvbnN0cnVjdG9yICh2YWx1ZSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ2xvYmFsLkJpZ0ludC5hc0ludE4oNjQsIHZhbHVlKVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgX3R5cGUsIHt2YWx1ZTogSU5URUdFUn0pXG4gIH1cbiAgaXNOYU4gKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlID09PSBudWxsXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSlcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBbX2luc3BlY3RdICgpIHtcbiAgICByZXR1cm4gYFtCaWdJbnQ6ICR7dGhpcy50b1N0cmluZygpfV19YFxuICB9XG4gIHZhbHVlT2YgKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlXG4gIH1cbn1cblxuY29uc3QgSU5URUdFUiA9IFN5bWJvbCgnaW50ZWdlcicpXG5mdW5jdGlvbiBJbnRlZ2VyICh2YWx1ZSkge1xuICBsZXQgbnVtID0gTnVtYmVyKHZhbHVlKVxuICAvLyAtMCBpcyBhIGZsb2F0IHRoaW5nLCBub3QgYW4gaW50IHRoaW5nXG4gIGlmIChPYmplY3QuaXMobnVtLCAtMCkpIG51bSA9IDBcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGdsb2JhbC5CaWdJbnQgJiYgIU51bWJlci5pc1NhZmVJbnRlZ2VyKG51bSkpIHtcbiAgICByZXR1cm4gbmV3IEJveGVkQmlnSW50KHZhbHVlKVxuICB9IGVsc2Uge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG5ldyBOdW1iZXIobnVtKSwge1xuICAgICAgaXNOYU46IHt2YWx1ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gaXNOYU4odGhpcykgfX0sXG4gICAgICBbX3R5cGVdOiB7dmFsdWU6IElOVEVHRVJ9LFxuICAgICAgW19pbnNwZWN0XToge3ZhbHVlOiAoKSA9PiBgW0ludGVnZXI6ICR7dmFsdWV9XWB9XG4gICAgfSlcbiAgfVxufVxuZnVuY3Rpb24gaXNJbnRlZ2VyIChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIG9ialtfdHlwZV0gPT09IElOVEVHRVJcbn1cblxuY29uc3QgRkxPQVQgPSBTeW1ib2woJ2Zsb2F0JylcbmZ1bmN0aW9uIEZsb2F0ICh2YWx1ZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobmV3IE51bWJlcih2YWx1ZSksIHtcbiAgICBbX3R5cGVdOiB7dmFsdWU6IEZMT0FUfSxcbiAgICBbX2luc3BlY3RdOiB7dmFsdWU6ICgpID0+IGBbRmxvYXQ6ICR7dmFsdWV9XWB9XG4gIH0pXG59XG5mdW5jdGlvbiBpc0Zsb2F0IChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIG9ialtfdHlwZV0gPT09IEZMT0FUXG59XG5cbmZ1bmN0aW9uIHRvbWxUeXBlICh2YWx1ZSkge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlXG4gIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJ1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiAnZGF0ZXRpbWUnXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoX3R5cGUgaW4gdmFsdWUpIHtcbiAgICAgIHN3aXRjaCAodmFsdWVbX3R5cGVdKSB7XG4gICAgICAgIGNhc2UgSU5MSU5FX1RBQkxFOiByZXR1cm4gJ2lubGluZS10YWJsZSdcbiAgICAgICAgY2FzZSBJTkxJTkVfTElTVDogcmV0dXJuICdpbmxpbmUtbGlzdCdcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgY2FzZSBUQUJMRTogcmV0dXJuICd0YWJsZSdcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgY2FzZSBMSVNUOiByZXR1cm4gJ2xpc3QnXG4gICAgICAgIGNhc2UgRkxPQVQ6IHJldHVybiAnZmxvYXQnXG4gICAgICAgIGNhc2UgSU5URUdFUjogcmV0dXJuICdpbnRlZ2VyJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHlwZVxufVxuXG5mdW5jdGlvbiBtYWtlUGFyc2VyQ2xhc3MgKFBhcnNlcikge1xuICBjbGFzcyBUT01MUGFyc2VyIGV4dGVuZHMgUGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICBzdXBlcigpXG4gICAgICB0aGlzLmN0eCA9IHRoaXMub2JqID0gVGFibGUoKVxuICAgIH1cblxuICAgIC8qIE1BVENIIEhFTFBFUiAqL1xuICAgIGF0RW5kT2ZXb3JkICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYXIgPT09IENIQVJfTlVNIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9JIHx8IHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmF0RW5kT2ZMaW5lKClcbiAgICB9XG4gICAgYXRFbmRPZkxpbmUgKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2hhciA9PT0gUGFyc2VyLkVORCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSiB8fCB0aGlzLmNoYXIgPT09IENUUkxfTVxuICAgIH1cblxuICAgIHBhcnNlU3RhcnQgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gUGFyc2VyLkVORCkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTFNRQikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VUYWJsZU9yTGlzdClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX05VTSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VDb21tZW50KVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENUUkxfSiB8fCB0aGlzLmNoYXIgPT09IENIQVJfU1AgfHwgdGhpcy5jaGFyID09PSBDVFJMX0kgfHwgdGhpcy5jaGFyID09PSBDVFJMX00pIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0gZWxzZSBpZiAoaXNBbHBoYU51bVF1b3RlSHlwaGVuKHRoaXMuY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlQXNzaWduU3RhdGVtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKGBVbmtub3duIGNoYXJhY3RlciBcIiR7dGhpcy5jaGFyfVwiYCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSEVMUEVSLCB0aGlzIHN0cmlwcyBhbnkgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZVxuICAgIC8vIHRoZW4gUkVUVVJOUy4gTGFzdCBzdGF0ZSBpbiBhIHByb2R1Y3Rpb24uXG4gICAgcGFyc2VXaGl0ZXNwYWNlVG9FT0wgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSB8fCB0aGlzLmNoYXIgPT09IENUUkxfTSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTlVNKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUNvbW1lbnQpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gUGFyc2VyLkVORCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbmV4cGVjdGVkIGNoYXJhY3RlciwgZXhwZWN0ZWQgb25seSB3aGl0ZXNwYWNlIG9yIGNvbW1lbnRzIHRpbGwgZW5kIG9mIGxpbmUnKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBBU1NJR05NRU5UOiBrZXkgPSB2YWx1ZSAqL1xuICAgIHBhcnNlQXNzaWduU3RhdGVtZW50ICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGxOb3codGhpcy5wYXJzZUFzc2lnbiwgdGhpcy5yZWNvcmRBc3NpZ25TdGF0ZW1lbnQpXG4gICAgfVxuICAgIHJlY29yZEFzc2lnblN0YXRlbWVudCAoa3YpIHtcbiAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmN0eFxuICAgICAgbGV0IGZpbmFsS2V5ID0ga3Yua2V5LnBvcCgpXG4gICAgICBmb3IgKGxldCBrdyBvZiBrdi5rZXkpIHtcbiAgICAgICAgaWYgKGhhc0tleSh0YXJnZXQsIGt3KSAmJiAoIWlzVGFibGUodGFyZ2V0W2t3XSkgfHwgdGFyZ2V0W2t3XVtfZGVjbGFyZWRdKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSB0YXJnZXRba3ddID0gdGFyZ2V0W2t3XSB8fCBUYWJsZSgpXG4gICAgICB9XG4gICAgICBpZiAoaGFzS2V5KHRhcmdldCwgZmluYWxLZXkpKSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgIH1cbiAgICAgIC8vIHVuYm94IG91ciBudW1iZXJzXG4gICAgICBpZiAoaXNJbnRlZ2VyKGt2LnZhbHVlKSB8fCBpc0Zsb2F0KGt2LnZhbHVlKSkge1xuICAgICAgICB0YXJnZXRbZmluYWxLZXldID0ga3YudmFsdWUudmFsdWVPZigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbZmluYWxLZXldID0ga3YudmFsdWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZVdoaXRlc3BhY2VUb0VPTClcbiAgICB9XG5cbiAgICAvKiBBU1NTSUdOTUVOVCBleHByZXNzaW9uLCBrZXkgPSB2YWx1ZSBwb3NzaWJseSBpbnNpZGUgYW4gaW5saW5lIHRhYmxlICovXG4gICAgcGFyc2VBc3NpZ24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlS2V5d29yZCwgdGhpcy5yZWNvcmRBc3NpZ25LZXl3b3JkKVxuICAgIH1cbiAgICByZWNvcmRBc3NpZ25LZXl3b3JkIChrZXkpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnJlc3VsdFRhYmxlKSB7XG4gICAgICAgIHRoaXMuc3RhdGUucmVzdWx0VGFibGUucHVzaChrZXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLnJlc3VsdFRhYmxlID0gW2tleV1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUFzc2lnbktleXdvcmRQcmVEb3QpXG4gICAgfVxuICAgIHBhcnNlQXNzaWduS2V5d29yZFByZURvdCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1BFUklPRCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VBc3NpZ25LZXl3b3JkUG9zdERvdClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyICE9PSBDSEFSX1NQICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9JKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUFzc2lnbkVxdWFsKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUFzc2lnbktleXdvcmRQb3N0RG90ICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgIT09IENIQVJfU1AgJiYgdGhpcy5jaGFyICE9PSBDVFJMX0kpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlS2V5d29yZCwgdGhpcy5yZWNvcmRBc3NpZ25LZXl3b3JkKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlQXNzaWduRXF1YWwgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9FUVVBTFMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlQXNzaWduUHJlVmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyLCBleHBlY3RlZCBcIj1cIicpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUFzc2lnblByZVZhbHVlICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfU1AgfHwgdGhpcy5jaGFyID09PSBDVFJMX0kpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxOb3codGhpcy5wYXJzZVZhbHVlLCB0aGlzLnJlY29yZEFzc2lnblZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgICByZWNvcmRBc3NpZ25WYWx1ZSAodmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyh7a2V5OiB0aGlzLnN0YXRlLnJlc3VsdFRhYmxlLCB2YWx1ZTogdmFsdWV9KVxuICAgIH1cblxuICAgIC8qIENPTU1FTlRTOiAjLi4uZW9sICovXG4gICAgcGFyc2VDb21tZW50ICgpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhciA9PT0gUGFyc2VyLkVORCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSikge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJldHVybigpXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKHRoaXMubmV4dENoYXIoKSlcbiAgICB9XG5cbiAgICAvKiBUQUJMRVMgQU5EIExJU1RTLCBbZm9vXSBhbmQgW1tmb29dXSAqL1xuICAgIHBhcnNlVGFibGVPckxpc3QgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9MU1FCKSB7XG4gICAgICAgIHRoaXMubmV4dCh0aGlzLnBhcnNlTGlzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZVRhYmxlKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIFRBQkxFIFtmb28uYmFyLmJhel0gKi9cbiAgICBwYXJzZVRhYmxlICgpIHtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5vYmpcbiAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZVRhYmxlTmV4dClcbiAgICB9XG4gICAgcGFyc2VUYWJsZU5leHQgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlS2V5d29yZCwgdGhpcy5wYXJzZVRhYmxlTW9yZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VUYWJsZU1vcmUgKGtleXdvcmQpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfU1AgfHwgdGhpcy5jaGFyID09PSBDVFJMX0kpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1JTUUIpIHtcbiAgICAgICAgaWYgKGhhc0tleSh0aGlzLmN0eCwga2V5d29yZCkgJiYgKCFpc1RhYmxlKHRoaXMuY3R4W2tleXdvcmRdKSB8fCB0aGlzLmN0eFtrZXl3b3JkXVtfZGVjbGFyZWRdKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY3R4W2tleXdvcmRdID0gdGhpcy5jdHhba2V5d29yZF0gfHwgVGFibGUoKVxuICAgICAgICAgIHRoaXMuY3R4W19kZWNsYXJlZF0gPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlV2hpdGVzcGFjZVRvRU9MKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUEVSSU9EKSB7XG4gICAgICAgIGlmICghaGFzS2V5KHRoaXMuY3R4LCBrZXl3b3JkKSkge1xuICAgICAgICAgIHRoaXMuY3R4ID0gdGhpcy5jdHhba2V5d29yZF0gPSBUYWJsZSgpXG4gICAgICAgIH0gZWxzZSBpZiAoaXNUYWJsZSh0aGlzLmN0eFtrZXl3b3JkXSkpIHtcbiAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY3R4W2tleXdvcmRdXG4gICAgICAgIH0gZWxzZSBpZiAoaXNMaXN0KHRoaXMuY3R4W2tleXdvcmRdKSkge1xuICAgICAgICAgIHRoaXMuY3R4ID0gdGhpcy5jdHhba2V5d29yZF1bdGhpcy5jdHhba2V5d29yZF0ubGVuZ3RoIC0gMV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoXCJDYW4ndCByZWRlZmluZSBleGlzdGluZyBrZXlcIikpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlVGFibGVOZXh0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbmV4cGVjdGVkIGNoYXJhY3RlciwgZXhwZWN0ZWQgd2hpdGVzcGFjZSwgLiBvciBdJykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogTElTVCBbW2EuYi5jXV0gKi9cbiAgICBwYXJzZUxpc3QgKCkge1xuICAgICAgdGhpcy5jdHggPSB0aGlzLm9ialxuICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlTGlzdE5leHQpXG4gICAgfVxuICAgIHBhcnNlTGlzdE5leHQgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlS2V5d29yZCwgdGhpcy5wYXJzZUxpc3RNb3JlKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUxpc3RNb3JlIChrZXl3b3JkKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1NQIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9JKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9SU1FCKSB7XG4gICAgICAgIGlmICghaGFzS2V5KHRoaXMuY3R4LCBrZXl3b3JkKSkge1xuICAgICAgICAgIHRoaXMuY3R4W2tleXdvcmRdID0gTGlzdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSW5saW5lTGlzdCh0aGlzLmN0eFtrZXl3b3JkXSkpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoXCJDYW4ndCBleHRlbmQgYW4gaW5saW5lIGFycmF5XCIpKVxuICAgICAgICB9IGVsc2UgaWYgKGlzTGlzdCh0aGlzLmN0eFtrZXl3b3JkXSkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gVGFibGUoKVxuICAgICAgICAgIHRoaXMuY3R4W2tleXdvcmRdLnB1c2gobmV4dClcbiAgICAgICAgICB0aGlzLmN0eCA9IG5leHRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoXCJDYW4ndCByZWRlZmluZSBhbiBleGlzdGluZyBrZXlcIikpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTGlzdEVuZClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1BFUklPRCkge1xuICAgICAgICBpZiAoIWhhc0tleSh0aGlzLmN0eCwga2V5d29yZCkpIHtcbiAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY3R4W2tleXdvcmRdID0gVGFibGUoKVxuICAgICAgICB9IGVsc2UgaWYgKGlzSW5saW5lTGlzdCh0aGlzLmN0eFtrZXl3b3JkXSkpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoXCJDYW4ndCBleHRlbmQgYW4gaW5saW5lIGFycmF5XCIpKVxuICAgICAgICB9IGVsc2UgaWYgKGlzSW5saW5lVGFibGUodGhpcy5jdHhba2V5d29yZF0pKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKFwiQ2FuJ3QgZXh0ZW5kIGFuIGlubGluZSB0YWJsZVwiKSlcbiAgICAgICAgfSBlbHNlIGlmIChpc0xpc3QodGhpcy5jdHhba2V5d29yZF0pKSB7XG4gICAgICAgICAgdGhpcy5jdHggPSB0aGlzLmN0eFtrZXl3b3JkXVt0aGlzLmN0eFtrZXl3b3JkXS5sZW5ndGggLSAxXVxuICAgICAgICB9IGVsc2UgaWYgKGlzVGFibGUodGhpcy5jdHhba2V5d29yZF0pKSB7XG4gICAgICAgICAgdGhpcy5jdHggPSB0aGlzLmN0eFtrZXl3b3JkXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGFuIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VMaXN0TmV4dClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIsIGV4cGVjdGVkIHdoaXRlc3BhY2UsIC4gb3IgXScpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUxpc3RFbmQgKGtleXdvcmQpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUlNRQikge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VXaGl0ZXNwYWNlVG9FT0wpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyLCBleHBlY3RlZCB3aGl0ZXNwYWNlLCAuIG9yIF0nKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBWQUxVRSBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgaW5saW5lIGxpc3QsIGlubGluZSBvYmplY3QgKi9cbiAgICBwYXJzZVZhbHVlICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IFBhcnNlci5FTkQpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdLZXkgd2l0aG91dCB2YWx1ZScpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUVVPVCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VEb3VibGVTdHJpbmcpXG4gICAgICB9IGlmICh0aGlzLmNoYXIgPT09IENIQVJfQVBPUykge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VTaW5nbGVTdHJpbmcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9IWVBIRU4gfHwgdGhpcy5jaGFyID09PSBDSEFSX1BMVVMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlTnVtYmVyU2lnbilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX2kpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlSW5mKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfbikge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VOYW4pXG4gICAgICB9IGVsc2UgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VOdW1iZXJPckRhdGVUaW1lKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfdCB8fCB0aGlzLmNoYXIgPT09IENIQVJfZikge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VCb29sZWFuKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTFNRQikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VJbmxpbmVMaXN0LCB0aGlzLnJlY29yZFZhbHVlKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTENVQikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VJbmxpbmVUYWJsZSwgdGhpcy5yZWNvcmRWYWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIsIGV4cGVjdGluZyBzdHJpbmcsIG51bWJlciwgZGF0ZXRpbWUsIGJvb2xlYW4sIGlubGluZSBhcnJheSBvciBpbmxpbmUgdGFibGUnKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmVjb3JkVmFsdWUgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3codmFsdWUpXG4gICAgfVxuXG4gICAgcGFyc2VJbmYgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZUluZjIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyLCBleHBlY3RlZCBcImluZlwiLCBcIitpbmZcIiBvciBcIi1pbmZcIicpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUluZjIgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9mKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1ZiA9PT0gJy0nKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKC1JbmZpbml0eSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oSW5maW5pdHkpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIsIGV4cGVjdGVkIFwiaW5mXCIsIFwiK2luZlwiIG9yIFwiLWluZlwiJykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VOYW4gKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9hKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU5hbjIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyLCBleHBlY3RlZCBcIm5hblwiJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTmFuMiAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKE5hTilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIsIGV4cGVjdGVkIFwibmFuXCInKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBLRVlTLCBiYXJld29yZHMgb3IgYmFzaWMsIGxpdGVyYWwsIG9yIGRvdHRlZCAqL1xuICAgIHBhcnNlS2V5d29yZCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1FVT1QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlQmFzaWNTdHJpbmcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9BUE9TKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZUxpdGVyYWxTdHJpbmcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VCYXJlS2V5KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEtFWVM6IGJhcmV3b3JkcyAqL1xuICAgIHBhcnNlQmFyZUtleSAoKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICh0aGlzLmNoYXIgPT09IFBhcnNlci5FTkQpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0tleSBlbmRlZCB3aXRob3V0IHZhbHVlJykpXG4gICAgICAgIH0gZWxzZSBpZiAoaXNBbHBoYU51bUh5cGhlbih0aGlzLmNoYXIpKSB7XG4gICAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmJ1Zi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0VtcHR5IGJhcmUga2V5cyBhcmUgbm90IGFsbG93ZWQnKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3coKVxuICAgICAgICB9XG4gICAgICB9IHdoaWxlICh0aGlzLm5leHRDaGFyKCkpXG4gICAgfVxuXG4gICAgLyogU1RSSU5HUywgc2luZ2xlIHF1b3RlZCAobGl0ZXJhbCkgKi9cbiAgICBwYXJzZVNpbmdsZVN0cmluZyAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0FQT1MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTGl0ZXJhbE11bHRpU3RyaW5nTWF5YmUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VMaXRlcmFsU3RyaW5nKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUxpdGVyYWxTdHJpbmcgKCkge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0FQT1MpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXRFbmRPZkxpbmUoKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW50ZXJtaW5hdGVkIHN0cmluZycpKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9ERUwgfHwgKHRoaXMuY2hhciA8PSBDVFJMX0NIQVJfQk9VTkRBUlkgJiYgdGhpcy5jaGFyICE9PSBDVFJMX0kpKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvckNvbnRyb2xDaGFySW5TdHJpbmcoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKHRoaXMubmV4dENoYXIoKSlcbiAgICB9XG4gICAgcGFyc2VMaXRlcmFsTXVsdGlTdHJpbmdNYXliZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0FQT1MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTGl0ZXJhbE11bHRpU3RyaW5nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KClcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VMaXRlcmFsTXVsdGlTdHJpbmcgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9NKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9KKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZUxpdGVyYWxNdWx0aVN0cmluZ0NvbnRlbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VMaXRlcmFsTXVsdGlTdHJpbmdDb250ZW50KVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUxpdGVyYWxNdWx0aVN0cmluZ0NvbnRlbnQgKCkge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0FQT1MpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VMaXRlcmFsTXVsdGlFbmQpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBQYXJzZXIuRU5EKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbnRlcm1pbmF0ZWQgbXVsdGktbGluZSBzdHJpbmcnKSlcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfREVMIHx8ICh0aGlzLmNoYXIgPD0gQ1RSTF9DSEFSX0JPVU5EQVJZICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9JICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9KICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9NKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3JDb250cm9sQ2hhckluU3RyaW5nKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICB9XG4gICAgICB9IHdoaWxlICh0aGlzLm5leHRDaGFyKCkpXG4gICAgfVxuICAgIHBhcnNlTGl0ZXJhbE11bHRpRW5kICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQVBPUykge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VMaXRlcmFsTXVsdGlFbmQyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgKz0gXCInXCJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlTGl0ZXJhbE11bHRpU3RyaW5nQ29udGVudClcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VMaXRlcmFsTXVsdGlFbmQyICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQVBPUykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgKz0gXCInJ1wiXG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUxpdGVyYWxNdWx0aVN0cmluZ0NvbnRlbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogU1RSSU5HUyBkb3VibGUgcXVvdGVkICovXG4gICAgcGFyc2VEb3VibGVTdHJpbmcgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9RVU9UKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU11bHRpU3RyaW5nTWF5YmUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VCYXNpY1N0cmluZylcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VCYXNpY1N0cmluZyAoKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQlNPTCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZUVzY2FwZSwgdGhpcy5yZWNvcmRFc2NhcGVSZXBsYWNlbWVudClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUVVPVCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJldHVybigpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hdEVuZE9mTGluZSgpKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbnRlcm1pbmF0ZWQgc3RyaW5nJykpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0RFTCB8fCAodGhpcy5jaGFyIDw9IENUUkxfQ0hBUl9CT1VOREFSWSAmJiB0aGlzLmNoYXIgIT09IENUUkxfSSkpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yQ29udHJvbENoYXJJblN0cmluZygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAodGhpcy5uZXh0Q2hhcigpKVxuICAgIH1cbiAgICByZWNvcmRFc2NhcGVSZXBsYWNlbWVudCAocmVwbGFjZW1lbnQpIHtcbiAgICAgIHRoaXMuc3RhdGUuYnVmICs9IHJlcGxhY2VtZW50XG4gICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VCYXNpY1N0cmluZylcbiAgICB9XG4gICAgcGFyc2VNdWx0aVN0cmluZ01heWJlICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUVVPVCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VNdWx0aVN0cmluZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdygpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTXVsdGlTdHJpbmcgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9NKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9KKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU11bHRpU3RyaW5nQ29udGVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZU11bHRpU3RyaW5nQ29udGVudClcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VNdWx0aVN0cmluZ0NvbnRlbnQgKCkge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0JTT0wpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VNdWx0aUVzY2FwZSwgdGhpcy5yZWNvcmRNdWx0aUVzY2FwZVJlcGxhY2VtZW50KVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9RVU9UKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTXVsdGlFbmQpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBQYXJzZXIuRU5EKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbnRlcm1pbmF0ZWQgbXVsdGktbGluZSBzdHJpbmcnKSlcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfREVMIHx8ICh0aGlzLmNoYXIgPD0gQ1RSTF9DSEFSX0JPVU5EQVJZICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9JICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9KICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9NKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3JDb250cm9sQ2hhckluU3RyaW5nKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICB9XG4gICAgICB9IHdoaWxlICh0aGlzLm5leHRDaGFyKCkpXG4gICAgfVxuICAgIGVycm9yQ29udHJvbENoYXJJblN0cmluZyAoKSB7XG4gICAgICBsZXQgZGlzcGxheUNvZGUgPSAnXFxcXHUwMCdcbiAgICAgIGlmICh0aGlzLmNoYXIgPCAxNikge1xuICAgICAgICBkaXNwbGF5Q29kZSArPSAnMCdcbiAgICAgIH1cbiAgICAgIGRpc3BsYXlDb2RlICs9IHRoaXMuY2hhci50b1N0cmluZygxNilcblxuICAgICAgcmV0dXJuIHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihgQ29udHJvbCBjaGFyYWN0ZXJzIChjb2RlcyA8IDB4MWYgYW5kIDB4N2YpIGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpbmdzLCB1c2UgJHtkaXNwbGF5Q29kZX0gaW5zdGVhZGApKVxuICAgIH1cbiAgICByZWNvcmRNdWx0aUVzY2FwZVJlcGxhY2VtZW50IChyZXBsYWNlbWVudCkge1xuICAgICAgdGhpcy5zdGF0ZS5idWYgKz0gcmVwbGFjZW1lbnRcbiAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZU11bHRpU3RyaW5nQ29udGVudClcbiAgICB9XG4gICAgcGFyc2VNdWx0aUVuZCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1FVT1QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTXVsdGlFbmQyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgKz0gJ1wiJ1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VNdWx0aVN0cmluZ0NvbnRlbnQpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTXVsdGlFbmQyICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUVVPVCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgKz0gJ1wiXCInXG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZU11bHRpU3RyaW5nQ29udGVudClcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VNdWx0aUVzY2FwZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDVFJMX00gfHwgdGhpcy5jaGFyID09PSBDVFJMX0opIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTXVsdGlUcmltKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfU1AgfHwgdGhpcy5jaGFyID09PSBDVFJMX0kpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlUHJlTXVsdGlUcmltKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlRXNjYXBlKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVByZU11bHRpVHJpbSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1NQIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9JKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9NIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9KKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU11bHRpVHJpbSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IGVzY2FwZSB3aGl0ZXNwYWNlXCIpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZU11bHRpVHJpbSAoKSB7XG4gICAgICAvLyBleHBsaWNpdGx5IHdoaXRlc3BhY2UgaGVyZSwgRU5EIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgcGF0aCBhcyBjaGFyc1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9KIHx8IHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSB8fCB0aGlzLmNoYXIgPT09IENUUkxfTSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KClcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VFc2NhcGUgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciBpbiBlc2NhcGVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybihlc2NhcGVzW3RoaXMuY2hhcl0pXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl91KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZVNtYWxsVW5pY29kZSwgdGhpcy5wYXJzZVVuaWNvZGVSZXR1cm4pXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9VKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZUxhcmdlVW5pY29kZSwgdGhpcy5wYXJzZVVuaWNvZGVSZXR1cm4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1Vua25vd24gZXNjYXBlIGNoYXJhY3RlcjogJyArIHRoaXMuY2hhcikpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlVW5pY29kZVJldHVybiAoY2hhcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29kZVBvaW50ID0gcGFyc2VJbnQoY2hhciwgMTYpXG4gICAgICAgIGlmIChjb2RlUG9pbnQgPj0gU1VSUk9HQVRFX0ZJUlNUICYmIGNvZGVQb2ludCA8PSBTVVJST0dBVEVfTEFTVCkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW52YWxpZCB1bmljb2RlLCBjaGFyYWN0ZXIgaW4gcmFuZ2UgMHhEODAwIC0gMHhERkZGIGlzIHJlc2VydmVkJykpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCkpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihUb21sRXJyb3Iud3JhcChlcnIpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVNtYWxsVW5pY29kZSAoKSB7XG4gICAgICBpZiAoIWlzSGV4aXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIHVuaWNvZGUgc2VxdWVuY2UsIGV4cGVjdGVkIGhleCcpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA+PSA0KSByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUxhcmdlVW5pY29kZSAoKSB7XG4gICAgICBpZiAoIWlzSGV4aXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIHVuaWNvZGUgc2VxdWVuY2UsIGV4cGVjdGVkIGhleCcpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA+PSA4KSByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIE5VTUJFUlMgKi9cbiAgICBwYXJzZU51bWJlclNpZ24gKCkge1xuICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU1heWJlU2lnbmVkSW5mT3JOYW4pXG4gICAgfVxuICAgIHBhcnNlTWF5YmVTaWduZWRJbmZPck5hbiAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX2kpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlSW5mKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfbikge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VOYW4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsTm93KHRoaXMucGFyc2VOb1VuZGVyLCB0aGlzLnBhcnNlTnVtYmVySW50ZWdlclN0YXJ0KVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZU51bWJlckludGVnZXJTdGFydCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSXzApIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTnVtYmVySW50ZWdlckV4cG9uZW50T3JEZWNpbWFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlTnVtYmVySW50ZWdlcilcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VOdW1iZXJJbnRlZ2VyRXhwb25lbnRPckRlY2ltYWwgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9QRVJJT0QpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlTm9VbmRlciwgdGhpcy5wYXJzZU51bWJlckZsb2F0KVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfRSB8fCB0aGlzLmNoYXIgPT09IENIQVJfZSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VOdW1iZXJFeHBvbmVudFNpZ24pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3coSW50ZWdlcih0aGlzLnN0YXRlLmJ1ZikpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTnVtYmVySW50ZWdlciAoKSB7XG4gICAgICBpZiAoaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9MT1dCQVIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlTm9VbmRlcilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0UgfHwgdGhpcy5jaGFyID09PSBDSEFSX2UpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTnVtYmVyRXhwb25lbnRTaWduKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUEVSSU9EKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXIsIHRoaXMucGFyc2VOdW1iZXJGbG9hdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEludGVnZXIodGhpcy5zdGF0ZS5idWYpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocmVzdWx0LmlzTmFOKCkpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgbnVtYmVyJykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KHJlc3VsdClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZU5vVW5kZXIgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9MT1dCQVIgfHwgdGhpcy5jaGFyID09PSBDSEFSX1BFUklPRCB8fCB0aGlzLmNoYXIgPT09IENIQVJfRSB8fCB0aGlzLmNoYXIgPT09IENIQVJfZSkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyLCBleHBlY3RlZCBkaWdpdCcpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmF0RW5kT2ZXb3JkKCkpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbmNvbXBsZXRlIG51bWJlcicpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KClcbiAgICB9XG4gICAgcGFyc2VOb1VuZGVySGV4T2N0QmluTGl0ZXJhbCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0xPV0JBUiB8fCB0aGlzLmNoYXIgPT09IENIQVJfUEVSSU9EKSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIsIGV4cGVjdGVkIGRpZ2l0JykpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXRFbmRPZldvcmQoKSkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0luY29tcGxldGUgbnVtYmVyJykpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3coKVxuICAgIH1cbiAgICBwYXJzZU51bWJlckZsb2F0ICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTE9XQkFSKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXIsIHRoaXMucGFyc2VOdW1iZXJGbG9hdClcbiAgICAgIH0gZWxzZSBpZiAoaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9FIHx8IHRoaXMuY2hhciA9PT0gQ0hBUl9lKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU51bWJlckV4cG9uZW50U2lnbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhGbG9hdCh0aGlzLnN0YXRlLmJ1ZikpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTnVtYmVyRXhwb25lbnRTaWduICgpIHtcbiAgICAgIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlTnVtYmVyRXhwb25lbnQpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9IWVBIRU4gfHwgdGhpcy5jaGFyID09PSBDSEFSX1BMVVMpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgdGhpcy5jYWxsKHRoaXMucGFyc2VOb1VuZGVyLCB0aGlzLnBhcnNlTnVtYmVyRXhwb25lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyLCBleHBlY3RlZCAtLCArIG9yIGRpZ2l0JykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTnVtYmVyRXhwb25lbnQgKCkge1xuICAgICAgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTE9XQkFSKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3coRmxvYXQodGhpcy5zdGF0ZS5idWYpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIE5VTUJFUlMgb3IgREFURVRJTUVTICAqL1xuICAgIHBhcnNlTnVtYmVyT3JEYXRlVGltZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSXzApIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTnVtYmVyQmFzZU9yRGF0ZVRpbWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VOdW1iZXJPckRhdGVUaW1lT25seSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VOdW1iZXJPckRhdGVUaW1lT25seSAoKSB7XG4gICAgICAvLyBub3RlLCBpZiB0d28gemVyb3MgYXJlIGluIGEgcm93IHRoZW4gaXQgTVVTVCBiZSBhIGRhdGVcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTE9XQkFSKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXIsIHRoaXMucGFyc2VOdW1iZXJJbnRlZ2VyKVxuICAgICAgfSBlbHNlIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA+IDQpIHRoaXMubmV4dCh0aGlzLnBhcnNlTnVtYmVySW50ZWdlcilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0UgfHwgdGhpcy5jaGFyID09PSBDSEFSX2UpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTnVtYmVyRXhwb25lbnRTaWduKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUEVSSU9EKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXIsIHRoaXMucGFyc2VOdW1iZXJGbG9hdClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0hZUEhFTikge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VEYXRlVGltZSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0NPTE9OKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZU9ubHlUaW1lSG91cilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhJbnRlZ2VyKHRoaXMuc3RhdGUuYnVmKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VEYXRlVGltZU9ubHkgKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN1bWUoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9DT0xPTikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZU9ubHlUaW1lSG91cilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0V4cGVjdGVkIGRpZ2l0IHdoaWxlIHBhcnNpbmcgeWVhciBwYXJ0IG9mIGEgZGF0ZScpKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0hZUEhFTikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZURhdGVUaW1lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignRXhwZWN0ZWQgaHlwaGVuICgtKSB3aGlsZSBwYXJzaW5nIHllYXIgcGFydCBvZiBkYXRlJykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VOdW1iZXJCYXNlT3JEYXRlVGltZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX2IpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlTm9VbmRlckhleE9jdEJpbkxpdGVyYWwsIHRoaXMucGFyc2VJbnRlZ2VyQmluKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfbykge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VOb1VuZGVySGV4T2N0QmluTGl0ZXJhbCwgdGhpcy5wYXJzZUludGVnZXJPY3QpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl94KSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXJIZXhPY3RCaW5MaXRlcmFsLCB0aGlzLnBhcnNlSW50ZWdlckhleClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1BFUklPRCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VOdW1iZXJJbnRlZ2VyKVxuICAgICAgfSBlbHNlIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlRGF0ZVRpbWVPbmx5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KEludGVnZXIodGhpcy5zdGF0ZS5idWYpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUludGVnZXJIZXggKCkge1xuICAgICAgaWYgKGlzSGV4aXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTE9XQkFSKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXJIZXhPY3RCaW5MaXRlcmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gSW50ZWdlcih0aGlzLnN0YXRlLmJ1ZilcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChyZXN1bHQuaXNOYU4oKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW52YWxpZCBudW1iZXInKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3cocmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlSW50ZWdlck9jdCAoKSB7XG4gICAgICBpZiAoaXNPY3RpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9MT1dCQVIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlTm9VbmRlckhleE9jdEJpbkxpdGVyYWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBJbnRlZ2VyKHRoaXMuc3RhdGUuYnVmKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHJlc3VsdC5pc05hTigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbnZhbGlkIG51bWJlcicpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhyZXN1bHQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VJbnRlZ2VyQmluICgpIHtcbiAgICAgIGlmIChpc0JpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9MT1dCQVIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlTm9VbmRlckhleE9jdEJpbkxpdGVyYWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBJbnRlZ2VyKHRoaXMuc3RhdGUuYnVmKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHJlc3VsdC5pc05hTigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbnZhbGlkIG51bWJlcicpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhyZXN1bHQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBEQVRFVElNRSAqL1xuICAgIHBhcnNlRGF0ZVRpbWUgKCkge1xuICAgICAgLy8gd2UgZW50ZXIgaGVyZSBoYXZpbmcganVzdCBjb25zdW1lZCB0aGUgeWVhciBhbmQgYWJvdXQgdG8gY29uc3VtZSB0aGUgaHlwaGVuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5idWYubGVuZ3RoIDwgNCkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1llYXJzIGxlc3MgdGhhbiAxMDAwIG11c3QgYmUgemVybyBwYWRkZWQgdG8gZm91ciBjaGFyYWN0ZXJzJykpXG4gICAgICB9XG4gICAgICB0aGlzLnN0YXRlLnJlc3VsdCA9IHRoaXMuc3RhdGUuYnVmXG4gICAgICB0aGlzLnN0YXRlLmJ1ZiA9ICcnXG4gICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VEYXRlTW9udGgpXG4gICAgfVxuICAgIHBhcnNlRGF0ZU1vbnRoICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfSFlQSEVOKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1Zi5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdNb250aHMgbGVzcyB0aGFuIDEwIG11c3QgYmUgemVybyBwYWRkZWQgdG8gdHdvIGNoYXJhY3RlcnMnKSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlLnJlc3VsdCArPSAnLScgKyB0aGlzLnN0YXRlLmJ1ZlxuICAgICAgICB0aGlzLnN0YXRlLmJ1ZiA9ICcnXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZURhdGVEYXkpXG4gICAgICB9IGVsc2UgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbmNvbXBsZXRlIGRhdGV0aW1lJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlRGF0ZURheSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1QgfHwgdGhpcy5jaGFyID09PSBDSEFSX1NQKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1Zi5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdEYXlzIGxlc3MgdGhhbiAxMCBtdXN0IGJlIHplcm8gcGFkZGVkIHRvIHR3byBjaGFyYWN0ZXJzJykpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5yZXN1bHQgKz0gJy0nICsgdGhpcy5zdGF0ZS5idWZcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VTdGFydFRpbWVIb3VyKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmF0RW5kT2ZXb3JkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KGNyZWF0ZURhdGUodGhpcy5zdGF0ZS5yZXN1bHQgKyAnLScgKyB0aGlzLnN0YXRlLmJ1ZikpXG4gICAgICB9IGVsc2UgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbmNvbXBsZXRlIGRhdGV0aW1lJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlU3RhcnRUaW1lSG91ciAoKSB7XG4gICAgICBpZiAodGhpcy5hdEVuZE9mV29yZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhjcmVhdGVEYXRlKHRoaXMuc3RhdGUucmVzdWx0KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZVRpbWVIb3VyKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVRpbWVIb3VyICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQ09MT04pIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0hvdXJzIGxlc3MgdGhhbiAxMCBtdXN0IGJlIHplcm8gcGFkZGVkIHRvIHR3byBjaGFyYWN0ZXJzJykpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5yZXN1bHQgKz0gJ1QnICsgdGhpcy5zdGF0ZS5idWZcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VUaW1lTWluKVxuICAgICAgfSBlbHNlIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW5jb21wbGV0ZSBkYXRldGltZScpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVRpbWVNaW4gKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA8IDIgJiYgaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA9PT0gMiAmJiB0aGlzLmNoYXIgPT09IENIQVJfQ09MT04pIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5yZXN1bHQgKz0gJzonICsgdGhpcy5zdGF0ZS5idWZcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VUaW1lU2VjKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbmNvbXBsZXRlIGRhdGV0aW1lJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlVGltZVNlYyAoKSB7XG4gICAgICBpZiAoaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1Zi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlLnJlc3VsdCArPSAnOicgKyB0aGlzLnN0YXRlLmJ1ZlxuICAgICAgICAgIHRoaXMuc3RhdGUuYnVmID0gJydcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VUaW1lWm9uZU9yRnJhY3Rpb24pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW5jb21wbGV0ZSBkYXRldGltZScpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlT25seVRpbWVIb3VyICgpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0NPTE9OKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1Zi5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdIb3VycyBsZXNzIHRoYW4gMTAgbXVzdCBiZSB6ZXJvIHBhZGRlZCB0byB0d28gY2hhcmFjdGVycycpKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUucmVzdWx0ID0gdGhpcy5zdGF0ZS5idWZcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VPbmx5VGltZU1pbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW5jb21wbGV0ZSB0aW1lJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlT25seVRpbWVNaW4gKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA8IDIgJiYgaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA9PT0gMiAmJiB0aGlzLmNoYXIgPT09IENIQVJfQ09MT04pIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5yZXN1bHQgKz0gJzonICsgdGhpcy5zdGF0ZS5idWZcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VPbmx5VGltZVNlYylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW5jb21wbGV0ZSB0aW1lJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlT25seVRpbWVTZWMgKCkge1xuICAgICAgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5idWYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlT25seVRpbWVGcmFjdGlvbk1heWJlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0luY29tcGxldGUgdGltZScpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZU9ubHlUaW1lRnJhY3Rpb25NYXliZSAoKSB7XG4gICAgICB0aGlzLnN0YXRlLnJlc3VsdCArPSAnOicgKyB0aGlzLnN0YXRlLmJ1ZlxuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9QRVJJT0QpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICB0aGlzLm5leHQodGhpcy5wYXJzZU9ubHlUaW1lRnJhY3Rpb24pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oY3JlYXRlVGltZSh0aGlzLnN0YXRlLnJlc3VsdCkpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlT25seVRpbWVGcmFjdGlvbiAoKSB7XG4gICAgICBpZiAoaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXRFbmRPZldvcmQoKSkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5idWYubGVuZ3RoID09PSAwKSB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0V4cGVjdGVkIGRpZ2l0IGluIG1pbGxpc2Vjb25kcycpKVxuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3coY3JlYXRlVGltZSh0aGlzLnN0YXRlLnJlc3VsdCArICcuJyArIHRoaXMuc3RhdGUuYnVmKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gZGF0ZXRpbWUsIGV4cGVjdGVkIHBlcmlvZCAoLiksIG1pbnVzICgtKSwgcGx1cyAoKykgb3IgWicpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlVGltZVpvbmVPckZyYWN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUEVSSU9EKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHRoaXMubmV4dCh0aGlzLnBhcnNlRGF0ZVRpbWVGcmFjdGlvbilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0hZUEhFTiB8fCB0aGlzLmNoYXIgPT09IENIQVJfUExVUykge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICB0aGlzLm5leHQodGhpcy5wYXJzZVRpbWVab25lSG91cilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1opIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKGNyZWF0ZURhdGVUaW1lKHRoaXMuc3RhdGUucmVzdWx0ICsgdGhpcy5zdGF0ZS5idWYpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmF0RW5kT2ZXb3JkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KGNyZWF0ZURhdGVUaW1lRmxvYXQodGhpcy5zdGF0ZS5yZXN1bHQgKyB0aGlzLnN0YXRlLmJ1ZikpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyIGluIGRhdGV0aW1lLCBleHBlY3RlZCBwZXJpb2QgKC4pLCBtaW51cyAoLSksIHBsdXMgKCspIG9yIFonKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VEYXRlVGltZUZyYWN0aW9uICgpIHtcbiAgICAgIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5idWYubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignRXhwZWN0ZWQgZGlnaXQgaW4gbWlsbGlzZWNvbmRzJykpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9IWVBIRU4gfHwgdGhpcy5jaGFyID09PSBDSEFSX1BMVVMpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgdGhpcy5uZXh0KHRoaXMucGFyc2VUaW1lWm9uZUhvdXIpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9aKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybihjcmVhdGVEYXRlVGltZSh0aGlzLnN0YXRlLnJlc3VsdCArIHRoaXMuc3RhdGUuYnVmKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hdEVuZE9mV29yZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhjcmVhdGVEYXRlVGltZUZsb2F0KHRoaXMuc3RhdGUucmVzdWx0ICsgdGhpcy5zdGF0ZS5idWYpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbmV4cGVjdGVkIGNoYXJhY3RlciBpbiBkYXRldGltZSwgZXhwZWN0ZWQgcGVyaW9kICguKSwgbWludXMgKC0pLCBwbHVzICgrKSBvciBaJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlVGltZVpvbmVIb3VyICgpIHtcbiAgICAgIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgLy8gRklYTUU6IE5vIG1vcmUgcmVnZXhwc1xuICAgICAgICBpZiAoL1xcZFxcZCQvLnRlc3QodGhpcy5zdGF0ZS5idWYpKSByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VUaW1lWm9uZVNlcClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gZGF0ZXRpbWUsIGV4cGVjdGVkIGRpZ2l0JykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlVGltZVpvbmVTZXAgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9DT0xPTikge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICB0aGlzLm5leHQodGhpcy5wYXJzZVRpbWVab25lTWluKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbmV4cGVjdGVkIGNoYXJhY3RlciBpbiBkYXRldGltZSwgZXhwZWN0ZWQgY29sb24nKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VUaW1lWm9uZU1pbiAoKSB7XG4gICAgICBpZiAoaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIGlmICgvXFxkXFxkJC8udGVzdCh0aGlzLnN0YXRlLmJ1ZikpIHJldHVybiB0aGlzLnJldHVybihjcmVhdGVEYXRlVGltZSh0aGlzLnN0YXRlLnJlc3VsdCArIHRoaXMuc3RhdGUuYnVmKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gZGF0ZXRpbWUsIGV4cGVjdGVkIGRpZ2l0JykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogQk9PTEVBTiAqL1xuICAgIHBhcnNlQm9vbGVhbiAoKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl90KSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZVRydWVfcilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX2YpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlRmFsc2VfYSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VUcnVlX3IgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9yKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZVRydWVfdSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW52YWxpZCBib29sZWFuLCBleHBlY3RlZCB0cnVlIG9yIGZhbHNlJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlVHJ1ZV91ICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfdSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VUcnVlX2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgYm9vbGVhbiwgZXhwZWN0ZWQgdHJ1ZSBvciBmYWxzZScpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVRydWVfZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgYm9vbGVhbiwgZXhwZWN0ZWQgdHJ1ZSBvciBmYWxzZScpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlRmFsc2VfYSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX2EpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlRmFsc2VfbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW52YWxpZCBib29sZWFuLCBleHBlY3RlZCB0cnVlIG9yIGZhbHNlJykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VGYWxzZV9sICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfbCkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VGYWxzZV9zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbnZhbGlkIGJvb2xlYW4sIGV4cGVjdGVkIHRydWUgb3IgZmFsc2UnKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJzZUZhbHNlX3MgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9zKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZUZhbHNlX2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgYm9vbGVhbiwgZXhwZWN0ZWQgdHJ1ZSBvciBmYWxzZScpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlRmFsc2VfZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKGZhbHNlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbnZhbGlkIGJvb2xlYW4sIGV4cGVjdGVkIHRydWUgb3IgZmFsc2UnKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJTkxJTkUgTElTVFMgKi9cbiAgICBwYXJzZUlubGluZUxpc3QgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSB8fCB0aGlzLmNoYXIgPT09IENUUkxfTSB8fCB0aGlzLmNoYXIgPT09IENUUkxfSikge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IFBhcnNlci5FTkQpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbnRlcm1pbmF0ZWQgaW5saW5lIGFycmF5JykpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9OVU0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlQ29tbWVudClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1JTUUIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKHRoaXMuc3RhdGUucmVzdWx0QXJyIHx8IElubGluZUxpc3QoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxOb3codGhpcy5wYXJzZVZhbHVlLCB0aGlzLnJlY29yZElubGluZUxpc3RWYWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmVjb3JkSW5saW5lTGlzdFZhbHVlICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUucmVzdWx0QXJyKSB7XG4gICAgICAgIGNvbnN0IGxpc3RUeXBlID0gdGhpcy5zdGF0ZS5yZXN1bHRBcnJbX2NvbnRlbnRUeXBlXVxuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0b21sVHlwZSh2YWx1ZSlcbiAgICAgICAgaWYgKGxpc3RUeXBlICE9PSB2YWx1ZVR5cGUpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoYElubGluZSBsaXN0cyBtdXN0IGJlIGEgc2luZ2xlIHR5cGUsIG5vdCBhIG1peCBvZiAke2xpc3RUeXBlfSBhbmQgJHt2YWx1ZVR5cGV9YCkpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhdGUucmVzdWx0QXJyID0gSW5saW5lTGlzdCh0b21sVHlwZSh2YWx1ZSkpXG4gICAgICB9XG4gICAgICBpZiAoaXNGbG9hdCh2YWx1ZSkgfHwgaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAvLyB1bmJveCBub3cgdGhhdCB3ZSd2ZSB2ZXJpZmllZCB0aGV5J3JlIG9rXG4gICAgICAgIHRoaXMuc3RhdGUucmVzdWx0QXJyLnB1c2godmFsdWUudmFsdWVPZigpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5yZXN1bHRBcnIucHVzaCh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUlubGluZUxpc3ROZXh0KVxuICAgIH1cbiAgICBwYXJzZUlubGluZUxpc3ROZXh0ICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfU1AgfHwgdGhpcy5jaGFyID09PSBDVFJMX0kgfHwgdGhpcy5jaGFyID09PSBDVFJMX00gfHwgdGhpcy5jaGFyID09PSBDVFJMX0opIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX05VTSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VDb21tZW50KVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQ09NTUEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlSW5saW5lTGlzdClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1JTUUIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlSW5saW5lTGlzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIsIGV4cGVjdGVkIHdoaXRlc3BhY2UsIGNvbW1hICgsKSBvciBjbG9zZSBicmFja2V0IChdKScpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIElOTElORSBUQUJMRSAqL1xuICAgIHBhcnNlSW5saW5lVGFibGUgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IFBhcnNlci5FTkQgfHwgdGhpcy5jaGFyID09PSBDSEFSX05VTSB8fCB0aGlzLmNoYXIgPT09IENUUkxfSiB8fCB0aGlzLmNoYXIgPT09IENUUkxfTSkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VudGVybWluYXRlZCBpbmxpbmUgYXJyYXknKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1JDVUIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKHRoaXMuc3RhdGUucmVzdWx0VGFibGUgfHwgSW5saW5lVGFibGUoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5yZXN1bHRUYWJsZSkgdGhpcy5zdGF0ZS5yZXN1bHRUYWJsZSA9IElubGluZVRhYmxlKClcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlQXNzaWduLCB0aGlzLnJlY29yZElubGluZVRhYmxlVmFsdWUpXG4gICAgICB9XG4gICAgfVxuICAgIHJlY29yZElubGluZVRhYmxlVmFsdWUgKGt2KSB7XG4gICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5zdGF0ZS5yZXN1bHRUYWJsZVxuICAgICAgbGV0IGZpbmFsS2V5ID0ga3Yua2V5LnBvcCgpXG4gICAgICBmb3IgKGxldCBrdyBvZiBrdi5rZXkpIHtcbiAgICAgICAgaWYgKGhhc0tleSh0YXJnZXQsIGt3KSAmJiAoIWlzVGFibGUodGFyZ2V0W2t3XSkgfHwgdGFyZ2V0W2t3XVtfZGVjbGFyZWRdKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSB0YXJnZXRba3ddID0gdGFyZ2V0W2t3XSB8fCBUYWJsZSgpXG4gICAgICB9XG4gICAgICBpZiAoaGFzS2V5KHRhcmdldCwgZmluYWxLZXkpKSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgIH1cbiAgICAgIGlmIChpc0ludGVnZXIoa3YudmFsdWUpIHx8IGlzRmxvYXQoa3YudmFsdWUpKSB7XG4gICAgICAgIHRhcmdldFtmaW5hbEtleV0gPSBrdi52YWx1ZS52YWx1ZU9mKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtmaW5hbEtleV0gPSBrdi52YWx1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlSW5saW5lVGFibGVOZXh0KVxuICAgIH1cbiAgICBwYXJzZUlubGluZVRhYmxlTmV4dCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1NQIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9JKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gUGFyc2VyLkVORCB8fCB0aGlzLmNoYXIgPT09IENIQVJfTlVNIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9KIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9NKSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW50ZXJtaW5hdGVkIGlubGluZSBhcnJheScpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQ09NTUEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlSW5saW5lVGFibGUpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9SQ1VCKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUlubGluZVRhYmxlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciwgZXhwZWN0ZWQgd2hpdGVzcGFjZSwgY29tbWEgKCwpIG9yIGNsb3NlIGJyYWNrZXQgKF0pJykpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBUT01MUGFyc2VyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBwcmV0dHlFcnJvclxuXG5mdW5jdGlvbiBwcmV0dHlFcnJvciAoZXJyLCBidWYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChlcnIucG9zID09IG51bGwgfHwgZXJyLmxpbmUgPT0gbnVsbCkgcmV0dXJuIGVyclxuICBsZXQgbXNnID0gZXJyLm1lc3NhZ2VcbiAgbXNnICs9IGAgYXQgcm93ICR7ZXJyLmxpbmUgKyAxfSwgY29sICR7ZXJyLmNvbCArIDF9LCBwb3MgJHtlcnIucG9zfTpcXG5gXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGJ1ZiAmJiBidWYuc3BsaXQpIHtcbiAgICBjb25zdCBsaW5lcyA9IGJ1Zi5zcGxpdCgvXFxuLylcbiAgICBjb25zdCBsaW5lTnVtV2lkdGggPSBTdHJpbmcoTWF0aC5taW4obGluZXMubGVuZ3RoLCBlcnIubGluZSArIDMpKS5sZW5ndGhcbiAgICBsZXQgbGluZVBhZGRpbmcgPSAnICdcbiAgICB3aGlsZSAobGluZVBhZGRpbmcubGVuZ3RoIDwgbGluZU51bVdpZHRoKSBsaW5lUGFkZGluZyArPSAnICdcbiAgICBmb3IgKGxldCBpaSA9IE1hdGgubWF4KDAsIGVyci5saW5lIC0gMSk7IGlpIDwgTWF0aC5taW4obGluZXMubGVuZ3RoLCBlcnIubGluZSArIDIpOyArK2lpKSB7XG4gICAgICBsZXQgbGluZU51bSA9IFN0cmluZyhpaSArIDEpXG4gICAgICBpZiAobGluZU51bS5sZW5ndGggPCBsaW5lTnVtV2lkdGgpIGxpbmVOdW0gPSAnICcgKyBsaW5lTnVtXG4gICAgICBpZiAoZXJyLmxpbmUgPT09IGlpKSB7XG4gICAgICAgIG1zZyArPSBsaW5lTnVtICsgJz4gJyArIGxpbmVzW2lpXSArICdcXG4nXG4gICAgICAgIG1zZyArPSBsaW5lUGFkZGluZyArICcgICdcbiAgICAgICAgZm9yIChsZXQgaGggPSAwOyBoaCA8IGVyci5jb2w7ICsraGgpIHtcbiAgICAgICAgICBtc2cgKz0gJyAnXG4gICAgICAgIH1cbiAgICAgICAgbXNnICs9ICdeXFxuJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXNnICs9IGxpbmVOdW0gKyAnOiAnICsgbGluZXNbaWldICsgJ1xcbidcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZXJyLm1lc3NhZ2UgPSBtc2cgKyAnXFxuJ1xuICByZXR1cm4gZXJyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVN0cmluZ1xuXG5jb25zdCBUT01MUGFyc2VyID0gcmVxdWlyZSgnLi9saWIvdG9tbC1wYXJzZXIuanMnKVxuY29uc3QgcHJldHR5RXJyb3IgPSByZXF1aXJlKCcuL3BhcnNlLXByZXR0eS1lcnJvci5qcycpXG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nIChzdHIpIHtcbiAgaWYgKGdsb2JhbC5CdWZmZXIgJiYgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihzdHIpKSB7XG4gICAgc3RyID0gc3RyLnRvU3RyaW5nKCd1dGY4JylcbiAgfVxuICBjb25zdCBwYXJzZXIgPSBuZXcgVE9NTFBhcnNlcigpXG4gIHRyeSB7XG4gICAgcGFyc2VyLnBhcnNlKHN0cilcbiAgICByZXR1cm4gcGFyc2VyLmZpbmlzaCgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IHByZXR0eUVycm9yKGVyciwgc3RyKVxuICB9XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBwYXJzZUFzeW5jXG5cbmNvbnN0IFRPTUxQYXJzZXIgPSByZXF1aXJlKCcuL2xpYi90b21sLXBhcnNlci5qcycpXG5jb25zdCBwcmV0dHlFcnJvciA9IHJlcXVpcmUoJy4vcGFyc2UtcHJldHR5LWVycm9yLmpzJylcblxuZnVuY3Rpb24gcGFyc2VBc3luYyAoc3RyLCBvcHRzKSB7XG4gIGlmICghb3B0cykgb3B0cyA9IHt9XG4gIGNvbnN0IGluZGV4ID0gMFxuICBjb25zdCBibG9ja3NpemUgPSBvcHRzLmJsb2Nrc2l6ZSB8fCA0MDk2MFxuICBjb25zdCBwYXJzZXIgPSBuZXcgVE9NTFBhcnNlcigpXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2V0SW1tZWRpYXRlKHBhcnNlQXN5bmNOZXh0LCBpbmRleCwgYmxvY2tzaXplLCByZXNvbHZlLCByZWplY3QpXG4gIH0pXG4gIGZ1bmN0aW9uIHBhcnNlQXN5bmNOZXh0IChpbmRleCwgYmxvY2tzaXplLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICBpZiAoaW5kZXggPj0gc3RyLmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUocGFyc2VyLmZpbmlzaCgpKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QocHJldHR5RXJyb3IoZXJyLCBzdHIpKVxuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgcGFyc2VyLnBhcnNlKHN0ci5zbGljZShpbmRleCwgaW5kZXggKyBibG9ja3NpemUpKVxuICAgICAgc2V0SW1tZWRpYXRlKHBhcnNlQXN5bmNOZXh0LCBpbmRleCArIGJsb2Nrc2l6ZSwgYmxvY2tzaXplLCByZXNvbHZlLCByZWplY3QpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZWplY3QocHJldHR5RXJyb3IoZXJyLCBzdHIpKVxuICAgIH1cbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcbm1vZHVsZS5leHBvcnRzID0gcGFyc2VTdHJlYW1cblxuY29uc3Qgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IFRPTUxQYXJzZXIgPSByZXF1aXJlKCcuL2xpYi90b21sLXBhcnNlci5qcycpXG5cbmZ1bmN0aW9uIHBhcnNlU3RyZWFtIChzdG0pIHtcbiAgaWYgKHN0bSkge1xuICAgIHJldHVybiBwYXJzZVJlYWRhYmxlKHN0bSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcGFyc2VUcmFuc2Zvcm0oc3RtKVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVhZGFibGUgKHN0bSkge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgVE9NTFBhcnNlcigpXG4gIHN0bS5zZXRFbmNvZGluZygndXRmOCcpXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHJlYWRhYmxlXG4gICAgbGV0IGVuZGVkID0gZmFsc2VcbiAgICBsZXQgZXJyb3JlZCA9IGZhbHNlXG4gICAgZnVuY3Rpb24gZmluaXNoICgpIHtcbiAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgaWYgKHJlYWRhYmxlKSByZXR1cm5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmUocGFyc2VyLmZpbmlzaCgpKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpXG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVycm9yIChlcnIpIHtcbiAgICAgIGVycm9yZWQgPSB0cnVlXG4gICAgICByZWplY3QoZXJyKVxuICAgIH1cbiAgICBzdG0ub25jZSgnZW5kJywgZmluaXNoKVxuICAgIHN0bS5vbmNlKCdlcnJvcicsIGVycm9yKVxuICAgIHJlYWROZXh0KClcblxuICAgIGZ1bmN0aW9uIHJlYWROZXh0ICgpIHtcbiAgICAgIHJlYWRhYmxlID0gdHJ1ZVxuICAgICAgbGV0IGRhdGFcbiAgICAgIHdoaWxlICgoZGF0YSA9IHN0bS5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyc2VyLnBhcnNlKGRhdGEpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJldHVybiBlcnJvcihlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlYWRhYmxlID0gZmFsc2VcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVuZGVkKSByZXR1cm4gZmluaXNoKClcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVycm9yZWQpIHJldHVyblxuICAgICAgc3RtLm9uY2UoJ3JlYWRhYmxlJywgcmVhZE5leHQpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBwYXJzZVRyYW5zZm9ybSAoKSB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBUT01MUGFyc2VyKClcbiAgcmV0dXJuIG5ldyBzdHJlYW0uVHJhbnNmb3JtKHtcbiAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgIHRyYW5zZm9ybSAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VyLnBhcnNlKGNodW5rLnRvU3RyaW5nKGVuY29kaW5nKSlcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfVxuICAgICAgY2IoKVxuICAgIH0sXG4gICAgZmx1c2ggKGNiKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnB1c2gocGFyc2VyLmZpbmlzaCgpKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9XG4gICAgICBjYigpXG4gICAgfVxuICB9KVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9wYXJzZS1zdHJpbmcuanMnKVxubW9kdWxlLmV4cG9ydHMuYXN5bmMgPSByZXF1aXJlKCcuL3BhcnNlLWFzeW5jLmpzJylcbm1vZHVsZS5leHBvcnRzLnN0cmVhbSA9IHJlcXVpcmUoJy4vcGFyc2Utc3RyZWFtLmpzJylcbm1vZHVsZS5leHBvcnRzLnByZXR0eUVycm9yID0gcmVxdWlyZSgnLi9wYXJzZS1wcmV0dHktZXJyb3IuanMnKVxuIiwKICAgICIndXNlIHN0cmljdCdcbm1vZHVsZS5leHBvcnRzID0gc3RyaW5naWZ5XG5tb2R1bGUuZXhwb3J0cy52YWx1ZSA9IHN0cmluZ2lmeUlubGluZVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkgKG9iaikge1xuICBpZiAob2JqID09PSBudWxsKSB0aHJvdyB0eXBlRXJyb3IoJ251bGwnKVxuICBpZiAob2JqID09PSB2b2lkICgwKSkgdGhyb3cgdHlwZUVycm9yKCd1bmRlZmluZWQnKVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHRocm93IHR5cGVFcnJvcih0eXBlb2Ygb2JqKVxuXG4gIGlmICh0eXBlb2Ygb2JqLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykgb2JqID0gb2JqLnRvSlNPTigpXG4gIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgY29uc3QgdHlwZSA9IHRvbWxUeXBlKG9iailcbiAgaWYgKHR5cGUgIT09ICd0YWJsZScpIHRocm93IHR5cGVFcnJvcih0eXBlKVxuICByZXR1cm4gc3RyaW5naWZ5T2JqZWN0KCcnLCAnJywgb2JqKVxufVxuXG5mdW5jdGlvbiB0eXBlRXJyb3IgKHR5cGUpIHtcbiAgcmV0dXJuIG5ldyBFcnJvcignQ2FuIG9ubHkgc3RyaW5naWZ5IG9iamVjdHMsIG5vdCAnICsgdHlwZSlcbn1cblxuZnVuY3Rpb24gYXJyYXlPbmVUeXBlRXJyb3IgKCkge1xuICByZXR1cm4gbmV3IEVycm9yKFwiQXJyYXkgdmFsdWVzIGNhbid0IGhhdmUgbWl4ZWQgdHlwZXNcIilcbn1cblxuZnVuY3Rpb24gZ2V0SW5saW5lS2V5cyAob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmZpbHRlcihrZXkgPT4gaXNJbmxpbmUob2JqW2tleV0pKVxufVxuZnVuY3Rpb24gZ2V0Q29tcGxleEtleXMgKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5maWx0ZXIoa2V5ID0+ICFpc0lubGluZShvYmpba2V5XSkpXG59XG5cbmZ1bmN0aW9uIHRvSlNPTiAob2JqKSB7XG4gIGxldCBub2JqID0gQXJyYXkuaXNBcnJheShvYmopID8gW10gOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCAnX19wcm90b19fJykgPyB7WydfX3Byb3RvX18nXTogdW5kZWZpbmVkfSA6IHt9XG4gIGZvciAobGV0IHByb3Agb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmIChvYmpbcHJvcF0gJiYgdHlwZW9mIG9ialtwcm9wXS50b0pTT04gPT09ICdmdW5jdGlvbicgJiYgISgndG9JU09TdHJpbmcnIGluIG9ialtwcm9wXSkpIHtcbiAgICAgIG5vYmpbcHJvcF0gPSBvYmpbcHJvcF0udG9KU09OKClcbiAgICB9IGVsc2Uge1xuICAgICAgbm9ialtwcm9wXSA9IG9ialtwcm9wXVxuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ialxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHByZWZpeCwgaW5kZW50LCBvYmopIHtcbiAgb2JqID0gdG9KU09OKG9iailcbiAgdmFyIGlubGluZUtleXNcbiAgdmFyIGNvbXBsZXhLZXlzXG4gIGlubGluZUtleXMgPSBnZXRJbmxpbmVLZXlzKG9iailcbiAgY29tcGxleEtleXMgPSBnZXRDb21wbGV4S2V5cyhvYmopXG4gIHZhciByZXN1bHQgPSBbXVxuICB2YXIgaW5saW5lSW5kZW50ID0gaW5kZW50IHx8ICcnXG4gIGlubGluZUtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgIHZhciB0eXBlID0gdG9tbFR5cGUob2JqW2tleV0pXG4gICAgaWYgKHR5cGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGUgIT09ICdudWxsJykge1xuICAgICAgcmVzdWx0LnB1c2goaW5saW5lSW5kZW50ICsgc3RyaW5naWZ5S2V5KGtleSkgKyAnID0gJyArIHN0cmluZ2lmeUFueUlubGluZShvYmpba2V5XSwgdHJ1ZSkpXG4gICAgfVxuICB9KVxuICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHJlc3VsdC5wdXNoKCcnKVxuICB2YXIgY29tcGxleEluZGVudCA9IHByZWZpeCAmJiBpbmxpbmVLZXlzLmxlbmd0aCA+IDAgPyBpbmRlbnQgKyAnICAnIDogJydcbiAgY29tcGxleEtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgIHJlc3VsdC5wdXNoKHN0cmluZ2lmeUNvbXBsZXgocHJlZml4LCBjb21wbGV4SW5kZW50LCBrZXksIG9ialtrZXldKSlcbiAgfSlcbiAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKVxufVxuXG5mdW5jdGlvbiBpc0lubGluZSAodmFsdWUpIHtcbiAgc3dpdGNoICh0b21sVHlwZSh2YWx1ZSkpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgIGNhc2UgJ251bGwnOlxuICAgIGNhc2UgJ2ludGVnZXInOlxuICAgIGNhc2UgJ25hbic6XG4gICAgY2FzZSAnZmxvYXQnOlxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnZGF0ZXRpbWUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBjYXNlICdhcnJheSc6XG4gICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID09PSAwIHx8IHRvbWxUeXBlKHZhbHVlWzBdKSAhPT0gJ3RhYmxlJ1xuICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9tbFR5cGUgKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnXG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnXG4gIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLXR5cGVvZiAqL1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgKE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmICFPYmplY3QuaXModmFsdWUsIC0wKSkpIHtcbiAgICByZXR1cm4gJ2ludGVnZXInXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiAnZmxvYXQnXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gJ2Jvb2xlYW4nXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnc3RyaW5nJ1xuICB9IGVsc2UgaWYgKCd0b0lTT1N0cmluZycgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gaXNOYU4odmFsdWUpID8gJ3VuZGVmaW5lZCcgOiAnZGF0ZXRpbWUnXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJ2FycmF5J1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAndGFibGUnXG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5S2V5IChrZXkpIHtcbiAgdmFyIGtleVN0ciA9IFN0cmluZyhrZXkpXG4gIGlmICgvXlstQS1aYS16MC05X10rJC8udGVzdChrZXlTdHIpKSB7XG4gICAgcmV0dXJuIGtleVN0clxuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHJpbmdpZnlCYXNpY1N0cmluZyhrZXlTdHIpXG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QmFzaWNTdHJpbmcgKHN0cikge1xuICByZXR1cm4gJ1wiJyArIGVzY2FwZVN0cmluZyhzdHIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKSArICdcIidcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5TGl0ZXJhbFN0cmluZyAoc3RyKSB7XG4gIHJldHVybiBcIidcIiArIHN0ciArIFwiJ1wiXG59XG5cbmZ1bmN0aW9uIG51bXBhZCAobnVtLCBzdHIpIHtcbiAgd2hpbGUgKHN0ci5sZW5ndGggPCBudW0pIHN0ciA9ICcwJyArIHN0clxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKVxuICAgIC5yZXBsYWNlKC9bXFxiXS9nLCAnXFxcXGInKVxuICAgIC5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0JylcbiAgICAucmVwbGFjZSgvXFxuL2csICdcXFxcbicpXG4gICAgLnJlcGxhY2UoL1xcZi9nLCAnXFxcXGYnKVxuICAgIC5yZXBsYWNlKC9cXHIvZywgJ1xcXFxyJylcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgLnJlcGxhY2UoLyhbXFx1MDAwMC1cXHUwMDFmXFx1MDA3Zl0pLywgYyA9PiAnXFxcXHUnICsgbnVtcGFkKDQsIGMuY29kZVBvaW50QXQoMCkudG9TdHJpbmcoMTYpKSlcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnRyb2wtcmVnZXggKi9cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5TXVsdGlsaW5lU3RyaW5nIChzdHIpIHtcbiAgbGV0IGVzY2FwZWQgPSBzdHIuc3BsaXQoL1xcbi8pLm1hcChzdHIgPT4ge1xuICAgIHJldHVybiBlc2NhcGVTdHJpbmcoc3RyKS5yZXBsYWNlKC9cIig/PVwiXCIpL2csICdcXFxcXCInKVxuICB9KS5qb2luKCdcXG4nKVxuICBpZiAoZXNjYXBlZC5zbGljZSgtMSkgPT09ICdcIicpIGVzY2FwZWQgKz0gJ1xcXFxcXG4nXG4gIHJldHVybiAnXCJcIlwiXFxuJyArIGVzY2FwZWQgKyAnXCJcIlwiJ1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlBbnlJbmxpbmUgKHZhbHVlLCBtdWx0aWxpbmVPaykge1xuICBsZXQgdHlwZSA9IHRvbWxUeXBlKHZhbHVlKVxuICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAobXVsdGlsaW5lT2sgJiYgL1xcbi8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHR5cGUgPSAnc3RyaW5nLW11bHRpbGluZSdcbiAgICB9IGVsc2UgaWYgKCEvW1xcYlxcdFxcblxcZlxcciddLy50ZXN0KHZhbHVlKSAmJiAvXCIvLnRlc3QodmFsdWUpKSB7XG4gICAgICB0eXBlID0gJ3N0cmluZy1saXRlcmFsJ1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyaW5naWZ5SW5saW5lKHZhbHVlLCB0eXBlKVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlJbmxpbmUgKHZhbHVlLCB0eXBlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIXR5cGUpIHR5cGUgPSB0b21sVHlwZSh2YWx1ZSlcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nLW11bHRpbGluZSc6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5TXVsdGlsaW5lU3RyaW5nKHZhbHVlKVxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5QmFzaWNTdHJpbmcodmFsdWUpXG4gICAgY2FzZSAnc3RyaW5nLWxpdGVyYWwnOlxuICAgICAgcmV0dXJuIHN0cmluZ2lmeUxpdGVyYWxTdHJpbmcodmFsdWUpXG4gICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5SW50ZWdlcih2YWx1ZSlcbiAgICBjYXNlICdmbG9hdCc6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5RmxvYXQodmFsdWUpXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5Qm9vbGVhbih2YWx1ZSlcbiAgICBjYXNlICdkYXRldGltZSc6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5RGF0ZXRpbWUodmFsdWUpXG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgcmV0dXJuIHN0cmluZ2lmeUlubGluZUFycmF5KHZhbHVlLmZpbHRlcihfID0+IHRvbWxUeXBlKF8pICE9PSAnbnVsbCcgJiYgdG9tbFR5cGUoXykgIT09ICd1bmRlZmluZWQnICYmIHRvbWxUeXBlKF8pICE9PSAnbmFuJykpXG4gICAgY2FzZSAndGFibGUnOlxuICAgICAgcmV0dXJuIHN0cmluZ2lmeUlubGluZVRhYmxlKHZhbHVlKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IHR5cGVFcnJvcih0eXBlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUludGVnZXIgKHZhbHVlKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIHNlY3VyaXR5L2RldGVjdC11bnNhZmUtcmVnZXggKi9cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJ18nKVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlGbG9hdCAodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIHJldHVybiAnaW5mJ1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSAtSW5maW5pdHkpIHtcbiAgICByZXR1cm4gJy1pbmYnXG4gIH0gZWxzZSBpZiAoT2JqZWN0LmlzKHZhbHVlLCBOYU4pKSB7XG4gICAgcmV0dXJuICduYW4nXG4gIH0gZWxzZSBpZiAoT2JqZWN0LmlzKHZhbHVlLCAtMCkpIHtcbiAgICByZXR1cm4gJy0wLjAnXG4gIH1cbiAgdmFyIGNodW5rcyA9IFN0cmluZyh2YWx1ZSkuc3BsaXQoJy4nKVxuICB2YXIgaW50ID0gY2h1bmtzWzBdXG4gIHZhciBkZWMgPSBjaHVua3NbMV0gfHwgMFxuICByZXR1cm4gc3RyaW5naWZ5SW50ZWdlcihpbnQpICsgJy4nICsgZGVjXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUJvb2xlYW4gKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeURhdGV0aW1lICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKVxufVxuXG5mdW5jdGlvbiBpc051bWJlciAodHlwZSkge1xuICByZXR1cm4gdHlwZSA9PT0gJ2Zsb2F0JyB8fCB0eXBlID09PSAnaW50ZWdlcidcbn1cbmZ1bmN0aW9uIGFycmF5VHlwZSAodmFsdWVzKSB7XG4gIHZhciBjb250ZW50VHlwZSA9IHRvbWxUeXBlKHZhbHVlc1swXSlcbiAgaWYgKHZhbHVlcy5ldmVyeShfID0+IHRvbWxUeXBlKF8pID09PSBjb250ZW50VHlwZSkpIHJldHVybiBjb250ZW50VHlwZVxuICAvLyBtaXhlZCBpbnRlZ2VyL2Zsb2F0LCBlbWl0IGFzIGZsb2F0c1xuICBpZiAodmFsdWVzLmV2ZXJ5KF8gPT4gaXNOdW1iZXIodG9tbFR5cGUoXykpKSkgcmV0dXJuICdmbG9hdCdcbiAgcmV0dXJuICdtaXhlZCdcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQXJyYXkgKHZhbHVlcykge1xuICBjb25zdCB0eXBlID0gYXJyYXlUeXBlKHZhbHVlcylcbiAgaWYgKHR5cGUgPT09ICdtaXhlZCcpIHtcbiAgICB0aHJvdyBhcnJheU9uZVR5cGVFcnJvcigpXG4gIH1cbiAgcmV0dXJuIHR5cGVcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5SW5saW5lQXJyYXkgKHZhbHVlcykge1xuICB2YWx1ZXMgPSB0b0pTT04odmFsdWVzKVxuICBjb25zdCB0eXBlID0gdmFsaWRhdGVBcnJheSh2YWx1ZXMpXG4gIHZhciByZXN1bHQgPSAnWydcbiAgdmFyIHN0cmluZ2lmaWVkID0gdmFsdWVzLm1hcChfID0+IHN0cmluZ2lmeUlubGluZShfLCB0eXBlKSlcbiAgaWYgKHN0cmluZ2lmaWVkLmpvaW4oJywgJykubGVuZ3RoID4gNjAgfHwgL1xcbi8udGVzdChzdHJpbmdpZmllZCkpIHtcbiAgICByZXN1bHQgKz0gJ1xcbiAgJyArIHN0cmluZ2lmaWVkLmpvaW4oJyxcXG4gICcpICsgJ1xcbidcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgKz0gJyAnICsgc3RyaW5naWZpZWQuam9pbignLCAnKSArIChzdHJpbmdpZmllZC5sZW5ndGggPiAwID8gJyAnIDogJycpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdCArICddJ1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlJbmxpbmVUYWJsZSAodmFsdWUpIHtcbiAgdmFsdWUgPSB0b0pTT04odmFsdWUpXG4gIHZhciByZXN1bHQgPSBbXVxuICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgIHJlc3VsdC5wdXNoKHN0cmluZ2lmeUtleShrZXkpICsgJyA9ICcgKyBzdHJpbmdpZnlBbnlJbmxpbmUodmFsdWVba2V5XSwgZmFsc2UpKVxuICB9KVxuICByZXR1cm4gJ3sgJyArIHJlc3VsdC5qb2luKCcsICcpICsgKHJlc3VsdC5sZW5ndGggPiAwID8gJyAnIDogJycpICsgJ30nXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNvbXBsZXggKHByZWZpeCwgaW5kZW50LCBrZXksIHZhbHVlKSB7XG4gIHZhciB2YWx1ZVR5cGUgPSB0b21sVHlwZSh2YWx1ZSlcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHZhbHVlVHlwZSA9PT0gJ2FycmF5Jykge1xuICAgIHJldHVybiBzdHJpbmdpZnlBcnJheU9mVGFibGVzKHByZWZpeCwgaW5kZW50LCBrZXksIHZhbHVlKVxuICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gJ3RhYmxlJykge1xuICAgIHJldHVybiBzdHJpbmdpZnlDb21wbGV4VGFibGUocHJlZml4LCBpbmRlbnQsIGtleSwgdmFsdWUpXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKHZhbHVlVHlwZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlBcnJheU9mVGFibGVzIChwcmVmaXgsIGluZGVudCwga2V5LCB2YWx1ZXMpIHtcbiAgdmFsdWVzID0gdG9KU09OKHZhbHVlcylcbiAgdmFsaWRhdGVBcnJheSh2YWx1ZXMpXG4gIHZhciBmaXJzdFZhbHVlVHlwZSA9IHRvbWxUeXBlKHZhbHVlc1swXSlcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChmaXJzdFZhbHVlVHlwZSAhPT0gJ3RhYmxlJykgdGhyb3cgdHlwZUVycm9yKGZpcnN0VmFsdWVUeXBlKVxuICB2YXIgZnVsbEtleSA9IHByZWZpeCArIHN0cmluZ2lmeUtleShrZXkpXG4gIHZhciByZXN1bHQgPSAnJ1xuICB2YWx1ZXMuZm9yRWFjaCh0YWJsZSA9PiB7XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSByZXN1bHQgKz0gJ1xcbidcbiAgICByZXN1bHQgKz0gaW5kZW50ICsgJ1tbJyArIGZ1bGxLZXkgKyAnXV1cXG4nXG4gICAgcmVzdWx0ICs9IHN0cmluZ2lmeU9iamVjdChmdWxsS2V5ICsgJy4nLCBpbmRlbnQsIHRhYmxlKVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNvbXBsZXhUYWJsZSAocHJlZml4LCBpbmRlbnQsIGtleSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxLZXkgPSBwcmVmaXggKyBzdHJpbmdpZnlLZXkoa2V5KVxuICB2YXIgcmVzdWx0ID0gJydcbiAgaWYgKGdldElubGluZUtleXModmFsdWUpLmxlbmd0aCA+IDApIHtcbiAgICByZXN1bHQgKz0gaW5kZW50ICsgJ1snICsgZnVsbEtleSArICddXFxuJ1xuICB9XG4gIHJldHVybiByZXN1bHQgKyBzdHJpbmdpZnlPYmplY3QoZnVsbEtleSArICcuJywgaW5kZW50LCB2YWx1ZSlcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5leHBvcnRzLnBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZS5qcycpXG5leHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5LmpzJylcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBiYWxhbmNlZDtcbmZ1bmN0aW9uIGJhbGFuY2VkKGEsIGIsIHN0cikge1xuICBpZiAoYSBpbnN0YW5jZW9mIFJlZ0V4cCkgYSA9IG1heWJlTWF0Y2goYSwgc3RyKTtcbiAgaWYgKGIgaW5zdGFuY2VvZiBSZWdFeHApIGIgPSBtYXliZU1hdGNoKGIsIHN0cik7XG5cbiAgdmFyIHIgPSByYW5nZShhLCBiLCBzdHIpO1xuXG4gIHJldHVybiByICYmIHtcbiAgICBzdGFydDogclswXSxcbiAgICBlbmQ6IHJbMV0sXG4gICAgcHJlOiBzdHIuc2xpY2UoMCwgclswXSksXG4gICAgYm9keTogc3RyLnNsaWNlKHJbMF0gKyBhLmxlbmd0aCwgclsxXSksXG4gICAgcG9zdDogc3RyLnNsaWNlKHJbMV0gKyBiLmxlbmd0aClcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWF5YmVNYXRjaChyZWcsIHN0cikge1xuICB2YXIgbSA9IHN0ci5tYXRjaChyZWcpO1xuICByZXR1cm4gbSA/IG1bMF0gOiBudWxsO1xufVxuXG5iYWxhbmNlZC5yYW5nZSA9IHJhbmdlO1xuZnVuY3Rpb24gcmFuZ2UoYSwgYiwgc3RyKSB7XG4gIHZhciBiZWdzLCBiZWcsIGxlZnQsIHJpZ2h0LCByZXN1bHQ7XG4gIHZhciBhaSA9IHN0ci5pbmRleE9mKGEpO1xuICB2YXIgYmkgPSBzdHIuaW5kZXhPZihiLCBhaSArIDEpO1xuICB2YXIgaSA9IGFpO1xuXG4gIGlmIChhaSA+PSAwICYmIGJpID4gMCkge1xuICAgIGlmKGE9PT1iKSB7XG4gICAgICByZXR1cm4gW2FpLCBiaV07XG4gICAgfVxuICAgIGJlZ3MgPSBbXTtcbiAgICBsZWZ0ID0gc3RyLmxlbmd0aDtcblxuICAgIHdoaWxlIChpID49IDAgJiYgIXJlc3VsdCkge1xuICAgICAgaWYgKGkgPT0gYWkpIHtcbiAgICAgICAgYmVncy5wdXNoKGkpO1xuICAgICAgICBhaSA9IHN0ci5pbmRleE9mKGEsIGkgKyAxKTtcbiAgICAgIH0gZWxzZSBpZiAoYmVncy5sZW5ndGggPT0gMSkge1xuICAgICAgICByZXN1bHQgPSBbIGJlZ3MucG9wKCksIGJpIF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiZWcgPSBiZWdzLnBvcCgpO1xuICAgICAgICBpZiAoYmVnIDwgbGVmdCkge1xuICAgICAgICAgIGxlZnQgPSBiZWc7XG4gICAgICAgICAgcmlnaHQgPSBiaTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJpID0gc3RyLmluZGV4T2YoYiwgaSArIDEpO1xuICAgICAgfVxuXG4gICAgICBpID0gYWkgPCBiaSAmJiBhaSA+PSAwID8gYWkgOiBiaTtcbiAgICB9XG5cbiAgICBpZiAoYmVncy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IFsgbGVmdCwgcmlnaHQgXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwKICAgICJ2YXIgYmFsYW5jZWQgPSByZXF1aXJlKCdiYWxhbmNlZC1tYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cGFuZFRvcDtcblxudmFyIGVzY1NsYXNoID0gJ1xcMFNMQVNIJytNYXRoLnJhbmRvbSgpKydcXDAnO1xudmFyIGVzY09wZW4gPSAnXFwwT1BFTicrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NDbG9zZSA9ICdcXDBDTE9TRScrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NDb21tYSA9ICdcXDBDT01NQScrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NQZXJpb2QgPSAnXFwwUEVSSU9EJytNYXRoLnJhbmRvbSgpKydcXDAnO1xuXG5mdW5jdGlvbiBudW1lcmljKHN0cikge1xuICByZXR1cm4gcGFyc2VJbnQoc3RyLCAxMCkgPT0gc3RyXG4gICAgPyBwYXJzZUludChzdHIsIDEwKVxuICAgIDogc3RyLmNoYXJDb2RlQXQoMCk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUJyYWNlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgnXFxcXFxcXFwnKS5qb2luKGVzY1NsYXNoKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxceycpLmpvaW4oZXNjT3BlbilcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXH0nKS5qb2luKGVzY0Nsb3NlKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxcLCcpLmpvaW4oZXNjQ29tbWEpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcXFwuJykuam9pbihlc2NQZXJpb2QpO1xufVxuXG5mdW5jdGlvbiB1bmVzY2FwZUJyYWNlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdChlc2NTbGFzaCkuam9pbignXFxcXCcpXG4gICAgICAgICAgICAuc3BsaXQoZXNjT3Blbikuam9pbigneycpXG4gICAgICAgICAgICAuc3BsaXQoZXNjQ2xvc2UpLmpvaW4oJ30nKVxuICAgICAgICAgICAgLnNwbGl0KGVzY0NvbW1hKS5qb2luKCcsJylcbiAgICAgICAgICAgIC5zcGxpdChlc2NQZXJpb2QpLmpvaW4oJy4nKTtcbn1cblxuXG4vLyBCYXNpY2FsbHkganVzdCBzdHIuc3BsaXQoXCIsXCIpLCBidXQgaGFuZGxpbmcgY2FzZXNcbi8vIHdoZXJlIHdlIGhhdmUgbmVzdGVkIGJyYWNlZCBzZWN0aW9ucywgd2hpY2ggc2hvdWxkIGJlXG4vLyB0cmVhdGVkIGFzIGluZGl2aWR1YWwgbWVtYmVycywgbGlrZSB7YSx7YixjfSxkfVxuZnVuY3Rpb24gcGFyc2VDb21tYVBhcnRzKHN0cikge1xuICBpZiAoIXN0cilcbiAgICByZXR1cm4gWycnXTtcblxuICB2YXIgcGFydHMgPSBbXTtcbiAgdmFyIG0gPSBiYWxhbmNlZCgneycsICd9Jywgc3RyKTtcblxuICBpZiAoIW0pXG4gICAgcmV0dXJuIHN0ci5zcGxpdCgnLCcpO1xuXG4gIHZhciBwcmUgPSBtLnByZTtcbiAgdmFyIGJvZHkgPSBtLmJvZHk7XG4gIHZhciBwb3N0ID0gbS5wb3N0O1xuICB2YXIgcCA9IHByZS5zcGxpdCgnLCcpO1xuXG4gIHBbcC5sZW5ndGgtMV0gKz0gJ3snICsgYm9keSArICd9JztcbiAgdmFyIHBvc3RQYXJ0cyA9IHBhcnNlQ29tbWFQYXJ0cyhwb3N0KTtcbiAgaWYgKHBvc3QubGVuZ3RoKSB7XG4gICAgcFtwLmxlbmd0aC0xXSArPSBwb3N0UGFydHMuc2hpZnQoKTtcbiAgICBwLnB1c2guYXBwbHkocCwgcG9zdFBhcnRzKTtcbiAgfVxuXG4gIHBhcnRzLnB1c2guYXBwbHkocGFydHMsIHApO1xuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuZnVuY3Rpb24gZXhwYW5kVG9wKHN0cikge1xuICBpZiAoIXN0cilcbiAgICByZXR1cm4gW107XG5cbiAgLy8gSSBkb24ndCBrbm93IHdoeSBCYXNoIDQuMyBkb2VzIHRoaXMsIGJ1dCBpdCBkb2VzLlxuICAvLyBBbnl0aGluZyBzdGFydGluZyB3aXRoIHt9IHdpbGwgaGF2ZSB0aGUgZmlyc3QgdHdvIGJ5dGVzIHByZXNlcnZlZFxuICAvLyBidXQgKm9ubHkqIGF0IHRoZSB0b3AgbGV2ZWwsIHNvIHt9LGF9YiB3aWxsIG5vdCBleHBhbmQgdG8gYW55dGhpbmcsXG4gIC8vIGJ1dCBhe30sYn1jIHdpbGwgYmUgZXhwYW5kZWQgdG8gW2F9YyxhYmNdLlxuICAvLyBPbmUgY291bGQgYXJndWUgdGhhdCB0aGlzIGlzIGEgYnVnIGluIEJhc2gsIGJ1dCBzaW5jZSB0aGUgZ29hbCBvZlxuICAvLyB0aGlzIG1vZHVsZSBpcyB0byBtYXRjaCBCYXNoJ3MgcnVsZXMsIHdlIGVzY2FwZSBhIGxlYWRpbmcge31cbiAgaWYgKHN0ci5zdWJzdHIoMCwgMikgPT09ICd7fScpIHtcbiAgICBzdHIgPSAnXFxcXHtcXFxcfScgKyBzdHIuc3Vic3RyKDIpO1xuICB9XG5cbiAgcmV0dXJuIGV4cGFuZChlc2NhcGVCcmFjZXMoc3RyKSwgdHJ1ZSkubWFwKHVuZXNjYXBlQnJhY2VzKTtcbn1cblxuZnVuY3Rpb24gZW1icmFjZShzdHIpIHtcbiAgcmV0dXJuICd7JyArIHN0ciArICd9Jztcbn1cbmZ1bmN0aW9uIGlzUGFkZGVkKGVsKSB7XG4gIHJldHVybiAvXi0/MFxcZC8udGVzdChlbCk7XG59XG5cbmZ1bmN0aW9uIGx0ZShpLCB5KSB7XG4gIHJldHVybiBpIDw9IHk7XG59XG5mdW5jdGlvbiBndGUoaSwgeSkge1xuICByZXR1cm4gaSA+PSB5O1xufVxuXG5mdW5jdGlvbiBleHBhbmQoc3RyLCBpc1RvcCkge1xuICB2YXIgZXhwYW5zaW9ucyA9IFtdO1xuXG4gIHZhciBtID0gYmFsYW5jZWQoJ3snLCAnfScsIHN0cik7XG4gIGlmICghbSkgcmV0dXJuIFtzdHJdO1xuXG4gIC8vIG5vIG5lZWQgdG8gZXhwYW5kIHByZSwgc2luY2UgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBmcmVlIG9mIGJyYWNlLXNldHNcbiAgdmFyIHByZSA9IG0ucHJlO1xuICB2YXIgcG9zdCA9IG0ucG9zdC5sZW5ndGhcbiAgICA/IGV4cGFuZChtLnBvc3QsIGZhbHNlKVxuICAgIDogWycnXTtcblxuICBpZiAoL1xcJCQvLnRlc3QobS5wcmUpKSB7ICAgIFxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcG9zdC5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIGV4cGFuc2lvbiA9IHByZSsgJ3snICsgbS5ib2R5ICsgJ30nICsgcG9zdFtrXTtcbiAgICAgIGV4cGFuc2lvbnMucHVzaChleHBhbnNpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXNOdW1lcmljU2VxdWVuY2UgPSAvXi0/XFxkK1xcLlxcLi0/XFxkKyg/OlxcLlxcLi0/XFxkKyk/JC8udGVzdChtLmJvZHkpO1xuICAgIHZhciBpc0FscGhhU2VxdWVuY2UgPSAvXlthLXpBLVpdXFwuXFwuW2EtekEtWl0oPzpcXC5cXC4tP1xcZCspPyQvLnRlc3QobS5ib2R5KTtcbiAgICB2YXIgaXNTZXF1ZW5jZSA9IGlzTnVtZXJpY1NlcXVlbmNlIHx8IGlzQWxwaGFTZXF1ZW5jZTtcbiAgICB2YXIgaXNPcHRpb25zID0gbS5ib2R5LmluZGV4T2YoJywnKSA+PSAwO1xuICAgIGlmICghaXNTZXF1ZW5jZSAmJiAhaXNPcHRpb25zKSB7XG4gICAgICAvLyB7YX0sYn1cbiAgICAgIGlmIChtLnBvc3QubWF0Y2goLywuKlxcfS8pKSB7XG4gICAgICAgIHN0ciA9IG0ucHJlICsgJ3snICsgbS5ib2R5ICsgZXNjQ2xvc2UgKyBtLnBvc3Q7XG4gICAgICAgIHJldHVybiBleHBhbmQoc3RyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc3RyXTtcbiAgICB9XG5cbiAgICB2YXIgbjtcbiAgICBpZiAoaXNTZXF1ZW5jZSkge1xuICAgICAgbiA9IG0uYm9keS5zcGxpdCgvXFwuXFwuLyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBwYXJzZUNvbW1hUGFydHMobS5ib2R5KTtcbiAgICAgIGlmIChuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyB4e3thLGJ9fXkgPT0+IHh7YX15IHh7Yn15XG4gICAgICAgIG4gPSBleHBhbmQoblswXSwgZmFsc2UpLm1hcChlbWJyYWNlKTtcbiAgICAgICAgaWYgKG4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHBvc3QubWFwKGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICAgIHJldHVybiBtLnByZSArIG5bMF0gKyBwO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgbiBpcyB0aGUgcGFydHMsIGFuZCB3ZSBrbm93IGl0J3Mgbm90IGEgY29tbWEgc2V0XG4gICAgLy8gd2l0aCBhIHNpbmdsZSBlbnRyeS5cbiAgICB2YXIgTjtcblxuICAgIGlmIChpc1NlcXVlbmNlKSB7XG4gICAgICB2YXIgeCA9IG51bWVyaWMoblswXSk7XG4gICAgICB2YXIgeSA9IG51bWVyaWMoblsxXSk7XG4gICAgICB2YXIgd2lkdGggPSBNYXRoLm1heChuWzBdLmxlbmd0aCwgblsxXS5sZW5ndGgpXG4gICAgICB2YXIgaW5jciA9IG4ubGVuZ3RoID09IDNcbiAgICAgICAgPyBNYXRoLmFicyhudW1lcmljKG5bMl0pKVxuICAgICAgICA6IDE7XG4gICAgICB2YXIgdGVzdCA9IGx0ZTtcbiAgICAgIHZhciByZXZlcnNlID0geSA8IHg7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICBpbmNyICo9IC0xO1xuICAgICAgICB0ZXN0ID0gZ3RlO1xuICAgICAgfVxuICAgICAgdmFyIHBhZCA9IG4uc29tZShpc1BhZGRlZCk7XG5cbiAgICAgIE4gPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IHg7IHRlc3QoaSwgeSk7IGkgKz0gaW5jcikge1xuICAgICAgICB2YXIgYztcbiAgICAgICAgaWYgKGlzQWxwaGFTZXF1ZW5jZSkge1xuICAgICAgICAgIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xuICAgICAgICAgIGlmIChjID09PSAnXFxcXCcpXG4gICAgICAgICAgICBjID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYyA9IFN0cmluZyhpKTtcbiAgICAgICAgICBpZiAocGFkKSB7XG4gICAgICAgICAgICB2YXIgbmVlZCA9IHdpZHRoIC0gYy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobmVlZCA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIHogPSBuZXcgQXJyYXkobmVlZCArIDEpLmpvaW4oJzAnKTtcbiAgICAgICAgICAgICAgaWYgKGkgPCAwKVxuICAgICAgICAgICAgICAgIGMgPSAnLScgKyB6ICsgYy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGMgPSB6ICsgYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgTi5wdXNoKGMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBOID0gW107XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbi5sZW5ndGg7IGorKykge1xuICAgICAgICBOLnB1c2guYXBwbHkoTiwgZXhwYW5kKG5bal0sIGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBOLmxlbmd0aDsgaisrKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHBvc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGV4cGFuc2lvbiA9IHByZSArIE5bal0gKyBwb3N0W2tdO1xuICAgICAgICBpZiAoIWlzVG9wIHx8IGlzU2VxdWVuY2UgfHwgZXhwYW5zaW9uKVxuICAgICAgICAgIGV4cGFuc2lvbnMucHVzaChleHBhbnNpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbnNpb25zO1xufVxuXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmZyb21DYWxsYmFjayA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBhcmdzLnB1c2goKGVyciwgcmVzKSA9PiAoZXJyICE9IG51bGwpID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcykpXG4gICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgICB9KVxuICAgIH1cbiAgfSwgJ25hbWUnLCB7IHZhbHVlOiBmbi5uYW1lIH0pXG59XG5cbmV4cG9ydHMuZnJvbVByb21pc2UgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGNvbnN0IGNiID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdXG4gICAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgZWxzZSB7XG4gICAgICBhcmdzLnBvcCgpXG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmdzKS50aGVuKHIgPT4gY2IobnVsbCwgciksIGNiKVxuICAgIH1cbiAgfSwgJ25hbWUnLCB7IHZhbHVlOiBmbi5uYW1lIH0pXG59XG4iLAogICAgInZhciBjb25zdGFudHMgPSByZXF1aXJlKCdjb25zdGFudHMnKVxuXG52YXIgb3JpZ0N3ZCA9IHByb2Nlc3MuY3dkXG52YXIgY3dkID0gbnVsbFxuXG52YXIgcGxhdGZvcm0gPSBwcm9jZXNzLmVudi5HUkFDRUZVTF9GU19QTEFURk9STSB8fCBwcm9jZXNzLnBsYXRmb3JtXG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24oKSB7XG4gIGlmICghY3dkKVxuICAgIGN3ZCA9IG9yaWdDd2QuY2FsbChwcm9jZXNzKVxuICByZXR1cm4gY3dkXG59XG50cnkge1xuICBwcm9jZXNzLmN3ZCgpXG59IGNhdGNoIChlcikge31cblxuLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgdW50aWwgbm9kZS5qcyAxMiBpcyByZXF1aXJlZFxuaWYgKHR5cGVvZiBwcm9jZXNzLmNoZGlyID09PSAnZnVuY3Rpb24nKSB7XG4gIHZhciBjaGRpciA9IHByb2Nlc3MuY2hkaXJcbiAgcHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkKSB7XG4gICAgY3dkID0gbnVsbFxuICAgIGNoZGlyLmNhbGwocHJvY2VzcywgZClcbiAgfVxuICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSBPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvY2Vzcy5jaGRpciwgY2hkaXIpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hcblxuZnVuY3Rpb24gcGF0Y2ggKGZzKSB7XG4gIC8vIChyZS0paW1wbGVtZW50IHNvbWUgdGhpbmdzIHRoYXQgYXJlIGtub3duIGJ1c3RlZCBvciBtaXNzaW5nLlxuXG4gIC8vIGxjaG1vZCwgYnJva2VuIHByaW9yIHRvIDAuNi4yXG4gIC8vIGJhY2stcG9ydCB0aGUgZml4IGhlcmUuXG4gIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkoJ09fU1lNTElOSycpICYmXG4gICAgICBwcm9jZXNzLnZlcnNpb24ubWF0Y2goL152MFxcLjZcXC5bMC0yXXxedjBcXC41XFwuLykpIHtcbiAgICBwYXRjaExjaG1vZChmcylcbiAgfVxuXG4gIC8vIGx1dGltZXMgaW1wbGVtZW50YXRpb24sIG9yIG5vLW9wXG4gIGlmICghZnMubHV0aW1lcykge1xuICAgIHBhdGNoTHV0aW1lcyhmcylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1ncmFjZWZ1bC1mcy9pc3N1ZXMvNFxuICAvLyBDaG93biBzaG91bGQgbm90IGZhaWwgb24gZWludmFsIG9yIGVwZXJtIGlmIG5vbi1yb290LlxuICAvLyBJdCBzaG91bGQgbm90IGZhaWwgb24gZW5vc3lzIGV2ZXIsIGFzIHRoaXMganVzdCBpbmRpY2F0ZXNcbiAgLy8gdGhhdCBhIGZzIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgaW50ZW5kZWQgb3BlcmF0aW9uLlxuXG4gIGZzLmNob3duID0gY2hvd25GaXgoZnMuY2hvd24pXG4gIGZzLmZjaG93biA9IGNob3duRml4KGZzLmZjaG93bilcbiAgZnMubGNob3duID0gY2hvd25GaXgoZnMubGNob3duKVxuXG4gIGZzLmNobW9kID0gY2htb2RGaXgoZnMuY2htb2QpXG4gIGZzLmZjaG1vZCA9IGNobW9kRml4KGZzLmZjaG1vZClcbiAgZnMubGNobW9kID0gY2htb2RGaXgoZnMubGNobW9kKVxuXG4gIGZzLmNob3duU3luYyA9IGNob3duRml4U3luYyhmcy5jaG93blN5bmMpXG4gIGZzLmZjaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMuZmNob3duU3luYylcbiAgZnMubGNob3duU3luYyA9IGNob3duRml4U3luYyhmcy5sY2hvd25TeW5jKVxuXG4gIGZzLmNobW9kU3luYyA9IGNobW9kRml4U3luYyhmcy5jaG1vZFN5bmMpXG4gIGZzLmZjaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMuZmNobW9kU3luYylcbiAgZnMubGNobW9kU3luYyA9IGNobW9kRml4U3luYyhmcy5sY2htb2RTeW5jKVxuXG4gIGZzLnN0YXQgPSBzdGF0Rml4KGZzLnN0YXQpXG4gIGZzLmZzdGF0ID0gc3RhdEZpeChmcy5mc3RhdClcbiAgZnMubHN0YXQgPSBzdGF0Rml4KGZzLmxzdGF0KVxuXG4gIGZzLnN0YXRTeW5jID0gc3RhdEZpeFN5bmMoZnMuc3RhdFN5bmMpXG4gIGZzLmZzdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLmZzdGF0U3luYylcbiAgZnMubHN0YXRTeW5jID0gc3RhdEZpeFN5bmMoZnMubHN0YXRTeW5jKVxuXG4gIC8vIGlmIGxjaG1vZC9sY2hvd24gZG8gbm90IGV4aXN0LCB0aGVuIG1ha2UgdGhlbSBuby1vcHNcbiAgaWYgKGZzLmNobW9kICYmICFmcy5sY2htb2QpIHtcbiAgICBmcy5sY2htb2QgPSBmdW5jdGlvbiAocGF0aCwgbW9kZSwgY2IpIHtcbiAgICAgIGlmIChjYikgcHJvY2Vzcy5uZXh0VGljayhjYilcbiAgICB9XG4gICAgZnMubGNobW9kU3luYyA9IGZ1bmN0aW9uICgpIHt9XG4gIH1cbiAgaWYgKGZzLmNob3duICYmICFmcy5sY2hvd24pIHtcbiAgICBmcy5sY2hvd24gPSBmdW5jdGlvbiAocGF0aCwgdWlkLCBnaWQsIGNiKSB7XG4gICAgICBpZiAoY2IpIHByb2Nlc3MubmV4dFRpY2soY2IpXG4gICAgfVxuICAgIGZzLmxjaG93blN5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICB9XG5cbiAgLy8gb24gV2luZG93cywgQS9WIHNvZnR3YXJlIGNhbiBsb2NrIHRoZSBkaXJlY3RvcnksIGNhdXNpbmcgdGhpc1xuICAvLyB0byBmYWlsIHdpdGggYW4gRUFDQ0VTIG9yIEVQRVJNIGlmIHRoZSBkaXJlY3RvcnkgY29udGFpbnMgbmV3bHlcbiAgLy8gY3JlYXRlZCBmaWxlcy4gIFRyeSBhZ2FpbiBvbiBmYWlsdXJlLCBmb3IgdXAgdG8gNjAgc2Vjb25kcy5cblxuICAvLyBTZXQgdGhlIHRpbWVvdXQgdGhpcyBsb25nIGJlY2F1c2Ugc29tZSBXaW5kb3dzIEFudGktVmlydXMsIHN1Y2ggYXMgUGFyaXR5XG4gIC8vIGJpdDksIG1heSBsb2NrIGZpbGVzIGZvciB1cCB0byBhIG1pbnV0ZSwgY2F1c2luZyBucG0gcGFja2FnZSBpbnN0YWxsXG4gIC8vIGZhaWx1cmVzLiBBbHNvLCB0YWtlIGNhcmUgdG8geWllbGQgdGhlIHNjaGVkdWxlci4gV2luZG93cyBzY2hlZHVsaW5nIGdpdmVzXG4gIC8vIENQVSB0byBhIGJ1c3kgbG9vcGluZyBwcm9jZXNzLCB3aGljaCBjYW4gY2F1c2UgdGhlIHByb2dyYW0gY2F1c2luZyB0aGUgbG9ja1xuICAvLyBjb250ZW50aW9uIHRvIGJlIHN0YXJ2ZWQgb2YgQ1BVIGJ5IG5vZGUsIHNvIHRoZSBjb250ZW50aW9uIGRvZXNuJ3QgcmVzb2x2ZS5cbiAgaWYgKHBsYXRmb3JtID09PSBcIndpbjMyXCIpIHtcbiAgICBmcy5yZW5hbWUgPSB0eXBlb2YgZnMucmVuYW1lICE9PSAnZnVuY3Rpb24nID8gZnMucmVuYW1lXG4gICAgOiAoZnVuY3Rpb24gKGZzJHJlbmFtZSkge1xuICAgICAgZnVuY3Rpb24gcmVuYW1lIChmcm9tLCB0bywgY2IpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICB2YXIgYmFja29mZiA9IDA7XG4gICAgICAgIGZzJHJlbmFtZShmcm9tLCB0bywgZnVuY3Rpb24gQ0IgKGVyKSB7XG4gICAgICAgICAgaWYgKGVyXG4gICAgICAgICAgICAgICYmIChlci5jb2RlID09PSBcIkVBQ0NFU1wiIHx8IGVyLmNvZGUgPT09IFwiRVBFUk1cIiB8fCBlci5jb2RlID09PSBcIkVCVVNZXCIpXG4gICAgICAgICAgICAgICYmIERhdGUubm93KCkgLSBzdGFydCA8IDYwMDAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBmcy5zdGF0KHRvLCBmdW5jdGlvbiAoc3RhdGVyLCBzdCkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZXIgJiYgc3RhdGVyLmNvZGUgPT09IFwiRU5PRU5UXCIpXG4gICAgICAgICAgICAgICAgICBmcyRyZW5hbWUoZnJvbSwgdG8sIENCKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICBjYihlcilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGJhY2tvZmYpXG4gICAgICAgICAgICBpZiAoYmFja29mZiA8IDEwMClcbiAgICAgICAgICAgICAgYmFja29mZiArPSAxMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNiKSBjYihlcilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIE9iamVjdC5zZXRQcm90b3R5cGVPZihyZW5hbWUsIGZzJHJlbmFtZSlcbiAgICAgIHJldHVybiByZW5hbWVcbiAgICB9KShmcy5yZW5hbWUpXG4gIH1cblxuICAvLyBpZiByZWFkKCkgcmV0dXJucyBFQUdBSU4sIHRoZW4ganVzdCB0cnkgaXQgYWdhaW4uXG4gIGZzLnJlYWQgPSB0eXBlb2YgZnMucmVhZCAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlYWRcbiAgOiAoZnVuY3Rpb24gKGZzJHJlYWQpIHtcbiAgICBmdW5jdGlvbiByZWFkIChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrXykge1xuICAgICAgdmFyIGNhbGxiYWNrXG4gICAgICBpZiAoY2FsbGJhY2tfICYmIHR5cGVvZiBjYWxsYmFja18gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIGVhZ0NvdW50ZXIgPSAwXG4gICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGVyLCBfLCBfXykge1xuICAgICAgICAgIGlmIChlciAmJiBlci5jb2RlID09PSAnRUFHQUlOJyAmJiBlYWdDb3VudGVyIDwgMTApIHtcbiAgICAgICAgICAgIGVhZ0NvdW50ZXIgKytcbiAgICAgICAgICAgIHJldHVybiBmcyRyZWFkLmNhbGwoZnMsIGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhbGxiYWNrXy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmcyRyZWFkLmNhbGwoZnMsIGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgLy8gVGhpcyBlbnN1cmVzIGB1dGlsLnByb21pc2lmeWAgd29ya3MgYXMgaXQgZG9lcyBmb3IgbmF0aXZlIGBmcy5yZWFkYC5cbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVhZCwgZnMkcmVhZClcbiAgICByZXR1cm4gcmVhZFxuICB9KShmcy5yZWFkKVxuXG4gIGZzLnJlYWRTeW5jID0gdHlwZW9mIGZzLnJlYWRTeW5jICE9PSAnZnVuY3Rpb24nID8gZnMucmVhZFN5bmNcbiAgOiAoZnVuY3Rpb24gKGZzJHJlYWRTeW5jKSB7IHJldHVybiBmdW5jdGlvbiAoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKSB7XG4gICAgdmFyIGVhZ0NvdW50ZXIgPSAwXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmcyRyZWFkU3luYy5jYWxsKGZzLCBmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoZXIuY29kZSA9PT0gJ0VBR0FJTicgJiYgZWFnQ291bnRlciA8IDEwKSB7XG4gICAgICAgICAgZWFnQ291bnRlciArK1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gIH19KShmcy5yZWFkU3luYylcblxuICBmdW5jdGlvbiBwYXRjaExjaG1vZCAoZnMpIHtcbiAgICBmcy5sY2htb2QgPSBmdW5jdGlvbiAocGF0aCwgbW9kZSwgY2FsbGJhY2spIHtcbiAgICAgIGZzLm9wZW4oIHBhdGhcbiAgICAgICAgICAgICAsIGNvbnN0YW50cy5PX1dST05MWSB8IGNvbnN0YW50cy5PX1NZTUxJTktcbiAgICAgICAgICAgICAsIG1vZGVcbiAgICAgICAgICAgICAsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVycilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyBwcmVmZXIgdG8gcmV0dXJuIHRoZSBjaG1vZCBlcnJvciwgaWYgb25lIG9jY3VycyxcbiAgICAgICAgLy8gYnV0IHN0aWxsIHRyeSB0byBjbG9zZSwgYW5kIHJlcG9ydCBjbG9zaW5nIGVycm9ycyBpZiB0aGV5IG9jY3VyLlxuICAgICAgICBmcy5mY2htb2QoZmQsIG1vZGUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBmcy5jbG9zZShmZCwgZnVuY3Rpb24oZXJyMikge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIgfHwgZXJyMilcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmcy5sY2htb2RTeW5jID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUpIHtcbiAgICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1dST05MWSB8IGNvbnN0YW50cy5PX1NZTUxJTkssIG1vZGUpXG5cbiAgICAgIC8vIHByZWZlciB0byByZXR1cm4gdGhlIGNobW9kIGVycm9yLCBpZiBvbmUgb2NjdXJzLFxuICAgICAgLy8gYnV0IHN0aWxsIHRyeSB0byBjbG9zZSwgYW5kIHJlcG9ydCBjbG9zaW5nIGVycm9ycyBpZiB0aGV5IG9jY3VyLlxuICAgICAgdmFyIHRocmV3ID0gdHJ1ZVxuICAgICAgdmFyIHJldFxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0ID0gZnMuZmNobW9kU3luYyhmZCwgbW9kZSlcbiAgICAgICAgdGhyZXcgPSBmYWxzZVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHRocmV3KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICB9IGNhdGNoIChlcikge31cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXRjaEx1dGltZXMgKGZzKSB7XG4gICAgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eShcIk9fU1lNTElOS1wiKSAmJiBmcy5mdXRpbWVzKSB7XG4gICAgICBmcy5sdXRpbWVzID0gZnVuY3Rpb24gKHBhdGgsIGF0LCBtdCwgY2IpIHtcbiAgICAgICAgZnMub3BlbihwYXRoLCBjb25zdGFudHMuT19TWU1MSU5LLCBmdW5jdGlvbiAoZXIsIGZkKSB7XG4gICAgICAgICAgaWYgKGVyKSB7XG4gICAgICAgICAgICBpZiAoY2IpIGNiKGVyKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGZzLmZ1dGltZXMoZmQsIGF0LCBtdCwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgICAgICBmcy5jbG9zZShmZCwgZnVuY3Rpb24gKGVyMikge1xuICAgICAgICAgICAgICBpZiAoY2IpIGNiKGVyIHx8IGVyMilcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZnMubHV0aW1lc1N5bmMgPSBmdW5jdGlvbiAocGF0aCwgYXQsIG10KSB7XG4gICAgICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1NZTUxJTkspXG4gICAgICAgIHZhciByZXRcbiAgICAgICAgdmFyIHRocmV3ID0gdHJ1ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldCA9IGZzLmZ1dGltZXNTeW5jKGZkLCBhdCwgbXQpXG4gICAgICAgICAgdGhyZXcgPSBmYWxzZVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmICh0aHJldykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXIpIHt9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChmcy5mdXRpbWVzKSB7XG4gICAgICBmcy5sdXRpbWVzID0gZnVuY3Rpb24gKF9hLCBfYiwgX2MsIGNiKSB7IGlmIChjYikgcHJvY2Vzcy5uZXh0VGljayhjYikgfVxuICAgICAgZnMubHV0aW1lc1N5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNobW9kRml4IChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBtb2RlLCBjYikge1xuICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCBtb2RlLCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgICAgaWYgKGNob3duRXJPayhlcikpIGVyID0gbnVsbFxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2htb2RGaXhTeW5jIChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBtb2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG1vZGUpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoIWNob3duRXJPayhlcikpIHRocm93IGVyXG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBjaG93bkZpeCAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdWlkLCBnaWQsIGNiKSB7XG4gICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIHVpZCwgZ2lkLCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgICAgaWYgKGNob3duRXJPayhlcikpIGVyID0gbnVsbFxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hvd25GaXhTeW5jIChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB1aWQsIGdpZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCB1aWQsIGdpZClcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIGlmICghY2hvd25Fck9rKGVyKSkgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0Rml4IChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIE5vZGUgZXJyb25lb3VzbHkgcmV0dXJuZWQgc2lnbmVkIGludGVnZXJzIGZvclxuICAgIC8vIHVpZCArIGdpZC5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgb3B0aW9ucywgY2IpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IG9wdGlvbnNcbiAgICAgICAgb3B0aW9ucyA9IG51bGxcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrIChlciwgc3RhdHMpIHtcbiAgICAgICAgaWYgKHN0YXRzKSB7XG4gICAgICAgICAgaWYgKHN0YXRzLnVpZCA8IDApIHN0YXRzLnVpZCArPSAweDEwMDAwMDAwMFxuICAgICAgICAgIGlmIChzdGF0cy5naWQgPCAwKSBzdGF0cy5naWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zID8gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgICAgICA6IG9yaWcuY2FsbChmcywgdGFyZ2V0LCBjYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0Rml4U3luYyAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiBOb2RlIGVycm9uZW91c2x5IHJldHVybmVkIHNpZ25lZCBpbnRlZ2VycyBmb3JcbiAgICAvLyB1aWQgKyBnaWQuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBzdGF0cyA9IG9wdGlvbnMgPyBvcmlnLmNhbGwoZnMsIHRhcmdldCwgb3B0aW9ucylcbiAgICAgICAgOiBvcmlnLmNhbGwoZnMsIHRhcmdldClcbiAgICAgIGlmIChzdGF0cykge1xuICAgICAgICBpZiAoc3RhdHMudWlkIDwgMCkgc3RhdHMudWlkICs9IDB4MTAwMDAwMDAwXG4gICAgICAgIGlmIChzdGF0cy5naWQgPCAwKSBzdGF0cy5naWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG4gIH1cblxuICAvLyBFTk9TWVMgbWVhbnMgdGhhdCB0aGUgZnMgZG9lc24ndCBzdXBwb3J0IHRoZSBvcC4gSnVzdCBpZ25vcmVcbiAgLy8gdGhhdCwgYmVjYXVzZSBpdCBkb2Vzbid0IG1hdHRlci5cbiAgLy9cbiAgLy8gaWYgdGhlcmUncyBubyBnZXR1aWQsIG9yIGlmIGdldHVpZCgpIGlzIHNvbWV0aGluZyBvdGhlclxuICAvLyB0aGFuIDAsIGFuZCB0aGUgZXJyb3IgaXMgRUlOVkFMIG9yIEVQRVJNLCB0aGVuIGp1c3QgaWdub3JlXG4gIC8vIGl0LlxuICAvL1xuICAvLyBUaGlzIHNwZWNpZmljIGNhc2UgaXMgYSBzaWxlbnQgZmFpbHVyZSBpbiBjcCwgaW5zdGFsbCwgdGFyLFxuICAvLyBhbmQgbW9zdCBvdGhlciB1bml4IHRvb2xzIHRoYXQgbWFuYWdlIHBlcm1pc3Npb25zLlxuICAvL1xuICAvLyBXaGVuIHJ1bm5pbmcgYXMgcm9vdCwgb3IgaWYgb3RoZXIgdHlwZXMgb2YgZXJyb3JzIGFyZVxuICAvLyBlbmNvdW50ZXJlZCwgdGhlbiBpdCdzIHN0cmljdC5cbiAgZnVuY3Rpb24gY2hvd25Fck9rIChlcikge1xuICAgIGlmICghZXIpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKGVyLmNvZGUgPT09IFwiRU5PU1lTXCIpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgdmFyIG5vbnJvb3QgPSAhcHJvY2Vzcy5nZXR1aWQgfHwgcHJvY2Vzcy5nZXR1aWQoKSAhPT0gMFxuICAgIGlmIChub25yb290KSB7XG4gICAgICBpZiAoZXIuY29kZSA9PT0gXCJFSU5WQUxcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiIsCiAgICAidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxlZ2FjeVxuXG5mdW5jdGlvbiBsZWdhY3kgKGZzKSB7XG4gIHJldHVybiB7XG4gICAgUmVhZFN0cmVhbTogUmVhZFN0cmVhbSxcbiAgICBXcml0ZVN0cmVhbTogV3JpdGVTdHJlYW1cbiAgfVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZFN0cmVhbSkpIHJldHVybiBuZXcgUmVhZFN0cmVhbShwYXRoLCBvcHRpb25zKTtcblxuICAgIFN0cmVhbS5jYWxsKHRoaXMpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLmZkID0gbnVsbDtcbiAgICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5mbGFncyA9ICdyJztcbiAgICB0aGlzLm1vZGUgPSA0Mzg7IC8qPTA2NjYqL1xuICAgIHRoaXMuYnVmZmVyU2l6ZSA9IDY0ICogMTAyNDtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWl4aW4gb3B0aW9ucyBpbnRvIHRoaXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZW5jb2RpbmcpIHRoaXMuc2V0RW5jb2RpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICBpZiAodGhpcy5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLnN0YXJ0KSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignc3RhcnQgbXVzdCBiZSBhIE51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5lbmQgPSBJbmZpbml0eTtcbiAgICAgIH0gZWxzZSBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLmVuZCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ2VuZCBtdXN0IGJlIGEgTnVtYmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXJ0ID4gdGhpcy5lbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydCBtdXN0IGJlIDw9IGVuZCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmQgIT09IG51bGwpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuX3JlYWQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZzLm9wZW4odGhpcy5wYXRoLCB0aGlzLmZsYWdzLCB0aGlzLm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICBzZWxmLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VsZi5mZCA9IGZkO1xuICAgICAgc2VsZi5lbWl0KCdvcGVuJywgZmQpO1xuICAgICAgc2VsZi5fcmVhZCgpO1xuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0ZVN0cmVhbSkpIHJldHVybiBuZXcgV3JpdGVTdHJlYW0ocGF0aCwgb3B0aW9ucyk7XG5cbiAgICBTdHJlYW0uY2FsbCh0aGlzKTtcblxuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5mZCA9IG51bGw7XG4gICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgICB0aGlzLmZsYWdzID0gJ3cnO1xuICAgIHRoaXMuZW5jb2RpbmcgPSAnYmluYXJ5JztcbiAgICB0aGlzLm1vZGUgPSA0Mzg7IC8qPTA2NjYqL1xuICAgIHRoaXMuYnl0ZXNXcml0dGVuID0gMDtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWl4aW4gb3B0aW9ucyBpbnRvIHRoaXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdGhpcy5zdGFydCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ3N0YXJ0IG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXJ0IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IG11c3QgYmUgPj0gemVybycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcblxuICAgIGlmICh0aGlzLmZkID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9vcGVuID0gZnMub3BlbjtcbiAgICAgIHRoaXMuX3F1ZXVlLnB1c2goW3RoaXMuX29wZW4sIHRoaXMucGF0aCwgdGhpcy5mbGFncywgdGhpcy5tb2RlLCB1bmRlZmluZWRdKTtcbiAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVcblxudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iai5fX3Byb3RvX19cbn1cblxuZnVuY3Rpb24gY2xvbmUgKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKVxuICAgIHJldHVybiBvYmpcblxuICBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgIHZhciBjb3B5ID0geyBfX3Byb3RvX186IGdldFByb3RvdHlwZU9mKG9iaikgfVxuICBlbHNlXG4gICAgdmFyIGNvcHkgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29weSwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSlcbiAgfSlcblxuICByZXR1cm4gY29weVxufVxuIiwKICAgICJ2YXIgZnMgPSByZXF1aXJlKCdmcycpXG52YXIgcG9seWZpbGxzID0gcmVxdWlyZSgnLi9wb2x5ZmlsbHMuanMnKVxudmFyIGxlZ2FjeSA9IHJlcXVpcmUoJy4vbGVnYWN5LXN0cmVhbXMuanMnKVxudmFyIGNsb25lID0gcmVxdWlyZSgnLi9jbG9uZS5qcycpXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gbm9kZSAwLnggcG9seWZpbGwgKi9cbnZhciBncmFjZWZ1bFF1ZXVlXG52YXIgcHJldmlvdXNTeW1ib2xcblxuLyogaXN0YW5idWwgaWdub3JlIGVsc2UgLSBub2RlIDAueCBwb2x5ZmlsbCAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgZ3JhY2VmdWxRdWV1ZSA9IFN5bWJvbC5mb3IoJ2dyYWNlZnVsLWZzLnF1ZXVlJylcbiAgLy8gVGhpcyBpcyB1c2VkIGluIHRlc3RpbmcgYnkgZnV0dXJlIHZlcnNpb25zXG4gIHByZXZpb3VzU3ltYm9sID0gU3ltYm9sLmZvcignZ3JhY2VmdWwtZnMucHJldmlvdXMnKVxufSBlbHNlIHtcbiAgZ3JhY2VmdWxRdWV1ZSA9ICdfX19ncmFjZWZ1bC1mcy5xdWV1ZSdcbiAgcHJldmlvdXNTeW1ib2wgPSAnX19fZ3JhY2VmdWwtZnMucHJldmlvdXMnXG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gcHVibGlzaFF1ZXVlKGNvbnRleHQsIHF1ZXVlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0LCBncmFjZWZ1bFF1ZXVlLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBxdWV1ZVxuICAgIH1cbiAgfSlcbn1cblxudmFyIGRlYnVnID0gbm9vcFxuaWYgKHV0aWwuZGVidWdsb2cpXG4gIGRlYnVnID0gdXRpbC5kZWJ1Z2xvZygnZ2ZzNCcpXG5lbHNlIGlmICgvXFxiZ2ZzNFxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJykpXG4gIGRlYnVnID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG0gPSB1dGlsLmZvcm1hdC5hcHBseSh1dGlsLCBhcmd1bWVudHMpXG4gICAgbSA9ICdHRlM0OiAnICsgbS5zcGxpdCgvXFxuLykuam9pbignXFxuR0ZTNDogJylcbiAgICBjb25zb2xlLmVycm9yKG0pXG4gIH1cblxuLy8gT25jZSB0aW1lIGluaXRpYWxpemF0aW9uXG5pZiAoIWZzW2dyYWNlZnVsUXVldWVdKSB7XG4gIC8vIFRoaXMgcXVldWUgY2FuIGJlIHNoYXJlZCBieSBtdWx0aXBsZSBsb2FkZWQgaW5zdGFuY2VzXG4gIHZhciBxdWV1ZSA9IGdsb2JhbFtncmFjZWZ1bFF1ZXVlXSB8fCBbXVxuICBwdWJsaXNoUXVldWUoZnMsIHF1ZXVlKVxuXG4gIC8vIFBhdGNoIGZzLmNsb3NlL2Nsb3NlU3luYyB0byBzaGFyZWQgcXVldWUgdmVyc2lvbiwgYmVjYXVzZSB3ZSBuZWVkXG4gIC8vIHRvIHJldHJ5KCkgd2hlbmV2ZXIgYSBjbG9zZSBoYXBwZW5zICphbnl3aGVyZSogaW4gdGhlIHByb2dyYW0uXG4gIC8vIFRoaXMgaXMgZXNzZW50aWFsIHdoZW4gbXVsdGlwbGUgZ3JhY2VmdWwtZnMgaW5zdGFuY2VzIGFyZVxuICAvLyBpbiBwbGF5IGF0IHRoZSBzYW1lIHRpbWUuXG4gIGZzLmNsb3NlID0gKGZ1bmN0aW9uIChmcyRjbG9zZSkge1xuICAgIGZ1bmN0aW9uIGNsb3NlIChmZCwgY2IpIHtcbiAgICAgIHJldHVybiBmcyRjbG9zZS5jYWxsKGZzLCBmZCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGdyYWNlZnVsLWZzIHNoYXJlZCBxdWV1ZVxuICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgIHJlc2V0UXVldWUoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9KVxuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9zZSwgcHJldmlvdXNTeW1ib2wsIHtcbiAgICAgIHZhbHVlOiBmcyRjbG9zZVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb3NlXG4gIH0pKGZzLmNsb3NlKVxuXG4gIGZzLmNsb3NlU3luYyA9IChmdW5jdGlvbiAoZnMkY2xvc2VTeW5jKSB7XG4gICAgZnVuY3Rpb24gY2xvc2VTeW5jIChmZCkge1xuICAgICAgLy8gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBncmFjZWZ1bC1mcyBzaGFyZWQgcXVldWVcbiAgICAgIGZzJGNsb3NlU3luYy5hcHBseShmcywgYXJndW1lbnRzKVxuICAgICAgcmVzZXRRdWV1ZSgpXG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb3NlU3luYywgcHJldmlvdXNTeW1ib2wsIHtcbiAgICAgIHZhbHVlOiBmcyRjbG9zZVN5bmNcbiAgICB9KVxuICAgIHJldHVybiBjbG9zZVN5bmNcbiAgfSkoZnMuY2xvc2VTeW5jKVxuXG4gIGlmICgvXFxiZ2ZzNFxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJykpIHtcbiAgICBwcm9jZXNzLm9uKCdleGl0JywgZnVuY3Rpb24oKSB7XG4gICAgICBkZWJ1Zyhmc1tncmFjZWZ1bFF1ZXVlXSlcbiAgICAgIHJlcXVpcmUoJ2Fzc2VydCcpLmVxdWFsKGZzW2dyYWNlZnVsUXVldWVdLmxlbmd0aCwgMClcbiAgICB9KVxuICB9XG59XG5cbmlmICghZ2xvYmFsW2dyYWNlZnVsUXVldWVdKSB7XG4gIHB1Ymxpc2hRdWV1ZShnbG9iYWwsIGZzW2dyYWNlZnVsUXVldWVdKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaChjbG9uZShmcykpXG5pZiAocHJvY2Vzcy5lbnYuVEVTVF9HUkFDRUZVTF9GU19HTE9CQUxfUEFUQ0ggJiYgIWZzLl9fcGF0Y2hlZCkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gcGF0Y2goZnMpXG4gICAgZnMuX19wYXRjaGVkID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcGF0Y2ggKGZzKSB7XG4gIC8vIEV2ZXJ5dGhpbmcgdGhhdCByZWZlcmVuY2VzIHRoZSBvcGVuKCkgZnVuY3Rpb24gbmVlZHMgdG8gYmUgaW4gaGVyZVxuICBwb2x5ZmlsbHMoZnMpXG4gIGZzLmdyYWNlZnVsaWZ5ID0gcGF0Y2hcblxuICBmcy5jcmVhdGVSZWFkU3RyZWFtID0gY3JlYXRlUmVhZFN0cmVhbVxuICBmcy5jcmVhdGVXcml0ZVN0cmVhbSA9IGNyZWF0ZVdyaXRlU3RyZWFtXG4gIHZhciBmcyRyZWFkRmlsZSA9IGZzLnJlYWRGaWxlXG4gIGZzLnJlYWRGaWxlID0gcmVhZEZpbGVcbiAgZnVuY3Rpb24gcmVhZEZpbGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJHJlYWRGaWxlKHBhdGgsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kcmVhZEZpbGUgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRyZWFkRmlsZShwYXRoLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJHJlYWRGaWxlLCBbcGF0aCwgb3B0aW9ucywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkd3JpdGVGaWxlID0gZnMud3JpdGVGaWxlXG4gIGZzLndyaXRlRmlsZSA9IHdyaXRlRmlsZVxuICBmdW5jdGlvbiB3cml0ZUZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJHdyaXRlRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJHdyaXRlRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJHdyaXRlRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJHdyaXRlRmlsZSwgW3BhdGgsIGRhdGEsIG9wdGlvbnMsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJGFwcGVuZEZpbGUgPSBmcy5hcHBlbmRGaWxlXG4gIGlmIChmcyRhcHBlbmRGaWxlKVxuICAgIGZzLmFwcGVuZEZpbGUgPSBhcHBlbmRGaWxlXG4gIGZ1bmN0aW9uIGFwcGVuZEZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJGFwcGVuZEZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRhcHBlbmRGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkYXBwZW5kRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJGFwcGVuZEZpbGUsIFtwYXRoLCBkYXRhLCBvcHRpb25zLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyRjb3B5RmlsZSA9IGZzLmNvcHlGaWxlXG4gIGlmIChmcyRjb3B5RmlsZSlcbiAgICBmcy5jb3B5RmlsZSA9IGNvcHlGaWxlXG4gIGZ1bmN0aW9uIGNvcHlGaWxlIChzcmMsIGRlc3QsIGZsYWdzLCBjYikge1xuICAgIGlmICh0eXBlb2YgZmxhZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiID0gZmxhZ3NcbiAgICAgIGZsYWdzID0gMFxuICAgIH1cbiAgICByZXR1cm4gZ28kY29weUZpbGUoc3JjLCBkZXN0LCBmbGFncywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRjb3B5RmlsZSAoc3JjLCBkZXN0LCBmbGFncywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJGNvcHlGaWxlKHNyYywgZGVzdCwgZmxhZ3MsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kY29weUZpbGUsIFtzcmMsIGRlc3QsIGZsYWdzLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyRyZWFkZGlyID0gZnMucmVhZGRpclxuICBmcy5yZWFkZGlyID0gcmVhZGRpclxuICB2YXIgbm9SZWFkZGlyT3B0aW9uVmVyc2lvbnMgPSAvXnZbMC01XVxcLi9cbiAgZnVuY3Rpb24gcmVhZGRpciAocGF0aCwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICB2YXIgZ28kcmVhZGRpciA9IG5vUmVhZGRpck9wdGlvblZlcnNpb25zLnRlc3QocHJvY2Vzcy52ZXJzaW9uKVxuICAgICAgPyBmdW5jdGlvbiBnbyRyZWFkZGlyIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICAgIHJldHVybiBmcyRyZWFkZGlyKHBhdGgsIGZzJHJlYWRkaXJDYWxsYmFjayhcbiAgICAgICAgICBwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lXG4gICAgICAgICkpXG4gICAgICB9XG4gICAgICA6IGZ1bmN0aW9uIGdvJHJlYWRkaXIgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZzJHJlYWRkaXIocGF0aCwgb3B0aW9ucywgZnMkcmVhZGRpckNhbGxiYWNrKFxuICAgICAgICAgIHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWVcbiAgICAgICAgKSlcbiAgICAgIH1cblxuICAgIHJldHVybiBnbyRyZWFkZGlyKHBhdGgsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZnMkcmVhZGRpckNhbGxiYWNrIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGVyciwgZmlsZXMpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbXG4gICAgICAgICAgICBnbyRyZWFkZGlyLFxuICAgICAgICAgICAgW3BhdGgsIG9wdGlvbnMsIGNiXSxcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLFxuICAgICAgICAgICAgRGF0ZS5ub3coKVxuICAgICAgICAgIF0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChmaWxlcyAmJiBmaWxlcy5zb3J0KVxuICAgICAgICAgICAgZmlsZXMuc29ydCgpXG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuY2FsbCh0aGlzLCBlcnIsIGZpbGVzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MudmVyc2lvbi5zdWJzdHIoMCwgNCkgPT09ICd2MC44Jykge1xuICAgIHZhciBsZWdTdHJlYW1zID0gbGVnYWN5KGZzKVxuICAgIFJlYWRTdHJlYW0gPSBsZWdTdHJlYW1zLlJlYWRTdHJlYW1cbiAgICBXcml0ZVN0cmVhbSA9IGxlZ1N0cmVhbXMuV3JpdGVTdHJlYW1cbiAgfVxuXG4gIHZhciBmcyRSZWFkU3RyZWFtID0gZnMuUmVhZFN0cmVhbVxuICBpZiAoZnMkUmVhZFN0cmVhbSkge1xuICAgIFJlYWRTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShmcyRSZWFkU3RyZWFtLnByb3RvdHlwZSlcbiAgICBSZWFkU3RyZWFtLnByb3RvdHlwZS5vcGVuID0gUmVhZFN0cmVhbSRvcGVuXG4gIH1cblxuICB2YXIgZnMkV3JpdGVTdHJlYW0gPSBmcy5Xcml0ZVN0cmVhbVxuICBpZiAoZnMkV3JpdGVTdHJlYW0pIHtcbiAgICBXcml0ZVN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGZzJFdyaXRlU3RyZWFtLnByb3RvdHlwZSlcbiAgICBXcml0ZVN0cmVhbS5wcm90b3R5cGUub3BlbiA9IFdyaXRlU3RyZWFtJG9wZW5cbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ1JlYWRTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gUmVhZFN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBSZWFkU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdXcml0ZVN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBXcml0ZVN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBXcml0ZVN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcblxuICAvLyBsZWdhY3kgbmFtZXNcbiAgdmFyIEZpbGVSZWFkU3RyZWFtID0gUmVhZFN0cmVhbVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdGaWxlUmVhZFN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBGaWxlUmVhZFN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBGaWxlUmVhZFN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbiAgdmFyIEZpbGVXcml0ZVN0cmVhbSA9IFdyaXRlU3RyZWFtXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ0ZpbGVXcml0ZVN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBGaWxlV3JpdGVTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgRmlsZVdyaXRlU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFJlYWRTdHJlYW0pXG4gICAgICByZXR1cm4gZnMkUmVhZFN0cmVhbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0aGlzXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIFJlYWRTdHJlYW0uYXBwbHkoT2JqZWN0LmNyZWF0ZShSZWFkU3RyZWFtLnByb3RvdHlwZSksIGFyZ3VtZW50cylcbiAgfVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0kb3BlbiAoKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgb3Blbih0aGF0LnBhdGgsIHRoYXQuZmxhZ3MsIHRoYXQubW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgaWYgKHRoYXQuYXV0b0Nsb3NlKVxuICAgICAgICAgIHRoYXQuZGVzdHJveSgpXG5cbiAgICAgICAgdGhhdC5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoYXQuZmQgPSBmZFxuICAgICAgICB0aGF0LmVtaXQoJ29wZW4nLCBmZClcbiAgICAgICAgdGhhdC5yZWFkKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gV3JpdGVTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFdyaXRlU3RyZWFtKVxuICAgICAgcmV0dXJuIGZzJFdyaXRlU3RyZWFtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXNcbiAgICBlbHNlXG4gICAgICByZXR1cm4gV3JpdGVTdHJlYW0uYXBwbHkoT2JqZWN0LmNyZWF0ZShXcml0ZVN0cmVhbS5wcm90b3R5cGUpLCBhcmd1bWVudHMpXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSRvcGVuICgpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICBvcGVuKHRoYXQucGF0aCwgdGhhdC5mbGFncywgdGhhdC5tb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICB0aGF0LmRlc3Ryb3koKVxuICAgICAgICB0aGF0LmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhhdC5mZCA9IGZkXG4gICAgICAgIHRoYXQuZW1pdCgnb3BlbicsIGZkKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVSZWFkU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBmcy5SZWFkU3RyZWFtKHBhdGgsIG9wdGlvbnMpXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgZnMuV3JpdGVTdHJlYW0ocGF0aCwgb3B0aW9ucylcbiAgfVxuXG4gIHZhciBmcyRvcGVuID0gZnMub3BlblxuICBmcy5vcGVuID0gb3BlblxuICBmdW5jdGlvbiBvcGVuIChwYXRoLCBmbGFncywgbW9kZSwgY2IpIHtcbiAgICBpZiAodHlwZW9mIG1vZGUgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG1vZGUsIG1vZGUgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kb3BlbihwYXRoLCBmbGFncywgbW9kZSwgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRvcGVuIChwYXRoLCBmbGFncywgbW9kZSwgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJG9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJG9wZW4sIFtwYXRoLCBmbGFncywgbW9kZSwgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnNcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZSAoZWxlbSkge1xuICBkZWJ1ZygnRU5RVUVVRScsIGVsZW1bMF0ubmFtZSwgZWxlbVsxXSlcbiAgZnNbZ3JhY2VmdWxRdWV1ZV0ucHVzaChlbGVtKVxuICByZXRyeSgpXG59XG5cbi8vIGtlZXAgdHJhY2sgb2YgdGhlIHRpbWVvdXQgYmV0d2VlbiByZXRyeSgpIGNhbGxzXG52YXIgcmV0cnlUaW1lclxuXG4vLyByZXNldCB0aGUgc3RhcnRUaW1lIGFuZCBsYXN0VGltZSB0byBub3dcbi8vIHRoaXMgcmVzZXRzIHRoZSBzdGFydCBvZiB0aGUgNjAgc2Vjb25kIG92ZXJhbGwgdGltZW91dCBhcyB3ZWxsIGFzIHRoZVxuLy8gZGVsYXkgYmV0d2VlbiBhdHRlbXB0cyBzbyB0aGF0IHdlJ2xsIHJldHJ5IHRoZXNlIGpvYnMgc29vbmVyXG5mdW5jdGlvbiByZXNldFF1ZXVlICgpIHtcbiAgdmFyIG5vdyA9IERhdGUubm93KClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmc1tncmFjZWZ1bFF1ZXVlXS5sZW5ndGg7ICsraSkge1xuICAgIC8vIGVudHJpZXMgdGhhdCBhcmUgb25seSBhIGxlbmd0aCBvZiAyIGFyZSBmcm9tIGFuIG9sZGVyIHZlcnNpb24sIGRvbid0XG4gICAgLy8gYm90aGVyIG1vZGlmeWluZyB0aG9zZSBzaW5jZSB0aGV5J2xsIGJlIHJldHJpZWQgYW55d2F5LlxuICAgIGlmIChmc1tncmFjZWZ1bFF1ZXVlXVtpXS5sZW5ndGggPiAyKSB7XG4gICAgICBmc1tncmFjZWZ1bFF1ZXVlXVtpXVszXSA9IG5vdyAvLyBzdGFydFRpbWVcbiAgICAgIGZzW2dyYWNlZnVsUXVldWVdW2ldWzRdID0gbm93IC8vIGxhc3RUaW1lXG4gICAgfVxuICB9XG4gIC8vIGNhbGwgcmV0cnkgdG8gbWFrZSBzdXJlIHdlJ3JlIGFjdGl2ZWx5IHByb2Nlc3NpbmcgdGhlIHF1ZXVlXG4gIHJldHJ5KClcbn1cblxuZnVuY3Rpb24gcmV0cnkgKCkge1xuICAvLyBjbGVhciB0aGUgdGltZXIgYW5kIHJlbW92ZSBpdCB0byBoZWxwIHByZXZlbnQgdW5pbnRlbmRlZCBjb25jdXJyZW5jeVxuICBjbGVhclRpbWVvdXQocmV0cnlUaW1lcilcbiAgcmV0cnlUaW1lciA9IHVuZGVmaW5lZFxuXG4gIGlmIChmc1tncmFjZWZ1bFF1ZXVlXS5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuXG5cbiAgdmFyIGVsZW0gPSBmc1tncmFjZWZ1bFF1ZXVlXS5zaGlmdCgpXG4gIHZhciBmbiA9IGVsZW1bMF1cbiAgdmFyIGFyZ3MgPSBlbGVtWzFdXG4gIC8vIHRoZXNlIGl0ZW1zIG1heSBiZSB1bnNldCBpZiB0aGV5IHdlcmUgYWRkZWQgYnkgYW4gb2xkZXIgZ3JhY2VmdWwtZnNcbiAgdmFyIGVyciA9IGVsZW1bMl1cbiAgdmFyIHN0YXJ0VGltZSA9IGVsZW1bM11cbiAgdmFyIGxhc3RUaW1lID0gZWxlbVs0XVxuXG4gIC8vIGlmIHdlIGRvbid0IGhhdmUgYSBzdGFydFRpbWUgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyBpZiB3ZSd2ZSB3YWl0ZWRcbiAgLy8gbG9uZyBlbm91Z2gsIHNvIGdvIGFoZWFkIGFuZCByZXRyeSB0aGlzIGl0ZW0gbm93XG4gIGlmIChzdGFydFRpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGRlYnVnKCdSRVRSWScsIGZuLm5hbWUsIGFyZ3MpXG4gICAgZm4uYXBwbHkobnVsbCwgYXJncylcbiAgfSBlbHNlIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IDYwMDAwKSB7XG4gICAgLy8gaXQncyBiZWVuIG1vcmUgdGhhbiA2MCBzZWNvbmRzIHRvdGFsLCBiYWlsIG5vd1xuICAgIGRlYnVnKCdUSU1FT1VUJywgZm4ubmFtZSwgYXJncylcbiAgICB2YXIgY2IgPSBhcmdzLnBvcCgpXG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiLmNhbGwobnVsbCwgZXJyKVxuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGF0dGVtcHQgYW5kIHJpZ2h0IG5vd1xuICAgIHZhciBzaW5jZUF0dGVtcHQgPSBEYXRlLm5vdygpIC0gbGFzdFRpbWVcbiAgICAvLyB0aGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiB3aGVuIHdlIGZpcnN0IHRyaWVkLCBhbmQgd2hlbiB3ZSBsYXN0IHRyaWVkXG4gICAgLy8gcm91bmRlZCB1cCB0byBhdCBsZWFzdCAxXG4gICAgdmFyIHNpbmNlU3RhcnQgPSBNYXRoLm1heChsYXN0VGltZSAtIHN0YXJ0VGltZSwgMSlcbiAgICAvLyBiYWNrb2ZmLiB3YWl0IGxvbmdlciB0aGFuIHRoZSB0b3RhbCB0aW1lIHdlJ3ZlIGJlZW4gcmV0cnlpbmcsIGJ1dCBvbmx5XG4gICAgLy8gdXAgdG8gYSBtYXhpbXVtIG9mIDEwMG1zXG4gICAgdmFyIGRlc2lyZWREZWxheSA9IE1hdGgubWluKHNpbmNlU3RhcnQgKiAxLjIsIDEwMClcbiAgICAvLyBpdCdzIGJlZW4gbG9uZyBlbm91Z2ggc2luY2UgdGhlIGxhc3QgcmV0cnksIGRvIGl0IGFnYWluXG4gICAgaWYgKHNpbmNlQXR0ZW1wdCA+PSBkZXNpcmVkRGVsYXkpIHtcbiAgICAgIGRlYnVnKCdSRVRSWScsIGZuLm5hbWUsIGFyZ3MpXG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbc3RhcnRUaW1lXSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHdlIGNhbid0IGRvIHRoaXMgam9iIHlldCwgcHVzaCBpdCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxuICAgICAgLy8gYW5kIGxldCB0aGUgbmV4dCBpdGVyYXRpb24gY2hlY2sgYWdhaW5cbiAgICAgIGZzW2dyYWNlZnVsUXVldWVdLnB1c2goZWxlbSlcbiAgICB9XG4gIH1cblxuICAvLyBzY2hlZHVsZSBvdXIgbmV4dCBydW4gaWYgb25lIGlzbid0IGFscmVhZHkgc2NoZWR1bGVkXG4gIGlmIChyZXRyeVRpbWVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXRyeVRpbWVyID0gc2V0VGltZW91dChyZXRyeSwgMClcbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcbi8vIFRoaXMgaXMgYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3JtYWxpemUvbXpcbi8vIENvcHlyaWdodCAoYykgMjAxNC0yMDE2IEpvbmF0aGFuIE9uZyBtZUBqb25nbGViZXJyeS5jb20gYW5kIENvbnRyaWJ1dG9yc1xuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21DYWxsYmFja1xuY29uc3QgZnMgPSByZXF1aXJlKCdncmFjZWZ1bC1mcycpXG5cbmNvbnN0IGFwaSA9IFtcbiAgJ2FjY2VzcycsXG4gICdhcHBlbmRGaWxlJyxcbiAgJ2NobW9kJyxcbiAgJ2Nob3duJyxcbiAgJ2Nsb3NlJyxcbiAgJ2NvcHlGaWxlJyxcbiAgJ2NwJyxcbiAgJ2ZjaG1vZCcsXG4gICdmY2hvd24nLFxuICAnZmRhdGFzeW5jJyxcbiAgJ2ZzdGF0JyxcbiAgJ2ZzeW5jJyxcbiAgJ2Z0cnVuY2F0ZScsXG4gICdmdXRpbWVzJyxcbiAgJ2dsb2InLFxuICAnbGNobW9kJyxcbiAgJ2xjaG93bicsXG4gICdsdXRpbWVzJyxcbiAgJ2xpbmsnLFxuICAnbHN0YXQnLFxuICAnbWtkaXInLFxuICAnbWtkdGVtcCcsXG4gICdvcGVuJyxcbiAgJ29wZW5kaXInLFxuICAncmVhZGRpcicsXG4gICdyZWFkRmlsZScsXG4gICdyZWFkbGluaycsXG4gICdyZWFscGF0aCcsXG4gICdyZW5hbWUnLFxuICAncm0nLFxuICAncm1kaXInLFxuICAnc3RhdCcsXG4gICdzdGF0ZnMnLFxuICAnc3ltbGluaycsXG4gICd0cnVuY2F0ZScsXG4gICd1bmxpbmsnLFxuICAndXRpbWVzJyxcbiAgJ3dyaXRlRmlsZSdcbl0uZmlsdGVyKGtleSA9PiB7XG4gIC8vIFNvbWUgY29tbWFuZHMgYXJlIG5vdCBhdmFpbGFibGUgb24gc29tZSBzeXN0ZW1zLiBFeDpcbiAgLy8gZnMuY3Agd2FzIGFkZGVkIGluIE5vZGUuanMgdjE2LjcuMFxuICAvLyBmcy5zdGF0ZnMgd2FzIGFkZGVkIGluIE5vZGUgdjE5LjYuMCwgdjE4LjE1LjBcbiAgLy8gZnMuZ2xvYiB3YXMgYWRkZWQgaW4gTm9kZS5qcyB2MjIuMC4wXG4gIC8vIGZzLmxjaG93biBpcyBub3QgYXZhaWxhYmxlIG9uIGF0IGxlYXN0IHNvbWUgTGludXhcbiAgcmV0dXJuIHR5cGVvZiBmc1trZXldID09PSAnZnVuY3Rpb24nXG59KVxuXG4vLyBFeHBvcnQgY2xvbmVkIGZzOlxuT2JqZWN0LmFzc2lnbihleHBvcnRzLCBmcylcblxuLy8gVW5pdmVyc2FsaWZ5IGFzeW5jIG1ldGhvZHM6XG5hcGkuZm9yRWFjaChtZXRob2QgPT4ge1xuICBleHBvcnRzW21ldGhvZF0gPSB1KGZzW21ldGhvZF0pXG59KVxuXG4vLyBXZSBkaWZmZXIgZnJvbSBtei9mcyBpbiB0aGF0IHdlIHN0aWxsIHNoaXAgdGhlIG9sZCwgYnJva2VuLCBmcy5leGlzdHMoKVxuLy8gc2luY2Ugd2UgYXJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIG5hdGl2ZSBtb2R1bGVcbmV4cG9ydHMuZXhpc3RzID0gZnVuY3Rpb24gKGZpbGVuYW1lLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0cyhmaWxlbmFtZSwgY2FsbGJhY2spXG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHJldHVybiBmcy5leGlzdHMoZmlsZW5hbWUsIHJlc29sdmUpXG4gIH0pXG59XG5cbi8vIGZzLnJlYWQoKSwgZnMud3JpdGUoKSwgZnMucmVhZHYoKSwgJiBmcy53cml0ZXYoKSBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IGR1ZSB0byBtdWx0aXBsZSBjYWxsYmFjayBhcmdzXG5cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKVxuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIChlcnIsIGJ5dGVzUmVhZCwgYnVmZmVyKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1JlYWQsIGJ1ZmZlciB9KVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBjYW4gYmVcbi8vIGZzLndyaXRlKGZkLCBidWZmZXJbLCBvZmZzZXRbLCBsZW5ndGhbLCBwb3NpdGlvbl1dXSwgY2FsbGJhY2spXG4vLyBPUlxuLy8gZnMud3JpdGUoZmQsIHN0cmluZ1ssIHBvc2l0aW9uWywgZW5jb2RpbmddXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSBib3RoIGNhc2VzLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChmZCwgYnVmZmVyLCAuLi5hcmdzKSB7XG4gIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZzLndyaXRlKGZkLCBidWZmZXIsIC4uLmFyZ3MpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGZzLndyaXRlKGZkLCBidWZmZXIsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzV3JpdHRlbiwgYnVmZmVyKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1dyaXR0ZW4sIGJ1ZmZlciB9KVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBpc1xuLy8gcy5yZWFkdihmZCwgYnVmZmVyc1ssIHBvc2l0aW9uXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgb3B0aW9uYWwgYXJnLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy5yZWFkdiA9IGZ1bmN0aW9uIChmZCwgYnVmZmVycywgLi4uYXJncykge1xuICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmcy5yZWFkdihmZCwgYnVmZmVycywgLi4uYXJncylcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMucmVhZHYoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzUmVhZCwgYnVmZmVycykgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICByZXNvbHZlKHsgYnl0ZXNSZWFkLCBidWZmZXJzIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gRnVuY3Rpb24gc2lnbmF0dXJlIGlzXG4vLyBzLndyaXRldihmZCwgYnVmZmVyc1ssIHBvc2l0aW9uXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgb3B0aW9uYWwgYXJnLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy53cml0ZXYgPSBmdW5jdGlvbiAoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMud3JpdGV2KGZkLCBidWZmZXJzLCAuLi5hcmdzKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy53cml0ZXYoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzV3JpdHRlbiwgYnVmZmVycykgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICByZXNvbHZlKHsgYnl0ZXNXcml0dGVuLCBidWZmZXJzIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gZnMucmVhbHBhdGgubmF0aXZlIHNvbWV0aW1lcyBub3QgYXZhaWxhYmxlIGlmIGZzIGlzIG1vbmtleS1wYXRjaGVkXG5pZiAodHlwZW9mIGZzLnJlYWxwYXRoLm5hdGl2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICBleHBvcnRzLnJlYWxwYXRoLm5hdGl2ZSA9IHUoZnMucmVhbHBhdGgubmF0aXZlKVxufSBlbHNlIHtcbiAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAnZnMucmVhbHBhdGgubmF0aXZlIGlzIG5vdCBhIGZ1bmN0aW9uLiBJcyBmcyBiZWluZyBtb25rZXktcGF0Y2hlZD8nLFxuICAgICdXYXJuaW5nJywgJ2ZzLWV4dHJhLVdBUk4wMDAzJ1xuICApXG59XG4iLAogICAgIi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL21ha2UtZGlyXG4vLyBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChzaW5kcmVzb3JodXMuY29tKVxuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4ndXNlIHN0cmljdCdcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy84OTg3XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbGlidXYvbGlidXYvcHVsbC8xMDg4XG5tb2R1bGUuZXhwb3J0cy5jaGVja1BhdGggPSBmdW5jdGlvbiBjaGVja1BhdGggKHB0aCkge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IHBhdGhIYXNJbnZhbGlkV2luQ2hhcmFjdGVycyA9IC9bPD46XCJ8PypdLy50ZXN0KHB0aC5yZXBsYWNlKHBhdGgucGFyc2UocHRoKS5yb290LCAnJykpXG5cbiAgICBpZiAocGF0aEhhc0ludmFsaWRXaW5DaGFyYWN0ZXJzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUGF0aCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnM6ICR7cHRofWApXG4gICAgICBlcnJvci5jb2RlID0gJ0VJTlZBTCdcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB7IGNoZWNrUGF0aCB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmNvbnN0IGdldE1vZGUgPSBvcHRpb25zID0+IHtcbiAgY29uc3QgZGVmYXVsdHMgPSB7IG1vZGU6IDBvNzc3IH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykgcmV0dXJuIG9wdGlvbnNcbiAgcmV0dXJuICh7IC4uLmRlZmF1bHRzLCAuLi5vcHRpb25zIH0pLm1vZGVcbn1cblxubW9kdWxlLmV4cG9ydHMubWFrZURpciA9IGFzeW5jIChkaXIsIG9wdGlvbnMpID0+IHtcbiAgY2hlY2tQYXRoKGRpcilcblxuICByZXR1cm4gZnMubWtkaXIoZGlyLCB7XG4gICAgbW9kZTogZ2V0TW9kZShvcHRpb25zKSxcbiAgICByZWN1cnNpdmU6IHRydWVcbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMubWFrZURpclN5bmMgPSAoZGlyLCBvcHRpb25zKSA9PiB7XG4gIGNoZWNrUGF0aChkaXIpXG5cbiAgcmV0dXJuIGZzLm1rZGlyU3luYyhkaXIsIHtcbiAgICBtb2RlOiBnZXRNb2RlKG9wdGlvbnMpLFxuICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICB9KVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgeyBtYWtlRGlyOiBfbWFrZURpciwgbWFrZURpclN5bmMgfSA9IHJlcXVpcmUoJy4vbWFrZS1kaXInKVxuY29uc3QgbWFrZURpciA9IHUoX21ha2VEaXIpXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBta2RpcnM6IG1ha2VEaXIsXG4gIG1rZGlyc1N5bmM6IG1ha2VEaXJTeW5jLFxuICAvLyBhbGlhc1xuICBta2RpcnA6IG1ha2VEaXIsXG4gIG1rZGlycFN5bmM6IG1ha2VEaXJTeW5jLFxuICBlbnN1cmVEaXI6IG1ha2VEaXIsXG4gIGVuc3VyZURpclN5bmM6IG1ha2VEaXJTeW5jXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcblxuZnVuY3Rpb24gcGF0aEV4aXN0cyAocGF0aCkge1xuICByZXR1cm4gZnMuYWNjZXNzKHBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwYXRoRXhpc3RzOiB1KHBhdGhFeGlzdHMpLFxuICBwYXRoRXhpc3RzU3luYzogZnMuZXhpc3RzU3luY1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcblxuYXN5bmMgZnVuY3Rpb24gdXRpbWVzTWlsbGlzIChwYXRoLCBhdGltZSwgbXRpbWUpIHtcbiAgLy8gaWYgKCFIQVNfTUlMTElTX1JFUykgcmV0dXJuIGZzLnV0aW1lcyhwYXRoLCBhdGltZSwgbXRpbWUsIGNhbGxiYWNrKVxuICBjb25zdCBmZCA9IGF3YWl0IGZzLm9wZW4ocGF0aCwgJ3IrJylcblxuICBsZXQgY2xvc2VFcnIgPSBudWxsXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5mdXRpbWVzKGZkLCBhdGltZSwgbXRpbWUpXG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmNsb3NlKGZkKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNsb3NlRXJyID0gZVxuICAgIH1cbiAgfVxuXG4gIGlmIChjbG9zZUVycikge1xuICAgIHRocm93IGNsb3NlRXJyXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRpbWVzTWlsbGlzU3luYyAocGF0aCwgYXRpbWUsIG10aW1lKSB7XG4gIGNvbnN0IGZkID0gZnMub3BlblN5bmMocGF0aCwgJ3IrJylcbiAgZnMuZnV0aW1lc1N5bmMoZmQsIGF0aW1lLCBtdGltZSlcbiAgcmV0dXJuIGZzLmNsb3NlU3luYyhmZClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHV0aW1lc01pbGxpczogdSh1dGltZXNNaWxsaXMpLFxuICB1dGltZXNNaWxsaXNTeW5jXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuXG5mdW5jdGlvbiBnZXRTdGF0cyAoc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGNvbnN0IHN0YXRGdW5jID0gb3B0cy5kZXJlZmVyZW5jZVxuICAgID8gKGZpbGUpID0+IGZzLnN0YXQoZmlsZSwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgICA6IChmaWxlKSA9PiBmcy5sc3RhdChmaWxlLCB7IGJpZ2ludDogdHJ1ZSB9KVxuICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgIHN0YXRGdW5jKHNyYyksXG4gICAgc3RhdEZ1bmMoZGVzdCkuY2F0Y2goZXJyID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBudWxsXG4gICAgICB0aHJvdyBlcnJcbiAgICB9KVxuICBdKS50aGVuKChbc3JjU3RhdCwgZGVzdFN0YXRdKSA9PiAoeyBzcmNTdGF0LCBkZXN0U3RhdCB9KSlcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdHNTeW5jIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgbGV0IGRlc3RTdGF0XG4gIGNvbnN0IHN0YXRGdW5jID0gb3B0cy5kZXJlZmVyZW5jZVxuICAgID8gKGZpbGUpID0+IGZzLnN0YXRTeW5jKGZpbGUsIHsgYmlnaW50OiB0cnVlIH0pXG4gICAgOiAoZmlsZSkgPT4gZnMubHN0YXRTeW5jKGZpbGUsIHsgYmlnaW50OiB0cnVlIH0pXG4gIGNvbnN0IHNyY1N0YXQgPSBzdGF0RnVuYyhzcmMpXG4gIHRyeSB7XG4gICAgZGVzdFN0YXQgPSBzdGF0RnVuYyhkZXN0KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdDogbnVsbCB9XG4gICAgdGhyb3cgZXJyXG4gIH1cbiAgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja1BhdGhzIChzcmMsIGRlc3QsIGZ1bmNOYW1lLCBvcHRzKSB7XG4gIGNvbnN0IHsgc3JjU3RhdCwgZGVzdFN0YXQgfSA9IGF3YWl0IGdldFN0YXRzKHNyYywgZGVzdCwgb3B0cylcbiAgaWYgKGRlc3RTdGF0KSB7XG4gICAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkZXN0U3RhdCkpIHtcbiAgICAgIGNvbnN0IHNyY0Jhc2VOYW1lID0gcGF0aC5iYXNlbmFtZShzcmMpXG4gICAgICBjb25zdCBkZXN0QmFzZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGRlc3QpXG4gICAgICBpZiAoZnVuY05hbWUgPT09ICdtb3ZlJyAmJlxuICAgICAgICBzcmNCYXNlTmFtZSAhPT0gZGVzdEJhc2VOYW1lICYmXG4gICAgICAgIHNyY0Jhc2VOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGRlc3RCYXNlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0LCBpc0NoYW5naW5nQ2FzZTogdHJ1ZSB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSBhbmQgZGVzdGluYXRpb24gbXVzdCBub3QgYmUgdGhlIHNhbWUuJylcbiAgICB9XG4gICAgaWYgKHNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiAhZGVzdFN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlIG5vbi1kaXJlY3RvcnkgJyR7ZGVzdH0nIHdpdGggZGlyZWN0b3J5ICcke3NyY30nLmApXG4gICAgfVxuICAgIGlmICghc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmIGRlc3RTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG92ZXJ3cml0ZSBkaXJlY3RvcnkgJyR7ZGVzdH0nIHdpdGggbm9uLWRpcmVjdG9yeSAnJHtzcmN9Jy5gKVxuICAgIH1cbiAgfVxuXG4gIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgaXNTcmNTdWJkaXIoc3JjLCBkZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2coc3JjLCBkZXN0LCBmdW5jTmFtZSkpXG4gIH1cblxuICByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdCB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUGF0aHNTeW5jIChzcmMsIGRlc3QsIGZ1bmNOYW1lLCBvcHRzKSB7XG4gIGNvbnN0IHsgc3JjU3RhdCwgZGVzdFN0YXQgfSA9IGdldFN0YXRzU3luYyhzcmMsIGRlc3QsIG9wdHMpXG5cbiAgaWYgKGRlc3RTdGF0KSB7XG4gICAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkZXN0U3RhdCkpIHtcbiAgICAgIGNvbnN0IHNyY0Jhc2VOYW1lID0gcGF0aC5iYXNlbmFtZShzcmMpXG4gICAgICBjb25zdCBkZXN0QmFzZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGRlc3QpXG4gICAgICBpZiAoZnVuY05hbWUgPT09ICdtb3ZlJyAmJlxuICAgICAgICBzcmNCYXNlTmFtZSAhPT0gZGVzdEJhc2VOYW1lICYmXG4gICAgICAgIHNyY0Jhc2VOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGRlc3RCYXNlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0LCBpc0NoYW5naW5nQ2FzZTogdHJ1ZSB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSBhbmQgZGVzdGluYXRpb24gbXVzdCBub3QgYmUgdGhlIHNhbWUuJylcbiAgICB9XG4gICAgaWYgKHNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiAhZGVzdFN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlIG5vbi1kaXJlY3RvcnkgJyR7ZGVzdH0nIHdpdGggZGlyZWN0b3J5ICcke3NyY30nLmApXG4gICAgfVxuICAgIGlmICghc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmIGRlc3RTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG92ZXJ3cml0ZSBkaXJlY3RvcnkgJyR7ZGVzdH0nIHdpdGggbm9uLWRpcmVjdG9yeSAnJHtzcmN9Jy5gKVxuICAgIH1cbiAgfVxuXG4gIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgaXNTcmNTdWJkaXIoc3JjLCBkZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2coc3JjLCBkZXN0LCBmdW5jTmFtZSkpXG4gIH1cbiAgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQgfVxufVxuXG4vLyByZWN1cnNpdmVseSBjaGVjayBpZiBkZXN0IHBhcmVudCBpcyBhIHN1YmRpcmVjdG9yeSBvZiBzcmMuXG4vLyBJdCB3b3JrcyBmb3IgYWxsIGZpbGUgdHlwZXMgaW5jbHVkaW5nIHN5bWxpbmtzIHNpbmNlIGl0XG4vLyBjaGVja3MgdGhlIHNyYyBhbmQgZGVzdCBpbm9kZXMuIEl0IHN0YXJ0cyBmcm9tIHRoZSBkZWVwZXN0XG4vLyBwYXJlbnQgYW5kIHN0b3BzIG9uY2UgaXQgcmVhY2hlcyB0aGUgc3JjIHBhcmVudCBvciB0aGUgcm9vdCBwYXRoLlxuYXN5bmMgZnVuY3Rpb24gY2hlY2tQYXJlbnRQYXRocyAoc3JjLCBzcmNTdGF0LCBkZXN0LCBmdW5jTmFtZSkge1xuICBjb25zdCBzcmNQYXJlbnQgPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKHNyYykpXG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGRlc3QpKVxuICBpZiAoZGVzdFBhcmVudCA9PT0gc3JjUGFyZW50IHx8IGRlc3RQYXJlbnQgPT09IHBhdGgucGFyc2UoZGVzdFBhcmVudCkucm9vdCkgcmV0dXJuXG5cbiAgbGV0IGRlc3RTdGF0XG4gIHRyeSB7XG4gICAgZGVzdFN0YXQgPSBhd2FpdCBmcy5zdGF0KGRlc3RQYXJlbnQsIHsgYmlnaW50OiB0cnVlIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVyblxuICAgIHRocm93IGVyclxuICB9XG5cbiAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkZXN0U3RhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKHNyYywgZGVzdCwgZnVuY05hbWUpKVxuICB9XG5cbiAgcmV0dXJuIGNoZWNrUGFyZW50UGF0aHMoc3JjLCBzcmNTdGF0LCBkZXN0UGFyZW50LCBmdW5jTmFtZSlcbn1cblxuZnVuY3Rpb24gY2hlY2tQYXJlbnRQYXRoc1N5bmMgKHNyYywgc3JjU3RhdCwgZGVzdCwgZnVuY05hbWUpIHtcbiAgY29uc3Qgc3JjUGFyZW50ID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShzcmMpKVxuICBjb25zdCBkZXN0UGFyZW50ID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShkZXN0KSlcbiAgaWYgKGRlc3RQYXJlbnQgPT09IHNyY1BhcmVudCB8fCBkZXN0UGFyZW50ID09PSBwYXRoLnBhcnNlKGRlc3RQYXJlbnQpLnJvb3QpIHJldHVyblxuICBsZXQgZGVzdFN0YXRcbiAgdHJ5IHtcbiAgICBkZXN0U3RhdCA9IGZzLnN0YXRTeW5jKGRlc3RQYXJlbnQsIHsgYmlnaW50OiB0cnVlIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVyblxuICAgIHRocm93IGVyclxuICB9XG4gIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZGVzdFN0YXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyhzcmMsIGRlc3QsIGZ1bmNOYW1lKSlcbiAgfVxuICByZXR1cm4gY2hlY2tQYXJlbnRQYXRoc1N5bmMoc3JjLCBzcmNTdGF0LCBkZXN0UGFyZW50LCBmdW5jTmFtZSlcbn1cblxuZnVuY3Rpb24gYXJlSWRlbnRpY2FsIChzcmNTdGF0LCBkZXN0U3RhdCkge1xuICByZXR1cm4gZGVzdFN0YXQuaW5vICYmIGRlc3RTdGF0LmRldiAmJiBkZXN0U3RhdC5pbm8gPT09IHNyY1N0YXQuaW5vICYmIGRlc3RTdGF0LmRldiA9PT0gc3JjU3RhdC5kZXZcbn1cblxuLy8gcmV0dXJuIHRydWUgaWYgZGVzdCBpcyBhIHN1YmRpciBvZiBzcmMsIG90aGVyd2lzZSBmYWxzZS5cbi8vIEl0IG9ubHkgY2hlY2tzIHRoZSBwYXRoIHN0cmluZ3MuXG5mdW5jdGlvbiBpc1NyY1N1YmRpciAoc3JjLCBkZXN0KSB7XG4gIGNvbnN0IHNyY0FyciA9IHBhdGgucmVzb2x2ZShzcmMpLnNwbGl0KHBhdGguc2VwKS5maWx0ZXIoaSA9PiBpKVxuICBjb25zdCBkZXN0QXJyID0gcGF0aC5yZXNvbHZlKGRlc3QpLnNwbGl0KHBhdGguc2VwKS5maWx0ZXIoaSA9PiBpKVxuICByZXR1cm4gc3JjQXJyLmV2ZXJ5KChjdXIsIGkpID0+IGRlc3RBcnJbaV0gPT09IGN1cilcbn1cblxuZnVuY3Rpb24gZXJyTXNnIChzcmMsIGRlc3QsIGZ1bmNOYW1lKSB7XG4gIHJldHVybiBgQ2Fubm90ICR7ZnVuY05hbWV9ICcke3NyY30nIHRvIGEgc3ViZGlyZWN0b3J5IG9mIGl0c2VsZiwgJyR7ZGVzdH0nLmBcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGNoZWNrUGF0aHNcbiAgY2hlY2tQYXRoczogdShjaGVja1BhdGhzKSxcbiAgY2hlY2tQYXRoc1N5bmMsXG4gIC8vIGNoZWNrUGFyZW50XG4gIGNoZWNrUGFyZW50UGF0aHM6IHUoY2hlY2tQYXJlbnRQYXRocyksXG4gIGNoZWNrUGFyZW50UGF0aHNTeW5jLFxuICAvLyBNaXNjXG4gIGlzU3JjU3ViZGlyLFxuICBhcmVJZGVudGljYWxcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgeyBta2RpcnMgfSA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcbmNvbnN0IHsgdXRpbWVzTWlsbGlzIH0gPSByZXF1aXJlKCcuLi91dGlsL3V0aW1lcycpXG5jb25zdCBzdGF0ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuYXN5bmMgZnVuY3Rpb24gY29weSAoc3JjLCBkZXN0LCBvcHRzID0ge30pIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb3B0cyA9IHsgZmlsdGVyOiBvcHRzIH1cbiAgfVxuXG4gIG9wdHMuY2xvYmJlciA9ICdjbG9iYmVyJyBpbiBvcHRzID8gISFvcHRzLmNsb2JiZXIgOiB0cnVlIC8vIGRlZmF1bHQgdG8gdHJ1ZSBmb3Igbm93XG4gIG9wdHMub3ZlcndyaXRlID0gJ292ZXJ3cml0ZScgaW4gb3B0cyA/ICEhb3B0cy5vdmVyd3JpdGUgOiBvcHRzLmNsb2JiZXIgLy8gb3ZlcndyaXRlIGZhbGxzIGJhY2sgdG8gY2xvYmJlclxuXG4gIC8vIFdhcm4gYWJvdXQgdXNpbmcgcHJlc2VydmVUaW1lc3RhbXBzIG9uIDMyLWJpdCBub2RlXG4gIGlmIChvcHRzLnByZXNlcnZlVGltZXN0YW1wcyAmJiBwcm9jZXNzLmFyY2ggPT09ICdpYTMyJykge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoXG4gICAgICAnVXNpbmcgdGhlIHByZXNlcnZlVGltZXN0YW1wcyBvcHRpb24gaW4gMzItYml0IG5vZGUgaXMgbm90IHJlY29tbWVuZGVkO1xcblxcbicgK1xuICAgICAgJ1xcdHNlZSBodHRwczovL2dpdGh1Yi5jb20vanByaWNoYXJkc29uL25vZGUtZnMtZXh0cmEvaXNzdWVzLzI2OScsXG4gICAgICAnV2FybmluZycsICdmcy1leHRyYS1XQVJOMDAwMSdcbiAgICApXG4gIH1cblxuICBjb25zdCB7IHNyY1N0YXQsIGRlc3RTdGF0IH0gPSBhd2FpdCBzdGF0LmNoZWNrUGF0aHMoc3JjLCBkZXN0LCAnY29weScsIG9wdHMpXG5cbiAgYXdhaXQgc3RhdC5jaGVja1BhcmVudFBhdGhzKHNyYywgc3JjU3RhdCwgZGVzdCwgJ2NvcHknKVxuXG4gIGNvbnN0IGluY2x1ZGUgPSBhd2FpdCBydW5GaWx0ZXIoc3JjLCBkZXN0LCBvcHRzKVxuXG4gIGlmICghaW5jbHVkZSkgcmV0dXJuXG5cbiAgLy8gY2hlY2sgaWYgdGhlIHBhcmVudCBvZiBkZXN0IGV4aXN0cywgYW5kIGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgY29uc3QgZGlyRXhpc3RzID0gYXdhaXQgcGF0aEV4aXN0cyhkZXN0UGFyZW50KVxuICBpZiAoIWRpckV4aXN0cykge1xuICAgIGF3YWl0IG1rZGlycyhkZXN0UGFyZW50KVxuICB9XG5cbiAgYXdhaXQgZ2V0U3RhdHNBbmRQZXJmb3JtQ29weShkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxufVxuXG5hc3luYyBmdW5jdGlvbiBydW5GaWx0ZXIgKHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAoIW9wdHMuZmlsdGVyKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gb3B0cy5maWx0ZXIoc3JjLCBkZXN0KVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5IChkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGNvbnN0IHN0YXRGbiA9IG9wdHMuZGVyZWZlcmVuY2UgPyBmcy5zdGF0IDogZnMubHN0YXRcbiAgY29uc3Qgc3JjU3RhdCA9IGF3YWl0IHN0YXRGbihzcmMpXG5cbiAgaWYgKHNyY1N0YXQuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIG9uRGlyKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG5cbiAgaWYgKFxuICAgIHNyY1N0YXQuaXNGaWxlKCkgfHxcbiAgICBzcmNTdGF0LmlzQ2hhcmFjdGVyRGV2aWNlKCkgfHxcbiAgICBzcmNTdGF0LmlzQmxvY2tEZXZpY2UoKVxuICApIHJldHVybiBvbkZpbGUoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcblxuICBpZiAoc3JjU3RhdC5pc1N5bWJvbGljTGluaygpKSByZXR1cm4gb25MaW5rKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG4gIGlmIChzcmNTdGF0LmlzU29ja2V0KCkpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgYSBzb2NrZXQgZmlsZTogJHtzcmN9YClcbiAgaWYgKHNyY1N0YXQuaXNGSUZPKCkpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgYSBGSUZPIHBpcGU6ICR7c3JjfWApXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWxlOiAke3NyY31gKVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbkZpbGUgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFkZXN0U3RhdCkgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcblxuICBpZiAob3B0cy5vdmVyd3JpdGUpIHtcbiAgICBhd2FpdCBmcy51bmxpbmsoZGVzdClcbiAgICByZXR1cm4gY29weUZpbGUoc3JjU3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICB9XG4gIGlmIChvcHRzLmVycm9yT25FeGlzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7ZGVzdH0nIGFscmVhZHkgZXhpc3RzYClcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5RmlsZSAoc3JjU3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGF3YWl0IGZzLmNvcHlGaWxlKHNyYywgZGVzdClcbiAgaWYgKG9wdHMucHJlc2VydmVUaW1lc3RhbXBzKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBmaWxlIGlzIHdyaXRhYmxlIGJlZm9yZSBzZXR0aW5nIHRoZSB0aW1lc3RhbXBcbiAgICAvLyBvdGhlcndpc2Ugb3BlbiBmYWlscyB3aXRoIEVQRVJNIHdoZW4gaW52b2tlZCB3aXRoICdyKydcbiAgICAvLyAodGhyb3VnaCB1dGltZXMgY2FsbClcbiAgICBpZiAoZmlsZUlzTm90V3JpdGFibGUoc3JjU3RhdC5tb2RlKSkge1xuICAgICAgYXdhaXQgbWFrZUZpbGVXcml0YWJsZShkZXN0LCBzcmNTdGF0Lm1vZGUpXG4gICAgfVxuXG4gICAgLy8gU2V0IHRpbWVzdGFtcHMgYW5kIG1vZGUgY29ycmVzcG9uZGluZ2x5XG5cbiAgICAvLyBOb3RlIHRoYXQgVGhlIGluaXRpYWwgc3JjU3RhdC5hdGltZSBjYW5ub3QgYmUgdHJ1c3RlZFxuICAgIC8vIGJlY2F1c2UgaXQgaXMgbW9kaWZpZWQgYnkgdGhlIHJlYWQoMikgc3lzdGVtIGNhbGxcbiAgICAvLyAoU2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZnMuaHRtbCNmc19zdGF0X3RpbWVfdmFsdWVzKVxuICAgIGNvbnN0IHVwZGF0ZWRTcmNTdGF0ID0gYXdhaXQgZnMuc3RhdChzcmMpXG4gICAgYXdhaXQgdXRpbWVzTWlsbGlzKGRlc3QsIHVwZGF0ZWRTcmNTdGF0LmF0aW1lLCB1cGRhdGVkU3JjU3RhdC5tdGltZSlcbiAgfVxuXG4gIHJldHVybiBmcy5jaG1vZChkZXN0LCBzcmNTdGF0Lm1vZGUpXG59XG5cbmZ1bmN0aW9uIGZpbGVJc05vdFdyaXRhYmxlIChzcmNNb2RlKSB7XG4gIHJldHVybiAoc3JjTW9kZSAmIDBvMjAwKSA9PT0gMFxufVxuXG5mdW5jdGlvbiBtYWtlRmlsZVdyaXRhYmxlIChkZXN0LCBzcmNNb2RlKSB7XG4gIHJldHVybiBmcy5jaG1vZChkZXN0LCBzcmNNb2RlIHwgMG8yMDApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9uRGlyIChzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIC8vIHRoZSBkZXN0IGRpcmVjdG9yeSBtaWdodCBub3QgZXhpc3QsIGNyZWF0ZSBpdFxuICBpZiAoIWRlc3RTdGF0KSB7XG4gICAgYXdhaXQgZnMubWtkaXIoZGVzdClcbiAgfVxuXG4gIGNvbnN0IHByb21pc2VzID0gW11cblxuICAvLyBsb29wIHRocm91Z2ggdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0byBjb3B5IGV2ZXJ5dGhpbmdcbiAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGF3YWl0IGZzLm9wZW5kaXIoc3JjKSkge1xuICAgIGNvbnN0IHNyY0l0ZW0gPSBwYXRoLmpvaW4oc3JjLCBpdGVtLm5hbWUpXG4gICAgY29uc3QgZGVzdEl0ZW0gPSBwYXRoLmpvaW4oZGVzdCwgaXRlbS5uYW1lKVxuXG4gICAgcHJvbWlzZXMucHVzaChcbiAgICAgIHJ1bkZpbHRlcihzcmNJdGVtLCBkZXN0SXRlbSwgb3B0cykudGhlbihpbmNsdWRlID0+IHtcbiAgICAgICAgaWYgKGluY2x1ZGUpIHtcbiAgICAgICAgICAvLyBvbmx5IGNvcHkgdGhlIGl0ZW0gaWYgaXQgbWF0Y2hlcyB0aGUgZmlsdGVyIGZ1bmN0aW9uXG4gICAgICAgICAgcmV0dXJuIHN0YXQuY2hlY2tQYXRocyhzcmNJdGVtLCBkZXN0SXRlbSwgJ2NvcHknLCBvcHRzKS50aGVuKCh7IGRlc3RTdGF0IH0pID0+IHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpdGVtIGlzIGEgY29weWFibGUgZmlsZSwgYGdldFN0YXRzQW5kUGVyZm9ybUNvcHlgIHdpbGwgY29weSBpdFxuICAgICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgYSBkaXJlY3RvcnksIGBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5YCB3aWxsIGNhbGwgYG9uRGlyYCByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmV0dXJuIGdldFN0YXRzQW5kUGVyZm9ybUNvcHkoZGVzdFN0YXQsIHNyY0l0ZW0sIGRlc3RJdGVtLCBvcHRzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG5cbiAgaWYgKCFkZXN0U3RhdCkge1xuICAgIGF3YWl0IGZzLmNobW9kKGRlc3QsIHNyY1N0YXQubW9kZSlcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbkxpbmsgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgbGV0IHJlc29sdmVkU3JjID0gYXdhaXQgZnMucmVhZGxpbmsoc3JjKVxuICBpZiAob3B0cy5kZXJlZmVyZW5jZSkge1xuICAgIHJlc29sdmVkU3JjID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkU3JjKVxuICB9XG4gIGlmICghZGVzdFN0YXQpIHtcbiAgICByZXR1cm4gZnMuc3ltbGluayhyZXNvbHZlZFNyYywgZGVzdClcbiAgfVxuXG4gIGxldCByZXNvbHZlZERlc3QgPSBudWxsXG4gIHRyeSB7XG4gICAgcmVzb2x2ZWREZXN0ID0gYXdhaXQgZnMucmVhZGxpbmsoZGVzdClcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGRlc3QgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnksXG4gICAgLy8gV2luZG93cyBtYXkgdGhyb3cgVU5LTk9XTiBlcnJvci4gSWYgZGVzdCBhbHJlYWR5IGV4aXN0cyxcbiAgICAvLyBmcyB0aHJvd3MgZXJyb3IgYW55d2F5LCBzbyBubyBuZWVkIHRvIGd1YXJkIGFnYWluc3QgaXQgaGVyZS5cbiAgICBpZiAoZS5jb2RlID09PSAnRUlOVkFMJyB8fCBlLmNvZGUgPT09ICdVTktOT1dOJykgcmV0dXJuIGZzLnN5bWxpbmsocmVzb2x2ZWRTcmMsIGRlc3QpXG4gICAgdGhyb3cgZVxuICB9XG4gIGlmIChvcHRzLmRlcmVmZXJlbmNlKSB7XG4gICAgcmVzb2x2ZWREZXN0ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkRGVzdClcbiAgfVxuICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZFNyYywgcmVzb2x2ZWREZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgJyR7cmVzb2x2ZWRTcmN9JyB0byBhIHN1YmRpcmVjdG9yeSBvZiBpdHNlbGYsICcke3Jlc29sdmVkRGVzdH0nLmApXG4gIH1cblxuICAvLyBkbyBub3QgY29weSBpZiBzcmMgaXMgYSBzdWJkaXIgb2YgZGVzdCBzaW5jZSB1bmxpbmtpbmdcbiAgLy8gZGVzdCBpbiB0aGlzIGNhc2Ugd291bGQgcmVzdWx0IGluIHJlbW92aW5nIHNyYyBjb250ZW50c1xuICAvLyBhbmQgdGhlcmVmb3JlIGEgYnJva2VuIHN5bWxpbmsgd291bGQgYmUgY3JlYXRlZC5cbiAgaWYgKHN0YXQuaXNTcmNTdWJkaXIocmVzb2x2ZWREZXN0LCByZXNvbHZlZFNyYykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgJyR7cmVzb2x2ZWREZXN0fScgd2l0aCAnJHtyZXNvbHZlZFNyY30nLmApXG4gIH1cblxuICAvLyBjb3B5IHRoZSBsaW5rXG4gIGF3YWl0IGZzLnVubGluayhkZXN0KVxuICByZXR1cm4gZnMuc3ltbGluayhyZXNvbHZlZFNyYywgZGVzdClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG1rZGlyc1N5bmMgPSByZXF1aXJlKCcuLi9ta2RpcnMnKS5ta2RpcnNTeW5jXG5jb25zdCB1dGltZXNNaWxsaXNTeW5jID0gcmVxdWlyZSgnLi4vdXRpbC91dGltZXMnKS51dGltZXNNaWxsaXNTeW5jXG5jb25zdCBzdGF0ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuZnVuY3Rpb24gY29weVN5bmMgKHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRzID0geyBmaWx0ZXI6IG9wdHMgfVxuICB9XG5cbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgb3B0cy5jbG9iYmVyID0gJ2Nsb2JiZXInIGluIG9wdHMgPyAhIW9wdHMuY2xvYmJlciA6IHRydWUgLy8gZGVmYXVsdCB0byB0cnVlIGZvciBub3dcbiAgb3B0cy5vdmVyd3JpdGUgPSAnb3ZlcndyaXRlJyBpbiBvcHRzID8gISFvcHRzLm92ZXJ3cml0ZSA6IG9wdHMuY2xvYmJlciAvLyBvdmVyd3JpdGUgZmFsbHMgYmFjayB0byBjbG9iYmVyXG5cbiAgLy8gV2FybiBhYm91dCB1c2luZyBwcmVzZXJ2ZVRpbWVzdGFtcHMgb24gMzItYml0IG5vZGVcbiAgaWYgKG9wdHMucHJlc2VydmVUaW1lc3RhbXBzICYmIHByb2Nlc3MuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAgICdVc2luZyB0aGUgcHJlc2VydmVUaW1lc3RhbXBzIG9wdGlvbiBpbiAzMi1iaXQgbm9kZSBpcyBub3QgcmVjb21tZW5kZWQ7XFxuXFxuJyArXG4gICAgICAnXFx0c2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcHJpY2hhcmRzb24vbm9kZS1mcy1leHRyYS9pc3N1ZXMvMjY5JyxcbiAgICAgICdXYXJuaW5nJywgJ2ZzLWV4dHJhLVdBUk4wMDAyJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHsgc3JjU3RhdCwgZGVzdFN0YXQgfSA9IHN0YXQuY2hlY2tQYXRoc1N5bmMoc3JjLCBkZXN0LCAnY29weScsIG9wdHMpXG4gIHN0YXQuY2hlY2tQYXJlbnRQYXRoc1N5bmMoc3JjLCBzcmNTdGF0LCBkZXN0LCAnY29weScpXG4gIGlmIChvcHRzLmZpbHRlciAmJiAhb3B0cy5maWx0ZXIoc3JjLCBkZXN0KSkgcmV0dXJuXG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRlc3RQYXJlbnQpKSBta2RpcnNTeW5jKGRlc3RQYXJlbnQpXG4gIHJldHVybiBnZXRTdGF0cyhkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxufVxuXG5mdW5jdGlvbiBnZXRTdGF0cyAoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBjb25zdCBzdGF0U3luYyA9IG9wdHMuZGVyZWZlcmVuY2UgPyBmcy5zdGF0U3luYyA6IGZzLmxzdGF0U3luY1xuICBjb25zdCBzcmNTdGF0ID0gc3RhdFN5bmMoc3JjKVxuXG4gIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkpIHJldHVybiBvbkRpcihzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICBlbHNlIGlmIChzcmNTdGF0LmlzRmlsZSgpIHx8XG4gICAgICAgICAgIHNyY1N0YXQuaXNDaGFyYWN0ZXJEZXZpY2UoKSB8fFxuICAgICAgICAgICBzcmNTdGF0LmlzQmxvY2tEZXZpY2UoKSkgcmV0dXJuIG9uRmlsZShzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICBlbHNlIGlmIChzcmNTdGF0LmlzU3ltYm9saWNMaW5rKCkpIHJldHVybiBvbkxpbmsoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgZWxzZSBpZiAoc3JjU3RhdC5pc1NvY2tldCgpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3B5IGEgc29ja2V0IGZpbGU6ICR7c3JjfWApXG4gIGVsc2UgaWYgKHNyY1N0YXQuaXNGSUZPKCkpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgYSBGSUZPIHBpcGU6ICR7c3JjfWApXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWxlOiAke3NyY31gKVxufVxuXG5mdW5jdGlvbiBvbkZpbGUgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFkZXN0U3RhdCkgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIG1heUNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbn1cblxuZnVuY3Rpb24gbWF5Q29weUZpbGUgKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAob3B0cy5vdmVyd3JpdGUpIHtcbiAgICBmcy51bmxpbmtTeW5jKGRlc3QpXG4gICAgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgfSBlbHNlIGlmIChvcHRzLmVycm9yT25FeGlzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7ZGVzdH0nIGFscmVhZHkgZXhpc3RzYClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5RmlsZSAoc3JjU3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGZzLmNvcHlGaWxlU3luYyhzcmMsIGRlc3QpXG4gIGlmIChvcHRzLnByZXNlcnZlVGltZXN0YW1wcykgaGFuZGxlVGltZXN0YW1wcyhzcmNTdGF0Lm1vZGUsIHNyYywgZGVzdClcbiAgcmV0dXJuIHNldERlc3RNb2RlKGRlc3QsIHNyY1N0YXQubW9kZSlcbn1cblxuZnVuY3Rpb24gaGFuZGxlVGltZXN0YW1wcyAoc3JjTW9kZSwgc3JjLCBkZXN0KSB7XG4gIC8vIE1ha2Ugc3VyZSB0aGUgZmlsZSBpcyB3cml0YWJsZSBiZWZvcmUgc2V0dGluZyB0aGUgdGltZXN0YW1wXG4gIC8vIG90aGVyd2lzZSBvcGVuIGZhaWxzIHdpdGggRVBFUk0gd2hlbiBpbnZva2VkIHdpdGggJ3IrJ1xuICAvLyAodGhyb3VnaCB1dGltZXMgY2FsbClcbiAgaWYgKGZpbGVJc05vdFdyaXRhYmxlKHNyY01vZGUpKSBtYWtlRmlsZVdyaXRhYmxlKGRlc3QsIHNyY01vZGUpXG4gIHJldHVybiBzZXREZXN0VGltZXN0YW1wcyhzcmMsIGRlc3QpXG59XG5cbmZ1bmN0aW9uIGZpbGVJc05vdFdyaXRhYmxlIChzcmNNb2RlKSB7XG4gIHJldHVybiAoc3JjTW9kZSAmIDBvMjAwKSA9PT0gMFxufVxuXG5mdW5jdGlvbiBtYWtlRmlsZVdyaXRhYmxlIChkZXN0LCBzcmNNb2RlKSB7XG4gIHJldHVybiBzZXREZXN0TW9kZShkZXN0LCBzcmNNb2RlIHwgMG8yMDApXG59XG5cbmZ1bmN0aW9uIHNldERlc3RNb2RlIChkZXN0LCBzcmNNb2RlKSB7XG4gIHJldHVybiBmcy5jaG1vZFN5bmMoZGVzdCwgc3JjTW9kZSlcbn1cblxuZnVuY3Rpb24gc2V0RGVzdFRpbWVzdGFtcHMgKHNyYywgZGVzdCkge1xuICAvLyBUaGUgaW5pdGlhbCBzcmNTdGF0LmF0aW1lIGNhbm5vdCBiZSB0cnVzdGVkXG4gIC8vIGJlY2F1c2UgaXQgaXMgbW9kaWZpZWQgYnkgdGhlIHJlYWQoMikgc3lzdGVtIGNhbGxcbiAgLy8gKFNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfc3RhdF90aW1lX3ZhbHVlcylcbiAgY29uc3QgdXBkYXRlZFNyY1N0YXQgPSBmcy5zdGF0U3luYyhzcmMpXG4gIHJldHVybiB1dGltZXNNaWxsaXNTeW5jKGRlc3QsIHVwZGF0ZWRTcmNTdGF0LmF0aW1lLCB1cGRhdGVkU3JjU3RhdC5tdGltZSlcbn1cblxuZnVuY3Rpb24gb25EaXIgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFkZXN0U3RhdCkgcmV0dXJuIG1rRGlyQW5kQ29weShzcmNTdGF0Lm1vZGUsIHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIGNvcHlEaXIoc3JjLCBkZXN0LCBvcHRzKVxufVxuXG5mdW5jdGlvbiBta0RpckFuZENvcHkgKHNyY01vZGUsIHNyYywgZGVzdCwgb3B0cykge1xuICBmcy5ta2RpclN5bmMoZGVzdClcbiAgY29weURpcihzcmMsIGRlc3QsIG9wdHMpXG4gIHJldHVybiBzZXREZXN0TW9kZShkZXN0LCBzcmNNb2RlKVxufVxuXG5mdW5jdGlvbiBjb3B5RGlyIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3QgZGlyID0gZnMub3BlbmRpclN5bmMoc3JjKVxuXG4gIHRyeSB7XG4gICAgbGV0IGRpcmVudFxuXG4gICAgd2hpbGUgKChkaXJlbnQgPSBkaXIucmVhZFN5bmMoKSkgIT09IG51bGwpIHtcbiAgICAgIGNvcHlEaXJJdGVtKGRpcmVudC5uYW1lLCBzcmMsIGRlc3QsIG9wdHMpXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGRpci5jbG9zZVN5bmMoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvcHlEaXJJdGVtIChpdGVtLCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3Qgc3JjSXRlbSA9IHBhdGguam9pbihzcmMsIGl0ZW0pXG4gIGNvbnN0IGRlc3RJdGVtID0gcGF0aC5qb2luKGRlc3QsIGl0ZW0pXG4gIGlmIChvcHRzLmZpbHRlciAmJiAhb3B0cy5maWx0ZXIoc3JjSXRlbSwgZGVzdEl0ZW0pKSByZXR1cm5cbiAgY29uc3QgeyBkZXN0U3RhdCB9ID0gc3RhdC5jaGVja1BhdGhzU3luYyhzcmNJdGVtLCBkZXN0SXRlbSwgJ2NvcHknLCBvcHRzKVxuICByZXR1cm4gZ2V0U3RhdHMoZGVzdFN0YXQsIHNyY0l0ZW0sIGRlc3RJdGVtLCBvcHRzKVxufVxuXG5mdW5jdGlvbiBvbkxpbmsgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgbGV0IHJlc29sdmVkU3JjID0gZnMucmVhZGxpbmtTeW5jKHNyYylcbiAgaWYgKG9wdHMuZGVyZWZlcmVuY2UpIHtcbiAgICByZXNvbHZlZFNyYyA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlZFNyYylcbiAgfVxuXG4gIGlmICghZGVzdFN0YXQpIHtcbiAgICByZXR1cm4gZnMuc3ltbGlua1N5bmMocmVzb2x2ZWRTcmMsIGRlc3QpXG4gIH0gZWxzZSB7XG4gICAgbGV0IHJlc29sdmVkRGVzdFxuICAgIHRyeSB7XG4gICAgICByZXNvbHZlZERlc3QgPSBmcy5yZWFkbGlua1N5bmMoZGVzdClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGRlc3QgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnksXG4gICAgICAvLyBXaW5kb3dzIG1heSB0aHJvdyBVTktOT1dOIGVycm9yLiBJZiBkZXN0IGFscmVhZHkgZXhpc3RzLFxuICAgICAgLy8gZnMgdGhyb3dzIGVycm9yIGFueXdheSwgc28gbm8gbmVlZCB0byBndWFyZCBhZ2FpbnN0IGl0IGhlcmUuXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFSU5WQUwnIHx8IGVyci5jb2RlID09PSAnVU5LTk9XTicpIHJldHVybiBmcy5zeW1saW5rU3luYyhyZXNvbHZlZFNyYywgZGVzdClcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBpZiAob3B0cy5kZXJlZmVyZW5jZSkge1xuICAgICAgcmVzb2x2ZWREZXN0ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkRGVzdClcbiAgICB9XG4gICAgaWYgKHN0YXQuaXNTcmNTdWJkaXIocmVzb2x2ZWRTcmMsIHJlc29sdmVkRGVzdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgJyR7cmVzb2x2ZWRTcmN9JyB0byBhIHN1YmRpcmVjdG9yeSBvZiBpdHNlbGYsICcke3Jlc29sdmVkRGVzdH0nLmApXG4gICAgfVxuXG4gICAgLy8gcHJldmVudCBjb3B5IGlmIHNyYyBpcyBhIHN1YmRpciBvZiBkZXN0IHNpbmNlIHVubGlua2luZ1xuICAgIC8vIGRlc3QgaW4gdGhpcyBjYXNlIHdvdWxkIHJlc3VsdCBpbiByZW1vdmluZyBzcmMgY29udGVudHNcbiAgICAvLyBhbmQgdGhlcmVmb3JlIGEgYnJva2VuIHN5bWxpbmsgd291bGQgYmUgY3JlYXRlZC5cbiAgICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZERlc3QsIHJlc29sdmVkU3JjKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlICcke3Jlc29sdmVkRGVzdH0nIHdpdGggJyR7cmVzb2x2ZWRTcmN9Jy5gKVxuICAgIH1cbiAgICByZXR1cm4gY29weUxpbmsocmVzb2x2ZWRTcmMsIGRlc3QpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29weUxpbmsgKHJlc29sdmVkU3JjLCBkZXN0KSB7XG4gIGZzLnVubGlua1N5bmMoZGVzdClcbiAgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHJlc29sdmVkU3JjLCBkZXN0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW5jXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2Vcbm1vZHVsZS5leHBvcnRzID0ge1xuICBjb3B5OiB1KHJlcXVpcmUoJy4vY29weScpKSxcbiAgY29weVN5bmM6IHJlcXVpcmUoJy4vY29weS1zeW5jJylcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21DYWxsYmFja1xuXG5mdW5jdGlvbiByZW1vdmUgKHBhdGgsIGNhbGxiYWNrKSB7XG4gIGZzLnJtKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9LCBjYWxsYmFjaylcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3luYyAocGF0aCkge1xuICBmcy5ybVN5bmMocGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICByZW1vdmU6IHUocmVtb3ZlKSxcbiAgcmVtb3ZlU3luY1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG1rZGlyID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcbmNvbnN0IHJlbW92ZSA9IHJlcXVpcmUoJy4uL3JlbW92ZScpXG5cbmNvbnN0IGVtcHR5RGlyID0gdShhc3luYyBmdW5jdGlvbiBlbXB0eURpciAoZGlyKSB7XG4gIGxldCBpdGVtc1xuICB0cnkge1xuICAgIGl0ZW1zID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBta2Rpci5ta2RpcnMoZGlyKVxuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zLm1hcChpdGVtID0+IHJlbW92ZS5yZW1vdmUocGF0aC5qb2luKGRpciwgaXRlbSkpKSlcbn0pXG5cbmZ1bmN0aW9uIGVtcHR5RGlyU3luYyAoZGlyKSB7XG4gIGxldCBpdGVtc1xuICB0cnkge1xuICAgIGl0ZW1zID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbWtkaXIubWtkaXJzU3luYyhkaXIpXG4gIH1cblxuICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGl0ZW0gPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIHJlbW92ZS5yZW1vdmVTeW5jKGl0ZW0pXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBlbXB0eURpclN5bmMsXG4gIGVtcHR5ZGlyU3luYzogZW1wdHlEaXJTeW5jLFxuICBlbXB0eURpcixcbiAgZW1wdHlkaXI6IGVtcHR5RGlyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgbWtkaXIgPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVGaWxlIChmaWxlKSB7XG4gIGxldCBzdGF0c1xuICB0cnkge1xuICAgIHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlKVxuICB9IGNhdGNoIHsgfVxuICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHJldHVyblxuXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuXG4gIGxldCBkaXJTdGF0cyA9IG51bGxcbiAgdHJ5IHtcbiAgICBkaXJTdGF0cyA9IGF3YWl0IGZzLnN0YXQoZGlyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIG1ha2UgaXRcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICBhd2FpdCBta2Rpci5ta2RpcnMoZGlyKVxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGUsICcnKVxuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJTdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGUsICcnKVxuICB9IGVsc2Uge1xuICAgIC8vIHBhcmVudCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICAvLyBUaGlzIGlzIGp1c3QgdG8gY2F1c2UgYW4gaW50ZXJuYWwgRU5PVERJUiBlcnJvciB0byBiZSB0aHJvd25cbiAgICBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWxlU3luYyAoZmlsZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGUpXG4gIH0gY2F0Y2ggeyB9XG4gIGlmIChzdGF0cyAmJiBzdGF0cy5pc0ZpbGUoKSkgcmV0dXJuXG5cbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpXG4gIHRyeSB7XG4gICAgaWYgKCFmcy5zdGF0U3luYyhkaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIC8vIHBhcmVudCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICAgIC8vIFRoaXMgaXMganVzdCB0byBjYXVzZSBhbiBpbnRlcm5hbCBFTk9URElSIGVycm9yIHRvIGJlIHRocm93blxuICAgICAgZnMucmVhZGRpclN5bmMoZGlyKVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSWYgdGhlIHN0YXQgY2FsbCBhYm92ZSBmYWlsZWQgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdFxuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdFTk9FTlQnKSBta2Rpci5ta2RpcnNTeW5jKGRpcilcbiAgICBlbHNlIHRocm93IGVyclxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCAnJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZUZpbGU6IHUoY3JlYXRlRmlsZSksXG4gIGNyZWF0ZUZpbGVTeW5jXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgbWtkaXIgPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuY29uc3QgeyBwYXRoRXhpc3RzIH0gPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpXG5jb25zdCB7IGFyZUlkZW50aWNhbCB9ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlTGluayAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBsZXQgZHN0U3RhdFxuICB0cnkge1xuICAgIGRzdFN0YXQgPSBhd2FpdCBmcy5sc3RhdChkc3RwYXRoKVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgZXJyb3JcbiAgfVxuXG4gIGxldCBzcmNTdGF0XG4gIHRyeSB7XG4gICAgc3JjU3RhdCA9IGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UucmVwbGFjZSgnbHN0YXQnLCAnZW5zdXJlTGluaycpXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICBpZiAoZHN0U3RhdCAmJiBhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RwYXRoKVxuXG4gIGNvbnN0IGRpckV4aXN0cyA9IGF3YWl0IHBhdGhFeGlzdHMoZGlyKVxuXG4gIGlmICghZGlyRXhpc3RzKSB7XG4gICAgYXdhaXQgbWtkaXIubWtkaXJzKGRpcilcbiAgfVxuXG4gIGF3YWl0IGZzLmxpbmsoc3JjcGF0aCwgZHN0cGF0aClcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGlua1N5bmMgKHNyY3BhdGgsIGRzdHBhdGgpIHtcbiAgbGV0IGRzdFN0YXRcbiAgdHJ5IHtcbiAgICBkc3RTdGF0ID0gZnMubHN0YXRTeW5jKGRzdHBhdGgpXG4gIH0gY2F0Y2gge31cblxuICB0cnkge1xuICAgIGNvbnN0IHNyY1N0YXQgPSBmcy5sc3RhdFN5bmMoc3JjcGF0aClcbiAgICBpZiAoZHN0U3RhdCAmJiBhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ2xzdGF0JywgJ2Vuc3VyZUxpbmsnKVxuICAgIHRocm93IGVyclxuICB9XG5cbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG4gIGNvbnN0IGRpckV4aXN0cyA9IGZzLmV4aXN0c1N5bmMoZGlyKVxuICBpZiAoZGlyRXhpc3RzKSByZXR1cm4gZnMubGlua1N5bmMoc3JjcGF0aCwgZHN0cGF0aClcbiAgbWtkaXIubWtkaXJzU3luYyhkaXIpXG5cbiAgcmV0dXJuIGZzLmxpbmtTeW5jKHNyY3BhdGgsIGRzdHBhdGgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVMaW5rOiB1KGNyZWF0ZUxpbmspLFxuICBjcmVhdGVMaW5rU3luY1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCByZXR1cm5zIHR3byB0eXBlcyBvZiBwYXRocywgb25lIHJlbGF0aXZlIHRvIHN5bWxpbmssIGFuZCBvbmVcbiAqIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBDaGVja3MgaWYgcGF0aCBpcyBhYnNvbHV0ZSBvclxuICogcmVsYXRpdmUuIElmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLCB0aGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgcGF0aCBpc1xuICogcmVsYXRpdmUgdG8gc3ltbGluayBvciByZWxhdGl2ZSB0byBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIGlzIGFuXG4gKiBpbml0aWF0aXZlIHRvIGZpbmQgYSBzbWFydGVyIGBzcmNwYXRoYCB0byBzdXBwbHkgd2hlbiBidWlsZGluZyBzeW1saW5rcy5cbiAqIFRoaXMgYWxsb3dzIHlvdSB0byBkZXRlcm1pbmUgd2hpY2ggcGF0aCB0byB1c2Ugb3V0IG9mIG9uZSBvZiB0aHJlZSBwb3NzaWJsZVxuICogdHlwZXMgb2Ygc291cmNlIHBhdGhzLiBUaGUgZmlyc3QgaXMgYW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBpcyBkZXRlY3RlZCBieVxuICogYHBhdGguaXNBYnNvbHV0ZSgpYC4gV2hlbiBhbiBhYnNvbHV0ZSBwYXRoIGlzIHByb3ZpZGVkLCBpdCBpcyBjaGVja2VkIHRvXG4gKiBzZWUgaWYgaXQgZXhpc3RzLiBJZiBpdCBkb2VzIGl0J3MgdXNlZCwgaWYgbm90IGFuIGVycm9yIGlzIHJldHVybmVkXG4gKiAoY2FsbGJhY2spLyB0aHJvd24gKHN5bmMpLiBUaGUgb3RoZXIgdHdvIG9wdGlvbnMgZm9yIGBzcmNwYXRoYCBhcmUgYVxuICogcmVsYXRpdmUgdXJsLiBCeSBkZWZhdWx0IE5vZGUncyBgZnMuc3ltbGlua2Agd29ya3MgYnkgY3JlYXRpbmcgYSBzeW1saW5rXG4gKiB1c2luZyBgZHN0cGF0aGAgYW5kIGV4cGVjdHMgdGhlIGBzcmNwYXRoYCB0byBiZSByZWxhdGl2ZSB0byB0aGUgbmV3bHlcbiAqIGNyZWF0ZWQgc3ltbGluay4gSWYgeW91IHByb3ZpZGUgYSBgc3JjcGF0aGAgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZmlsZVxuICogc3lzdGVtIGl0IHJlc3VsdHMgaW4gYSBicm9rZW4gc3ltbGluay4gVG8gbWluaW1pemUgdGhpcywgdGhlIGZ1bmN0aW9uXG4gKiBjaGVja3MgdG8gc2VlIGlmIHRoZSAncmVsYXRpdmUgdG8gc3ltbGluaycgc291cmNlIGZpbGUgZXhpc3RzLCBhbmQgaWYgaXRcbiAqIGRvZXMgaXQgd2lsbCB1c2UgaXQuIElmIGl0IGRvZXMgbm90LCBpdCBjaGVja3MgaWYgdGhlcmUncyBhIGZpbGUgdGhhdFxuICogZXhpc3RzIHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGlmIGRvZXMgaXRzIHVzZWQuXG4gKiBUaGlzIHByZXNlcnZlcyB0aGUgZXhwZWN0YXRpb25zIG9mIHRoZSBvcmlnaW5hbCBmcy5zeW1saW5rIHNwZWMgYW5kIGFkZHNcbiAqIHRoZSBhYmlsaXR5IHRvIHBhc3MgaW4gYHJlbGF0aXZlIHRvIGN1cnJlbnQgd29ya2luZyBkaXJlY290cnlgIHBhdGhzLlxuICovXG5cbmFzeW5jIGZ1bmN0aW9uIHN5bWxpbmtQYXRocyAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBpZiAocGF0aC5pc0Fic29sdXRlKHNyY3BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ2xzdGF0JywgJ2Vuc3VyZVN5bWxpbmsnKVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBkc3RkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgcmVsYXRpdmVUb0RzdCA9IHBhdGguam9pbihkc3RkaXIsIHNyY3BhdGgpXG5cbiAgY29uc3QgZXhpc3RzID0gYXdhaXQgcGF0aEV4aXN0cyhyZWxhdGl2ZVRvRHN0KVxuICBpZiAoZXhpc3RzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiByZWxhdGl2ZVRvRHN0LFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UucmVwbGFjZSgnbHN0YXQnLCAnZW5zdXJlU3ltbGluaycpXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgIHRvRHN0OiBwYXRoLnJlbGF0aXZlKGRzdGRpciwgc3JjcGF0aClcbiAgfVxufVxuXG5mdW5jdGlvbiBzeW1saW5rUGF0aHNTeW5jIChzcmNwYXRoLCBkc3RwYXRoKSB7XG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoc3JjcGF0aCkpIHtcbiAgICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKHNyY3BhdGgpXG4gICAgaWYgKCFleGlzdHMpIHRocm93IG5ldyBFcnJvcignYWJzb2x1dGUgc3JjcGF0aCBkb2VzIG5vdCBleGlzdCcpXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBkc3RkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgcmVsYXRpdmVUb0RzdCA9IHBhdGguam9pbihkc3RkaXIsIHNyY3BhdGgpXG4gIGNvbnN0IGV4aXN0cyA9IGZzLmV4aXN0c1N5bmMocmVsYXRpdmVUb0RzdClcbiAgaWYgKGV4aXN0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0b0N3ZDogcmVsYXRpdmVUb0RzdCxcbiAgICAgIHRvRHN0OiBzcmNwYXRoXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3JjRXhpc3RzID0gZnMuZXhpc3RzU3luYyhzcmNwYXRoKVxuICBpZiAoIXNyY0V4aXN0cykgdGhyb3cgbmV3IEVycm9yKCdyZWxhdGl2ZSBzcmNwYXRoIGRvZXMgbm90IGV4aXN0JylcbiAgcmV0dXJuIHtcbiAgICB0b0N3ZDogc3JjcGF0aCxcbiAgICB0b0RzdDogcGF0aC5yZWxhdGl2ZShkc3RkaXIsIHNyY3BhdGgpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN5bWxpbmtQYXRoczogdShzeW1saW5rUGF0aHMpLFxuICBzeW1saW5rUGF0aHNTeW5jXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuXG5hc3luYyBmdW5jdGlvbiBzeW1saW5rVHlwZSAoc3JjcGF0aCwgdHlwZSkge1xuICBpZiAodHlwZSkgcmV0dXJuIHR5cGVcblxuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnZmlsZSdcbiAgfVxuXG4gIHJldHVybiAoc3RhdHMgJiYgc3RhdHMuaXNEaXJlY3RvcnkoKSkgPyAnZGlyJyA6ICdmaWxlJ1xufVxuXG5mdW5jdGlvbiBzeW1saW5rVHlwZVN5bmMgKHNyY3BhdGgsIHR5cGUpIHtcbiAgaWYgKHR5cGUpIHJldHVybiB0eXBlXG5cbiAgbGV0IHN0YXRzXG4gIHRyeSB7XG4gICAgc3RhdHMgPSBmcy5sc3RhdFN5bmMoc3JjcGF0aClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICdmaWxlJ1xuICB9XG4gIHJldHVybiAoc3RhdHMgJiYgc3RhdHMuaXNEaXJlY3RvcnkoKSkgPyAnZGlyJyA6ICdmaWxlJ1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc3ltbGlua1R5cGU6IHUoc3ltbGlua1R5cGUpLFxuICBzeW1saW5rVHlwZVN5bmNcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5cbmNvbnN0IHsgbWtkaXJzLCBta2RpcnNTeW5jIH0gPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuXG5jb25zdCB7IHN5bWxpbmtQYXRocywgc3ltbGlua1BhdGhzU3luYyB9ID0gcmVxdWlyZSgnLi9zeW1saW5rLXBhdGhzJylcbmNvbnN0IHsgc3ltbGlua1R5cGUsIHN5bWxpbmtUeXBlU3luYyB9ID0gcmVxdWlyZSgnLi9zeW1saW5rLXR5cGUnKVxuXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcblxuY29uc3QgeyBhcmVJZGVudGljYWwgfSA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN5bWxpbmsgKHNyY3BhdGgsIGRzdHBhdGgsIHR5cGUpIHtcbiAgbGV0IHN0YXRzXG4gIHRyeSB7XG4gICAgc3RhdHMgPSBhd2FpdCBmcy5sc3RhdChkc3RwYXRoKVxuICB9IGNhdGNoIHsgfVxuXG4gIGlmIChzdGF0cyAmJiBzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc3QgW3NyY1N0YXQsIGRzdFN0YXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMuc3RhdChzcmNwYXRoKSxcbiAgICAgIGZzLnN0YXQoZHN0cGF0aClcbiAgICBdKVxuXG4gICAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkc3RTdGF0KSkgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZWxhdGl2ZSA9IGF3YWl0IHN5bWxpbmtQYXRocyhzcmNwYXRoLCBkc3RwYXRoKVxuICBzcmNwYXRoID0gcmVsYXRpdmUudG9Ec3RcbiAgY29uc3QgdG9UeXBlID0gYXdhaXQgc3ltbGlua1R5cGUocmVsYXRpdmUudG9Dd2QsIHR5cGUpXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RwYXRoKVxuXG4gIGlmICghKGF3YWl0IHBhdGhFeGlzdHMoZGlyKSkpIHtcbiAgICBhd2FpdCBta2RpcnMoZGlyKVxuICB9XG5cbiAgcmV0dXJuIGZzLnN5bWxpbmsoc3JjcGF0aCwgZHN0cGF0aCwgdG9UeXBlKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTeW1saW5rU3luYyAoc3JjcGF0aCwgZHN0cGF0aCwgdHlwZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGZzLmxzdGF0U3luYyhkc3RwYXRoKVxuICB9IGNhdGNoIHsgfVxuICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGNvbnN0IHNyY1N0YXQgPSBmcy5zdGF0U3luYyhzcmNwYXRoKVxuICAgIGNvbnN0IGRzdFN0YXQgPSBmcy5zdGF0U3luYyhkc3RwYXRoKVxuICAgIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVsYXRpdmUgPSBzeW1saW5rUGF0aHNTeW5jKHNyY3BhdGgsIGRzdHBhdGgpXG4gIHNyY3BhdGggPSByZWxhdGl2ZS50b0RzdFxuICB0eXBlID0gc3ltbGlua1R5cGVTeW5jKHJlbGF0aXZlLnRvQ3dkLCB0eXBlKVxuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhkaXIpXG4gIGlmIChleGlzdHMpIHJldHVybiBmcy5zeW1saW5rU3luYyhzcmNwYXRoLCBkc3RwYXRoLCB0eXBlKVxuICBta2RpcnNTeW5jKGRpcilcbiAgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHNyY3BhdGgsIGRzdHBhdGgsIHR5cGUpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVTeW1saW5rOiB1KGNyZWF0ZVN5bWxpbmspLFxuICBjcmVhdGVTeW1saW5rU3luY1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBjcmVhdGVGaWxlLCBjcmVhdGVGaWxlU3luYyB9ID0gcmVxdWlyZSgnLi9maWxlJylcbmNvbnN0IHsgY3JlYXRlTGluaywgY3JlYXRlTGlua1N5bmMgfSA9IHJlcXVpcmUoJy4vbGluaycpXG5jb25zdCB7IGNyZWF0ZVN5bWxpbmssIGNyZWF0ZVN5bWxpbmtTeW5jIH0gPSByZXF1aXJlKCcuL3N5bWxpbmsnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gZmlsZVxuICBjcmVhdGVGaWxlLFxuICBjcmVhdGVGaWxlU3luYyxcbiAgZW5zdXJlRmlsZTogY3JlYXRlRmlsZSxcbiAgZW5zdXJlRmlsZVN5bmM6IGNyZWF0ZUZpbGVTeW5jLFxuICAvLyBsaW5rXG4gIGNyZWF0ZUxpbmssXG4gIGNyZWF0ZUxpbmtTeW5jLFxuICBlbnN1cmVMaW5rOiBjcmVhdGVMaW5rLFxuICBlbnN1cmVMaW5rU3luYzogY3JlYXRlTGlua1N5bmMsXG4gIC8vIHN5bWxpbmtcbiAgY3JlYXRlU3ltbGluayxcbiAgY3JlYXRlU3ltbGlua1N5bmMsXG4gIGVuc3VyZVN5bWxpbms6IGNyZWF0ZVN5bWxpbmssXG4gIGVuc3VyZVN5bWxpbmtTeW5jOiBjcmVhdGVTeW1saW5rU3luY1xufVxuIiwKICAgICJmdW5jdGlvbiBzdHJpbmdpZnkgKG9iaiwgeyBFT0wgPSAnXFxuJywgZmluYWxFT0wgPSB0cnVlLCByZXBsYWNlciA9IG51bGwsIHNwYWNlcyB9ID0ge30pIHtcbiAgY29uc3QgRU9GID0gZmluYWxFT0wgPyBFT0wgOiAnJ1xuICBjb25zdCBzdHIgPSBKU09OLnN0cmluZ2lmeShvYmosIHJlcGxhY2VyLCBzcGFjZXMpXG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXG4vZywgRU9MKSArIEVPRlxufVxuXG5mdW5jdGlvbiBzdHJpcEJvbSAoY29udGVudCkge1xuICAvLyB3ZSBkbyB0aGlzIGJlY2F1c2UgSlNPTi5wYXJzZSB3b3VsZCBjb252ZXJ0IGl0IHRvIGEgdXRmOCBzdHJpbmcgaWYgZW5jb2Rpbmcgd2Fzbid0IHNwZWNpZmllZFxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnQpKSBjb250ZW50ID0gY29udGVudC50b1N0cmluZygndXRmOCcpXG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpXG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBzdHJpbmdpZnksIHN0cmlwQm9tIH1cbiIsCiAgICAibGV0IF9mc1xudHJ5IHtcbiAgX2ZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxufSBjYXRjaCAoXykge1xuICBfZnMgPSByZXF1aXJlKCdmcycpXG59XG5jb25zdCB1bml2ZXJzYWxpZnkgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKVxuY29uc3QgeyBzdHJpbmdpZnksIHN0cmlwQm9tIH0gPSByZXF1aXJlKCcuL3V0aWxzJylcblxuYXN5bmMgZnVuY3Rpb24gX3JlYWRGaWxlIChmaWxlLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMgPSB7IGVuY29kaW5nOiBvcHRpb25zIH1cbiAgfVxuXG4gIGNvbnN0IGZzID0gb3B0aW9ucy5mcyB8fCBfZnNcblxuICBjb25zdCBzaG91bGRUaHJvdyA9ICd0aHJvd3MnIGluIG9wdGlvbnMgPyBvcHRpb25zLnRocm93cyA6IHRydWVcblxuICBsZXQgZGF0YSA9IGF3YWl0IHVuaXZlcnNhbGlmeS5mcm9tQ2FsbGJhY2soZnMucmVhZEZpbGUpKGZpbGUsIG9wdGlvbnMpXG5cbiAgZGF0YSA9IHN0cmlwQm9tKGRhdGEpXG5cbiAgbGV0IG9ialxuICB0cnkge1xuICAgIG9iaiA9IEpTT04ucGFyc2UoZGF0YSwgb3B0aW9ucyA/IG9wdGlvbnMucmV2aXZlciA6IG51bGwpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgJHtmaWxlfTogJHtlcnIubWVzc2FnZX1gXG4gICAgICB0aHJvdyBlcnJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmNvbnN0IHJlYWRGaWxlID0gdW5pdmVyc2FsaWZ5LmZyb21Qcm9taXNlKF9yZWFkRmlsZSlcblxuZnVuY3Rpb24gcmVhZEZpbGVTeW5jIChmaWxlLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMgPSB7IGVuY29kaW5nOiBvcHRpb25zIH1cbiAgfVxuXG4gIGNvbnN0IGZzID0gb3B0aW9ucy5mcyB8fCBfZnNcblxuICBjb25zdCBzaG91bGRUaHJvdyA9ICd0aHJvd3MnIGluIG9wdGlvbnMgPyBvcHRpb25zLnRocm93cyA6IHRydWVcblxuICB0cnkge1xuICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsIG9wdGlvbnMpXG4gICAgY29udGVudCA9IHN0cmlwQm9tKGNvbnRlbnQpXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCwgb3B0aW9ucy5yZXZpdmVyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gYCR7ZmlsZX06ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgdGhyb3cgZXJyXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF93cml0ZUZpbGUgKGZpbGUsIG9iaiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGZzID0gb3B0aW9ucy5mcyB8fCBfZnNcblxuICBjb25zdCBzdHIgPSBzdHJpbmdpZnkob2JqLCBvcHRpb25zKVxuXG4gIGF3YWl0IHVuaXZlcnNhbGlmeS5mcm9tQ2FsbGJhY2soZnMud3JpdGVGaWxlKShmaWxlLCBzdHIsIG9wdGlvbnMpXG59XG5cbmNvbnN0IHdyaXRlRmlsZSA9IHVuaXZlcnNhbGlmeS5mcm9tUHJvbWlzZShfd3JpdGVGaWxlKVxuXG5mdW5jdGlvbiB3cml0ZUZpbGVTeW5jIChmaWxlLCBvYmosIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBmcyA9IG9wdGlvbnMuZnMgfHwgX2ZzXG5cbiAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KG9iaiwgb3B0aW9ucylcbiAgLy8gbm90IHN1cmUgaWYgZnMud3JpdGVGaWxlU3luYyByZXR1cm5zIGFueXRoaW5nLCBidXQganVzdCBpbiBjYXNlXG4gIHJldHVybiBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIHN0ciwgb3B0aW9ucylcbn1cblxuY29uc3QganNvbmZpbGUgPSB7XG4gIHJlYWRGaWxlLFxuICByZWFkRmlsZVN5bmMsXG4gIHdyaXRlRmlsZSxcbiAgd3JpdGVGaWxlU3luY1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGpzb25maWxlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBqc29uRmlsZSA9IHJlcXVpcmUoJ2pzb25maWxlJylcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGpzb25maWxlIGV4cG9ydHNcbiAgcmVhZEpzb246IGpzb25GaWxlLnJlYWRGaWxlLFxuICByZWFkSnNvblN5bmM6IGpzb25GaWxlLnJlYWRGaWxlU3luYyxcbiAgd3JpdGVKc29uOiBqc29uRmlsZS53cml0ZUZpbGUsXG4gIHdyaXRlSnNvblN5bmM6IGpzb25GaWxlLndyaXRlRmlsZVN5bmNcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBta2RpciA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5jb25zdCBwYXRoRXhpc3RzID0gcmVxdWlyZSgnLi4vcGF0aC1leGlzdHMnKS5wYXRoRXhpc3RzXG5cbmFzeW5jIGZ1bmN0aW9uIG91dHB1dEZpbGUgKGZpbGUsIGRhdGEsIGVuY29kaW5nID0gJ3V0Zi04Jykge1xuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSlcblxuICBpZiAoIShhd2FpdCBwYXRoRXhpc3RzKGRpcikpKSB7XG4gICAgYXdhaXQgbWtkaXIubWtkaXJzKGRpcilcbiAgfVxuXG4gIHJldHVybiBmcy53cml0ZUZpbGUoZmlsZSwgZGF0YSwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIG91dHB1dEZpbGVTeW5jIChmaWxlLCAuLi5hcmdzKSB7XG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgIG1rZGlyLm1rZGlyc1N5bmMoZGlyKVxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCAuLi5hcmdzKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgb3V0cHV0RmlsZTogdShvdXRwdXRGaWxlKSxcbiAgb3V0cHV0RmlsZVN5bmNcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgc3RyaW5naWZ5IH0gPSByZXF1aXJlKCdqc29uZmlsZS91dGlscycpXG5jb25zdCB7IG91dHB1dEZpbGUgfSA9IHJlcXVpcmUoJy4uL291dHB1dC1maWxlJylcblxuYXN5bmMgZnVuY3Rpb24gb3V0cHV0SnNvbiAoZmlsZSwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShkYXRhLCBvcHRpb25zKVxuXG4gIGF3YWl0IG91dHB1dEZpbGUoZmlsZSwgc3RyLCBvcHRpb25zKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG91dHB1dEpzb25cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgc3RyaW5naWZ5IH0gPSByZXF1aXJlKCdqc29uZmlsZS91dGlscycpXG5jb25zdCB7IG91dHB1dEZpbGVTeW5jIH0gPSByZXF1aXJlKCcuLi9vdXRwdXQtZmlsZScpXG5cbmZ1bmN0aW9uIG91dHB1dEpzb25TeW5jIChmaWxlLCBkYXRhLCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShkYXRhLCBvcHRpb25zKVxuXG4gIG91dHB1dEZpbGVTeW5jKGZpbGUsIHN0ciwgb3B0aW9ucylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdXRwdXRKc29uU3luY1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBqc29uRmlsZSA9IHJlcXVpcmUoJy4vanNvbmZpbGUnKVxuXG5qc29uRmlsZS5vdXRwdXRKc29uID0gdShyZXF1aXJlKCcuL291dHB1dC1qc29uJykpXG5qc29uRmlsZS5vdXRwdXRKc29uU3luYyA9IHJlcXVpcmUoJy4vb3V0cHV0LWpzb24tc3luYycpXG4vLyBhbGlhc2VzXG5qc29uRmlsZS5vdXRwdXRKU09OID0ganNvbkZpbGUub3V0cHV0SnNvblxuanNvbkZpbGUub3V0cHV0SlNPTlN5bmMgPSBqc29uRmlsZS5vdXRwdXRKc29uU3luY1xuanNvbkZpbGUud3JpdGVKU09OID0ganNvbkZpbGUud3JpdGVKc29uXG5qc29uRmlsZS53cml0ZUpTT05TeW5jID0ganNvbkZpbGUud3JpdGVKc29uU3luY1xuanNvbkZpbGUucmVhZEpTT04gPSBqc29uRmlsZS5yZWFkSnNvblxuanNvbkZpbGUucmVhZEpTT05TeW5jID0ganNvbkZpbGUucmVhZEpzb25TeW5jXG5cbm1vZHVsZS5leHBvcnRzID0ganNvbkZpbGVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgeyBjb3B5IH0gPSByZXF1aXJlKCcuLi9jb3B5JylcbmNvbnN0IHsgcmVtb3ZlIH0gPSByZXF1aXJlKCcuLi9yZW1vdmUnKVxuY29uc3QgeyBta2RpcnAgfSA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcbmNvbnN0IHN0YXQgPSByZXF1aXJlKCcuLi91dGlsL3N0YXQnKVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlIChzcmMsIGRlc3QsIG9wdHMgPSB7fSkge1xuICBjb25zdCBvdmVyd3JpdGUgPSBvcHRzLm92ZXJ3cml0ZSB8fCBvcHRzLmNsb2JiZXIgfHwgZmFsc2VcblxuICBjb25zdCB7IHNyY1N0YXQsIGlzQ2hhbmdpbmdDYXNlID0gZmFsc2UgfSA9IGF3YWl0IHN0YXQuY2hlY2tQYXRocyhzcmMsIGRlc3QsICdtb3ZlJywgb3B0cylcblxuICBhd2FpdCBzdGF0LmNoZWNrUGFyZW50UGF0aHMoc3JjLCBzcmNTdGF0LCBkZXN0LCAnbW92ZScpXG5cbiAgLy8gSWYgdGhlIHBhcmVudCBvZiBkZXN0IGlzIG5vdCByb290LCBtYWtlIHN1cmUgaXQgZXhpc3RzIGJlZm9yZSBwcm9jZWVkaW5nXG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgY29uc3QgcGFyc2VkUGFyZW50UGF0aCA9IHBhdGgucGFyc2UoZGVzdFBhcmVudClcbiAgaWYgKHBhcnNlZFBhcmVudFBhdGgucm9vdCAhPT0gZGVzdFBhcmVudCkge1xuICAgIGF3YWl0IG1rZGlycChkZXN0UGFyZW50KVxuICB9XG5cbiAgcmV0dXJuIGRvUmVuYW1lKHNyYywgZGVzdCwgb3ZlcndyaXRlLCBpc0NoYW5naW5nQ2FzZSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9SZW5hbWUgKHNyYywgZGVzdCwgb3ZlcndyaXRlLCBpc0NoYW5naW5nQ2FzZSkge1xuICBpZiAoIWlzQ2hhbmdpbmdDYXNlKSB7XG4gICAgaWYgKG92ZXJ3cml0ZSkge1xuICAgICAgYXdhaXQgcmVtb3ZlKGRlc3QpXG4gICAgfSBlbHNlIGlmIChhd2FpdCBwYXRoRXhpc3RzKGRlc3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlc3QgYWxyZWFkeSBleGlzdHMuJylcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRyeSB3LyByZW5hbWUgZmlyc3QsIGFuZCB0cnkgY29weSArIHJlbW92ZSBpZiBFWERFVlxuICAgIGF3YWl0IGZzLnJlbmFtZShzcmMsIGRlc3QpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSAhPT0gJ0VYREVWJykge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICAgIGF3YWl0IG1vdmVBY3Jvc3NEZXZpY2Uoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbW92ZUFjcm9zc0RldmljZSAoc3JjLCBkZXN0LCBvdmVyd3JpdGUpIHtcbiAgY29uc3Qgb3B0cyA9IHtcbiAgICBvdmVyd3JpdGUsXG4gICAgZXJyb3JPbkV4aXN0OiB0cnVlLFxuICAgIHByZXNlcnZlVGltZXN0YW1wczogdHJ1ZVxuICB9XG5cbiAgYXdhaXQgY29weShzcmMsIGRlc3QsIG9wdHMpXG4gIHJldHVybiByZW1vdmUoc3JjKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1vdmVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgY29weVN5bmMgPSByZXF1aXJlKCcuLi9jb3B5JykuY29weVN5bmNcbmNvbnN0IHJlbW92ZVN5bmMgPSByZXF1aXJlKCcuLi9yZW1vdmUnKS5yZW1vdmVTeW5jXG5jb25zdCBta2RpcnBTeW5jID0gcmVxdWlyZSgnLi4vbWtkaXJzJykubWtkaXJwU3luY1xuY29uc3Qgc3RhdCA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmZ1bmN0aW9uIG1vdmVTeW5jIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgY29uc3Qgb3ZlcndyaXRlID0gb3B0cy5vdmVyd3JpdGUgfHwgb3B0cy5jbG9iYmVyIHx8IGZhbHNlXG5cbiAgY29uc3QgeyBzcmNTdGF0LCBpc0NoYW5naW5nQ2FzZSA9IGZhbHNlIH0gPSBzdGF0LmNoZWNrUGF0aHNTeW5jKHNyYywgZGVzdCwgJ21vdmUnLCBvcHRzKVxuICBzdGF0LmNoZWNrUGFyZW50UGF0aHNTeW5jKHNyYywgc3JjU3RhdCwgZGVzdCwgJ21vdmUnKVxuICBpZiAoIWlzUGFyZW50Um9vdChkZXN0KSkgbWtkaXJwU3luYyhwYXRoLmRpcm5hbWUoZGVzdCkpXG4gIHJldHVybiBkb1JlbmFtZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSwgaXNDaGFuZ2luZ0Nhc2UpXG59XG5cbmZ1bmN0aW9uIGlzUGFyZW50Um9vdCAoZGVzdCkge1xuICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgY29uc3QgcGFyc2VkUGF0aCA9IHBhdGgucGFyc2UocGFyZW50KVxuICByZXR1cm4gcGFyc2VkUGF0aC5yb290ID09PSBwYXJlbnRcbn1cblxuZnVuY3Rpb24gZG9SZW5hbWUgKHNyYywgZGVzdCwgb3ZlcndyaXRlLCBpc0NoYW5naW5nQ2FzZSkge1xuICBpZiAoaXNDaGFuZ2luZ0Nhc2UpIHJldHVybiByZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG4gIGlmIChvdmVyd3JpdGUpIHtcbiAgICByZW1vdmVTeW5jKGRlc3QpXG4gICAgcmV0dXJuIHJlbmFtZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSlcbiAgfVxuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0KSkgdGhyb3cgbmV3IEVycm9yKCdkZXN0IGFscmVhZHkgZXhpc3RzLicpXG4gIHJldHVybiByZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG59XG5cbmZ1bmN0aW9uIHJlbmFtZSAoc3JjLCBkZXN0LCBvdmVyd3JpdGUpIHtcbiAgdHJ5IHtcbiAgICBmcy5yZW5hbWVTeW5jKHNyYywgZGVzdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICE9PSAnRVhERVYnKSB0aHJvdyBlcnJcbiAgICByZXR1cm4gbW92ZUFjcm9zc0RldmljZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQWNyb3NzRGV2aWNlIChzcmMsIGRlc3QsIG92ZXJ3cml0ZSkge1xuICBjb25zdCBvcHRzID0ge1xuICAgIG92ZXJ3cml0ZSxcbiAgICBlcnJvck9uRXhpc3Q6IHRydWUsXG4gICAgcHJlc2VydmVUaW1lc3RhbXBzOiB0cnVlXG4gIH1cbiAgY29weVN5bmMoc3JjLCBkZXN0LCBvcHRzKVxuICByZXR1cm4gcmVtb3ZlU3luYyhzcmMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbW92ZVN5bmNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1vdmU6IHUocmVxdWlyZSgnLi9tb3ZlJykpLFxuICBtb3ZlU3luYzogcmVxdWlyZSgnLi9tb3ZlLXN5bmMnKVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIEV4cG9ydCBwcm9taXNlaWZpZWQgZ3JhY2VmdWwtZnM6XG4gIC4uLnJlcXVpcmUoJy4vZnMnKSxcbiAgLy8gRXhwb3J0IGV4dHJhIG1ldGhvZHM6XG4gIC4uLnJlcXVpcmUoJy4vY29weScpLFxuICAuLi5yZXF1aXJlKCcuL2VtcHR5JyksXG4gIC4uLnJlcXVpcmUoJy4vZW5zdXJlJyksXG4gIC4uLnJlcXVpcmUoJy4vanNvbicpLFxuICAuLi5yZXF1aXJlKCcuL21rZGlycycpLFxuICAuLi5yZXF1aXJlKCcuL21vdmUnKSxcbiAgLi4ucmVxdWlyZSgnLi9vdXRwdXQtZmlsZScpLFxuICAuLi5yZXF1aXJlKCcuL3BhdGgtZXhpc3RzJyksXG4gIC4uLnJlcXVpcmUoJy4vcmVtb3ZlJylcbn1cbiIsCiAgICAiaW1wb3J0IHsgZ2xvYiB9IGZyb20gXCJnbG9iXCI7XG5pbXBvcnQgVE9NTCBmcm9tIFwiQGlhcm5hL3RvbWxcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBjd2QsIGVudiB9IGZyb20gXCJub2RlOnByb2Nlc3NcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRkaXJTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RMaXN0ZW5lciB9IGZyb20gXCJAbWphY2tzb24vbm9kZS1mZXRjaC1zZXJ2ZXJcIjtcbmltcG9ydCB0eXBlIHsgUGx1Z2luT3B0aW9uIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgYWRhcHRlcnMgfSBmcm9tIFwiLi9hZGFwdGVycy9pbmRleC50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVml0ZVBsdWdpbk1pbGtpbyhvcHRpb25zPzoge1xuICBvdXRwdXRGb3JtYXQ/OiBcImVzbVwiIHwgXCJjanNcIjtcbn0pIHtcbiAgbGV0IG91dERpciA9IFwiZGlzdFwiO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJ2aXRlLXBsdWdpbi1taWxraW9cIixcbiAgICBhc3luYyBjb25maWd1cmVTZXJ2ZXIoc2VydmVyKSB7XG4gICAgICBzZXJ2ZXIubWlkZGxld2FyZXMudXNlKGFzeW5jIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgICBjb25zdCBhcHAgPSBhd2FpdCBzZXJ2ZXIuc3NyTG9hZE1vZHVsZShcImluZGV4LnRzXCIsIHsgZml4U3RhY2t0cmFjZTogZmFsc2UgfSk7XG4gICAgICAgIGNvbnN0IG1pbGtpbyA9IGF3YWl0IGFwcC5jcmVhdGUoe1xuICAgICAgICAgIGRldmVsb3A6IGVudi5NSUxLSU9fREVWRUxPUCA9PT0gXCJFTkFCTEVcIixcbiAgICAgICAgICBhcmd2OiBwcm9jZXNzLmFyZ3YsXG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBjcmVhdGVSZXF1ZXN0TGlzdGVuZXIoYXN5bmMgKHJlcXVlc3Q6IFJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBtaWxraW8ubGlzdGVuZXIuZmV0Y2goe1xuICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICBlbnY6IGVudixcbiAgICAgICAgICAgICAgZW52TW9kZTogZW52Lk1JTEtJT19ERVZFTE9QID09PSBcIkVOQUJMRVwiID8gXCJkZXZlbG9wbWVudFwiIDogXCJwcm9kdWN0aW9uXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KShyZXEsIHJlcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSBzZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShlKTtcbiAgICAgICAgICByZXR1cm4gbmV4dChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNvbmZpZyhjb25maWcsIHsgY29tbWFuZCB9KSB7XG4gICAgICBpZiAoY29tbWFuZCAhPT0gXCJidWlsZFwiKSByZXR1cm47XG4gICAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgZ2V0Q29va2Jvb2tUb21sUHJvamVjdCgpO1xuXG4gICAgICAvLyBjb25maWcuYnVpbGRcbiAgICAgIGlmICghY29uZmlnLmJ1aWxkKSBjb25maWcuYnVpbGQgPSB7fTtcbiAgICAgIGNvbmZpZy5idWlsZC5zc3IgPSB0cnVlO1xuICAgICAgY29uZmlnLmJ1aWxkLnRhcmdldCA9IFwiZXMyMDI0XCI7XG4gICAgICAvLyBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9uc1xuICAgICAgaWYgKCFjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucykgY29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnMgPSB7fTtcbiAgICAgIC8vIGNvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zLm91dHB1dFxuICAgICAgaWYgKCFjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucy5vdXRwdXQpIGNvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zLm91dHB1dCA9IHt9O1xuICAgICAgLy8gY29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnMuaW5wdXRcbiAgICAgIGNvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zLmlucHV0ID0ge1xuICAgICAgICBpbmRleDogXCIubWlsa2lvL3J1bi50c1wiLFxuICAgICAgfTtcblxuICAgICAgaWYgKCFwcm9qZWN0LmFkYXB0ZXIpIHtcbiAgICAgICAgbGV0IGZvcm1hdDogXCJlc21cIiB8IFwiY2pzXCIgPSBcImVzbVwiO1xuICAgICAgICBsZXQgbW9kZTogXCJjaHVua1wiIHwgXCJidW5kbGVcIiA9IFwiYnVuZGxlXCI7XG4gICAgICAgIGlmIChwcm9qZWN0LnJ1bnRpbWUgPT09IFwibm9kZVwiKSB7XG4gICAgICAgICAgZm9ybWF0ID0gb3B0aW9ucz8ub3V0cHV0Rm9ybWF0ID8/IFwiY2pzXCI7XG4gICAgICAgICAgbW9kZSA9IFwiY2h1bmtcIjtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9qZWN0LnJ1bnRpbWUgPT09IFwiYnVuXCIpIHtcbiAgICAgICAgICBmb3JtYXQgPSBvcHRpb25zPy5vdXRwdXRGb3JtYXQgPz8gXCJlc21cIjtcbiAgICAgICAgICBtb2RlID0gXCJjaHVua1wiO1xuICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKFwicnVudGltZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBBcnJheS5pc0FycmF5KGNvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zLm91dHB1dCkgPyBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucy5vdXRwdXQgOiBbY29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnMub3V0cHV0XSkge1xuICAgICAgICAgIG91dHB1dC5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgICAgb3V0cHV0LnNvdXJjZW1hcCA9IFwiaW5saW5lXCI7XG4gICAgICAgICAgb3V0cHV0LnByZXNlcnZlTW9kdWxlcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZmluZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgYWRhcHRlcnMpIHtcbiAgICAgICAgICBpZiAoYWRhcHRlci5uYW1lID09PSBwcm9qZWN0LmFkYXB0ZXIpIHtcbiAgICAgICAgICAgIGZpbmQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWRhcHRlci5hZGFwdGVyKHtcbiAgICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucy5pbnB1dCA9IHJlc3VsdC5pbnB1dDtcbiAgICAgICAgICAgIGNvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zLm91dHB1dCA9IHJlc3VsdC5vdXRwdXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmaW5kKSB0aHJvdyBuZXcgRXJyb3IoYGFkYXB0ZXIgXCIke3Byb2plY3QuYWRhcHRlcn1cIiBub3QgZm91bmRgKTtcbiAgICAgIH1cblxuICAgICAgLy8gY29uZmlnLnNlcnZlclxuICAgICAgaWYgKCFjb25maWcuc2VydmVyKSBjb25maWcuc2VydmVyID0ge307XG4gICAgICAvLyBjb25maWcuc2VydmVyLm1pZGRsZXdhcmVNb2RlXG4gICAgICBjb25maWcuc2VydmVyLmhtciA9IGZhbHNlO1xuXG4gICAgICAvLyBjb25maWcub3B0aW1pemVEZXBzXG4gICAgICBpZiAoIWNvbmZpZy5vcHRpbWl6ZURlcHMpIGNvbmZpZy5vcHRpbWl6ZURlcHMgPSB7fTtcbiAgICAgIGNvbmZpZy5vcHRpbWl6ZURlcHMubm9EaXNjb3ZlcnkgPSB0cnVlO1xuXG4gICAgICAvLyBjb25maWcucmVzb2x2ZVxuICAgICAgaWYgKCFjb25maWcucmVzb2x2ZSkgY29uZmlnLnJlc29sdmUgPSB7fTtcbiAgICAgIC8vIGNvbmZpZy5yZXNvbHZlLmFsaWFzXG4gICAgICBjb25maWcucmVzb2x2ZS5hbGlhcyA9IHtcbiAgICAgICAgLi4uKGNvbmZpZy5yZXNvbHZlLmFsaWFzID8/IHt9KSxcbiAgICAgIH07XG5cbiAgICAgIC8vIGNvbmZpZy5zc3JcbiAgICAgIGNvbmZpZy5zc3IgPSB7XG4gICAgICAgIG5vRXh0ZXJuYWw6IGdldE5vRXh0ZXJuYWwoKSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGNvbmZpZ1Jlc29sdmVkKHJlc29sdmVkQ29uZmlnKSB7XG4gICAgICBvdXREaXIgPSByZXNvbHZlZENvbmZpZy5idWlsZC5vdXREaXIgfHwgXCJkaXN0XCI7XG4gICAgfSxcblxuICAgIGFzeW5jIHdyaXRlQnVuZGxlKCkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGN3ZCgpLCBvdXREaXIsIFwiLmdpdGtlZXBcIik7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIFwiXCIsIFwidXRmLThcIik7XG4gICAgfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luT3B0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXROb0V4dGVybmFsKCkge1xuICAvLyBidW5cbiAgY29uc3QgYnVuID0gW1wiYnVuXCIsIC9eYnVuOi9dO1xuXG4gIC8vIG5vZGVfbW9kdWxlc1xuICBsZXQgbm9kZU1vZHVsZXMgPSBbLi4uKGV4aXN0c1N5bmMoam9pbihjd2QoKSwgXCJub2RlX21vZHVsZXNcIikpID8gcmVhZGRpclN5bmMoam9pbihjd2QoKSwgXCJub2RlX21vZHVsZXNcIikpIDogW10pLCAuLi4oZXhpc3RzU3luYyhqb2luKGN3ZCgpLCBcIi4uXCIsIFwiLi5cIiwgXCJub2RlX21vZHVsZXNcIikpID8gcmVhZGRpclN5bmMoam9pbihjd2QoKSwgXCIuLlwiLCBcIi4uXCIsIFwibm9kZV9tb2R1bGVzXCIpKSA6IFtdKV0uZmlsdGVyKChkZXBlbmRlbmN5KSA9PiAhZGVwZW5kZW5jeS5zdGFydHNXaXRoKFwiLlwiKSk7XG4gIC8vIGVsZWN0cm9uIGV4Y2x1ZGVcbiAgbm9kZU1vZHVsZXMgPSBub2RlTW9kdWxlcy5maWx0ZXIoKGRlcGVuZGVuY3kpID0+IGRlcGVuZGVuY3kgIT09IFwiZWxlY3Ryb25cIik7XG4gIC8vIHN0YXJ0c1dpdGggQFxuICBjb25zdCBub2RlTW9kdWxlc1JlZ0V4cCA9IG5vZGVNb2R1bGVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gKGRlcGVuZGVuY3kuc3RhcnRzV2l0aChcIkBcIikgPyBuZXcgUmVnRXhwKGBeJHtkZXBlbmRlbmN5fS9gKSA6IGRlcGVuZGVuY3kpKTtcblxuICByZXR1cm4gWy4uLmJ1biwgLi4ubm9kZU1vZHVsZXNSZWdFeHBdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb29rYm9va1RvbWxQcm9qZWN0KCk6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvb2tib29rVG9tbFJhdyA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oY3dkKCksIFwiLi5cIiwgXCIuLlwiLCBcImNvb2tib29rLnRvbWxcIiksIFwidXRmLThcIik7XG4gIGNvbnN0IGNvb2tib29rVG9tbCA9IFRPTUwucGFyc2UoY29va2Jvb2tUb21sUmF3KTtcbiAgbGV0IHByb2plY3Q6IGFueTtcbiAgZm9yIChjb25zdCBwcm9qZWN0TmFtZSBpbiBjb29rYm9va1RvbWwucHJvamVjdHMgYXMgYW55KSB7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1NlbGZDb21wYXJlOiA8ZXhwbGFuYXRpb24+XG4gICAgaWYgKGpvaW4oY3dkKCkpICE9PSBqb2luKGN3ZCgpLCBcIi4uXCIsIHByb2plY3ROYW1lKSkgY29udGludWU7XG4gICAgcHJvamVjdCA9IChjb29rYm9va1RvbWwucHJvamVjdHMgYXMgYW55KVtwcm9qZWN0TmFtZV07XG4gICAgYnJlYWs7XG4gIH1cbiAgaWYgKCFwcm9qZWN0KSB0aHJvdyBuZXcgRXJyb3IoXCJQcm9qZWN0IG5vdCBmb3VuZCBpbiBjb29rYm9vay50b21sXCIpO1xuICByZXR1cm4gcHJvamVjdDtcbn1cbiIsCiAgICAiaW1wb3J0IGV4cGFuZCBmcm9tICdicmFjZS1leHBhbnNpb24nO1xuaW1wb3J0IHsgYXNzZXJ0VmFsaWRQYXR0ZXJuIH0gZnJvbSAnLi9hc3NlcnQtdmFsaWQtcGF0dGVybi5qcyc7XG5pbXBvcnQgeyBBU1QgfSBmcm9tICcuL2FzdC5qcyc7XG5pbXBvcnQgeyBlc2NhcGUgfSBmcm9tICcuL2VzY2FwZS5qcyc7XG5pbXBvcnQgeyB1bmVzY2FwZSB9IGZyb20gJy4vdW5lc2NhcGUuanMnO1xuZXhwb3J0IGNvbnN0IG1pbmltYXRjaCA9IChwLCBwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybik7XG4gICAgLy8gc2hvcnRjdXQ6IGNvbW1lbnRzIG1hdGNoIG5vdGhpbmcuXG4gICAgaWYgKCFvcHRpb25zLm5vY29tbWVudCAmJiBwYXR0ZXJuLmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucykubWF0Y2gocCk7XG59O1xuLy8gT3B0aW1pemVkIGNoZWNraW5nIGZvciB0aGUgbW9zdCBjb21tb24gZ2xvYiBwYXR0ZXJucy5cbmNvbnN0IHN0YXJEb3RFeHRSRSA9IC9eXFwqKyhbXitAIT9cXCpcXFtcXChdKikkLztcbmNvbnN0IHN0YXJEb3RFeHRUZXN0ID0gKGV4dCkgPT4gKGYpID0+ICFmLnN0YXJ0c1dpdGgoJy4nKSAmJiBmLmVuZHNXaXRoKGV4dCk7XG5jb25zdCBzdGFyRG90RXh0VGVzdERvdCA9IChleHQpID0+IChmKSA9PiBmLmVuZHNXaXRoKGV4dCk7XG5jb25zdCBzdGFyRG90RXh0VGVzdE5vY2FzZSA9IChleHQpID0+IHtcbiAgICBleHQgPSBleHQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKGYpID0+ICFmLnN0YXJ0c1dpdGgoJy4nKSAmJiBmLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZXh0KTtcbn07XG5jb25zdCBzdGFyRG90RXh0VGVzdE5vY2FzZURvdCA9IChleHQpID0+IHtcbiAgICBleHQgPSBleHQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKGYpID0+IGYudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChleHQpO1xufTtcbmNvbnN0IHN0YXJEb3RTdGFyUkUgPSAvXlxcKitcXC5cXCorJC87XG5jb25zdCBzdGFyRG90U3RhclRlc3QgPSAoZikgPT4gIWYuc3RhcnRzV2l0aCgnLicpICYmIGYuaW5jbHVkZXMoJy4nKTtcbmNvbnN0IHN0YXJEb3RTdGFyVGVzdERvdCA9IChmKSA9PiBmICE9PSAnLicgJiYgZiAhPT0gJy4uJyAmJiBmLmluY2x1ZGVzKCcuJyk7XG5jb25zdCBkb3RTdGFyUkUgPSAvXlxcLlxcKiskLztcbmNvbnN0IGRvdFN0YXJUZXN0ID0gKGYpID0+IGYgIT09ICcuJyAmJiBmICE9PSAnLi4nICYmIGYuc3RhcnRzV2l0aCgnLicpO1xuY29uc3Qgc3RhclJFID0gL15cXCorJC87XG5jb25zdCBzdGFyVGVzdCA9IChmKSA9PiBmLmxlbmd0aCAhPT0gMCAmJiAhZi5zdGFydHNXaXRoKCcuJyk7XG5jb25zdCBzdGFyVGVzdERvdCA9IChmKSA9PiBmLmxlbmd0aCAhPT0gMCAmJiBmICE9PSAnLicgJiYgZiAhPT0gJy4uJztcbmNvbnN0IHFtYXJrc1JFID0gL15cXD8rKFteK0AhP1xcKlxcW1xcKF0qKT8kLztcbmNvbnN0IHFtYXJrc1Rlc3ROb2Nhc2UgPSAoWyQwLCBleHQgPSAnJ10pID0+IHtcbiAgICBjb25zdCBub2V4dCA9IHFtYXJrc1Rlc3ROb0V4dChbJDBdKTtcbiAgICBpZiAoIWV4dClcbiAgICAgICAgcmV0dXJuIG5vZXh0O1xuICAgIGV4dCA9IGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoZikgPT4gbm9leHQoZikgJiYgZi50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGV4dCk7XG59O1xuY29uc3QgcW1hcmtzVGVzdE5vY2FzZURvdCA9IChbJDAsIGV4dCA9ICcnXSkgPT4ge1xuICAgIGNvbnN0IG5vZXh0ID0gcW1hcmtzVGVzdE5vRXh0RG90KFskMF0pO1xuICAgIGlmICghZXh0KVxuICAgICAgICByZXR1cm4gbm9leHQ7XG4gICAgZXh0ID0gZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChmKSA9PiBub2V4dChmKSAmJiBmLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZXh0KTtcbn07XG5jb25zdCBxbWFya3NUZXN0RG90ID0gKFskMCwgZXh0ID0gJyddKSA9PiB7XG4gICAgY29uc3Qgbm9leHQgPSBxbWFya3NUZXN0Tm9FeHREb3QoWyQwXSk7XG4gICAgcmV0dXJuICFleHQgPyBub2V4dCA6IChmKSA9PiBub2V4dChmKSAmJiBmLmVuZHNXaXRoKGV4dCk7XG59O1xuY29uc3QgcW1hcmtzVGVzdCA9IChbJDAsIGV4dCA9ICcnXSkgPT4ge1xuICAgIGNvbnN0IG5vZXh0ID0gcW1hcmtzVGVzdE5vRXh0KFskMF0pO1xuICAgIHJldHVybiAhZXh0ID8gbm9leHQgOiAoZikgPT4gbm9leHQoZikgJiYgZi5lbmRzV2l0aChleHQpO1xufTtcbmNvbnN0IHFtYXJrc1Rlc3ROb0V4dCA9IChbJDBdKSA9PiB7XG4gICAgY29uc3QgbGVuID0gJDAubGVuZ3RoO1xuICAgIHJldHVybiAoZikgPT4gZi5sZW5ndGggPT09IGxlbiAmJiAhZi5zdGFydHNXaXRoKCcuJyk7XG59O1xuY29uc3QgcW1hcmtzVGVzdE5vRXh0RG90ID0gKFskMF0pID0+IHtcbiAgICBjb25zdCBsZW4gPSAkMC5sZW5ndGg7XG4gICAgcmV0dXJuIChmKSA9PiBmLmxlbmd0aCA9PT0gbGVuICYmIGYgIT09ICcuJyAmJiBmICE9PSAnLi4nO1xufTtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuY29uc3QgZGVmYXVsdFBsYXRmb3JtID0gKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzXG4gICAgPyAodHlwZW9mIHByb2Nlc3MuZW52ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBwcm9jZXNzLmVudiAmJlxuICAgICAgICBwcm9jZXNzLmVudi5fX01JTklNQVRDSF9URVNUSU5HX1BMQVRGT1JNX18pIHx8XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm1cbiAgICA6ICdwb3NpeCcpO1xuY29uc3QgcGF0aCA9IHtcbiAgICB3aW4zMjogeyBzZXA6ICdcXFxcJyB9LFxuICAgIHBvc2l4OiB7IHNlcDogJy8nIH0sXG59O1xuLyogYzggaWdub3JlIHN0b3AgKi9cbmV4cG9ydCBjb25zdCBzZXAgPSBkZWZhdWx0UGxhdGZvcm0gPT09ICd3aW4zMicgPyBwYXRoLndpbjMyLnNlcCA6IHBhdGgucG9zaXguc2VwO1xubWluaW1hdGNoLnNlcCA9IHNlcDtcbmV4cG9ydCBjb25zdCBHTE9CU1RBUiA9IFN5bWJvbCgnZ2xvYnN0YXIgKionKTtcbm1pbmltYXRjaC5HTE9CU1RBUiA9IEdMT0JTVEFSO1xuLy8gYW55IHNpbmdsZSB0aGluZyBvdGhlciB0aGFuIC9cbi8vIGRvbid0IG5lZWQgdG8gZXNjYXBlIC8gd2hlbiB1c2luZyBuZXcgUmVnRXhwKClcbmNvbnN0IHFtYXJrID0gJ1teL10nO1xuLy8gKiA9PiBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnNcbmNvbnN0IHN0YXIgPSBxbWFyayArICcqPyc7XG4vLyAqKiB3aGVuIGRvdHMgYXJlIGFsbG93ZWQuICBBbnl0aGluZyBnb2VzLCBleGNlcHQgLi4gYW5kIC5cbi8vIG5vdCAoXiBvciAvIGZvbGxvd2VkIGJ5IG9uZSBvciB0d28gZG90cyBmb2xsb3dlZCBieSAkIG9yIC8pLFxuLy8gZm9sbG93ZWQgYnkgYW55dGhpbmcsIGFueSBudW1iZXIgb2YgdGltZXMuXG5jb25zdCB0d29TdGFyRG90ID0gJyg/Oig/ISg/OlxcXFwvfF4pKD86XFxcXC57MSwyfSkoJHxcXFxcLykpLikqPyc7XG4vLyBub3QgYSBeIG9yIC8gZm9sbG93ZWQgYnkgYSBkb3QsXG4vLyBmb2xsb3dlZCBieSBhbnl0aGluZywgYW55IG51bWJlciBvZiB0aW1lcy5cbmNvbnN0IHR3b1N0YXJOb0RvdCA9ICcoPzooPyEoPzpcXFxcL3xeKVxcXFwuKS4pKj8nO1xuZXhwb3J0IGNvbnN0IGZpbHRlciA9IChwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IChwKSA9PiBtaW5pbWF0Y2gocCwgcGF0dGVybiwgb3B0aW9ucyk7XG5taW5pbWF0Y2guZmlsdGVyID0gZmlsdGVyO1xuY29uc3QgZXh0ID0gKGEsIGIgPSB7fSkgPT4gT2JqZWN0LmFzc2lnbih7fSwgYSwgYik7XG5leHBvcnQgY29uc3QgZGVmYXVsdHMgPSAoZGVmKSA9PiB7XG4gICAgaWYgKCFkZWYgfHwgdHlwZW9mIGRlZiAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5rZXlzKGRlZikubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBtaW5pbWF0Y2g7XG4gICAgfVxuICAgIGNvbnN0IG9yaWcgPSBtaW5pbWF0Y2g7XG4gICAgY29uc3QgbSA9IChwLCBwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IG9yaWcocCwgcGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG0sIHtcbiAgICAgICAgTWluaW1hdGNoOiBjbGFzcyBNaW5pbWF0Y2ggZXh0ZW5kcyBvcmlnLk1pbmltYXRjaCB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgICAgICBzdXBlcihwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgZGVmYXVsdHMob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnLmRlZmF1bHRzKGV4dChkZWYsIG9wdGlvbnMpKS5NaW5pbWF0Y2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIEFTVDogY2xhc3MgQVNUIGV4dGVuZHMgb3JpZy5BU1Qge1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICBjb25zdHJ1Y3Rvcih0eXBlLCBwYXJlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgICAgIHN1cGVyKHR5cGUsIHBhcmVudCwgZXh0KGRlZiwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIHN0YXRpYyBmcm9tR2xvYihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZy5BU1QuZnJvbUdsb2IocGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1bmVzY2FwZTogKHMsIG9wdGlvbnMgPSB7fSkgPT4gb3JpZy51bmVzY2FwZShzLCBleHQoZGVmLCBvcHRpb25zKSksXG4gICAgICAgIGVzY2FwZTogKHMsIG9wdGlvbnMgPSB7fSkgPT4gb3JpZy5lc2NhcGUocywgZXh0KGRlZiwgb3B0aW9ucykpLFxuICAgICAgICBmaWx0ZXI6IChwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IG9yaWcuZmlsdGVyKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKSxcbiAgICAgICAgZGVmYXVsdHM6IChvcHRpb25zKSA9PiBvcmlnLmRlZmF1bHRzKGV4dChkZWYsIG9wdGlvbnMpKSxcbiAgICAgICAgbWFrZVJlOiAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiBvcmlnLm1ha2VSZShwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSksXG4gICAgICAgIGJyYWNlRXhwYW5kOiAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiBvcmlnLmJyYWNlRXhwYW5kKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKSxcbiAgICAgICAgbWF0Y2g6IChsaXN0LCBwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IG9yaWcubWF0Y2gobGlzdCwgcGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpLFxuICAgICAgICBzZXA6IG9yaWcuc2VwLFxuICAgICAgICBHTE9CU1RBUjogR0xPQlNUQVIsXG4gICAgfSk7XG59O1xubWluaW1hdGNoLmRlZmF1bHRzID0gZGVmYXVsdHM7XG4vLyBCcmFjZSBleHBhbnNpb246XG4vLyBhe2IsY31kIC0+IGFiZCBhY2Rcbi8vIGF7Yix9YyAtPiBhYmMgYWNcbi8vIGF7MC4uM31kIC0+IGEwZCBhMWQgYTJkIGEzZFxuLy8gYXtiLGN7ZCxlfWZ9ZyAtPiBhYmcgYWNkZmcgYWNlZmdcbi8vIGF7YixjfWR7ZSxmfWcgLT4gYWJkZWcgYWNkZWcgYWJkZWcgYWJkZmdcbi8vXG4vLyBJbnZhbGlkIHNldHMgYXJlIG5vdCBleHBhbmRlZC5cbi8vIGF7Mi4ufWIgLT4gYXsyLi59YlxuLy8gYXtifWMgLT4gYXtifWNcbmV4cG9ydCBjb25zdCBicmFjZUV4cGFuZCA9IChwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybik7XG4gICAgLy8gVGhhbmtzIHRvIFlldGluZyBMaSA8aHR0cHM6Ly9naXRodWIuY29tL3lldGluZ2xpPiBmb3JcbiAgICAvLyBpbXByb3ZpbmcgdGhpcyByZWdleHAgdG8gYXZvaWQgYSBSZURPUyB2dWxuZXJhYmlsaXR5LlxuICAgIGlmIChvcHRpb25zLm5vYnJhY2UgfHwgIS9cXHsoPzooPyFcXHspLikqXFx9Ly50ZXN0KHBhdHRlcm4pKSB7XG4gICAgICAgIC8vIHNob3J0Y3V0LiBubyBuZWVkIHRvIGV4cGFuZC5cbiAgICAgICAgcmV0dXJuIFtwYXR0ZXJuXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cGFuZChwYXR0ZXJuKTtcbn07XG5taW5pbWF0Y2guYnJhY2VFeHBhbmQgPSBicmFjZUV4cGFuZDtcbi8vIHBhcnNlIGEgY29tcG9uZW50IG9mIHRoZSBleHBhbmRlZCBzZXQuXG4vLyBBdCB0aGlzIHBvaW50LCBubyBwYXR0ZXJuIG1heSBjb250YWluIFwiL1wiIGluIGl0XG4vLyBzbyB3ZSdyZSBnb2luZyB0byByZXR1cm4gYSAyZCBhcnJheSwgd2hlcmUgZWFjaCBlbnRyeSBpcyB0aGUgZnVsbFxuLy8gcGF0dGVybiwgc3BsaXQgb24gJy8nLCBhbmQgdGhlbiB0dXJuZWQgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbi8vIEEgcmVnZXhwIGlzIG1hZGUgYXQgdGhlIGVuZCB3aGljaCBqb2lucyBlYWNoIGFycmF5IHdpdGggYW5cbi8vIGVzY2FwZWQgLywgYW5kIGFub3RoZXIgZnVsbCBvbmUgd2hpY2ggam9pbnMgZWFjaCByZWdleHAgd2l0aCB8LlxuLy9cbi8vIEZvbGxvd2luZyB0aGUgbGVhZCBvZiBCYXNoIDQuMSwgbm90ZSB0aGF0IFwiKipcIiBvbmx5IGhhcyBzcGVjaWFsIG1lYW5pbmdcbi8vIHdoZW4gaXQgaXMgdGhlICpvbmx5KiB0aGluZyBpbiBhIHBhdGggcG9ydGlvbi4gIE90aGVyd2lzZSwgYW55IHNlcmllc1xuLy8gb2YgKiBpcyBlcXVpdmFsZW50IHRvIGEgc2luZ2xlICouICBHbG9ic3RhciBiZWhhdmlvciBpcyBlbmFibGVkIGJ5XG4vLyBkZWZhdWx0LCBhbmQgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgb3B0aW9ucy5ub2dsb2JzdGFyLlxuZXhwb3J0IGNvbnN0IG1ha2VSZSA9IChwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucykubWFrZVJlKCk7XG5taW5pbWF0Y2gubWFrZVJlID0gbWFrZVJlO1xuZXhwb3J0IGNvbnN0IG1hdGNoID0gKGxpc3QsIHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IG1tID0gbmV3IE1pbmltYXRjaChwYXR0ZXJuLCBvcHRpb25zKTtcbiAgICBsaXN0ID0gbGlzdC5maWx0ZXIoZiA9PiBtbS5tYXRjaChmKSk7XG4gICAgaWYgKG1tLm9wdGlvbnMubm9udWxsICYmICFsaXN0Lmxlbmd0aCkge1xuICAgICAgICBsaXN0LnB1c2gocGF0dGVybik7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xufTtcbm1pbmltYXRjaC5tYXRjaCA9IG1hdGNoO1xuLy8gcmVwbGFjZSBzdHVmZiBsaWtlIFxcKiB3aXRoICpcbmNvbnN0IGdsb2JNYWdpYyA9IC9bPypdfFsrQCFdXFwoLio/XFwpfFxcW3xcXF0vO1xuY29uc3QgcmVnRXhwRXNjYXBlID0gKHMpID0+IHMucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csICdcXFxcJCYnKTtcbmV4cG9ydCBjbGFzcyBNaW5pbWF0Y2gge1xuICAgIG9wdGlvbnM7XG4gICAgc2V0O1xuICAgIHBhdHRlcm47XG4gICAgd2luZG93c1BhdGhzTm9Fc2NhcGU7XG4gICAgbm9uZWdhdGU7XG4gICAgbmVnYXRlO1xuICAgIGNvbW1lbnQ7XG4gICAgZW1wdHk7XG4gICAgcHJlc2VydmVNdWx0aXBsZVNsYXNoZXM7XG4gICAgcGFydGlhbDtcbiAgICBnbG9iU2V0O1xuICAgIGdsb2JQYXJ0cztcbiAgICBub2Nhc2U7XG4gICAgaXNXaW5kb3dzO1xuICAgIHBsYXRmb3JtO1xuICAgIHdpbmRvd3NOb01hZ2ljUm9vdDtcbiAgICByZWdleHA7XG4gICAgY29uc3RydWN0b3IocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGFzc2VydFZhbGlkUGF0dGVybihwYXR0ZXJuKTtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG4gICAgICAgIHRoaXMucGxhdGZvcm0gPSBvcHRpb25zLnBsYXRmb3JtIHx8IGRlZmF1bHRQbGF0Zm9ybTtcbiAgICAgICAgdGhpcy5pc1dpbmRvd3MgPSB0aGlzLnBsYXRmb3JtID09PSAnd2luMzInO1xuICAgICAgICB0aGlzLndpbmRvd3NQYXRoc05vRXNjYXBlID1cbiAgICAgICAgICAgICEhb3B0aW9ucy53aW5kb3dzUGF0aHNOb0VzY2FwZSB8fCBvcHRpb25zLmFsbG93V2luZG93c0VzY2FwZSA9PT0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLndpbmRvd3NQYXRoc05vRXNjYXBlKSB7XG4gICAgICAgICAgICB0aGlzLnBhdHRlcm4gPSB0aGlzLnBhdHRlcm4ucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlc2VydmVNdWx0aXBsZVNsYXNoZXMgPSAhIW9wdGlvbnMucHJlc2VydmVNdWx0aXBsZVNsYXNoZXM7XG4gICAgICAgIHRoaXMucmVnZXhwID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZWdhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub25lZ2F0ZSA9ICEhb3B0aW9ucy5ub25lZ2F0ZTtcbiAgICAgICAgdGhpcy5jb21tZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsID0gISFvcHRpb25zLnBhcnRpYWw7XG4gICAgICAgIHRoaXMubm9jYXNlID0gISF0aGlzLm9wdGlvbnMubm9jYXNlO1xuICAgICAgICB0aGlzLndpbmRvd3NOb01hZ2ljUm9vdCA9XG4gICAgICAgICAgICBvcHRpb25zLndpbmRvd3NOb01hZ2ljUm9vdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLndpbmRvd3NOb01hZ2ljUm9vdFxuICAgICAgICAgICAgICAgIDogISEodGhpcy5pc1dpbmRvd3MgJiYgdGhpcy5ub2Nhc2UpO1xuICAgICAgICB0aGlzLmdsb2JTZXQgPSBbXTtcbiAgICAgICAgdGhpcy5nbG9iUGFydHMgPSBbXTtcbiAgICAgICAgdGhpcy5zZXQgPSBbXTtcbiAgICAgICAgLy8gbWFrZSB0aGUgc2V0IG9mIHJlZ2V4cHMgZXRjLlxuICAgICAgICB0aGlzLm1ha2UoKTtcbiAgICB9XG4gICAgaGFzTWFnaWMoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFnaWNhbEJyYWNlcyAmJiB0aGlzLnNldC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgdGhpcy5zZXQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBkZWJ1ZyguLi5fKSB7IH1cbiAgICBtYWtlKCkge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5wYXR0ZXJuO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICAvLyBlbXB0eSBwYXR0ZXJucyBhbmQgY29tbWVudHMgbWF0Y2ggbm90aGluZy5cbiAgICAgICAgaWYgKCFvcHRpb25zLm5vY29tbWVudCAmJiBwYXR0ZXJuLmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGF0dGVybikge1xuICAgICAgICAgICAgdGhpcy5lbXB0eSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RlcCAxOiBmaWd1cmUgb3V0IG5lZ2F0aW9uLCBldGMuXG4gICAgICAgIHRoaXMucGFyc2VOZWdhdGUoKTtcbiAgICAgICAgLy8gc3RlcCAyOiBleHBhbmQgYnJhY2VzXG4gICAgICAgIHRoaXMuZ2xvYlNldCA9IFsuLi5uZXcgU2V0KHRoaXMuYnJhY2VFeHBhbmQoKSldO1xuICAgICAgICBpZiAob3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyA9ICguLi5hcmdzKSA9PiBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCB0aGlzLmdsb2JTZXQpO1xuICAgICAgICAvLyBzdGVwIDM6IG5vdyB3ZSBoYXZlIGEgc2V0LCBzbyB0dXJuIGVhY2ggb25lIGludG8gYSBzZXJpZXMgb2ZcbiAgICAgICAgLy8gcGF0aC1wb3J0aW9uIG1hdGNoaW5nIHBhdHRlcm5zLlxuICAgICAgICAvLyBUaGVzZSB3aWxsIGJlIHJlZ2V4cHMsIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBcIioqXCIsIHdoaWNoIGlzXG4gICAgICAgIC8vIHNldCB0byB0aGUgR0xPQlNUQVIgb2JqZWN0IGZvciBnbG9ic3RhciBiZWhhdmlvcixcbiAgICAgICAgLy8gYW5kIHdpbGwgbm90IGNvbnRhaW4gYW55IC8gY2hhcmFjdGVyc1xuICAgICAgICAvL1xuICAgICAgICAvLyBGaXJzdCwgd2UgcHJlcHJvY2VzcyB0byBtYWtlIHRoZSBnbG9iIHBhdHRlcm4gc2V0cyBhIGJpdCBzaW1wbGVyXG4gICAgICAgIC8vIGFuZCBkZWR1cGVkLiAgVGhlcmUgYXJlIHNvbWUgcGVyZi1raWxsaW5nIHBhdHRlcm5zIHRoYXQgY2FuIGNhdXNlXG4gICAgICAgIC8vIHByb2JsZW1zIHdpdGggYSBnbG9iIHdhbGssIGJ1dCB3ZSBjYW4gc2ltcGxpZnkgdGhlbSBkb3duIGEgYml0LlxuICAgICAgICBjb25zdCByYXdHbG9iUGFydHMgPSB0aGlzLmdsb2JTZXQubWFwKHMgPT4gdGhpcy5zbGFzaFNwbGl0KHMpKTtcbiAgICAgICAgdGhpcy5nbG9iUGFydHMgPSB0aGlzLnByZXByb2Nlc3MocmF3R2xvYlBhcnRzKTtcbiAgICAgICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHRoaXMuZ2xvYlBhcnRzKTtcbiAgICAgICAgLy8gZ2xvYiAtLT4gcmVnZXhwc1xuICAgICAgICBsZXQgc2V0ID0gdGhpcy5nbG9iUGFydHMubWFwKChzLCBfLCBfXykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNXaW5kb3dzICYmIHRoaXMud2luZG93c05vTWFnaWNSb290KSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRyaXZlIG9yIHVuYyBwYXRoLlxuICAgICAgICAgICAgICAgIGNvbnN0IGlzVU5DID0gc1swXSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgc1sxXSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgKHNbMl0gPT09ICc/JyB8fCAhZ2xvYk1hZ2ljLnRlc3Qoc1syXSkpICYmXG4gICAgICAgICAgICAgICAgICAgICFnbG9iTWFnaWMudGVzdChzWzNdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0RyaXZlID0gL15bYS16XTovaS50ZXN0KHNbMF0pO1xuICAgICAgICAgICAgICAgIGlmIChpc1VOQykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWy4uLnMuc2xpY2UoMCwgNCksIC4uLnMuc2xpY2UoNCkubWFwKHNzID0+IHRoaXMucGFyc2Uoc3MpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRHJpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtzWzBdLCAuLi5zLnNsaWNlKDEpLm1hcChzcyA9PiB0aGlzLnBhcnNlKHNzKSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzLm1hcChzcyA9PiB0aGlzLnBhcnNlKHNzKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgc2V0KTtcbiAgICAgICAgLy8gZmlsdGVyIG91dCBldmVyeXRoaW5nIHRoYXQgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkuXG4gICAgICAgIHRoaXMuc2V0ID0gc2V0LmZpbHRlcihzID0+IHMuaW5kZXhPZihmYWxzZSkgPT09IC0xKTtcbiAgICAgICAgLy8gZG8gbm90IHRyZWF0IHRoZSA/IGluIFVOQyBwYXRocyBhcyBtYWdpY1xuICAgICAgICBpZiAodGhpcy5pc1dpbmRvd3MpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gdGhpcy5zZXRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBbMF0gPT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgIHBbMV0gPT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2xvYlBhcnRzW2ldWzJdID09PSAnPycgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBbM10gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIC9eW2Etel06JC9pLnRlc3QocFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcFsyXSA9ICc/JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHRoaXMuc2V0KTtcbiAgICB9XG4gICAgLy8gdmFyaW91cyB0cmFuc2Zvcm1zIHRvIGVxdWl2YWxlbnQgcGF0dGVybiBzZXRzIHRoYXQgYXJlXG4gICAgLy8gZmFzdGVyIHRvIHByb2Nlc3MgaW4gYSBmaWxlc3lzdGVtIHdhbGsuICBUaGUgZ29hbCBpcyB0b1xuICAgIC8vIGVsaW1pbmF0ZSB3aGF0IHdlIGNhbiwgYW5kIHB1c2ggYWxsICoqIHBhdHRlcm5zIGFzIGZhclxuICAgIC8vIHRvIHRoZSByaWdodCBhcyBwb3NzaWJsZSwgZXZlbiBpZiBpdCBpbmNyZWFzZXMgdGhlIG51bWJlclxuICAgIC8vIG9mIHBhdHRlcm5zIHRoYXQgd2UgaGF2ZSB0byBwcm9jZXNzLlxuICAgIHByZXByb2Nlc3MoZ2xvYlBhcnRzKSB7XG4gICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBpbiBnbG9ic3RhciBtb2RlLCB0aGVuIHR1cm4gYWxsICoqIGludG8gKlxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5vZ2xvYnN0YXIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2xvYlBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBnbG9iUGFydHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JQYXJ0c1tpXVtqXSA9PT0gJyoqJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYlBhcnRzW2ldW2pdID0gJyonO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgb3B0aW1pemF0aW9uTGV2ZWwgPSAxIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmIChvcHRpbWl6YXRpb25MZXZlbCA+PSAyKSB7XG4gICAgICAgICAgICAvLyBhZ2dyZXNzaXZlIG9wdGltaXphdGlvbiBmb3IgdGhlIHB1cnBvc2Ugb2YgZnMgd2Fsa2luZ1xuICAgICAgICAgICAgZ2xvYlBhcnRzID0gdGhpcy5maXJzdFBoYXNlUHJlUHJvY2VzcyhnbG9iUGFydHMpO1xuICAgICAgICAgICAgZ2xvYlBhcnRzID0gdGhpcy5zZWNvbmRQaGFzZVByZVByb2Nlc3MoZ2xvYlBhcnRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpbWl6YXRpb25MZXZlbCA+PSAxKSB7XG4gICAgICAgICAgICAvLyBqdXN0IGJhc2ljIG9wdGltaXphdGlvbnMgdG8gcmVtb3ZlIHNvbWUgLi4gcGFydHNcbiAgICAgICAgICAgIGdsb2JQYXJ0cyA9IHRoaXMubGV2ZWxPbmVPcHRpbWl6ZShnbG9iUGFydHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8ganVzdCBjb2xsYXBzZSBtdWx0aXBsZSAqKiBwb3J0aW9ucyBpbnRvIG9uZVxuICAgICAgICAgICAgZ2xvYlBhcnRzID0gdGhpcy5hZGphc2NlbnRHbG9ic3Rhck9wdGltaXplKGdsb2JQYXJ0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JQYXJ0cztcbiAgICB9XG4gICAgLy8ganVzdCBnZXQgcmlkIG9mIGFkamFzY2VudCAqKiBwb3J0aW9uc1xuICAgIGFkamFzY2VudEdsb2JzdGFyT3B0aW1pemUoZ2xvYlBhcnRzKSB7XG4gICAgICAgIHJldHVybiBnbG9iUGFydHMubWFwKHBhcnRzID0+IHtcbiAgICAgICAgICAgIGxldCBncyA9IC0xO1xuICAgICAgICAgICAgd2hpbGUgKC0xICE9PSAoZ3MgPSBwYXJ0cy5pbmRleE9mKCcqKicsIGdzICsgMSkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSBncztcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFydHNbaSArIDFdID09PSAnKionKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IGdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnNwbGljZShncywgaSAtIGdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFydHM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBnZXQgcmlkIG9mIGFkamFzY2VudCAqKiBhbmQgcmVzb2x2ZSAuLiBwb3J0aW9uc1xuICAgIGxldmVsT25lT3B0aW1pemUoZ2xvYlBhcnRzKSB7XG4gICAgICAgIHJldHVybiBnbG9iUGFydHMubWFwKHBhcnRzID0+IHtcbiAgICAgICAgICAgIHBhcnRzID0gcGFydHMucmVkdWNlKChzZXQsIHBhcnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gc2V0W3NldC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAocGFydCA9PT0gJyoqJyAmJiBwcmV2ID09PSAnKionKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYgIT09ICcuLicgJiYgcHJldiAhPT0gJy4nICYmIHByZXYgIT09ICcqKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldC5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0LnB1c2gocGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPT09IDAgPyBbJyddIDogcGFydHM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZXZlbFR3b0ZpbGVPcHRpbWl6ZShwYXJ0cykge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFydHMpKSB7XG4gICAgICAgICAgICBwYXJ0cyA9IHRoaXMuc2xhc2hTcGxpdChwYXJ0cyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRpZFNvbWV0aGluZyA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBkaWRTb21ldGhpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIDxwcmU+LzxlPi88cmVzdD4gLT4gPHByZT4vPHJlc3Q+XG4gICAgICAgICAgICBpZiAoIXRoaXMucHJlc2VydmVNdWx0aXBsZVNsYXNoZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gcGFydHNbaV07XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHNxdWVlemUgb3V0IFVOQyBwYXR0ZXJuc1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMSAmJiBwID09PSAnJyAmJiBwYXJ0c1swXSA9PT0gJycpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09ICcuJyB8fCBwID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlkU29tZXRoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFydHNbMF0gPT09ICcuJyAmJlxuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICAgICAgICAgICAgKHBhcnRzWzFdID09PSAnLicgfHwgcGFydHNbMV0gPT09ICcnKSkge1xuICAgICAgICAgICAgICAgICAgICBkaWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyA8cHJlPi88cD4vLi4vPHJlc3Q+IC0+IDxwcmU+LzxyZXN0PlxuICAgICAgICAgICAgbGV0IGRkID0gMDtcbiAgICAgICAgICAgIHdoaWxlICgtMSAhPT0gKGRkID0gcGFydHMuaW5kZXhPZignLi4nLCBkZCArIDEpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBwYXJ0c1tkZCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChwICYmIHAgIT09ICcuJyAmJiBwICE9PSAnLi4nICYmIHAgIT09ICcqKicpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlkU29tZXRoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcGFydHMuc3BsaWNlKGRkIC0gMSwgMik7XG4gICAgICAgICAgICAgICAgICAgIGRkIC09IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChkaWRTb21ldGhpbmcpO1xuICAgICAgICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAwID8gWycnXSA6IHBhcnRzO1xuICAgIH1cbiAgICAvLyBGaXJzdCBwaGFzZTogc2luZ2xlLXBhdHRlcm4gcHJvY2Vzc2luZ1xuICAgIC8vIDxwcmU+IGlzIDEgb3IgbW9yZSBwb3J0aW9uc1xuICAgIC8vIDxyZXN0PiBpcyAxIG9yIG1vcmUgcG9ydGlvbnNcbiAgICAvLyA8cD4gaXMgYW55IHBvcnRpb24gb3RoZXIgdGhhbiAuLCAuLiwgJycsIG9yICoqXG4gICAgLy8gPGU+IGlzIC4gb3IgJydcbiAgICAvL1xuICAgIC8vICoqLy4uIGlzICpicnV0YWwqIGZvciBmaWxlc3lzdGVtIHdhbGtpbmcgcGVyZm9ybWFuY2UsIGJlY2F1c2VcbiAgICAvLyBpdCBlZmZlY3RpdmVseSByZXNldHMgdGhlIHJlY3Vyc2l2ZSB3YWxrIGVhY2ggdGltZSBpdCBvY2N1cnMsXG4gICAgLy8gYW5kICoqIGNhbm5vdCBiZSByZWR1Y2VkIG91dCBieSBhIC4uIHBhdHRlcm4gcGFydCBsaWtlIGEgcmVnZXhwXG4gICAgLy8gb3IgbW9zdCBzdHJpbmdzIChvdGhlciB0aGFuIC4uLCAuLCBhbmQgJycpIGNhbiBiZS5cbiAgICAvL1xuICAgIC8vIDxwcmU+LyoqLy4uLzxwPi88cD4vPHJlc3Q+IC0+IHs8cHJlPi8uLi88cD4vPHA+LzxyZXN0Piw8cHJlPi8qKi88cD4vPHA+LzxyZXN0Pn1cbiAgICAvLyA8cHJlPi88ZT4vPHJlc3Q+IC0+IDxwcmU+LzxyZXN0PlxuICAgIC8vIDxwcmU+LzxwPi8uLi88cmVzdD4gLT4gPHByZT4vPHJlc3Q+XG4gICAgLy8gKiovKiovPHJlc3Q+IC0+ICoqLzxyZXN0PlxuICAgIC8vXG4gICAgLy8gKiovKi88cmVzdD4gLT4gKi8qKi88cmVzdD4gPD09IG5vdCB2YWxpZCBiZWNhdXNlICoqIGRvZXNuJ3QgZm9sbG93XG4gICAgLy8gdGhpcyBXT1VMRCBiZSBhbGxvd2VkIGlmICoqIGRpZCBmb2xsb3cgc3ltbGlua3MsIG9yICogZGlkbid0XG4gICAgZmlyc3RQaGFzZVByZVByb2Nlc3MoZ2xvYlBhcnRzKSB7XG4gICAgICAgIGxldCBkaWRTb21ldGhpbmcgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgZGlkU29tZXRoaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAvLyA8cHJlPi8qKi8uLi88cD4vPHA+LzxyZXN0PiAtPiB7PHByZT4vLi4vPHA+LzxwPi88cmVzdD4sPHByZT4vKiovPHA+LzxwPi88cmVzdD59XG4gICAgICAgICAgICBmb3IgKGxldCBwYXJ0cyBvZiBnbG9iUGFydHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZ3MgPSAtMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoLTEgIT09IChncyA9IHBhcnRzLmluZGV4T2YoJyoqJywgZ3MgKyAxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdzcyA9IGdzO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFydHNbZ3NzICsgMV0gPT09ICcqKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxwcmU+LyoqLyoqLzxyZXN0PiAtPiA8cHJlPi8qKi88cmVzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIGdzcysrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGVnLCBpZiBncyBpcyAyIGFuZCBnc3MgaXMgNCwgdGhhdCBtZWFucyB3ZSBoYXZlIDMgKipcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFydHMsIGFuZCBjYW4gcmVtb3ZlIDIgb2YgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGdzcyA+IGdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5zcGxpY2UoZ3MgKyAxLCBnc3MgLSBncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBwYXJ0c1tncyArIDFdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gcGFydHNbZ3MgKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcDIgPSBwYXJ0c1tncyArIDNdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPT0gJy4uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHAgPT09ICcuJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcCA9PT0gJy4uJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXAyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBwMiA9PT0gJy4nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBwMiA9PT0gJy4uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGlkU29tZXRoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZWRpdCBwYXJ0cyBpbiBwbGFjZSwgYW5kIHB1c2ggdGhlIG5ldyBvbmVcbiAgICAgICAgICAgICAgICAgICAgcGFydHMuc3BsaWNlKGdzLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3RoZXIgPSBwYXJ0cy5zbGljZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgb3RoZXJbZ3NdID0gJyoqJztcbiAgICAgICAgICAgICAgICAgICAgZ2xvYlBhcnRzLnB1c2gob3RoZXIpO1xuICAgICAgICAgICAgICAgICAgICBncy0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyA8cHJlPi88ZT4vPHJlc3Q+IC0+IDxwcmU+LzxyZXN0PlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wcmVzZXJ2ZU11bHRpcGxlU2xhc2hlcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IHBhcnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc3F1ZWV6ZSBvdXQgVU5DIHBhdHRlcm5zXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMSAmJiBwID09PSAnJyAmJiBwYXJ0c1swXSA9PT0gJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PT0gJy4nIHx8IHAgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkU29tZXRoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0c1swXSA9PT0gJy4nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChwYXJ0c1sxXSA9PT0gJy4nIHx8IHBhcnRzWzFdID09PSAnJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNvbWV0aGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyA8cHJlPi88cD4vLi4vPHJlc3Q+IC0+IDxwcmU+LzxyZXN0PlxuICAgICAgICAgICAgICAgIGxldCBkZCA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKC0xICE9PSAoZGQgPSBwYXJ0cy5pbmRleE9mKCcuLicsIGRkICsgMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBwYXJ0c1tkZCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocCAmJiBwICE9PSAnLicgJiYgcCAhPT0gJy4uJyAmJiBwICE9PSAnKionKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVlZERvdCA9IGRkID09PSAxICYmIHBhcnRzW2RkICsgMV0gPT09ICcqKic7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGxpbiA9IG5lZWREb3QgPyBbJy4nXSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuc3BsaWNlKGRkIC0gMSwgMiwgLi4uc3BsaW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRkIC09IDI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGRpZFNvbWV0aGluZyk7XG4gICAgICAgIHJldHVybiBnbG9iUGFydHM7XG4gICAgfVxuICAgIC8vIHNlY29uZCBwaGFzZTogbXVsdGktcGF0dGVybiBkZWR1cGVzXG4gICAgLy8gezxwcmU+LyovPHJlc3Q+LDxwcmU+LzxwPi88cmVzdD59IC0+IDxwcmU+LyovPHJlc3Q+XG4gICAgLy8gezxwcmU+LzxyZXN0Piw8cHJlPi88cmVzdD59IC0+IDxwcmU+LzxyZXN0PlxuICAgIC8vIHs8cHJlPi8qKi88cmVzdD4sPHByZT4vPHJlc3Q+fSAtPiA8cHJlPi8qKi88cmVzdD5cbiAgICAvL1xuICAgIC8vIHs8cHJlPi8qKi88cmVzdD4sPHByZT4vKiovPHA+LzxyZXN0Pn0gLT4gPHByZT4vKiovPHJlc3Q+XG4gICAgLy8gXi0tIG5vdCB2YWxpZCBiZWNhdXNlICoqIGRvZW5zJ3QgZm9sbG93IHN5bWxpbmtzXG4gICAgc2Vjb25kUGhhc2VQcmVQcm9jZXNzKGdsb2JQYXJ0cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdsb2JQYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGdsb2JQYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSB0aGlzLnBhcnRzTWF0Y2goZ2xvYlBhcnRzW2ldLCBnbG9iUGFydHNbal0sICF0aGlzLnByZXNlcnZlTXVsdGlwbGVTbGFzaGVzKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBnbG9iUGFydHNbaV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYlBhcnRzW2pdID0gbWF0Y2hlZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnbG9iUGFydHMuZmlsdGVyKGdzID0+IGdzLmxlbmd0aCk7XG4gICAgfVxuICAgIHBhcnRzTWF0Y2goYSwgYiwgZW1wdHlHU01hdGNoID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IGFpID0gMDtcbiAgICAgICAgbGV0IGJpID0gMDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgd2hpY2ggPSAnJztcbiAgICAgICAgd2hpbGUgKGFpIDwgYS5sZW5ndGggJiYgYmkgPCBiLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGFbYWldID09PSBiW2JpXSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHdoaWNoID09PSAnYicgPyBiW2JpXSA6IGFbYWldKTtcbiAgICAgICAgICAgICAgICBhaSsrO1xuICAgICAgICAgICAgICAgIGJpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbXB0eUdTTWF0Y2ggJiYgYVthaV0gPT09ICcqKicgJiYgYltiaV0gPT09IGFbYWkgKyAxXSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFbYWldKTtcbiAgICAgICAgICAgICAgICBhaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZW1wdHlHU01hdGNoICYmIGJbYmldID09PSAnKionICYmIGFbYWldID09PSBiW2JpICsgMV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChiW2JpXSk7XG4gICAgICAgICAgICAgICAgYmkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFbYWldID09PSAnKicgJiZcbiAgICAgICAgICAgICAgICBiW2JpXSAmJlxuICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZG90IHx8ICFiW2JpXS5zdGFydHNXaXRoKCcuJykpICYmXG4gICAgICAgICAgICAgICAgYltiaV0gIT09ICcqKicpIHtcbiAgICAgICAgICAgICAgICBpZiAod2hpY2ggPT09ICdiJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHdoaWNoID0gJ2EnO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFbYWldKTtcbiAgICAgICAgICAgICAgICBhaSsrO1xuICAgICAgICAgICAgICAgIGJpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiW2JpXSA9PT0gJyonICYmXG4gICAgICAgICAgICAgICAgYVthaV0gJiZcbiAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmRvdCB8fCAhYVthaV0uc3RhcnRzV2l0aCgnLicpKSAmJlxuICAgICAgICAgICAgICAgIGFbYWldICE9PSAnKionKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdoaWNoID09PSAnYScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB3aGljaCA9ICdiJztcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChiW2JpXSk7XG4gICAgICAgICAgICAgICAgYWkrKztcbiAgICAgICAgICAgICAgICBiaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlIGZhbGwgb3V0IG9mIHRoZSBsb29wLCBpdCBtZWFucyB0aGV5IHR3byBhcmUgaWRlbnRpY2FsXG4gICAgICAgIC8vIGFzIGxvbmcgYXMgdGhlaXIgbGVuZ3RocyBtYXRjaFxuICAgICAgICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIHJlc3VsdDtcbiAgICB9XG4gICAgcGFyc2VOZWdhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm5vbmVnYXRlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5wYXR0ZXJuO1xuICAgICAgICBsZXQgbmVnYXRlID0gZmFsc2U7XG4gICAgICAgIGxldCBuZWdhdGVPZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoICYmIHBhdHRlcm4uY2hhckF0KGkpID09PSAnISc7IGkrKykge1xuICAgICAgICAgICAgbmVnYXRlID0gIW5lZ2F0ZTtcbiAgICAgICAgICAgIG5lZ2F0ZU9mZnNldCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZWdhdGVPZmZzZXQpXG4gICAgICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKG5lZ2F0ZU9mZnNldCk7XG4gICAgICAgIHRoaXMubmVnYXRlID0gbmVnYXRlO1xuICAgIH1cbiAgICAvLyBzZXQgcGFydGlhbCB0byB0cnVlIHRvIHRlc3QgaWYsIGZvciBleGFtcGxlLFxuICAgIC8vIFwiL2EvYlwiIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIFwiLyovYi8qL2RcIlxuICAgIC8vIFBhcnRpYWwgbWVhbnMsIGlmIHlvdSBydW4gb3V0IG9mIGZpbGUgYmVmb3JlIHlvdSBydW5cbiAgICAvLyBvdXQgb2YgcGF0dGVybiwgdGhlbiB0aGF0J3MgZmluZSwgYXMgbG9uZyBhcyBhbGxcbiAgICAvLyB0aGUgcGFydHMgbWF0Y2guXG4gICAgbWF0Y2hPbmUoZmlsZSwgcGF0dGVybiwgcGFydGlhbCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIC8vIFVOQyBwYXRocyBsaWtlIC8vPy9YOi8uLi4gY2FuIG1hdGNoIFg6Ly4uLiBhbmQgdmljZSB2ZXJzYVxuICAgICAgICAvLyBEcml2ZSBsZXR0ZXJzIGluIGFic29sdXRlIGRyaXZlIG9yIHVuYyBwYXRocyBhcmUgYWx3YXlzIGNvbXBhcmVkXG4gICAgICAgIC8vIGNhc2UtaW5zZW5zaXRpdmVseS5cbiAgICAgICAgaWYgKHRoaXMuaXNXaW5kb3dzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlRHJpdmUgPSB0eXBlb2YgZmlsZVswXSA9PT0gJ3N0cmluZycgJiYgL15bYS16XTokL2kudGVzdChmaWxlWzBdKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVTkMgPSAhZmlsZURyaXZlICYmXG4gICAgICAgICAgICAgICAgZmlsZVswXSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICBmaWxlWzFdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgIGZpbGVbMl0gPT09ICc/JyAmJlxuICAgICAgICAgICAgICAgIC9eW2Etel06JC9pLnRlc3QoZmlsZVszXSk7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuRHJpdmUgPSB0eXBlb2YgcGF0dGVyblswXSA9PT0gJ3N0cmluZycgJiYgL15bYS16XTokL2kudGVzdChwYXR0ZXJuWzBdKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5VTkMgPSAhcGF0dGVybkRyaXZlICYmXG4gICAgICAgICAgICAgICAgcGF0dGVyblswXSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJuWzFdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgIHBhdHRlcm5bMl0gPT09ICc/JyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBwYXR0ZXJuWzNdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIC9eW2Etel06JC9pLnRlc3QocGF0dGVyblszXSk7XG4gICAgICAgICAgICBjb25zdCBmZGkgPSBmaWxlVU5DID8gMyA6IGZpbGVEcml2ZSA/IDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBwZGkgPSBwYXR0ZXJuVU5DID8gMyA6IHBhdHRlcm5Ecml2ZSA/IDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZkaSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHBkaSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbZmQsIHBkXSA9IFtmaWxlW2ZkaV0sIHBhdHRlcm5bcGRpXV07XG4gICAgICAgICAgICAgICAgaWYgKGZkLnRvTG93ZXJDYXNlKCkgPT09IHBkLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybltwZGldID0gZmQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwZGkgPiBmZGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKHBkaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZmRpID4gcGRpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gZmlsZS5zbGljZShmZGkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJlc29sdmUgYW5kIHJlZHVjZSAuIGFuZCAuLiBwb3J0aW9ucyBpbiB0aGUgZmlsZSBhcyB3ZWxsLlxuICAgICAgICAvLyBkb250JyBuZWVkIHRvIGRvIHRoZSBzZWNvbmQgcGhhc2UsIGJlY2F1c2UgaXQncyBvbmx5IG9uZSBzdHJpbmdbXVxuICAgICAgICBjb25zdCB7IG9wdGltaXphdGlvbkxldmVsID0gMSB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBpZiAob3B0aW1pemF0aW9uTGV2ZWwgPj0gMikge1xuICAgICAgICAgICAgZmlsZSA9IHRoaXMubGV2ZWxUd29GaWxlT3B0aW1pemUoZmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWJ1ZygnbWF0Y2hPbmUnLCB0aGlzLCB7IGZpbGUsIHBhdHRlcm4gfSk7XG4gICAgICAgIHRoaXMuZGVidWcoJ21hdGNoT25lJywgZmlsZS5sZW5ndGgsIHBhdHRlcm4ubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgZmkgPSAwLCBwaSA9IDAsIGZsID0gZmlsZS5sZW5ndGgsIHBsID0gcGF0dGVybi5sZW5ndGg7IGZpIDwgZmwgJiYgcGkgPCBwbDsgZmkrKywgcGkrKykge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnbWF0Y2hPbmUgbG9vcCcpO1xuICAgICAgICAgICAgdmFyIHAgPSBwYXR0ZXJuW3BpXTtcbiAgICAgICAgICAgIHZhciBmID0gZmlsZVtmaV07XG4gICAgICAgICAgICB0aGlzLmRlYnVnKHBhdHRlcm4sIHAsIGYpO1xuICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGltcG9zc2libGUuXG4gICAgICAgICAgICAvLyBzb21lIGludmFsaWQgcmVnZXhwIHN0dWZmIGluIHRoZSBzZXQuXG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgIGlmIChwID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICBpZiAocCA9PT0gR0xPQlNUQVIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdHTE9CU1RBUicsIFtwYXR0ZXJuLCBwLCBmXSk7XG4gICAgICAgICAgICAgICAgLy8gXCIqKlwiXG4gICAgICAgICAgICAgICAgLy8gYS8qKi9iLyoqL2Mgd291bGQgbWF0Y2ggdGhlIGZvbGxvd2luZzpcbiAgICAgICAgICAgICAgICAvLyBhL2IveC95L3ovY1xuICAgICAgICAgICAgICAgIC8vIGEveC95L3ovYi9jXG4gICAgICAgICAgICAgICAgLy8gYS9iL3gvYi94L2NcbiAgICAgICAgICAgICAgICAvLyBhL2IvY1xuICAgICAgICAgICAgICAgIC8vIFRvIGRvIHRoaXMsIHRha2UgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gYWZ0ZXJcbiAgICAgICAgICAgICAgICAvLyB0aGUgKiosIGFuZCBzZWUgaWYgaXQgd291bGQgbWF0Y2ggdGhlIGZpbGUgcmVtYWluZGVyLlxuICAgICAgICAgICAgICAgIC8vIElmIHNvLCByZXR1cm4gc3VjY2Vzcy5cbiAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHRoZSAqKiBcInN3YWxsb3dzXCIgYSBzZWdtZW50LCBhbmQgdHJ5IGFnYWluLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjdXJzaXZlbHkgYXdmdWwuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBhLyoqL2IvKiovYyBtYXRjaGluZyBhL2IveC95L3ovY1xuICAgICAgICAgICAgICAgIC8vIC0gYSBtYXRjaGVzIGFcbiAgICAgICAgICAgICAgICAvLyAtIGRvdWJsZXN0YXJcbiAgICAgICAgICAgICAgICAvLyAgIC0gbWF0Y2hPbmUoYi94L3kvei9jLCBiLyoqL2MpXG4gICAgICAgICAgICAgICAgLy8gICAgIC0gYiBtYXRjaGVzIGJcbiAgICAgICAgICAgICAgICAvLyAgICAgLSBkb3VibGVzdGFyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgLSBtYXRjaE9uZSh4L3kvei9jLCBjKSAtPiBub1xuICAgICAgICAgICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoeS96L2MsIGMpIC0+IG5vXG4gICAgICAgICAgICAgICAgLy8gICAgICAgLSBtYXRjaE9uZSh6L2MsIGMpIC0+IG5vXG4gICAgICAgICAgICAgICAgLy8gICAgICAgLSBtYXRjaE9uZShjLCBjKSB5ZXMsIGhpdFxuICAgICAgICAgICAgICAgIHZhciBmciA9IGZpO1xuICAgICAgICAgICAgICAgIHZhciBwciA9IHBpICsgMTtcbiAgICAgICAgICAgICAgICBpZiAocHIgPT09IHBsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJyoqIGF0IHRoZSBlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gYSAqKiBhdCB0aGUgZW5kIHdpbGwganVzdCBzd2FsbG93IHRoZSByZXN0LlxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIGEgbWF0Y2guXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvd2V2ZXIsIGl0IHdpbGwgbm90IHN3YWxsb3cgLy54LCB1bmxlc3NcbiAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9ucy5kb3QgaXMgc2V0LlxuICAgICAgICAgICAgICAgICAgICAvLyAuIGFuZCAuLiBhcmUgKm5ldmVyKiBtYXRjaGVkIGJ5ICoqLCBmb3IgZXhwbG9zaXZlbHlcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhwb25lbnRpYWwgcmVhc29ucy5cbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGZpIDwgZmw7IGZpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlW2ZpXSA9PT0gJy4nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVtmaV0gPT09ICcuLicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW9wdGlvbnMuZG90ICYmIGZpbGVbZmldLmNoYXJBdCgwKSA9PT0gJy4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG9rLCBsZXQncyBzZWUgaWYgd2UgY2FuIHN3YWxsb3cgd2hhdGV2ZXIgd2UgY2FuLlxuICAgICAgICAgICAgICAgIHdoaWxlIChmciA8IGZsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzd2FsbG93ZWUgPSBmaWxlW2ZyXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnXFxuZ2xvYnN0YXIgd2hpbGUnLCBmaWxlLCBmciwgcGF0dGVybiwgcHIsIHN3YWxsb3dlZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFhYWCByZW1vdmUgdGhpcyBzbGljZS4gIEp1c3QgcGFzcyB0aGUgc3RhcnQgaW5kZXguXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoT25lKGZpbGUuc2xpY2UoZnIpLCBwYXR0ZXJuLnNsaWNlKHByKSwgcGFydGlhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ2dsb2JzdGFyIGZvdW5kIG1hdGNoIScsIGZyLCBmbCwgc3dhbGxvd2VlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEgbWF0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IHN3YWxsb3cgXCIuXCIgb3IgXCIuLlwiIGV2ZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gb25seSBzd2FsbG93IFwiLmZvb1wiIHdoZW4gZXhwbGljaXRseSBhc2tlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzd2FsbG93ZWUgPT09ICcuJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YWxsb3dlZSA9PT0gJy4uJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICghb3B0aW9ucy5kb3QgJiYgc3dhbGxvd2VlLmNoYXJBdCgwKSA9PT0gJy4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ2RvdCBkZXRlY3RlZCEnLCBmaWxlLCBmciwgcGF0dGVybiwgcHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKiogc3dhbGxvd3MgYSBzZWdtZW50LCBhbmQgY29udGludWUuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdnbG9ic3RhciBzd2FsbG93IGEgc2VnbWVudCwgYW5kIGNvbnRpbnVlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcisrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG5vIG1hdGNoIHdhcyBmb3VuZC5cbiAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCBpbiBwYXJ0aWFsIG1vZGUsIHdlIGNhbid0IHNheSB0aGlzIGlzIG5lY2Vzc2FyaWx5IG92ZXIuXG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmFuIG91dCBvZiBmaWxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ1xcbj4+PiBubyBtYXRjaCwgcGFydGlhbD8nLCBmaWxlLCBmciwgcGF0dGVybiwgcHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnIgPT09IGZsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBvdGhlciB0aGFuICoqXG4gICAgICAgICAgICAvLyBub24tbWFnaWMgcGF0dGVybnMganVzdCBoYXZlIHRvIG1hdGNoIGV4YWN0bHlcbiAgICAgICAgICAgIC8vIHBhdHRlcm5zIHdpdGggbWFnaWMgaGF2ZSBiZWVuIHR1cm5lZCBpbnRvIHJlZ2V4cHMuXG4gICAgICAgICAgICBsZXQgaGl0O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGhpdCA9IGYgPT09IHA7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zygnc3RyaW5nIG1hdGNoJywgcCwgZiwgaGl0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhpdCA9IHAudGVzdChmKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdwYXR0ZXJuIG1hdGNoJywgcCwgZiwgaGl0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGl0KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBlbmRpbmcgaW4gLyBtZWFucyB0aGF0IHdlJ2xsIGdldCBhIGZpbmFsIFwiXCJcbiAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4gIFRoaXMgY2FuIG9ubHkgbWF0Y2ggYVxuICAgICAgICAvLyBjb3JyZXNwb25kaW5nIFwiXCIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS5cbiAgICAgICAgLy8gSWYgdGhlIGZpbGUgZW5kcyBpbiAvLCB0aGVuIGl0IGNhbiBvbmx5IG1hdGNoIGFcbiAgICAgICAgLy8gYSBwYXR0ZXJuIHRoYXQgZW5kcyBpbiAvLCB1bmxlc3MgdGhlIHBhdHRlcm4ganVzdFxuICAgICAgICAvLyBkb2Vzbid0IGhhdmUgYW55IG1vcmUgZm9yIGl0LiBCdXQsIGEvYi8gc2hvdWxkICpub3QqXG4gICAgICAgIC8vIG1hdGNoIFwiYS9iLypcIiwgZXZlbiB0aG91Z2ggXCJcIiBtYXRjaGVzIGFnYWluc3QgdGhlXG4gICAgICAgIC8vIFteL10qPyBwYXR0ZXJuLCBleGNlcHQgaW4gcGFydGlhbCBtb2RlLCB3aGVyZSBpdCBtaWdodFxuICAgICAgICAvLyBzaW1wbHkgbm90IGJlIHJlYWNoZWQgeWV0LlxuICAgICAgICAvLyBIb3dldmVyLCBhL2IvIHNob3VsZCBzdGlsbCBzYXRpc2Z5IGEvKlxuICAgICAgICAvLyBub3cgZWl0aGVyIHdlIGZlbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4sIG9yIHdlJ3JlIGRvbmUuXG4gICAgICAgIGlmIChmaSA9PT0gZmwgJiYgcGkgPT09IHBsKSB7XG4gICAgICAgICAgICAvLyByYW4gb3V0IG9mIHBhdHRlcm4gYW5kIGZpbGVuYW1lIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgICAgICAgICAvLyBhbiBleGFjdCBoaXQhXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmaSA9PT0gZmwpIHtcbiAgICAgICAgICAgIC8vIHJhbiBvdXQgb2YgZmlsZSwgYnV0IHN0aWxsIGhhZCBwYXR0ZXJuIGxlZnQuXG4gICAgICAgICAgICAvLyB0aGlzIGlzIG9rIGlmIHdlJ3JlIGRvaW5nIHRoZSBtYXRjaCBhcyBwYXJ0IG9mXG4gICAgICAgICAgICAvLyBhIGdsb2IgZnMgdHJhdmVyc2FsLlxuICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGkgPT09IHBsKSB7XG4gICAgICAgICAgICAvLyByYW4gb3V0IG9mIHBhdHRlcm4sIHN0aWxsIGhhdmUgZmlsZSBsZWZ0LlxuICAgICAgICAgICAgLy8gdGhpcyBpcyBvbmx5IGFjY2VwdGFibGUgaWYgd2UncmUgb24gdGhlIHZlcnkgbGFzdFxuICAgICAgICAgICAgLy8gZW1wdHkgc2VnbWVudCBvZiBhIGZpbGUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLlxuICAgICAgICAgICAgLy8gYS8qIHNob3VsZCBtYXRjaCBhL2IvXG4gICAgICAgICAgICByZXR1cm4gZmkgPT09IGZsIC0gMSAmJiBmaWxlW2ZpXSA9PT0gJyc7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNob3VsZCBiZSB1bnJlYWNoYWJsZS5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd3RmPycpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICAgIGJyYWNlRXhwYW5kKCkge1xuICAgICAgICByZXR1cm4gYnJhY2VFeHBhbmQodGhpcy5wYXR0ZXJuLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cbiAgICBwYXJzZShwYXR0ZXJuKSB7XG4gICAgICAgIGFzc2VydFZhbGlkUGF0dGVybihwYXR0ZXJuKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgLy8gc2hvcnRjdXRzXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSAnKionKVxuICAgICAgICAgICAgcmV0dXJuIEdMT0JTVEFSO1xuICAgICAgICBpZiAocGF0dGVybiA9PT0gJycpXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIC8vIGZhciBhbmQgYXdheSwgdGhlIG1vc3QgY29tbW9uIGdsb2IgcGF0dGVybiBwYXJ0cyBhcmVcbiAgICAgICAgLy8gKiwgKi4qLCBhbmQgKi48ZXh0PiAgQWRkIGEgZmFzdCBjaGVjayBtZXRob2QgZm9yIHRob3NlLlxuICAgICAgICBsZXQgbTtcbiAgICAgICAgbGV0IGZhc3RUZXN0ID0gbnVsbDtcbiAgICAgICAgaWYgKChtID0gcGF0dGVybi5tYXRjaChzdGFyUkUpKSkge1xuICAgICAgICAgICAgZmFzdFRlc3QgPSBvcHRpb25zLmRvdCA/IHN0YXJUZXN0RG90IDogc3RhclRlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKG0gPSBwYXR0ZXJuLm1hdGNoKHN0YXJEb3RFeHRSRSkpKSB7XG4gICAgICAgICAgICBmYXN0VGVzdCA9IChvcHRpb25zLm5vY2FzZVxuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5kb3RcbiAgICAgICAgICAgICAgICAgICAgPyBzdGFyRG90RXh0VGVzdE5vY2FzZURvdFxuICAgICAgICAgICAgICAgICAgICA6IHN0YXJEb3RFeHRUZXN0Tm9jYXNlXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLmRvdFxuICAgICAgICAgICAgICAgICAgICA/IHN0YXJEb3RFeHRUZXN0RG90XG4gICAgICAgICAgICAgICAgICAgIDogc3RhckRvdEV4dFRlc3QpKG1bMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChtID0gcGF0dGVybi5tYXRjaChxbWFya3NSRSkpKSB7XG4gICAgICAgICAgICBmYXN0VGVzdCA9IChvcHRpb25zLm5vY2FzZVxuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5kb3RcbiAgICAgICAgICAgICAgICAgICAgPyBxbWFya3NUZXN0Tm9jYXNlRG90XG4gICAgICAgICAgICAgICAgICAgIDogcW1hcmtzVGVzdE5vY2FzZVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5kb3RcbiAgICAgICAgICAgICAgICAgICAgPyBxbWFya3NUZXN0RG90XG4gICAgICAgICAgICAgICAgICAgIDogcW1hcmtzVGVzdCkobSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKG0gPSBwYXR0ZXJuLm1hdGNoKHN0YXJEb3RTdGFyUkUpKSkge1xuICAgICAgICAgICAgZmFzdFRlc3QgPSBvcHRpb25zLmRvdCA/IHN0YXJEb3RTdGFyVGVzdERvdCA6IHN0YXJEb3RTdGFyVGVzdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobSA9IHBhdHRlcm4ubWF0Y2goZG90U3RhclJFKSkpIHtcbiAgICAgICAgICAgIGZhc3RUZXN0ID0gZG90U3RhclRlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmUgPSBBU1QuZnJvbUdsb2IocGF0dGVybiwgdGhpcy5vcHRpb25zKS50b01NUGF0dGVybigpO1xuICAgICAgICBpZiAoZmFzdFRlc3QgJiYgdHlwZW9mIHJlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gQXZvaWRzIG92ZXJyaWRpbmcgaW4gZnJvemVuIGVudmlyb25tZW50c1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShyZSwgJ3Rlc3QnLCB7IHZhbHVlOiBmYXN0VGVzdCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmU7XG4gICAgfVxuICAgIG1ha2VSZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVnZXhwIHx8IHRoaXMucmVnZXhwID09PSBmYWxzZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZ2V4cDtcbiAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgdGhpcy5zZXQgaXMgYSAyZCBhcnJheSBvZiBwYXJ0aWFsXG4gICAgICAgIC8vIHBhdHRlcm4gc3RyaW5ncywgb3IgXCIqKlwiLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJdCdzIGJldHRlciB0byB1c2UgLm1hdGNoKCkuICBUaGlzIGZ1bmN0aW9uIHNob3VsZG4ndFxuICAgICAgICAvLyBiZSB1c2VkLCByZWFsbHksIGJ1dCBpdCdzIHByZXR0eSBjb252ZW5pZW50IHNvbWV0aW1lcyxcbiAgICAgICAgLy8gd2hlbiB5b3UganVzdCB3YW50IHRvIHdvcmsgd2l0aCBhIHJlZ2V4LlxuICAgICAgICBjb25zdCBzZXQgPSB0aGlzLnNldDtcbiAgICAgICAgaWYgKCFzZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnJlZ2V4cCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVnZXhwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHR3b1N0YXIgPSBvcHRpb25zLm5vZ2xvYnN0YXJcbiAgICAgICAgICAgID8gc3RhclxuICAgICAgICAgICAgOiBvcHRpb25zLmRvdFxuICAgICAgICAgICAgICAgID8gdHdvU3RhckRvdFxuICAgICAgICAgICAgICAgIDogdHdvU3Rhck5vRG90O1xuICAgICAgICBjb25zdCBmbGFncyA9IG5ldyBTZXQob3B0aW9ucy5ub2Nhc2UgPyBbJ2knXSA6IFtdKTtcbiAgICAgICAgLy8gcmVnZXhwaWZ5IG5vbi1nbG9ic3RhciBwYXR0ZXJuc1xuICAgICAgICAvLyBpZiAqKiBpcyBvbmx5IGl0ZW0sIHRoZW4gd2UganVzdCBkbyBvbmUgdHdvU3RhclxuICAgICAgICAvLyBpZiAqKiBpcyBmaXJzdCwgYW5kIHRoZXJlIGFyZSBtb3JlLCBwcmVwZW5kIChcXC98dHdvU3RhclxcLyk/IHRvIG5leHRcbiAgICAgICAgLy8gaWYgKiogaXMgbGFzdCwgYXBwZW5kIChcXC90d29TdGFyfCkgdG8gcHJldmlvdXNcbiAgICAgICAgLy8gaWYgKiogaXMgaW4gdGhlIG1pZGRsZSwgYXBwZW5kIChcXC98XFwvdHdvU3RhclxcLykgdG8gcHJldmlvdXNcbiAgICAgICAgLy8gdGhlbiBmaWx0ZXIgb3V0IEdMT0JTVEFSIHN5bWJvbHNcbiAgICAgICAgbGV0IHJlID0gc2V0XG4gICAgICAgICAgICAubWFwKHBhdHRlcm4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcHAgPSBwYXR0ZXJuLm1hcChwID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2YgcC5mbGFncy5zcGxpdCgnJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hZGQoZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgcCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyByZWdFeHBFc2NhcGUocClcbiAgICAgICAgICAgICAgICAgICAgOiBwID09PSBHTE9CU1RBUlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBHTE9CU1RBUlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwLl9zcmM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBwLmZvckVhY2goKHAsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gcHBbaSArIDFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBwcFtpIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKHAgIT09IEdMT0JTVEFSIHx8IHByZXYgPT09IEdMT0JTVEFSKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPT0gdW5kZWZpbmVkICYmIG5leHQgIT09IEdMT0JTVEFSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcFtpICsgMV0gPSAnKD86XFxcXC98JyArIHR3b1N0YXIgKyAnXFxcXC8pPycgKyBuZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHBbaV0gPSB0d29TdGFyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBwcFtpIC0gMV0gPSBwcmV2ICsgJyg/OlxcXFwvfCcgKyB0d29TdGFyICsgJyk/JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobmV4dCAhPT0gR0xPQlNUQVIpIHtcbiAgICAgICAgICAgICAgICAgICAgcHBbaSAtIDFdID0gcHJldiArICcoPzpcXFxcL3xcXFxcLycgKyB0d29TdGFyICsgJ1xcXFwvKScgKyBuZXh0O1xuICAgICAgICAgICAgICAgICAgICBwcFtpICsgMV0gPSBHTE9CU1RBUjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwcC5maWx0ZXIocCA9PiBwICE9PSBHTE9CU1RBUikuam9pbignLycpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJ3wnKTtcbiAgICAgICAgLy8gbmVlZCB0byB3cmFwIGluIHBhcmVucyBpZiB3ZSBoYWQgbW9yZSB0aGFuIG9uZSB0aGluZyB3aXRoIHwsXG4gICAgICAgIC8vIG90aGVyd2lzZSBvbmx5IHRoZSBmaXJzdCB3aWxsIGJlIGFuY2hvcmVkIHRvIF4gYW5kIHRoZSBsYXN0IHRvICRcbiAgICAgICAgY29uc3QgW29wZW4sIGNsb3NlXSA9IHNldC5sZW5ndGggPiAxID8gWycoPzonLCAnKSddIDogWycnLCAnJ107XG4gICAgICAgIC8vIG11c3QgbWF0Y2ggZW50aXJlIHBhdHRlcm5cbiAgICAgICAgLy8gZW5kaW5nIGluIGEgKiBvciAqKiB3aWxsIG1ha2UgaXQgbGVzcyBzdHJpY3QuXG4gICAgICAgIHJlID0gJ14nICsgb3BlbiArIHJlICsgY2xvc2UgKyAnJCc7XG4gICAgICAgIC8vIGNhbiBtYXRjaCBhbnl0aGluZywgYXMgbG9uZyBhcyBpdCdzIG5vdCB0aGlzLlxuICAgICAgICBpZiAodGhpcy5uZWdhdGUpXG4gICAgICAgICAgICByZSA9ICdeKD8hJyArIHJlICsgJykuKyQnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5yZWdleHAgPSBuZXcgUmVnRXhwKHJlLCBbLi4uZmxhZ3NdLmpvaW4oJycpKTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGltcG9zc2libGVcbiAgICAgICAgICAgIHRoaXMucmVnZXhwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnZXhwO1xuICAgIH1cbiAgICBzbGFzaFNwbGl0KHApIHtcbiAgICAgICAgLy8gaWYgcCBzdGFydHMgd2l0aCAvLyBvbiB3aW5kb3dzLCB3ZSBwcmVzZXJ2ZSB0aGF0XG4gICAgICAgIC8vIHNvIHRoYXQgVU5DIHBhdGhzIGFyZW4ndCBicm9rZW4uICBPdGhlcndpc2UsIGFueSBudW1iZXIgb2ZcbiAgICAgICAgLy8gLyBjaGFyYWN0ZXJzIGFyZSBjb2FsZXNjZWQgaW50byBvbmUsIHVubGVzc1xuICAgICAgICAvLyBwcmVzZXJ2ZU11bHRpcGxlU2xhc2hlcyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgICAgaWYgKHRoaXMucHJlc2VydmVNdWx0aXBsZVNsYXNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBwLnNwbGl0KCcvJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1dpbmRvd3MgJiYgL15cXC9cXC9bXlxcL10rLy50ZXN0KHApKSB7XG4gICAgICAgICAgICAvLyBhZGQgYW4gZXh0cmEgJycgZm9yIHRoZSBvbmUgd2UgbG9zZVxuICAgICAgICAgICAgcmV0dXJuIFsnJywgLi4ucC5zcGxpdCgvXFwvKy8pXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwLnNwbGl0KC9cXC8rLyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWF0Y2goZiwgcGFydGlhbCA9IHRoaXMucGFydGlhbCkge1xuICAgICAgICB0aGlzLmRlYnVnKCdtYXRjaCcsIGYsIHRoaXMucGF0dGVybik7XG4gICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaW4gdGhlIGNhc2Ugb2YgYnVzdGVkIHRoaW5ncy5cbiAgICAgICAgLy8gY29tbWVudHMsIGV0Yy5cbiAgICAgICAgaWYgKHRoaXMuY29tbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZiA9PT0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGYgPT09ICcvJyAmJiBwYXJ0aWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICAvLyB3aW5kb3dzOiBuZWVkIHRvIHVzZSAvLCBub3QgXFxcbiAgICAgICAgaWYgKHRoaXMuaXNXaW5kb3dzKSB7XG4gICAgICAgICAgICBmID0gZi5zcGxpdCgnXFxcXCcpLmpvaW4oJy8nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0cmVhdCB0aGUgdGVzdCBwYXRoIGFzIGEgc2V0IG9mIHBhdGhwYXJ0cy5cbiAgICAgICAgY29uc3QgZmYgPSB0aGlzLnNsYXNoU3BsaXQoZik7XG4gICAgICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCAnc3BsaXQnLCBmZik7XG4gICAgICAgIC8vIGp1c3QgT05FIG9mIHRoZSBwYXR0ZXJuIHNldHMgaW4gdGhpcy5zZXQgbmVlZHMgdG8gbWF0Y2hcbiAgICAgICAgLy8gaW4gb3JkZXIgZm9yIGl0IHRvIGJlIHZhbGlkLiAgSWYgbmVnYXRpbmcsIHRoZW4ganVzdCBvbmVcbiAgICAgICAgLy8gbWF0Y2ggbWVhbnMgdGhhdCB3ZSBoYXZlIGZhaWxlZC5cbiAgICAgICAgLy8gRWl0aGVyIHdheSwgcmV0dXJuIG9uIHRoZSBmaXJzdCBoaXQuXG4gICAgICAgIGNvbnN0IHNldCA9IHRoaXMuc2V0O1xuICAgICAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgJ3NldCcsIHNldCk7XG4gICAgICAgIC8vIEZpbmQgdGhlIGJhc2VuYW1lIG9mIHRoZSBwYXRoIGJ5IGxvb2tpbmcgZm9yIHRoZSBsYXN0IG5vbi1lbXB0eSBzZWdtZW50XG4gICAgICAgIGxldCBmaWxlbmFtZSA9IGZmW2ZmLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoIWZpbGVuYW1lKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZmYubGVuZ3RoIC0gMjsgIWZpbGVuYW1lICYmIGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmZltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHNldFtpXTtcbiAgICAgICAgICAgIGxldCBmaWxlID0gZmY7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tYXRjaEJhc2UgJiYgcGF0dGVybi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBmaWxlID0gW2ZpbGVuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhpdCA9IHRoaXMubWF0Y2hPbmUoZmlsZSwgcGF0dGVybiwgcGFydGlhbCk7XG4gICAgICAgICAgICBpZiAoaGl0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmxpcE5lZ2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLm5lZ2F0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBoaXRzLiAgdGhpcyBpcyBzdWNjZXNzIGlmIGl0J3MgYSBuZWdhdGl2ZVxuICAgICAgICAvLyBwYXR0ZXJuLCBmYWlsdXJlIG90aGVyd2lzZS5cbiAgICAgICAgaWYgKG9wdGlvbnMuZmxpcE5lZ2F0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5lZ2F0ZTtcbiAgICB9XG4gICAgc3RhdGljIGRlZmF1bHRzKGRlZikge1xuICAgICAgICByZXR1cm4gbWluaW1hdGNoLmRlZmF1bHRzKGRlZikuTWluaW1hdGNoO1xuICAgIH1cbn1cbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuZXhwb3J0IHsgQVNUIH0gZnJvbSAnLi9hc3QuanMnO1xuZXhwb3J0IHsgZXNjYXBlIH0gZnJvbSAnLi9lc2NhcGUuanMnO1xuZXhwb3J0IHsgdW5lc2NhcGUgfSBmcm9tICcuL3VuZXNjYXBlLmpzJztcbi8qIGM4IGlnbm9yZSBzdG9wICovXG5taW5pbWF0Y2guQVNUID0gQVNUO1xubWluaW1hdGNoLk1pbmltYXRjaCA9IE1pbmltYXRjaDtcbm1pbmltYXRjaC5lc2NhcGUgPSBlc2NhcGU7XG5taW5pbWF0Y2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiY29uc3QgTUFYX1BBVFRFUk5fTEVOR1RIID0gMTAyNCAqIDY0O1xuZXhwb3J0IGNvbnN0IGFzc2VydFZhbGlkUGF0dGVybiA9IChwYXR0ZXJuKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHBhdHRlcm4nKTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm4ubGVuZ3RoID4gTUFYX1BBVFRFUk5fTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhdHRlcm4gaXMgdG9vIGxvbmcnKTtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXNzZXJ0LXZhbGlkLXBhdHRlcm4uanMubWFwIiwKICAgICIvLyB0cmFuc2xhdGUgdGhlIHZhcmlvdXMgcG9zaXggY2hhcmFjdGVyIGNsYXNzZXMgaW50byB1bmljb2RlIHByb3BlcnRpZXNcbi8vIHRoaXMgd29ya3MgYWNyb3NzIGFsbCB1bmljb2RlIGxvY2FsZXNcbi8vIHsgPHBvc2l4IGNsYXNzPjogWzx0cmFuc2xhdGlvbj4sIC91IGZsYWcgcmVxdWlyZWQsIG5lZ2F0ZWRdXG5jb25zdCBwb3NpeENsYXNzZXMgPSB7XG4gICAgJ1s6YWxudW06XSc6IFsnXFxcXHB7TH1cXFxccHtObH1cXFxccHtOZH0nLCB0cnVlXSxcbiAgICAnWzphbHBoYTpdJzogWydcXFxccHtMfVxcXFxwe05sfScsIHRydWVdLFxuICAgICdbOmFzY2lpOl0nOiBbJ1xcXFx4JyArICcwMC1cXFxceCcgKyAnN2YnLCBmYWxzZV0sXG4gICAgJ1s6Ymxhbms6XSc6IFsnXFxcXHB7WnN9XFxcXHQnLCB0cnVlXSxcbiAgICAnWzpjbnRybDpdJzogWydcXFxccHtDY30nLCB0cnVlXSxcbiAgICAnWzpkaWdpdDpdJzogWydcXFxccHtOZH0nLCB0cnVlXSxcbiAgICAnWzpncmFwaDpdJzogWydcXFxccHtafVxcXFxwe0N9JywgdHJ1ZSwgdHJ1ZV0sXG4gICAgJ1s6bG93ZXI6XSc6IFsnXFxcXHB7TGx9JywgdHJ1ZV0sXG4gICAgJ1s6cHJpbnQ6XSc6IFsnXFxcXHB7Q30nLCB0cnVlXSxcbiAgICAnWzpwdW5jdDpdJzogWydcXFxccHtQfScsIHRydWVdLFxuICAgICdbOnNwYWNlOl0nOiBbJ1xcXFxwe1p9XFxcXHRcXFxcclxcXFxuXFxcXHZcXFxcZicsIHRydWVdLFxuICAgICdbOnVwcGVyOl0nOiBbJ1xcXFxwe0x1fScsIHRydWVdLFxuICAgICdbOndvcmQ6XSc6IFsnXFxcXHB7TH1cXFxccHtObH1cXFxccHtOZH1cXFxccHtQY30nLCB0cnVlXSxcbiAgICAnWzp4ZGlnaXQ6XSc6IFsnQS1GYS1mMC05JywgZmFsc2VdLFxufTtcbi8vIG9ubHkgbmVlZCB0byBlc2NhcGUgYSBmZXcgdGhpbmdzIGluc2lkZSBvZiBicmFjZSBleHByZXNzaW9uc1xuLy8gZXNjYXBlczogWyBcXCBdIC1cbmNvbnN0IGJyYWNlRXNjYXBlID0gKHMpID0+IHMucmVwbGFjZSgvW1tcXF1cXFxcLV0vZywgJ1xcXFwkJicpO1xuLy8gZXNjYXBlIGFsbCByZWdleHAgbWFnaWMgY2hhcmFjdGVyc1xuY29uc3QgcmVnZXhwRXNjYXBlID0gKHMpID0+IHMucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csICdcXFxcJCYnKTtcbi8vIGV2ZXJ5dGhpbmcgaGFzIGFscmVhZHkgYmVlbiBlc2NhcGVkLCB3ZSBqdXN0IGhhdmUgdG8gam9pblxuY29uc3QgcmFuZ2VzVG9TdHJpbmcgPSAocmFuZ2VzKSA9PiByYW5nZXMuam9pbignJyk7XG4vLyB0YWtlcyBhIGdsb2Igc3RyaW5nIGF0IGEgcG9zaXggYnJhY2UgZXhwcmVzc2lvbiwgYW5kIHJldHVybnNcbi8vIGFuIGVxdWl2YWxlbnQgcmVndWxhciBleHByZXNzaW9uIHNvdXJjZSwgYW5kIGJvb2xlYW4gaW5kaWNhdGluZ1xuLy8gd2hldGhlciB0aGUgL3UgZmxhZyBuZWVkcyB0byBiZSBhcHBsaWVkLCBhbmQgdGhlIG51bWJlciBvZiBjaGFyc1xuLy8gY29uc3VtZWQgdG8gcGFyc2UgdGhlIGNoYXJhY3RlciBjbGFzcy5cbi8vIFRoaXMgYWxzbyByZW1vdmVzIG91dCBvZiBvcmRlciByYW5nZXMsIGFuZCByZXR1cm5zICgkLikgaWYgdGhlXG4vLyBlbnRpcmUgY2xhc3MganVzdCBubyBnb29kLlxuZXhwb3J0IGNvbnN0IHBhcnNlQ2xhc3MgPSAoZ2xvYiwgcG9zaXRpb24pID0+IHtcbiAgICBjb25zdCBwb3MgPSBwb3NpdGlvbjtcbiAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICBpZiAoZ2xvYi5jaGFyQXQocG9zKSAhPT0gJ1snKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGluIGEgYnJhY2UgZXhwcmVzc2lvbicpO1xuICAgIH1cbiAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgIGNvbnN0IHJhbmdlcyA9IFtdO1xuICAgIGNvbnN0IG5lZ3MgPSBbXTtcbiAgICBsZXQgaSA9IHBvcyArIDE7XG4gICAgbGV0IHNhd1N0YXJ0ID0gZmFsc2U7XG4gICAgbGV0IHVmbGFnID0gZmFsc2U7XG4gICAgbGV0IGVzY2FwaW5nID0gZmFsc2U7XG4gICAgbGV0IG5lZ2F0ZSA9IGZhbHNlO1xuICAgIGxldCBlbmRQb3MgPSBwb3M7XG4gICAgbGV0IHJhbmdlU3RhcnQgPSAnJztcbiAgICBXSElMRTogd2hpbGUgKGkgPCBnbG9iLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjID0gZ2xvYi5jaGFyQXQoaSk7XG4gICAgICAgIGlmICgoYyA9PT0gJyEnIHx8IGMgPT09ICdeJykgJiYgaSA9PT0gcG9zICsgMSkge1xuICAgICAgICAgICAgbmVnYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjID09PSAnXScgJiYgc2F3U3RhcnQgJiYgIWVzY2FwaW5nKSB7XG4gICAgICAgICAgICBlbmRQb3MgPSBpICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNhd1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKGMgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgaWYgKCFlc2NhcGluZykge1xuICAgICAgICAgICAgICAgIGVzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2NhcGVkIFxcIGNoYXIsIGZhbGwgdGhyb3VnaCBhbmQgdHJlYXQgbGlrZSBub3JtYWwgY2hhclxuICAgICAgICB9XG4gICAgICAgIGlmIChjID09PSAnWycgJiYgIWVzY2FwaW5nKSB7XG4gICAgICAgICAgICAvLyBlaXRoZXIgYSBwb3NpeCBjbGFzcywgYSBjb2xsYXRpb24gZXF1aXZhbGVudCwgb3IganVzdCBhIFtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2NscywgW3VuaXAsIHUsIG5lZ11dIG9mIE9iamVjdC5lbnRyaWVzKHBvc2l4Q2xhc3NlcykpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYi5zdGFydHNXaXRoKGNscywgaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCwgW2EtW10gaXMgZmluZSwgYnV0IG5vdCBbYS1bOmFscGhhXV1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbJyQuJywgZmFsc2UsIGdsb2IubGVuZ3RoIC0gcG9zLCB0cnVlXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpICs9IGNscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWcpXG4gICAgICAgICAgICAgICAgICAgICAgICBuZWdzLnB1c2godW5pcCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKHVuaXApO1xuICAgICAgICAgICAgICAgICAgICB1ZmxhZyA9IHVmbGFnIHx8IHU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIFdISUxFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgaXQncyBqdXN0IGEgbm9ybWFsIGNoYXJhY3RlciwgZWZmZWN0aXZlbHlcbiAgICAgICAgZXNjYXBpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgIC8vIHRocm93IHRoaXMgcmFuZ2UgYXdheSBpZiBpdCdzIG5vdCB2YWxpZCwgYnV0IG90aGVyc1xuICAgICAgICAgICAgLy8gY2FuIHN0aWxsIG1hdGNoLlxuICAgICAgICAgICAgaWYgKGMgPiByYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goYnJhY2VFc2NhcGUocmFuZ2VTdGFydCkgKyAnLScgKyBicmFjZUVzY2FwZShjKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjID09PSByYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goYnJhY2VFc2NhcGUoYykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmFuZ2VTdGFydCA9ICcnO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm93IG1pZ2h0IGJlIHRoZSBzdGFydCBvZiBhIHJhbmdlLlxuICAgICAgICAvLyBjYW4gYmUgZWl0aGVyIGMtZCBvciBjLV0gb3IgYzxtb3JlLi4uPl0gb3IgY10gYXQgdGhpcyBwb2ludFxuICAgICAgICBpZiAoZ2xvYi5zdGFydHNXaXRoKCctXScsIGkgKyAxKSkge1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2goYnJhY2VFc2NhcGUoYyArICctJykpO1xuICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdsb2Iuc3RhcnRzV2l0aCgnLScsIGkgKyAxKSkge1xuICAgICAgICAgICAgcmFuZ2VTdGFydCA9IGM7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3QgdGhlIHN0YXJ0IG9mIGEgcmFuZ2UsIGp1c3QgYSBzaW5nbGUgY2hhcmFjdGVyXG4gICAgICAgIHJhbmdlcy5wdXNoKGJyYWNlRXNjYXBlKGMpKTtcbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICBpZiAoZW5kUG9zIDwgaSkge1xuICAgICAgICAvLyBkaWRuJ3Qgc2VlIHRoZSBlbmQgb2YgdGhlIGNsYXNzLCBub3QgYSB2YWxpZCBjbGFzcyxcbiAgICAgICAgLy8gYnV0IG1pZ2h0IHN0aWxsIGJlIHZhbGlkIGFzIGEgbGl0ZXJhbCBtYXRjaC5cbiAgICAgICAgcmV0dXJuIFsnJywgZmFsc2UsIDAsIGZhbHNlXTtcbiAgICB9XG4gICAgLy8gaWYgd2UgZ290IG5vIHJhbmdlcyBhbmQgbm8gbmVnYXRlcywgdGhlbiB3ZSBoYXZlIGEgcmFuZ2UgdGhhdFxuICAgIC8vIGNhbm5vdCBwb3NzaWJseSBtYXRjaCBhbnl0aGluZywgYW5kIHRoYXQgcG9pc29ucyB0aGUgd2hvbGUgZ2xvYlxuICAgIGlmICghcmFuZ2VzLmxlbmd0aCAmJiAhbmVncy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFsnJC4nLCBmYWxzZSwgZ2xvYi5sZW5ndGggLSBwb3MsIHRydWVdO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBnb3Qgb25lIHBvc2l0aXZlIHJhbmdlLCBhbmQgaXQncyBhIHNpbmdsZSBjaGFyYWN0ZXIsIHRoZW4gdGhhdCdzXG4gICAgLy8gbm90IGFjdHVhbGx5IGEgbWFnaWMgcGF0dGVybiwgaXQncyBqdXN0IHRoYXQgb25lIGxpdGVyYWwgY2hhcmFjdGVyLlxuICAgIC8vIHdlIHNob3VsZCBub3QgdHJlYXQgdGhhdCBhcyBcIm1hZ2ljXCIsIHdlIHNob3VsZCBqdXN0IHJldHVybiB0aGUgbGl0ZXJhbFxuICAgIC8vIGNoYXJhY3Rlci4gW19dIGlzIGEgcGVyZmVjdGx5IHZhbGlkIHdheSB0byBlc2NhcGUgZ2xvYiBtYWdpYyBjaGFycy5cbiAgICBpZiAobmVncy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgcmFuZ2VzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAvXlxcXFw/LiQvLnRlc3QocmFuZ2VzWzBdKSAmJlxuICAgICAgICAhbmVnYXRlKSB7XG4gICAgICAgIGNvbnN0IHIgPSByYW5nZXNbMF0ubGVuZ3RoID09PSAyID8gcmFuZ2VzWzBdLnNsaWNlKC0xKSA6IHJhbmdlc1swXTtcbiAgICAgICAgcmV0dXJuIFtyZWdleHBFc2NhcGUociksIGZhbHNlLCBlbmRQb3MgLSBwb3MsIGZhbHNlXTtcbiAgICB9XG4gICAgY29uc3Qgc3JhbmdlcyA9ICdbJyArIChuZWdhdGUgPyAnXicgOiAnJykgKyByYW5nZXNUb1N0cmluZyhyYW5nZXMpICsgJ10nO1xuICAgIGNvbnN0IHNuZWdzID0gJ1snICsgKG5lZ2F0ZSA/ICcnIDogJ14nKSArIHJhbmdlc1RvU3RyaW5nKG5lZ3MpICsgJ10nO1xuICAgIGNvbnN0IGNvbWIgPSByYW5nZXMubGVuZ3RoICYmIG5lZ3MubGVuZ3RoXG4gICAgICAgID8gJygnICsgc3JhbmdlcyArICd8JyArIHNuZWdzICsgJyknXG4gICAgICAgIDogcmFuZ2VzLmxlbmd0aFxuICAgICAgICAgICAgPyBzcmFuZ2VzXG4gICAgICAgICAgICA6IHNuZWdzO1xuICAgIHJldHVybiBbY29tYiwgdWZsYWcsIGVuZFBvcyAtIHBvcywgdHJ1ZV07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJhY2UtZXhwcmVzc2lvbnMuanMubWFwIiwKICAgICIvKipcbiAqIFVuLWVzY2FwZSBhIHN0cmluZyB0aGF0IGhhcyBiZWVuIGVzY2FwZWQgd2l0aCB7QGxpbmsgZXNjYXBlfS5cbiAqXG4gKiBJZiB0aGUge0BsaW5rIHdpbmRvd3NQYXRoc05vRXNjYXBlfSBvcHRpb24gaXMgdXNlZCwgdGhlbiBzcXVhcmUtYnJhY2VcbiAqIGVzY2FwZXMgYXJlIHJlbW92ZWQsIGJ1dCBub3QgYmFja3NsYXNoIGVzY2FwZXMuICBGb3IgZXhhbXBsZSwgaXQgd2lsbCB0dXJuXG4gKiB0aGUgc3RyaW5nIGAnWypdJ2AgaW50byBgKmAsIGJ1dCBpdCB3aWxsIG5vdCB0dXJuIGAnXFxcXConYCBpbnRvIGAnKidgLFxuICogYmVjdWFzZSBgXFxgIGlzIGEgcGF0aCBzZXBhcmF0b3IgaW4gYHdpbmRvd3NQYXRoc05vRXNjYXBlYCBtb2RlLlxuICpcbiAqIFdoZW4gYHdpbmRvd3NQYXRoc05vRXNjYXBlYCBpcyBub3Qgc2V0LCB0aGVuIGJvdGggYnJhY2UgZXNjYXBlcyBhbmRcbiAqIGJhY2tzbGFzaCBlc2NhcGVzIGFyZSByZW1vdmVkLlxuICpcbiAqIFNsYXNoZXMgKGFuZCBiYWNrc2xhc2hlcyBpbiBgd2luZG93c1BhdGhzTm9Fc2NhcGVgIG1vZGUpIGNhbm5vdCBiZSBlc2NhcGVkXG4gKiBvciB1bmVzY2FwZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB1bmVzY2FwZSA9IChzLCB7IHdpbmRvd3NQYXRoc05vRXNjYXBlID0gZmFsc2UsIH0gPSB7fSkgPT4ge1xuICAgIHJldHVybiB3aW5kb3dzUGF0aHNOb0VzY2FwZVxuICAgICAgICA/IHMucmVwbGFjZSgvXFxbKFteXFwvXFxcXF0pXFxdL2csICckMScpXG4gICAgICAgIDogcy5yZXBsYWNlKC8oKD8hXFxcXCkufF4pXFxbKFteXFwvXFxcXF0pXFxdL2csICckMSQyJykucmVwbGFjZSgvXFxcXChbXlxcL10pL2csICckMScpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuZXNjYXBlLmpzLm1hcCIsCiAgICAiLy8gcGFyc2UgYSBzaW5nbGUgcGF0aCBwb3J0aW9uXG5pbXBvcnQgeyBwYXJzZUNsYXNzIH0gZnJvbSAnLi9icmFjZS1leHByZXNzaW9ucy5qcyc7XG5pbXBvcnQgeyB1bmVzY2FwZSB9IGZyb20gJy4vdW5lc2NhcGUuanMnO1xuY29uc3QgdHlwZXMgPSBuZXcgU2V0KFsnIScsICc/JywgJysnLCAnKicsICdAJ10pO1xuY29uc3QgaXNFeHRnbG9iVHlwZSA9IChjKSA9PiB0eXBlcy5oYXMoYyk7XG4vLyBQYXR0ZXJucyB0aGF0IGdldCBwcmVwZW5kZWQgdG8gYmluZCB0byB0aGUgc3RhcnQgb2YgZWl0aGVyIHRoZVxuLy8gZW50aXJlIHN0cmluZywgb3IganVzdCBhIHNpbmdsZSBwYXRoIHBvcnRpb24sIHRvIHByZXZlbnQgZG90c1xuLy8gYW5kL29yIHRyYXZlcnNhbCBwYXR0ZXJucywgd2hlbiBuZWVkZWQuXG4vLyBFeHRzIGRvbid0IG5lZWQgdGhlIF4gb3IgLyBiaXQsIGJlY2F1c2UgdGhlIHJvb3QgYmluZHMgdGhhdCBhbHJlYWR5LlxuY29uc3Qgc3RhcnROb1RyYXZlcnNhbCA9ICcoPyEoPzpefC8pXFxcXC5cXFxcLj8oPzokfC8pKSc7XG5jb25zdCBzdGFydE5vRG90ID0gJyg/IVxcXFwuKSc7XG4vLyBjaGFyYWN0ZXJzIHRoYXQgaW5kaWNhdGUgYSBzdGFydCBvZiBwYXR0ZXJuIG5lZWRzIHRoZSBcIm5vIGRvdHNcIiBiaXQsXG4vLyBiZWNhdXNlIGEgZG90ICptaWdodCogYmUgbWF0Y2hlZC4gKCBpcyBub3QgaW4gdGhlIGxpc3QsIGJlY2F1c2UgaW5cbi8vIHRoZSBjYXNlIG9mIGEgY2hpbGQgZXh0Z2xvYiwgaXQgd2lsbCBoYW5kbGUgdGhlIHByZXZlbnRpb24gaXRzZWxmLlxuY29uc3QgYWRkUGF0dGVyblN0YXJ0ID0gbmV3IFNldChbJ1snLCAnLiddKTtcbi8vIGNhc2VzIHdoZXJlIHRyYXZlcnNhbCBpcyBBLU9LLCBubyBkb3QgcHJldmVudGlvbiBuZWVkZWRcbmNvbnN0IGp1c3REb3RzID0gbmV3IFNldChbJy4uJywgJy4nXSk7XG5jb25zdCByZVNwZWNpYWxzID0gbmV3IFNldCgnKCkuKnt9Kz9bXV4kXFxcXCEnKTtcbmNvbnN0IHJlZ0V4cEVzY2FwZSA9IChzKSA9PiBzLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJyk7XG4vLyBhbnkgc2luZ2xlIHRoaW5nIG90aGVyIHRoYW4gL1xuY29uc3QgcW1hcmsgPSAnW14vXSc7XG4vLyAqID0+IGFueSBudW1iZXIgb2YgY2hhcmFjdGVyc1xuY29uc3Qgc3RhciA9IHFtYXJrICsgJyo/Jztcbi8vIHVzZSArIHdoZW4gd2UgbmVlZCB0byBlbnN1cmUgdGhhdCAqc29tZXRoaW5nKiBtYXRjaGVzLCBiZWNhdXNlIHRoZSAqIGlzXG4vLyB0aGUgb25seSB0aGluZyBpbiB0aGUgcGF0aCBwb3J0aW9uLlxuY29uc3Qgc3Rhck5vRW1wdHkgPSBxbWFyayArICcrPyc7XG4vLyByZW1vdmUgdGhlIFxcIGNoYXJzIHRoYXQgd2UgYWRkZWQgaWYgd2UgZW5kIHVwIGRvaW5nIGEgbm9ubWFnaWMgY29tcGFyZVxuLy8gY29uc3QgZGVzbGFzaCA9IChzOiBzdHJpbmcpID0+IHMucmVwbGFjZSgvXFxcXCguKS9nLCAnJDEnKVxuZXhwb3J0IGNsYXNzIEFTVCB7XG4gICAgdHlwZTtcbiAgICAjcm9vdDtcbiAgICAjaGFzTWFnaWM7XG4gICAgI3VmbGFnID0gZmFsc2U7XG4gICAgI3BhcnRzID0gW107XG4gICAgI3BhcmVudDtcbiAgICAjcGFyZW50SW5kZXg7XG4gICAgI25lZ3M7XG4gICAgI2ZpbGxlZE5lZ3MgPSBmYWxzZTtcbiAgICAjb3B0aW9ucztcbiAgICAjdG9TdHJpbmc7XG4gICAgLy8gc2V0IHRvIHRydWUgaWYgaXQncyBhbiBleHRnbG9iIHdpdGggbm8gY2hpbGRyZW5cbiAgICAvLyAod2hpY2ggcmVhbGx5IG1lYW5zIG9uZSBjaGlsZCBvZiAnJylcbiAgICAjZW1wdHlFeHQgPSBmYWxzZTtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBwYXJlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAvLyBleHRnbG9icyBhcmUgaW5oZXJlbnRseSBtYWdpY2FsXG4gICAgICAgIGlmICh0eXBlKVxuICAgICAgICAgICAgdGhpcy4jaGFzTWFnaWMgPSB0cnVlO1xuICAgICAgICB0aGlzLiNwYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuI3Jvb3QgPSB0aGlzLiNwYXJlbnQgPyB0aGlzLiNwYXJlbnQuI3Jvb3QgOiB0aGlzO1xuICAgICAgICB0aGlzLiNvcHRpb25zID0gdGhpcy4jcm9vdCA9PT0gdGhpcyA/IG9wdGlvbnMgOiB0aGlzLiNyb290LiNvcHRpb25zO1xuICAgICAgICB0aGlzLiNuZWdzID0gdGhpcy4jcm9vdCA9PT0gdGhpcyA/IFtdIDogdGhpcy4jcm9vdC4jbmVncztcbiAgICAgICAgaWYgKHR5cGUgPT09ICchJyAmJiAhdGhpcy4jcm9vdC4jZmlsbGVkTmVncylcbiAgICAgICAgICAgIHRoaXMuI25lZ3MucHVzaCh0aGlzKTtcbiAgICAgICAgdGhpcy4jcGFyZW50SW5kZXggPSB0aGlzLiNwYXJlbnQgPyB0aGlzLiNwYXJlbnQuI3BhcnRzLmxlbmd0aCA6IDA7XG4gICAgfVxuICAgIGdldCBoYXNNYWdpYygpIHtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICh0aGlzLiNoYXNNYWdpYyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2hhc01hZ2ljO1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy4jcGFydHMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocC50eXBlIHx8IHAuaGFzTWFnaWMpXG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNoYXNNYWdpYyA9IHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdGU6IHdpbGwgYmUgdW5kZWZpbmVkIHVudGlsIHdlIGdlbmVyYXRlIHRoZSByZWdleHAgc3JjIGFuZCBmaW5kIG91dFxuICAgICAgICByZXR1cm4gdGhpcy4jaGFzTWFnaWM7XG4gICAgfVxuICAgIC8vIHJlY29uc3RydWN0cyB0aGUgcGF0dGVyblxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBpZiAodGhpcy4jdG9TdHJpbmcgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiN0b1N0cmluZztcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jdG9TdHJpbmcgPSB0aGlzLiNwYXJ0cy5tYXAocCA9PiBTdHJpbmcocCkpLmpvaW4oJycpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jdG9TdHJpbmcgPVxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSArICcoJyArIHRoaXMuI3BhcnRzLm1hcChwID0+IFN0cmluZyhwKSkuam9pbignfCcpICsgJyknKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjZmlsbE5lZ3MoKSB7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAodGhpcyAhPT0gdGhpcy4jcm9vdClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIG9ubHkgY2FsbCBvbiByb290Jyk7XG4gICAgICAgIGlmICh0aGlzLiNmaWxsZWROZWdzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIC8vIGNhbGwgdG9TdHJpbmcoKSBvbmNlIHRvIGZpbGwgdGhpcyBvdXRcbiAgICAgICAgdGhpcy50b1N0cmluZygpO1xuICAgICAgICB0aGlzLiNmaWxsZWROZWdzID0gdHJ1ZTtcbiAgICAgICAgbGV0IG47XG4gICAgICAgIHdoaWxlICgobiA9IHRoaXMuI25lZ3MucG9wKCkpKSB7XG4gICAgICAgICAgICBpZiAobi50eXBlICE9PSAnIScpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAvLyB3YWxrIHVwIHRoZSB0cmVlLCBhcHBlbmRpbmcgZXZlcnRoaW5nIHRoYXQgY29tZXMgQUZURVIgcGFyZW50SW5kZXhcbiAgICAgICAgICAgIGxldCBwID0gbjtcbiAgICAgICAgICAgIGxldCBwcCA9IHAuI3BhcmVudDtcbiAgICAgICAgICAgIHdoaWxlIChwcCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBwLiNwYXJlbnRJbmRleCArIDE7ICFwcC50eXBlICYmIGkgPCBwcC4jcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIG4uI3BhcnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmluZyBwYXJ0IGluIGV4dGdsb2IgQVNUPz8nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LmNvcHlJbihwcC4jcGFydHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHAgPSBwcDtcbiAgICAgICAgICAgICAgICBwcCA9IHAuI3BhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcHVzaCguLi5wYXJ0cykge1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcGFydHMpIHtcbiAgICAgICAgICAgIGlmIChwID09PSAnJylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJyAmJiAhKHAgaW5zdGFuY2VvZiBBU1QgJiYgcC4jcGFyZW50ID09PSB0aGlzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwYXJ0OiAnICsgcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgdGhpcy4jcGFydHMucHVzaChwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXMudHlwZSA9PT0gbnVsbFxuICAgICAgICAgICAgPyB0aGlzLiNwYXJ0cy5zbGljZSgpLm1hcChwID0+ICh0eXBlb2YgcCA9PT0gJ3N0cmluZycgPyBwIDogcC50b0pTT04oKSkpXG4gICAgICAgICAgICA6IFt0aGlzLnR5cGUsIC4uLnRoaXMuI3BhcnRzLm1hcChwID0+IHAudG9KU09OKCkpXTtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGFydCgpICYmICF0aGlzLnR5cGUpXG4gICAgICAgICAgICByZXQudW5zaGlmdChbXSk7XG4gICAgICAgIGlmICh0aGlzLmlzRW5kKCkgJiZcbiAgICAgICAgICAgICh0aGlzID09PSB0aGlzLiNyb290IHx8XG4gICAgICAgICAgICAgICAgKHRoaXMuI3Jvb3QuI2ZpbGxlZE5lZ3MgJiYgdGhpcy4jcGFyZW50Py50eXBlID09PSAnIScpKSkge1xuICAgICAgICAgICAgcmV0LnB1c2goe30pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzU3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNyb290ID09PSB0aGlzKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIGlmICh0aGlzLnR5cGUpIHJldHVybiAhIXRoaXMuI3BhcmVudD8uaXNTdGFydCgpXG4gICAgICAgIGlmICghdGhpcy4jcGFyZW50Py5pc1N0YXJ0KCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLiNwYXJlbnRJbmRleCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBpZiBldmVyeXRoaW5nIEFIRUFEIG9mIHRoaXMgaXMgYSBuZWdhdGlvbiwgdGhlbiBpdCdzIHN0aWxsIHRoZSBcInN0YXJ0XCJcbiAgICAgICAgY29uc3QgcCA9IHRoaXMuI3BhcmVudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLiNwYXJlbnRJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwcCA9IHAuI3BhcnRzW2ldO1xuICAgICAgICAgICAgaWYgKCEocHAgaW5zdGFuY2VvZiBBU1QgJiYgcHAudHlwZSA9PT0gJyEnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaXNFbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNyb290ID09PSB0aGlzKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLiNwYXJlbnQ/LnR5cGUgPT09ICchJylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuI3BhcmVudD8uaXNFbmQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jcGFyZW50Py5pc0VuZCgpO1xuICAgICAgICAvLyBpZiBub3Qgcm9vdCwgaXQnbGwgYWx3YXlzIGhhdmUgYSBwYXJlbnRcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGNvbnN0IHBsID0gdGhpcy4jcGFyZW50ID8gdGhpcy4jcGFyZW50LiNwYXJ0cy5sZW5ndGggOiAwO1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICByZXR1cm4gdGhpcy4jcGFyZW50SW5kZXggPT09IHBsIC0gMTtcbiAgICB9XG4gICAgY29weUluKHBhcnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHRoaXMucHVzaChwYXJ0KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5wdXNoKHBhcnQuY2xvbmUodGhpcykpO1xuICAgIH1cbiAgICBjbG9uZShwYXJlbnQpIHtcbiAgICAgICAgY29uc3QgYyA9IG5ldyBBU1QodGhpcy50eXBlLCBwYXJlbnQpO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy4jcGFydHMpIHtcbiAgICAgICAgICAgIGMuY29weUluKHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgICBzdGF0aWMgI3BhcnNlQVNUKHN0ciwgYXN0LCBwb3MsIG9wdCkge1xuICAgICAgICBsZXQgZXNjYXBpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IGluQnJhY2UgPSBmYWxzZTtcbiAgICAgICAgbGV0IGJyYWNlU3RhcnQgPSAtMTtcbiAgICAgICAgbGV0IGJyYWNlTmVnID0gZmFsc2U7XG4gICAgICAgIGlmIChhc3QudHlwZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gb3V0c2lkZSBvZiBhIGV4dGdsb2IsIGFwcGVuZCB1bnRpbCB3ZSBmaW5kIGEgc3RhcnRcbiAgICAgICAgICAgIGxldCBpID0gcG9zO1xuICAgICAgICAgICAgbGV0IGFjYyA9ICcnO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSsrKTtcbiAgICAgICAgICAgICAgICAvLyBzdGlsbCBhY2N1bXVsYXRlIGVzY2FwZXMgYXQgdGhpcyBwb2ludCwgYnV0IHdlIGRvIGlnbm9yZVxuICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyB0aGF0IGFyZSBlc2NhcGVkXG4gICAgICAgICAgICAgICAgaWYgKGVzY2FwaW5nIHx8IGMgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgICAgICBlc2NhcGluZyA9ICFlc2NhcGluZztcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IGM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW5CcmFjZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gYnJhY2VTdGFydCArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnXicgfHwgYyA9PT0gJyEnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2VOZWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09ICddJyAmJiAhKGkgPT09IGJyYWNlU3RhcnQgKyAyICYmIGJyYWNlTmVnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5CcmFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQnJhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmFjZVN0YXJ0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJhY2VOZWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IGM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW9wdC5ub2V4dCAmJiBpc0V4dGdsb2JUeXBlKGMpICYmIHN0ci5jaGFyQXQoaSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICBhc3QucHVzaChhY2MpO1xuICAgICAgICAgICAgICAgICAgICBhY2MgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ID0gbmV3IEFTVChjLCBhc3QpO1xuICAgICAgICAgICAgICAgICAgICBpID0gQVNULiNwYXJzZUFTVChzdHIsIGV4dCwgaSwgb3B0KTtcbiAgICAgICAgICAgICAgICAgICAgYXN0LnB1c2goZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFjYyArPSBjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXN0LnB1c2goYWNjKTtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNvbWUga2luZCBvZiBleHRnbG9iLCBwb3MgaXMgYXQgdGhlIChcbiAgICAgICAgLy8gZmluZCB0aGUgbmV4dCB8IG9yIClcbiAgICAgICAgbGV0IGkgPSBwb3MgKyAxO1xuICAgICAgICBsZXQgcGFydCA9IG5ldyBBU1QobnVsbCwgYXN0KTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICAgICAgbGV0IGFjYyA9ICcnO1xuICAgICAgICB3aGlsZSAoaSA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBzdHIuY2hhckF0KGkrKyk7XG4gICAgICAgICAgICAvLyBzdGlsbCBhY2N1bXVsYXRlIGVzY2FwZXMgYXQgdGhpcyBwb2ludCwgYnV0IHdlIGRvIGlnbm9yZVxuICAgICAgICAgICAgLy8gc3RhcnRzIHRoYXQgYXJlIGVzY2FwZWRcbiAgICAgICAgICAgIGlmIChlc2NhcGluZyB8fCBjID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICBlc2NhcGluZyA9ICFlc2NhcGluZztcbiAgICAgICAgICAgICAgICBhY2MgKz0gYztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbkJyYWNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IGJyYWNlU3RhcnQgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnXicgfHwgYyA9PT0gJyEnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmFjZU5lZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PT0gJ10nICYmICEoaSA9PT0gYnJhY2VTdGFydCArIDIgJiYgYnJhY2VOZWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQnJhY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWNjICs9IGM7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICBpbkJyYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmFjZVN0YXJ0ID0gaTtcbiAgICAgICAgICAgICAgICBicmFjZU5lZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGFjYyArPSBjO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRXh0Z2xvYlR5cGUoYykgJiYgc3RyLmNoYXJBdChpKSA9PT0gJygnKSB7XG4gICAgICAgICAgICAgICAgcGFydC5wdXNoKGFjYyk7XG4gICAgICAgICAgICAgICAgYWNjID0gJyc7XG4gICAgICAgICAgICAgICAgY29uc3QgZXh0ID0gbmV3IEFTVChjLCBwYXJ0KTtcbiAgICAgICAgICAgICAgICBwYXJ0LnB1c2goZXh0KTtcbiAgICAgICAgICAgICAgICBpID0gQVNULiNwYXJzZUFTVChzdHIsIGV4dCwgaSwgb3B0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjID09PSAnfCcpIHtcbiAgICAgICAgICAgICAgICBwYXJ0LnB1c2goYWNjKTtcbiAgICAgICAgICAgICAgICBhY2MgPSAnJztcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgQVNUKG51bGwsIGFzdCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PT0gJyknKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFjYyA9PT0gJycgJiYgYXN0LiNwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXN0LiNlbXB0eUV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcnQucHVzaChhY2MpO1xuICAgICAgICAgICAgICAgIGFjYyA9ICcnO1xuICAgICAgICAgICAgICAgIGFzdC5wdXNoKC4uLnBhcnRzLCBwYXJ0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjYyArPSBjO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVuZmluaXNoZWQgZXh0Z2xvYlxuICAgICAgICAvLyBpZiB3ZSBnb3QgaGVyZSwgaXQgd2FzIGEgbWFsZm9ybWVkIGV4dGdsb2IhIG5vdCBhbiBleHRnbG9iLCBidXRcbiAgICAgICAgLy8gbWF5YmUgc29tZXRoaW5nIGVsc2UgaW4gdGhlcmUuXG4gICAgICAgIGFzdC50eXBlID0gbnVsbDtcbiAgICAgICAgYXN0LiNoYXNNYWdpYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgYXN0LiNwYXJ0cyA9IFtzdHIuc3Vic3RyaW5nKHBvcyAtIDEpXTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tR2xvYihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgYXN0ID0gbmV3IEFTVChudWxsLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgICAgICBBU1QuI3BhcnNlQVNUKHBhdHRlcm4sIGFzdCwgMCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBhc3Q7XG4gICAgfVxuICAgIC8vIHJldHVybnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpZiB0aGVyZSdzIG1hZ2ljLCBvciB0aGUgdW5lc2NhcGVkXG4gICAgLy8gc3RyaW5nIGlmIG5vdC5cbiAgICB0b01NUGF0dGVybigpIHtcbiAgICAgICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIHJvb3RcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICh0aGlzICE9PSB0aGlzLiNyb290KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3Jvb3QudG9NTVBhdHRlcm4oKTtcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgY29uc3QgZ2xvYiA9IHRoaXMudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgW3JlLCBib2R5LCBoYXNNYWdpYywgdWZsYWddID0gdGhpcy50b1JlZ0V4cFNvdXJjZSgpO1xuICAgICAgICAvLyBpZiB3ZSdyZSBpbiBub2Nhc2UgbW9kZSwgYW5kIG5vdCBub2Nhc2VNYWdpY09ubHksIHRoZW4gd2UgZG9cbiAgICAgICAgLy8gc3RpbGwgbmVlZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBpZiB3ZSBoYXZlIHRvIGNhc2UtaW5zZW5zaXRpdmVseVxuICAgICAgICAvLyBtYXRjaCBjYXBpdGFsL2xvd2VyY2FzZSBjaGFyYWN0ZXJzLlxuICAgICAgICBjb25zdCBhbnlNYWdpYyA9IGhhc01hZ2ljIHx8XG4gICAgICAgICAgICB0aGlzLiNoYXNNYWdpYyB8fFxuICAgICAgICAgICAgKHRoaXMuI29wdGlvbnMubm9jYXNlICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI29wdGlvbnMubm9jYXNlTWFnaWNPbmx5ICYmXG4gICAgICAgICAgICAgICAgZ2xvYi50b1VwcGVyQ2FzZSgpICE9PSBnbG9iLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWFueU1hZ2ljKSB7XG4gICAgICAgICAgICByZXR1cm4gYm9keTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmbGFncyA9ICh0aGlzLiNvcHRpb25zLm5vY2FzZSA/ICdpJyA6ICcnKSArICh1ZmxhZyA/ICd1JyA6ICcnKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFJlZ0V4cChgXiR7cmV9JGAsIGZsYWdzKSwge1xuICAgICAgICAgICAgX3NyYzogcmUsXG4gICAgICAgICAgICBfZ2xvYjogZ2xvYixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jb3B0aW9ucztcbiAgICB9XG4gICAgLy8gcmV0dXJucyB0aGUgc3RyaW5nIG1hdGNoLCB0aGUgcmVnZXhwIHNvdXJjZSwgd2hldGhlciB0aGVyZSdzIG1hZ2ljXG4gICAgLy8gaW4gdGhlIHJlZ2V4cCAoc28gYSByZWd1bGFyIGV4cHJlc3Npb24gaXMgcmVxdWlyZWQpIGFuZCB3aGV0aGVyIG9yXG4gICAgLy8gbm90IHRoZSB1ZmxhZyBpcyBuZWVkZWQgZm9yIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gKGZvciBwb3NpeCBjbGFzc2VzKVxuICAgIC8vIFRPRE86IGluc3RlYWQgb2YgaW5qZWN0aW5nIHRoZSBzdGFydC9lbmQgYXQgdGhpcyBwb2ludCwganVzdCByZXR1cm5cbiAgICAvLyB0aGUgQk9EWSBvZiB0aGUgcmVnZXhwLCBhbG9uZyB3aXRoIHRoZSBzdGFydC9lbmQgcG9ydGlvbnMgc3VpdGFibGVcbiAgICAvLyBmb3IgYmluZGluZyB0aGUgc3RhcnQvZW5kIGluIGVpdGhlciBhIGpvaW5lZCBmdWxsLXBhdGggbWFrZVJlIGNvbnRleHRcbiAgICAvLyAod2hlcmUgd2UgYmluZCB0byAoXnwvKSwgb3IgYSBzdGFuZGFsb25lIG1hdGNoUGFydCBjb250ZXh0ICh3aGVyZVxuICAgIC8vIHdlIGJpbmQgdG8gXiwgYW5kIG5vdCAvKS4gIE90aGVyd2lzZSBzbGFzaGVzIGdldCBkdXBlZCFcbiAgICAvL1xuICAgIC8vIEluIHBhcnQtbWF0Y2hpbmcgbW9kZSwgdGhlIHN0YXJ0IGlzOlxuICAgIC8vIC0gaWYgbm90IGlzU3RhcnQ6IG5vdGhpbmdcbiAgICAvLyAtIGlmIHRyYXZlcnNhbCBwb3NzaWJsZSwgYnV0IG5vdCBhbGxvd2VkOiBeKD8hXFwuXFwuPyQpXG4gICAgLy8gLSBpZiBkb3RzIGFsbG93ZWQgb3Igbm90IHBvc3NpYmxlOiBeXG4gICAgLy8gLSBpZiBkb3RzIHBvc3NpYmxlIGFuZCBub3QgYWxsb3dlZDogXig/IVxcLilcbiAgICAvLyBlbmQgaXM6XG4gICAgLy8gLSBpZiBub3QgaXNFbmQoKTogbm90aGluZ1xuICAgIC8vIC0gZWxzZTogJFxuICAgIC8vXG4gICAgLy8gSW4gZnVsbC1wYXRoIG1hdGNoaW5nIG1vZGUsIHdlIHB1dCB0aGUgc2xhc2ggYXQgdGhlIFNUQVJUIG9mIHRoZVxuICAgIC8vIHBhdHRlcm4sIHNvIHN0YXJ0IGlzOlxuICAgIC8vIC0gaWYgZmlyc3QgcGF0dGVybjogc2FtZSBhcyBwYXJ0LW1hdGNoaW5nIG1vZGVcbiAgICAvLyAtIGlmIG5vdCBpc1N0YXJ0KCk6IG5vdGhpbmdcbiAgICAvLyAtIGlmIHRyYXZlcnNhbCBwb3NzaWJsZSwgYnV0IG5vdCBhbGxvd2VkOiAvKD8hXFwuXFwuPyg/OiR8LykpXG4gICAgLy8gLSBpZiBkb3RzIGFsbG93ZWQgb3Igbm90IHBvc3NpYmxlOiAvXG4gICAgLy8gLSBpZiBkb3RzIHBvc3NpYmxlIGFuZCBub3QgYWxsb3dlZDogLyg/IVxcLilcbiAgICAvLyBlbmQgaXM6XG4gICAgLy8gLSBpZiBsYXN0IHBhdHRlcm4sIHNhbWUgYXMgcGFydC1tYXRjaGluZyBtb2RlXG4gICAgLy8gLSBlbHNlIG5vdGhpbmdcbiAgICAvL1xuICAgIC8vIEFsd2F5cyBwdXQgdGhlICg/OiR8Lykgb24gbmVnYXRlZCB0YWlscywgdGhvdWdoLCBiZWNhdXNlIHRoYXQgaGFzIHRvIGJlXG4gICAgLy8gdGhlcmUgdG8gYmluZCB0aGUgZW5kIG9mIHRoZSBuZWdhdGVkIHBhdHRlcm4gcG9ydGlvbiwgYW5kIGl0J3MgZWFzaWVyIHRvXG4gICAgLy8ganVzdCBzdGljayBpdCBpbiBub3cgcmF0aGVyIHRoYW4gdHJ5IHRvIGluamVjdCBpdCBsYXRlciBpbiB0aGUgbWlkZGxlIG9mXG4gICAgLy8gdGhlIHBhdHRlcm4uXG4gICAgLy9cbiAgICAvLyBXZSBjYW4ganVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGVuZCwgYW5kIGxlYXZlIGl0IHVwIHRvIHRoZSBjYWxsZXJcbiAgICAvLyB0byBrbm93IHdoZXRoZXIgaXQncyBnb2luZyB0byBiZSB1c2VkIGpvaW5lZCBvciBpbiBwYXJ0cy5cbiAgICAvLyBBbmQsIGlmIHRoZSBzdGFydCBpcyBhZGp1c3RlZCBzbGlnaHRseSwgY2FuIGRvIHRoZSBzYW1lIHRoZXJlOlxuICAgIC8vIC0gaWYgbm90IGlzU3RhcnQ6IG5vdGhpbmdcbiAgICAvLyAtIGlmIHRyYXZlcnNhbCBwb3NzaWJsZSwgYnV0IG5vdCBhbGxvd2VkOiAoPzovfF4pKD8hXFwuXFwuPyQpXG4gICAgLy8gLSBpZiBkb3RzIGFsbG93ZWQgb3Igbm90IHBvc3NpYmxlOiAoPzovfF4pXG4gICAgLy8gLSBpZiBkb3RzIHBvc3NpYmxlIGFuZCBub3QgYWxsb3dlZDogKD86L3xeKSg/IVxcLilcbiAgICAvL1xuICAgIC8vIEJ1dCBpdCdzIGJldHRlciB0byBoYXZlIGEgc2ltcGxlciBiaW5kaW5nIHdpdGhvdXQgYSBjb25kaXRpb25hbCwgZm9yXG4gICAgLy8gcGVyZm9ybWFuY2UsIHNvIHByb2JhYmx5IGJldHRlciB0byByZXR1cm4gYm90aCBzdGFydCBvcHRpb25zLlxuICAgIC8vXG4gICAgLy8gVGhlbiB0aGUgY2FsbGVyIGp1c3QgaWdub3JlcyB0aGUgZW5kIGlmIGl0J3Mgbm90IHRoZSBmaXJzdCBwYXR0ZXJuLFxuICAgIC8vIGFuZCB0aGUgc3RhcnQgYWx3YXlzIGdldHMgYXBwbGllZC5cbiAgICAvL1xuICAgIC8vIEJ1dCB0aGF0J3MgYWx3YXlzIGdvaW5nIHRvIGJlICQgaWYgaXQncyB0aGUgZW5kaW5nIHBhdHRlcm4sIG9yIG5vdGhpbmcsXG4gICAgLy8gc28gdGhlIGNhbGxlciBjYW4ganVzdCBhdHRhY2ggJCBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuIHdoZW4gYnVpbGRpbmcuXG4gICAgLy9cbiAgICAvLyBTbyB0aGUgdG9kbyBpczpcbiAgICAvLyAtIGJldHRlciBkZXRlY3Qgd2hhdCBraW5kIG9mIHN0YXJ0IGlzIG5lZWRlZFxuICAgIC8vIC0gcmV0dXJuIGJvdGggZmxhdm9ycyBvZiBzdGFydGluZyBwYXR0ZXJuXG4gICAgLy8gLSBhdHRhY2ggJCBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuIHdoZW4gY3JlYXRpbmcgdGhlIGFjdHVhbCBSZWdFeHBcbiAgICAvL1xuICAgIC8vIEFoLCBidXQgd2FpdCwgbm8sIHRoYXQgYWxsIG9ubHkgYXBwbGllcyB0byB0aGUgcm9vdCB3aGVuIHRoZSBmaXJzdCBwYXR0ZXJuXG4gICAgLy8gaXMgbm90IGFuIGV4dGdsb2IuIElmIHRoZSBmaXJzdCBwYXR0ZXJuIElTIGFuIGV4dGdsb2IsIHRoZW4gd2UgbmVlZCBhbGxcbiAgICAvLyB0aGF0IGRvdCBwcmV2ZW50aW9uIGJpeiB0byBsaXZlIGluIHRoZSBleHRnbG9iIHBvcnRpb25zLCBiZWNhdXNlIGVnXG4gICAgLy8gKygqfC54KikgY2FuIG1hdGNoIC54eSBidXQgbm90IC55eC5cbiAgICAvL1xuICAgIC8vIFNvLCByZXR1cm4gdGhlIHR3byBmbGF2b3JzIGlmIGl0J3MgI3Jvb3QgYW5kIHRoZSBmaXJzdCBjaGlsZCBpcyBub3QgYW5cbiAgICAvLyBBU1QsIG90aGVyd2lzZSBsZWF2ZSBpdCB0byB0aGUgY2hpbGQgQVNUIHRvIGhhbmRsZSBpdCwgYW5kIHRoZXJlLFxuICAgIC8vIHVzZSB0aGUgKD86XnwvKSBzdHlsZSBvZiBzdGFydCBiaW5kaW5nLlxuICAgIC8vXG4gICAgLy8gRXZlbiBzaW1wbGlmaWVkIGZ1cnRoZXI6XG4gICAgLy8gLSBTaW5jZSB0aGUgc3RhcnQgZm9yIGEgam9pbiBpcyBlZyAvKD8hXFwuKSBhbmQgdGhlIHN0YXJ0IGZvciBhIHBhcnRcbiAgICAvLyBpcyBeKD8hXFwuKSwgd2UgY2FuIGp1c3QgcHJlcGVuZCAoPyFcXC4pIHRvIHRoZSBwYXR0ZXJuIChlaXRoZXIgcm9vdFxuICAgIC8vIG9yIHN0YXJ0IG9yIHdoYXRldmVyKSBhbmQgcHJlcGVuZCBeIG9yIC8gYXQgdGhlIFJlZ2V4cCBjb25zdHJ1Y3Rpb24uXG4gICAgdG9SZWdFeHBTb3VyY2UoYWxsb3dEb3QpIHtcbiAgICAgICAgY29uc3QgZG90ID0gYWxsb3dEb3QgPz8gISF0aGlzLiNvcHRpb25zLmRvdDtcbiAgICAgICAgaWYgKHRoaXMuI3Jvb3QgPT09IHRoaXMpXG4gICAgICAgICAgICB0aGlzLiNmaWxsTmVncygpO1xuICAgICAgICBpZiAoIXRoaXMudHlwZSkge1xuICAgICAgICAgICAgY29uc3Qgbm9FbXB0eSA9IHRoaXMuaXNTdGFydCgpICYmIHRoaXMuaXNFbmQoKTtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHRoaXMuI3BhcnRzXG4gICAgICAgICAgICAgICAgLm1hcChwID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbcmUsIF8sIGhhc01hZ2ljLCB1ZmxhZ10gPSB0eXBlb2YgcCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyBBU1QuI3BhcnNlR2xvYihwLCB0aGlzLiNoYXNNYWdpYywgbm9FbXB0eSlcbiAgICAgICAgICAgICAgICAgICAgOiBwLnRvUmVnRXhwU291cmNlKGFsbG93RG90KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNoYXNNYWdpYyA9IHRoaXMuI2hhc01hZ2ljIHx8IGhhc01hZ2ljO1xuICAgICAgICAgICAgICAgIHRoaXMuI3VmbGFnID0gdGhpcy4jdWZsYWcgfHwgdWZsYWc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSAnJztcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU3RhcnQoKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy4jcGFydHNbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHN0cmluZyB0aGF0IHdpbGwgbWF0Y2ggdGhlIHN0YXJ0IG9mIHRoZSBwYXR0ZXJuLFxuICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBkb3RzIGFuZCBzdWNoLlxuICAgICAgICAgICAgICAgICAgICAvLyAnLicgYW5kICcuLicgY2Fubm90IG1hdGNoIHVubGVzcyB0aGUgcGF0dGVybiBpcyB0aGF0IGV4YWN0bHksXG4gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgaXQgc3RhcnRzIHdpdGggLiBvciBkb3Q6dHJ1ZSBpcyBzZXQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdFRyYXZBbGxvd2VkID0gdGhpcy4jcGFydHMubGVuZ3RoID09PSAxICYmIGp1c3REb3RzLmhhcyh0aGlzLiNwYXJ0c1swXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZG90VHJhdkFsbG93ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcyA9IGFkZFBhdHRlcm5TdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgYSBwb3NzaWJpbGl0eSBvZiBtYXRjaGluZyAuIG9yIC4uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHByZXZlbnQgdGhhdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZWROb1RyYXYgPSBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvdHMgYXJlIGFsbG93ZWQsIGFuZCB0aGUgcGF0dGVybiBzdGFydHMgd2l0aCBbIG9yIC5cbiAgICAgICAgICAgICAgICAgICAgICAgIChkb3QgJiYgYXBzLmhhcyhzcmMuY2hhckF0KDApKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGF0dGVybiBzdGFydHMgd2l0aCBcXC4sIGFuZCB0aGVuIFsgb3IgLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmMuc3RhcnRzV2l0aCgnXFxcXC4nKSAmJiBhcHMuaGFzKHNyYy5jaGFyQXQoMikpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwYXR0ZXJuIHN0YXJ0cyB3aXRoIFxcLlxcLiwgYW5kIHRoZW4gWyBvciAuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyYy5zdGFydHNXaXRoKCdcXFxcLlxcXFwuJykgJiYgYXBzLmhhcyhzcmMuY2hhckF0KDQpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHByZXZlbnQgZG90cyBpZiBpdCBjYW4ndCBtYXRjaCBhIGRvdCwgb3IgaWYgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViLXBhdHRlcm4gd2lsbCBiZSBwcmV2ZW50aW5nIGl0IGFueXdheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZWROb0RvdCA9ICFkb3QgJiYgIWFsbG93RG90ICYmIGFwcy5oYXMoc3JjLmNoYXJBdCgwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG5lZWROb1RyYXYgPyBzdGFydE5vVHJhdmVyc2FsIDogbmVlZE5vRG90ID8gc3RhcnROb0RvdCA6ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXBwZW5kIHRoZSBcImVuZCBvZiBwYXRoIHBvcnRpb25cIiBwYXR0ZXJuIHRvIG5lZ2F0aW9uIHRhaWxzXG4gICAgICAgICAgICBsZXQgZW5kID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0VuZCgpICYmXG4gICAgICAgICAgICAgICAgdGhpcy4jcm9vdC4jZmlsbGVkTmVncyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuI3BhcmVudD8udHlwZSA9PT0gJyEnKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gJyg/OiR8XFxcXC8pJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZpbmFsID0gc3RhcnQgKyBzcmMgKyBlbmQ7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGZpbmFsLFxuICAgICAgICAgICAgICAgIHVuZXNjYXBlKHNyYyksXG4gICAgICAgICAgICAgICAgKHRoaXMuI2hhc01hZ2ljID0gISF0aGlzLiNoYXNNYWdpYyksXG4gICAgICAgICAgICAgICAgdGhpcy4jdWZsYWcsXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBib2R5ICp0d2ljZSogaWYgaXQncyBhIHJlcGVhdCBwYXR0ZXJuXG4gICAgICAgIC8vIGF0IHRoZSBzdGFydCwgb25jZSBpbiBub2RvdCBtb2RlLCB0aGVuIGFnYWluIGluIGRvdCBtb2RlLCBzbyBhXG4gICAgICAgIC8vIHBhdHRlcm4gbGlrZSAqKD8pIGNhbiBtYXRjaCAneC55J1xuICAgICAgICBjb25zdCByZXBlYXRlZCA9IHRoaXMudHlwZSA9PT0gJyonIHx8IHRoaXMudHlwZSA9PT0gJysnO1xuICAgICAgICAvLyBzb21lIGtpbmQgb2YgZXh0Z2xvYlxuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMudHlwZSA9PT0gJyEnID8gJyg/Oig/ISg/OicgOiAnKD86JztcbiAgICAgICAgbGV0IGJvZHkgPSB0aGlzLiNwYXJ0c1RvUmVnRXhwKGRvdCk7XG4gICAgICAgIGlmICh0aGlzLmlzU3RhcnQoKSAmJiB0aGlzLmlzRW5kKCkgJiYgIWJvZHkgJiYgdGhpcy50eXBlICE9PSAnIScpIHtcbiAgICAgICAgICAgIC8vIGludmFsaWQgZXh0Z2xvYiwgaGFzIHRvIGF0IGxlYXN0IGJlICpzb21ldGhpbmcqIHByZXNlbnQsIGlmIGl0J3NcbiAgICAgICAgICAgIC8vIHRoZSBlbnRpcmUgcGF0aCBwb3J0aW9uLlxuICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuI3BhcnRzID0gW3NdO1xuICAgICAgICAgICAgdGhpcy50eXBlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuI2hhc01hZ2ljID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIFtzLCB1bmVzY2FwZSh0aGlzLnRvU3RyaW5nKCkpLCBmYWxzZSwgZmFsc2VdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFhYWCBhYnN0cmFjdCBvdXQgdGhpcyBtYXAgbWV0aG9kXG4gICAgICAgIGxldCBib2R5RG90QWxsb3dlZCA9ICFyZXBlYXRlZCB8fCBhbGxvd0RvdCB8fCBkb3QgfHwgIXN0YXJ0Tm9Eb3RcbiAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgIDogdGhpcy4jcGFydHNUb1JlZ0V4cCh0cnVlKTtcbiAgICAgICAgaWYgKGJvZHlEb3RBbGxvd2VkID09PSBib2R5KSB7XG4gICAgICAgICAgICBib2R5RG90QWxsb3dlZCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChib2R5RG90QWxsb3dlZCkge1xuICAgICAgICAgICAgYm9keSA9IGAoPzoke2JvZHl9KSg/OiR7Ym9keURvdEFsbG93ZWR9KSo/YDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhbiBlbXB0eSAhKCkgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIGEgc3Rhck5vRW1wdHlcbiAgICAgICAgbGV0IGZpbmFsID0gJyc7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICchJyAmJiB0aGlzLiNlbXB0eUV4dCkge1xuICAgICAgICAgICAgZmluYWwgPSAodGhpcy5pc1N0YXJ0KCkgJiYgIWRvdCA/IHN0YXJ0Tm9Eb3QgOiAnJykgKyBzdGFyTm9FbXB0eTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNsb3NlID0gdGhpcy50eXBlID09PSAnISdcbiAgICAgICAgICAgICAgICA/IC8vICEoKSBtdXN0IG1hdGNoIHNvbWV0aGluZyxidXQgISh4KSBjYW4gbWF0Y2ggJydcbiAgICAgICAgICAgICAgICAgICAgJykpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5pc1N0YXJ0KCkgJiYgIWRvdCAmJiAhYWxsb3dEb3QgPyBzdGFydE5vRG90IDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgOiB0aGlzLnR5cGUgPT09ICdAJ1xuICAgICAgICAgICAgICAgICAgICA/ICcpJ1xuICAgICAgICAgICAgICAgICAgICA6IHRoaXMudHlwZSA9PT0gJz8nXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICcpPydcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy50eXBlID09PSAnKycgJiYgYm9keURvdEFsbG93ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy50eXBlID09PSAnKicgJiYgYm9keURvdEFsbG93ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgKT9gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYCkke3RoaXMudHlwZX1gO1xuICAgICAgICAgICAgZmluYWwgPSBzdGFydCArIGJvZHkgKyBjbG9zZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgZmluYWwsXG4gICAgICAgICAgICB1bmVzY2FwZShib2R5KSxcbiAgICAgICAgICAgICh0aGlzLiNoYXNNYWdpYyA9ICEhdGhpcy4jaGFzTWFnaWMpLFxuICAgICAgICAgICAgdGhpcy4jdWZsYWcsXG4gICAgICAgIF07XG4gICAgfVxuICAgICNwYXJ0c1RvUmVnRXhwKGRvdCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGFydHNcbiAgICAgICAgICAgIC5tYXAocCA9PiB7XG4gICAgICAgICAgICAvLyBleHRnbG9iIEFTVHMgc2hvdWxkIG9ubHkgY29udGFpbiBwYXJlbnQgQVNUc1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICBpZiAodHlwZW9mIHAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgdHlwZSBpbiBleHRnbG9iIGFzdD8/Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgLy8gY2FuIGlnbm9yZSBoYXNNYWdpYywgYmVjYXVzZSBleHRnbG9icyBhcmUgYWxyZWFkeSBhbHdheXMgbWFnaWNcbiAgICAgICAgICAgIGNvbnN0IFtyZSwgXywgX2hhc01hZ2ljLCB1ZmxhZ10gPSBwLnRvUmVnRXhwU291cmNlKGRvdCk7XG4gICAgICAgICAgICB0aGlzLiN1ZmxhZyA9IHRoaXMuI3VmbGFnIHx8IHVmbGFnO1xuICAgICAgICAgICAgcmV0dXJuIHJlO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcihwID0+ICEodGhpcy5pc1N0YXJ0KCkgJiYgdGhpcy5pc0VuZCgpKSB8fCAhIXApXG4gICAgICAgICAgICAuam9pbignfCcpO1xuICAgIH1cbiAgICBzdGF0aWMgI3BhcnNlR2xvYihnbG9iLCBoYXNNYWdpYywgbm9FbXB0eSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBlc2NhcGluZyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmUgPSAnJztcbiAgICAgICAgbGV0IHVmbGFnID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2xvYi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGdsb2IuY2hhckF0KGkpO1xuICAgICAgICAgICAgaWYgKGVzY2FwaW5nKSB7XG4gICAgICAgICAgICAgICAgZXNjYXBpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZSArPSAocmVTcGVjaWFscy5oYXMoYykgPyAnXFxcXCcgOiAnJykgKyBjO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSBnbG9iLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmUgKz0gJ1xcXFxcXFxcJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3NyYywgbmVlZFVmbGFnLCBjb25zdW1lZCwgbWFnaWNdID0gcGFyc2VDbGFzcyhnbG9iLCBpKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uc3VtZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmUgKz0gc3JjO1xuICAgICAgICAgICAgICAgICAgICB1ZmxhZyA9IHVmbGFnIHx8IG5lZWRVZmxhZztcbiAgICAgICAgICAgICAgICAgICAgaSArPSBjb25zdW1lZCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGhhc01hZ2ljID0gaGFzTWFnaWMgfHwgbWFnaWM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9FbXB0eSAmJiBnbG9iID09PSAnKicpXG4gICAgICAgICAgICAgICAgICAgIHJlICs9IHN0YXJOb0VtcHR5O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmUgKz0gc3RhcjtcbiAgICAgICAgICAgICAgICBoYXNNYWdpYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PT0gJz8nKSB7XG4gICAgICAgICAgICAgICAgcmUgKz0gcW1hcms7XG4gICAgICAgICAgICAgICAgaGFzTWFnaWMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmUgKz0gcmVnRXhwRXNjYXBlKGMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbcmUsIHVuZXNjYXBlKGdsb2IpLCAhIWhhc01hZ2ljLCB1ZmxhZ107XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXN0LmpzLm1hcCIsCiAgICAiLyoqXG4gKiBFc2NhcGUgYWxsIG1hZ2ljIGNoYXJhY3RlcnMgaW4gYSBnbG9iIHBhdHRlcm4uXG4gKlxuICogSWYgdGhlIHtAbGluayB3aW5kb3dzUGF0aHNOb0VzY2FwZSB8IEdsb2JPcHRpb25zLndpbmRvd3NQYXRoc05vRXNjYXBlfVxuICogb3B0aW9uIGlzIHVzZWQsIHRoZW4gY2hhcmFjdGVycyBhcmUgZXNjYXBlZCBieSB3cmFwcGluZyBpbiBgW11gLCBiZWNhdXNlXG4gKiBhIG1hZ2ljIGNoYXJhY3RlciB3cmFwcGVkIGluIGEgY2hhcmFjdGVyIGNsYXNzIGNhbiBvbmx5IGJlIHNhdGlzZmllZCBieVxuICogdGhhdCBleGFjdCBjaGFyYWN0ZXIuICBJbiB0aGlzIG1vZGUsIGBcXGAgaXMgX25vdF8gZXNjYXBlZCwgYmVjYXVzZSBpdCBpc1xuICogbm90IGludGVycHJldGVkIGFzIGEgbWFnaWMgY2hhcmFjdGVyLCBidXQgaW5zdGVhZCBhcyBhIHBhdGggc2VwYXJhdG9yLlxuICovXG5leHBvcnQgY29uc3QgZXNjYXBlID0gKHMsIHsgd2luZG93c1BhdGhzTm9Fc2NhcGUgPSBmYWxzZSwgfSA9IHt9KSA9PiB7XG4gICAgLy8gZG9uJ3QgbmVlZCB0byBlc2NhcGUgK0AhIGJlY2F1c2Ugd2UgZXNjYXBlIHRoZSBwYXJlbnNcbiAgICAvLyB0aGF0IG1ha2UgdGhvc2UgbWFnaWMsIGFuZCBlc2NhcGluZyAhIGFzIFshXSBpc24ndCB2YWxpZCxcbiAgICAvLyBiZWNhdXNlIFshXV0gaXMgYSB2YWxpZCBnbG9iIGNsYXNzIG1lYW5pbmcgbm90ICddJy5cbiAgICByZXR1cm4gd2luZG93c1BhdGhzTm9Fc2NhcGVcbiAgICAgICAgPyBzLnJlcGxhY2UoL1s/KigpW1xcXV0vZywgJ1skJl0nKVxuICAgICAgICA6IHMucmVwbGFjZSgvWz8qKClbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzY2FwZS5qcy5tYXAiLAogICAgImltcG9ydCB7IE1pbmltYXRjaCB9IGZyb20gJ21pbmltYXRjaCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgUGF0aFNjdXJyeSwgUGF0aFNjdXJyeURhcndpbiwgUGF0aFNjdXJyeVBvc2l4LCBQYXRoU2N1cnJ5V2luMzIsIH0gZnJvbSAncGF0aC1zY3VycnknO1xuaW1wb3J0IHsgUGF0dGVybiB9IGZyb20gJy4vcGF0dGVybi5qcyc7XG5pbXBvcnQgeyBHbG9iU3RyZWFtLCBHbG9iV2Fsa2VyIH0gZnJvbSAnLi93YWxrZXIuanMnO1xuLy8gaWYgbm8gcHJvY2VzcyBnbG9iYWwsIGp1c3QgY2FsbCBpdCBsaW51eC5cbi8vIHNvIHdlIGRlZmF1bHQgdG8gY2FzZS1zZW5zaXRpdmUsIC8gc2VwYXJhdG9yc1xuY29uc3QgZGVmYXVsdFBsYXRmb3JtID0gKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICAgIHByb2Nlc3MgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3N0cmluZycpID9cbiAgICBwcm9jZXNzLnBsYXRmb3JtXG4gICAgOiAnbGludXgnO1xuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjYW4gcGVyZm9ybSBnbG9iIHBhdHRlcm4gdHJhdmVyc2Fscy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdsb2Ige1xuICAgIGFic29sdXRlO1xuICAgIGN3ZDtcbiAgICByb290O1xuICAgIGRvdDtcbiAgICBkb3RSZWxhdGl2ZTtcbiAgICBmb2xsb3c7XG4gICAgaWdub3JlO1xuICAgIG1hZ2ljYWxCcmFjZXM7XG4gICAgbWFyaztcbiAgICBtYXRjaEJhc2U7XG4gICAgbWF4RGVwdGg7XG4gICAgbm9icmFjZTtcbiAgICBub2Nhc2U7XG4gICAgbm9kaXI7XG4gICAgbm9leHQ7XG4gICAgbm9nbG9ic3RhcjtcbiAgICBwYXR0ZXJuO1xuICAgIHBsYXRmb3JtO1xuICAgIHJlYWxwYXRoO1xuICAgIHNjdXJyeTtcbiAgICBzdGF0O1xuICAgIHNpZ25hbDtcbiAgICB3aW5kb3dzUGF0aHNOb0VzY2FwZTtcbiAgICB3aXRoRmlsZVR5cGVzO1xuICAgIGluY2x1ZGVDaGlsZE1hdGNoZXM7XG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIG9wdHM7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGFyc2VkIGltbXV0YWJsZSB7QGxpbmsgUGF0dGVybn0gb2JqZWN0cy5cbiAgICAgKi9cbiAgICBwYXR0ZXJucztcbiAgICAvKipcbiAgICAgKiBBbGwgb3B0aW9ucyBhcmUgc3RvcmVkIGFzIHByb3BlcnRpZXMgb24gdGhlIGBHbG9iYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIEdsb2JPcHRpb25zfSBmb3IgZnVsbCBvcHRpb25zIGRlc2NyaXB0aW9ucy5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBhIHByZXZpb3VzIGBHbG9iYCBvYmplY3QgY2FuIGJlIHBhc3NlZCBhcyB0aGVcbiAgICAgKiBgR2xvYk9wdGlvbnNgIHRvIGFub3RoZXIgYEdsb2JgIGluc3RhbnRpYXRpb24gdG8gcmUtdXNlIHNldHRpbmdzXG4gICAgICogYW5kIGNhY2hlcyB3aXRoIGEgbmV3IHBhdHRlcm4uXG4gICAgICpcbiAgICAgKiBUcmF2ZXJzYWwgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gcnVuIHRoZSB3YWxrXG4gICAgICogYWdhaW4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGF0dGVybiwgb3B0cykge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKCFvcHRzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZ2xvYiBvcHRpb25zIHJlcXVpcmVkJyk7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHRoaXMud2l0aEZpbGVUeXBlcyA9ICEhb3B0cy53aXRoRmlsZVR5cGVzO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IG9wdHMuc2lnbmFsO1xuICAgICAgICB0aGlzLmZvbGxvdyA9ICEhb3B0cy5mb2xsb3c7XG4gICAgICAgIHRoaXMuZG90ID0gISFvcHRzLmRvdDtcbiAgICAgICAgdGhpcy5kb3RSZWxhdGl2ZSA9ICEhb3B0cy5kb3RSZWxhdGl2ZTtcbiAgICAgICAgdGhpcy5ub2RpciA9ICEhb3B0cy5ub2RpcjtcbiAgICAgICAgdGhpcy5tYXJrID0gISFvcHRzLm1hcms7XG4gICAgICAgIGlmICghb3B0cy5jd2QpIHtcbiAgICAgICAgICAgIHRoaXMuY3dkID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0cy5jd2QgaW5zdGFuY2VvZiBVUkwgfHwgb3B0cy5jd2Quc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgICAgICAgICBvcHRzLmN3ZCA9IGZpbGVVUkxUb1BhdGgob3B0cy5jd2QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3dkID0gb3B0cy5jd2QgfHwgJyc7XG4gICAgICAgIHRoaXMucm9vdCA9IG9wdHMucm9vdDtcbiAgICAgICAgdGhpcy5tYWdpY2FsQnJhY2VzID0gISFvcHRzLm1hZ2ljYWxCcmFjZXM7XG4gICAgICAgIHRoaXMubm9icmFjZSA9ICEhb3B0cy5ub2JyYWNlO1xuICAgICAgICB0aGlzLm5vZXh0ID0gISFvcHRzLm5vZXh0O1xuICAgICAgICB0aGlzLnJlYWxwYXRoID0gISFvcHRzLnJlYWxwYXRoO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gb3B0cy5hYnNvbHV0ZTtcbiAgICAgICAgdGhpcy5pbmNsdWRlQ2hpbGRNYXRjaGVzID0gb3B0cy5pbmNsdWRlQ2hpbGRNYXRjaGVzICE9PSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub2dsb2JzdGFyID0gISFvcHRzLm5vZ2xvYnN0YXI7XG4gICAgICAgIHRoaXMubWF0Y2hCYXNlID0gISFvcHRzLm1hdGNoQmFzZTtcbiAgICAgICAgdGhpcy5tYXhEZXB0aCA9XG4gICAgICAgICAgICB0eXBlb2Ygb3B0cy5tYXhEZXB0aCA9PT0gJ251bWJlcicgPyBvcHRzLm1heERlcHRoIDogSW5maW5pdHk7XG4gICAgICAgIHRoaXMuc3RhdCA9ICEhb3B0cy5zdGF0O1xuICAgICAgICB0aGlzLmlnbm9yZSA9IG9wdHMuaWdub3JlO1xuICAgICAgICBpZiAodGhpcy53aXRoRmlsZVR5cGVzICYmIHRoaXMuYWJzb2x1dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3Qgc2V0IGFic29sdXRlIGFuZCB3aXRoRmlsZVR5cGVzOnRydWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwYXR0ZXJuID0gW3BhdHRlcm5dO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2luZG93c1BhdGhzTm9Fc2NhcGUgPVxuICAgICAgICAgICAgISFvcHRzLndpbmRvd3NQYXRoc05vRXNjYXBlIHx8XG4gICAgICAgICAgICAgICAgb3B0cy5hbGxvd1dpbmRvd3NFc2NhcGUgPT09XG4gICAgICAgICAgICAgICAgICAgIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy53aW5kb3dzUGF0aHNOb0VzY2FwZSkge1xuICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4ubWFwKHAgPT4gcC5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1hdGNoQmFzZSkge1xuICAgICAgICAgICAgaWYgKG9wdHMubm9nbG9ic3Rhcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Jhc2UgbWF0Y2hpbmcgcmVxdWlyZXMgZ2xvYnN0YXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLm1hcChwID0+IChwLmluY2x1ZGVzKCcvJykgPyBwIDogYC4vKiovJHtwfWApKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICAgICAgICB0aGlzLnBsYXRmb3JtID0gb3B0cy5wbGF0Zm9ybSB8fCBkZWZhdWx0UGxhdGZvcm07XG4gICAgICAgIHRoaXMub3B0cyA9IHsgLi4ub3B0cywgcGxhdGZvcm06IHRoaXMucGxhdGZvcm0gfTtcbiAgICAgICAgaWYgKG9wdHMuc2N1cnJ5KSB7XG4gICAgICAgICAgICB0aGlzLnNjdXJyeSA9IG9wdHMuc2N1cnJ5O1xuICAgICAgICAgICAgaWYgKG9wdHMubm9jYXNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBvcHRzLm5vY2FzZSAhPT0gb3B0cy5zY3Vycnkubm9jYXNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub2Nhc2Ugb3B0aW9uIGNvbnRyYWRpY3RzIHByb3ZpZGVkIHNjdXJyeSBvcHRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IFNjdXJyeSA9IG9wdHMucGxhdGZvcm0gPT09ICd3aW4zMicgPyBQYXRoU2N1cnJ5V2luMzJcbiAgICAgICAgICAgICAgICA6IG9wdHMucGxhdGZvcm0gPT09ICdkYXJ3aW4nID8gUGF0aFNjdXJyeURhcndpblxuICAgICAgICAgICAgICAgICAgICA6IG9wdHMucGxhdGZvcm0gPyBQYXRoU2N1cnJ5UG9zaXhcbiAgICAgICAgICAgICAgICAgICAgICAgIDogUGF0aFNjdXJyeTtcbiAgICAgICAgICAgIHRoaXMuc2N1cnJ5ID0gbmV3IFNjdXJyeSh0aGlzLmN3ZCwge1xuICAgICAgICAgICAgICAgIG5vY2FzZTogb3B0cy5ub2Nhc2UsXG4gICAgICAgICAgICAgICAgZnM6IG9wdHMuZnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vY2FzZSA9IHRoaXMuc2N1cnJ5Lm5vY2FzZTtcbiAgICAgICAgLy8gSWYgeW91IGRvIG5vY2FzZTp0cnVlIG9uIGEgY2FzZS1zZW5zaXRpdmUgZmlsZSBzeXN0ZW0sIHRoZW5cbiAgICAgICAgLy8gd2UgbmVlZCB0byB1c2UgcmVnZXhwcyBpbnN0ZWFkIG9mIHN0cmluZ3MgZm9yIG5vbi1tYWdpY1xuICAgICAgICAvLyBwYXRoIHBvcnRpb25zLCBiZWNhdXNlIHN0YXR0aW5nIGBhQmNgIHdvbid0IHJldHVybiByZXN1bHRzXG4gICAgICAgIC8vIGZvciB0aGUgZmlsZSBgQWJDYCBmb3IgZXhhbXBsZS5cbiAgICAgICAgY29uc3Qgbm9jYXNlTWFnaWNPbmx5ID0gdGhpcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicgfHwgdGhpcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbiAgICAgICAgY29uc3QgbW1vID0ge1xuICAgICAgICAgICAgLy8gZGVmYXVsdCBub2Nhc2UgYmFzZWQgb24gcGxhdGZvcm1cbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICBkb3Q6IHRoaXMuZG90LFxuICAgICAgICAgICAgbWF0Y2hCYXNlOiB0aGlzLm1hdGNoQmFzZSxcbiAgICAgICAgICAgIG5vYnJhY2U6IHRoaXMubm9icmFjZSxcbiAgICAgICAgICAgIG5vY2FzZTogdGhpcy5ub2Nhc2UsXG4gICAgICAgICAgICBub2Nhc2VNYWdpY09ubHksXG4gICAgICAgICAgICBub2NvbW1lbnQ6IHRydWUsXG4gICAgICAgICAgICBub2V4dDogdGhpcy5ub2V4dCxcbiAgICAgICAgICAgIG5vbmVnYXRlOiB0cnVlLFxuICAgICAgICAgICAgb3B0aW1pemF0aW9uTGV2ZWw6IDIsXG4gICAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICAgIHdpbmRvd3NQYXRoc05vRXNjYXBlOiB0aGlzLndpbmRvd3NQYXRoc05vRXNjYXBlLFxuICAgICAgICAgICAgZGVidWc6ICEhdGhpcy5vcHRzLmRlYnVnLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtbXMgPSB0aGlzLnBhdHRlcm4ubWFwKHAgPT4gbmV3IE1pbmltYXRjaChwLCBtbW8pKTtcbiAgICAgICAgY29uc3QgW21hdGNoU2V0LCBnbG9iUGFydHNdID0gbW1zLnJlZHVjZSgoc2V0LCBtKSA9PiB7XG4gICAgICAgICAgICBzZXRbMF0ucHVzaCguLi5tLnNldCk7XG4gICAgICAgICAgICBzZXRbMV0ucHVzaCguLi5tLmdsb2JQYXJ0cyk7XG4gICAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICB9LCBbW10sIFtdXSk7XG4gICAgICAgIHRoaXMucGF0dGVybnMgPSBtYXRjaFNldC5tYXAoKHNldCwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZyA9IGdsb2JQYXJ0c1tpXTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKCFnKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwYXR0ZXJuIG9iamVjdCcpO1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybihzZXQsIGcsIDAsIHRoaXMucGxhdGZvcm0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgd2FsaygpIHtcbiAgICAgICAgLy8gV2Fsa2VycyBhbHdheXMgcmV0dXJuIGFycmF5IG9mIFBhdGggb2JqZWN0cywgc28gd2UganVzdCBoYXZlIHRvXG4gICAgICAgIC8vIGNvZXJjZSB0aGVtIGludG8gdGhlIHJpZ2h0IHNoYXBlLiAgSXQgd2lsbCBoYXZlIGFscmVhZHkgY2FsbGVkXG4gICAgICAgIC8vIHJlYWxwYXRoKCkgaWYgdGhlIG9wdGlvbiB3YXMgc2V0IHRvIGRvIHNvLCBzbyB3ZSBrbm93IHRoYXQncyBjYWNoZWQuXG4gICAgICAgIC8vIHN0YXJ0IG91dCBrbm93aW5nIHRoZSBjd2QsIGF0IGxlYXN0XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi4oYXdhaXQgbmV3IEdsb2JXYWxrZXIodGhpcy5wYXR0ZXJucywgdGhpcy5zY3VycnkuY3dkLCB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgICAgICAgIG1heERlcHRoOiB0aGlzLm1heERlcHRoICE9PSBJbmZpbml0eSA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4RGVwdGggKyB0aGlzLnNjdXJyeS5jd2QuZGVwdGgoKVxuICAgICAgICAgICAgICAgICAgICA6IEluZmluaXR5LFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiB0aGlzLnBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIG5vY2FzZTogdGhpcy5ub2Nhc2UsXG4gICAgICAgICAgICAgICAgaW5jbHVkZUNoaWxkTWF0Y2hlczogdGhpcy5pbmNsdWRlQ2hpbGRNYXRjaGVzLFxuICAgICAgICAgICAgfSkud2FsaygpKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgd2Fsa1N5bmMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi5uZXcgR2xvYldhbGtlcih0aGlzLnBhdHRlcm5zLCB0aGlzLnNjdXJyeS5jd2QsIHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgICAgICAgbWF4RGVwdGg6IHRoaXMubWF4RGVwdGggIT09IEluZmluaXR5ID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhEZXB0aCArIHRoaXMuc2N1cnJ5LmN3ZC5kZXB0aCgpXG4gICAgICAgICAgICAgICAgICAgIDogSW5maW5pdHksXG4gICAgICAgICAgICAgICAgcGxhdGZvcm06IHRoaXMucGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgbm9jYXNlOiB0aGlzLm5vY2FzZSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlQ2hpbGRNYXRjaGVzOiB0aGlzLmluY2x1ZGVDaGlsZE1hdGNoZXMsXG4gICAgICAgICAgICB9KS53YWxrU3luYygpLFxuICAgICAgICBdO1xuICAgIH1cbiAgICBzdHJlYW0oKSB7XG4gICAgICAgIHJldHVybiBuZXcgR2xvYlN0cmVhbSh0aGlzLnBhdHRlcm5zLCB0aGlzLnNjdXJyeS5jd2QsIHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0cyxcbiAgICAgICAgICAgIG1heERlcHRoOiB0aGlzLm1heERlcHRoICE9PSBJbmZpbml0eSA/XG4gICAgICAgICAgICAgICAgdGhpcy5tYXhEZXB0aCArIHRoaXMuc2N1cnJ5LmN3ZC5kZXB0aCgpXG4gICAgICAgICAgICAgICAgOiBJbmZpbml0eSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiB0aGlzLnBsYXRmb3JtLFxuICAgICAgICAgICAgbm9jYXNlOiB0aGlzLm5vY2FzZSxcbiAgICAgICAgICAgIGluY2x1ZGVDaGlsZE1hdGNoZXM6IHRoaXMuaW5jbHVkZUNoaWxkTWF0Y2hlcyxcbiAgICAgICAgfSkuc3RyZWFtKCk7XG4gICAgfVxuICAgIHN0cmVhbVN5bmMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgR2xvYlN0cmVhbSh0aGlzLnBhdHRlcm5zLCB0aGlzLnNjdXJyeS5jd2QsIHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0cyxcbiAgICAgICAgICAgIG1heERlcHRoOiB0aGlzLm1heERlcHRoICE9PSBJbmZpbml0eSA/XG4gICAgICAgICAgICAgICAgdGhpcy5tYXhEZXB0aCArIHRoaXMuc2N1cnJ5LmN3ZC5kZXB0aCgpXG4gICAgICAgICAgICAgICAgOiBJbmZpbml0eSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiB0aGlzLnBsYXRmb3JtLFxuICAgICAgICAgICAgbm9jYXNlOiB0aGlzLm5vY2FzZSxcbiAgICAgICAgICAgIGluY2x1ZGVDaGlsZE1hdGNoZXM6IHRoaXMuaW5jbHVkZUNoaWxkTWF0Y2hlcyxcbiAgICAgICAgfSkuc3RyZWFtU3luYygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHN5bmMgaXRlcmF0aW9uIGZ1bmN0aW9uLiBSZXR1cm5zIGEgR2VuZXJhdG9yIHRoYXRcbiAgICAgKiBpdGVyYXRlcyBvdmVyIHRoZSByZXN1bHRzLlxuICAgICAqL1xuICAgIGl0ZXJhdGVTeW5jKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW1TeW5jKClbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlcmF0ZVN5bmMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBhc3luYyBpdGVyYXRpb24gZnVuY3Rpb24uIFJldHVybnMgYW4gQXN5bmNHZW5lcmF0b3IgdGhhdFxuICAgICAqIGl0ZXJhdGVzIG92ZXIgdGhlIHJlc3VsdHMuXG4gICAgICovXG4gICAgaXRlcmF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtKClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgfVxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZXJhdGUoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbG9iLmpzLm1hcCIsCiAgICAiLyoqXG4gKiBAbW9kdWxlIExSVUNhY2hlXG4gKi9cbmNvbnN0IHBlcmYgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgcGVyZm9ybWFuY2UgJiZcbiAgICB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nXG4gICAgPyBwZXJmb3JtYW5jZVxuICAgIDogRGF0ZTtcbmNvbnN0IHdhcm5lZCA9IG5ldyBTZXQoKTtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuY29uc3QgUFJPQ0VTUyA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgISFwcm9jZXNzID8gcHJvY2VzcyA6IHt9KTtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuY29uc3QgZW1pdFdhcm5pbmcgPSAobXNnLCB0eXBlLCBjb2RlLCBmbikgPT4ge1xuICAgIHR5cGVvZiBQUk9DRVNTLmVtaXRXYXJuaW5nID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gUFJPQ0VTUy5lbWl0V2FybmluZyhtc2csIHR5cGUsIGNvZGUsIGZuKVxuICAgICAgICA6IGNvbnNvbGUuZXJyb3IoYFske2NvZGV9XSAke3R5cGV9OiAke21zZ31gKTtcbn07XG5sZXQgQUMgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlcjtcbmxldCBBUyA9IGdsb2JhbFRoaXMuQWJvcnRTaWduYWw7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmlmICh0eXBlb2YgQUMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgQVMgPSBjbGFzcyBBYm9ydFNpZ25hbCB7XG4gICAgICAgIG9uYWJvcnQ7XG4gICAgICAgIF9vbmFib3J0ID0gW107XG4gICAgICAgIHJlYXNvbjtcbiAgICAgICAgYWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKF8sIGZuKSB7XG4gICAgICAgICAgICB0aGlzLl9vbmFib3J0LnB1c2goZm4pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBBQyA9IGNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgd2FybkFDUG9seWZpbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWwgPSBuZXcgQVMoKTtcbiAgICAgICAgYWJvcnQocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMuc2lnbmFsLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5zaWduYWwuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGZvciAoY29uc3QgZm4gb2YgdGhpcy5zaWduYWwuX29uYWJvcnQpIHtcbiAgICAgICAgICAgICAgICBmbihyZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zaWduYWwub25hYm9ydD8uKHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCBwcmludEFDUG9seWZpbGxXYXJuaW5nID0gUFJPQ0VTUy5lbnY/LkxSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORyAhPT0gJzEnO1xuICAgIGNvbnN0IHdhcm5BQ1BvbHlmaWxsID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXByaW50QUNQb2x5ZmlsbFdhcm5pbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHByaW50QUNQb2x5ZmlsbFdhcm5pbmcgPSBmYWxzZTtcbiAgICAgICAgZW1pdFdhcm5pbmcoJ0Fib3J0Q29udHJvbGxlciBpcyBub3QgZGVmaW5lZC4gSWYgdXNpbmcgbHJ1LWNhY2hlIGluICcgK1xuICAgICAgICAgICAgJ25vZGUgMTQsIGxvYWQgYW4gQWJvcnRDb250cm9sbGVyIHBvbHlmaWxsIGZyb20gdGhlICcgK1xuICAgICAgICAgICAgJ2Bub2RlLWFib3J0LWNvbnRyb2xsZXJgIHBhY2thZ2UuIEEgbWluaW1hbCBwb2x5ZmlsbCBpcyAnICtcbiAgICAgICAgICAgICdwcm92aWRlZCBmb3IgdXNlIGJ5IExSVUNhY2hlLmZldGNoKCksIGJ1dCBpdCBzaG91bGQgbm90IGJlICcgK1xuICAgICAgICAgICAgJ3JlbGllZCB1cG9uIGluIG90aGVyIGNvbnRleHRzIChlZywgcGFzc2luZyBpdCB0byBvdGhlciBBUElzIHRoYXQgJyArXG4gICAgICAgICAgICAndXNlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBtaWdodCBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMpLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGRpc2FibGUgdGhpcyB3aXRoIExSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORz0xIGluIHRoZSBlbnYuJywgJ05PX0FCT1JUX0NPTlRST0xMRVInLCAnRU5PVFNVUCcsIHdhcm5BQ1BvbHlmaWxsKTtcbiAgICB9O1xufVxuLyogYzggaWdub3JlIHN0b3AgKi9cbmNvbnN0IHNob3VsZFdhcm4gPSAoY29kZSkgPT4gIXdhcm5lZC5oYXMoY29kZSk7XG5jb25zdCBUWVBFID0gU3ltYm9sKCd0eXBlJyk7XG5jb25zdCBpc1Bvc0ludCA9IChuKSA9PiBuICYmIG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+IDAgJiYgaXNGaW5pdGUobik7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbi8vIFRoaXMgaXMgYSBsaXR0bGUgYml0IHJpZGljdWxvdXMsIHRiaC5cbi8vIFRoZSBtYXhpbXVtIGFycmF5IGxlbmd0aCBpcyAyXjMyLTEgb3IgdGhlcmVhYm91dHMgb24gbW9zdCBKUyBpbXBscy5cbi8vIEFuZCB3ZWxsIGJlZm9yZSB0aGF0IHBvaW50LCB5b3UncmUgY2FjaGluZyB0aGUgZW50aXJlIHdvcmxkLCBJIG1lYW4sXG4vLyB0aGF0J3MgfjMyR0Igb2YganVzdCBpbnRlZ2VycyBmb3IgdGhlIG5leHQvcHJldiBsaW5rcywgcGx1cyB3aGF0ZXZlclxuLy8gZWxzZSB0byBob2xkIHRoYXQgbWFueSBrZXlzIGFuZCB2YWx1ZXMuICBKdXN0IGZpbGxpbmcgdGhlIG1lbW9yeSB3aXRoXG4vLyB6ZXJvZXMgYXQgaW5pdCB0aW1lIGlzIGJydXRhbCB3aGVuIHlvdSBnZXQgdGhhdCBiaWcuXG4vLyBCdXQgd2h5IG5vdCBiZSBjb21wbGV0ZT9cbi8vIE1heWJlIGluIHRoZSBmdXR1cmUsIHRoZXNlIGxpbWl0cyB3aWxsIGhhdmUgZXhwYW5kZWQuXG5jb25zdCBnZXRVaW50QXJyYXkgPSAobWF4KSA9PiAhaXNQb3NJbnQobWF4KVxuICAgID8gbnVsbFxuICAgIDogbWF4IDw9IE1hdGgucG93KDIsIDgpXG4gICAgICAgID8gVWludDhBcnJheVxuICAgICAgICA6IG1heCA8PSBNYXRoLnBvdygyLCAxNilcbiAgICAgICAgICAgID8gVWludDE2QXJyYXlcbiAgICAgICAgICAgIDogbWF4IDw9IE1hdGgucG93KDIsIDMyKVxuICAgICAgICAgICAgICAgID8gVWludDMyQXJyYXlcbiAgICAgICAgICAgICAgICA6IG1heCA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgICAgICAgICAgICAgICAgICA/IFplcm9BcnJheVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4vKiBjOCBpZ25vcmUgc3RvcCAqL1xuY2xhc3MgWmVyb0FycmF5IGV4dGVuZHMgQXJyYXkge1xuICAgIGNvbnN0cnVjdG9yKHNpemUpIHtcbiAgICAgICAgc3VwZXIoc2l6ZSk7XG4gICAgICAgIHRoaXMuZmlsbCgwKTtcbiAgICB9XG59XG5jbGFzcyBTdGFjayB7XG4gICAgaGVhcDtcbiAgICBsZW5ndGg7XG4gICAgLy8gcHJpdmF0ZSBjb25zdHJ1Y3RvclxuICAgIHN0YXRpYyAjY29uc3RydWN0aW5nID0gZmFsc2U7XG4gICAgc3RhdGljIGNyZWF0ZShtYXgpIHtcbiAgICAgICAgY29uc3QgSGVhcENscyA9IGdldFVpbnRBcnJheShtYXgpO1xuICAgICAgICBpZiAoIUhlYXBDbHMpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIFN0YWNrLiNjb25zdHJ1Y3RpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBzID0gbmV3IFN0YWNrKG1heCwgSGVhcENscyk7XG4gICAgICAgIFN0YWNrLiNjb25zdHJ1Y3RpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG1heCwgSGVhcENscykge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKCFTdGFjay4jY29uc3RydWN0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnN0YW50aWF0ZSBTdGFjayB1c2luZyBTdGFjay5jcmVhdGUobiknKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB0aGlzLmhlYXAgPSBuZXcgSGVhcENscyhtYXgpO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIHB1c2gobikge1xuICAgICAgICB0aGlzLmhlYXBbdGhpcy5sZW5ndGgrK10gPSBuO1xuICAgIH1cbiAgICBwb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXBbLS10aGlzLmxlbmd0aF07XG4gICAgfVxufVxuLyoqXG4gKiBEZWZhdWx0IGV4cG9ydCwgdGhlIHRoaW5nIHlvdSdyZSB1c2luZyB0aGlzIG1vZHVsZSB0byBnZXQuXG4gKlxuICogVGhlIGBLYCBhbmQgYFZgIHR5cGVzIGRlZmluZSB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlcywgcmVzcGVjdGl2ZWx5LiBUaGVcbiAqIG9wdGlvbmFsIGBGQ2AgdHlwZSBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBgY29udGV4dGAgb2JqZWN0IHBhc3NlZCB0b1xuICogYGNhY2hlLmZldGNoKClgIGFuZCBgY2FjaGUubWVtbygpYC5cbiAqXG4gKiBLZXlzIGFuZCB2YWx1ZXMgKiptdXN0IG5vdCoqIGJlIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBBbGwgcHJvcGVydGllcyBmcm9tIHRoZSBvcHRpb25zIG9iamVjdCAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIGBtYXhgLFxuICogYG1heFNpemVgLCBgZmV0Y2hNZXRob2RgLCBgbWVtb01ldGhvZGAsIGBkaXNwb3NlYCBhbmQgYGRpc3Bvc2VBZnRlcmApIGFyZVxuICogYWRkZWQgYXMgbm9ybWFsIHB1YmxpYyBtZW1iZXJzLiAoVGhlIGxpc3RlZCBvcHRpb25zIGFyZSByZWFkLW9ubHkgZ2V0dGVycy4pXG4gKlxuICogQ2hhbmdpbmcgYW55IG9mIHRoZXNlIHdpbGwgYWx0ZXIgdGhlIGRlZmF1bHRzIGZvciBzdWJzZXF1ZW50IG1ldGhvZCBjYWxscy5cbiAqL1xuZXhwb3J0IGNsYXNzIExSVUNhY2hlIHtcbiAgICAvLyBvcHRpb25zIHRoYXQgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dCBkaXNhc3RlclxuICAgICNtYXg7XG4gICAgI21heFNpemU7XG4gICAgI2Rpc3Bvc2U7XG4gICAgI29uSW5zZXJ0O1xuICAgICNkaXNwb3NlQWZ0ZXI7XG4gICAgI2ZldGNoTWV0aG9kO1xuICAgICNtZW1vTWV0aG9kO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS50dGx9XG4gICAgICovXG4gICAgdHRsO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS50dGxSZXNvbHV0aW9ufVxuICAgICAqL1xuICAgIHR0bFJlc29sdXRpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnR0bEF1dG9wdXJnZX1cbiAgICAgKi9cbiAgICB0dGxBdXRvcHVyZ2U7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uR2V0fVxuICAgICAqL1xuICAgIHVwZGF0ZUFnZU9uR2V0O1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkhhc31cbiAgICAgKi9cbiAgICB1cGRhdGVBZ2VPbkhhcztcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZX1cbiAgICAgKi9cbiAgICBhbGxvd1N0YWxlO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5ub0Rpc3Bvc2VPblNldH1cbiAgICAgKi9cbiAgICBub0Rpc3Bvc2VPblNldDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9VcGRhdGVUVEx9XG4gICAgICovXG4gICAgbm9VcGRhdGVUVEw7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heEVudHJ5U2l6ZX1cbiAgICAgKi9cbiAgICBtYXhFbnRyeVNpemU7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnNpemVDYWxjdWxhdGlvbn1cbiAgICAgKi9cbiAgICBzaXplQ2FsY3VsYXRpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbn1cbiAgICAgKi9cbiAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vRGVsZXRlT25TdGFsZUdldH1cbiAgICAgKi9cbiAgICBub0RlbGV0ZU9uU3RhbGVHZXQ7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGVPbkZldGNoQWJvcnR9XG4gICAgICovXG4gICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb259XG4gICAgICovXG4gICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmlnbm9yZUZldGNoQWJvcnR9XG4gICAgICovXG4gICAgaWdub3JlRmV0Y2hBYm9ydDtcbiAgICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gICAgI3NpemU7XG4gICAgI2NhbGN1bGF0ZWRTaXplO1xuICAgICNrZXlNYXA7XG4gICAgI2tleUxpc3Q7XG4gICAgI3ZhbExpc3Q7XG4gICAgI25leHQ7XG4gICAgI3ByZXY7XG4gICAgI2hlYWQ7XG4gICAgI3RhaWw7XG4gICAgI2ZyZWU7XG4gICAgI2Rpc3Bvc2VkO1xuICAgICNzaXplcztcbiAgICAjc3RhcnRzO1xuICAgICN0dGxzO1xuICAgICNoYXNEaXNwb3NlO1xuICAgICNoYXNGZXRjaE1ldGhvZDtcbiAgICAjaGFzRGlzcG9zZUFmdGVyO1xuICAgICNoYXNPbkluc2VydDtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCB1bmxlc3MgeW91IG5lZWQgdG8gaW5zcGVjdCB0aGVcbiAgICAgKiBpbm5lciB3b3JraW5ncyBvZiB0aGUgY2FjaGUuICBJZiBhbnl0aGluZyByZXR1cm5lZCBieSB0aGlzXG4gICAgICogb2JqZWN0IGlzIG1vZGlmaWVkIGluIGFueSB3YXksIHN0cmFuZ2UgYnJlYWthZ2UgbWF5IG9jY3VyLlxuICAgICAqXG4gICAgICogVGhlc2UgZmllbGRzIGFyZSBwcml2YXRlIGZvciBhIHJlYXNvbiFcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyB1bnNhZmVFeHBvc2VJbnRlcm5hbHMoYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLy8gcHJvcGVydGllc1xuICAgICAgICAgICAgc3RhcnRzOiBjLiNzdGFydHMsXG4gICAgICAgICAgICB0dGxzOiBjLiN0dGxzLFxuICAgICAgICAgICAgc2l6ZXM6IGMuI3NpemVzLFxuICAgICAgICAgICAga2V5TWFwOiBjLiNrZXlNYXAsXG4gICAgICAgICAgICBrZXlMaXN0OiBjLiNrZXlMaXN0LFxuICAgICAgICAgICAgdmFsTGlzdDogYy4jdmFsTGlzdCxcbiAgICAgICAgICAgIG5leHQ6IGMuI25leHQsXG4gICAgICAgICAgICBwcmV2OiBjLiNwcmV2LFxuICAgICAgICAgICAgZ2V0IGhlYWQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGMuI2hlYWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IHRhaWwoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGMuI3RhaWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnJlZTogYy4jZnJlZSxcbiAgICAgICAgICAgIC8vIG1ldGhvZHNcbiAgICAgICAgICAgIGlzQmFja2dyb3VuZEZldGNoOiAocCkgPT4gYy4jaXNCYWNrZ3JvdW5kRmV0Y2gocCksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kRmV0Y2g6IChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCkgPT4gYy4jYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KSxcbiAgICAgICAgICAgIG1vdmVUb1RhaWw6IChpbmRleCkgPT4gYy4jbW92ZVRvVGFpbChpbmRleCksXG4gICAgICAgICAgICBpbmRleGVzOiAob3B0aW9ucykgPT4gYy4jaW5kZXhlcyhvcHRpb25zKSxcbiAgICAgICAgICAgIHJpbmRleGVzOiAob3B0aW9ucykgPT4gYy4jcmluZGV4ZXMob3B0aW9ucyksXG4gICAgICAgICAgICBpc1N0YWxlOiAoaW5kZXgpID0+IGMuI2lzU3RhbGUoaW5kZXgpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBQcm90ZWN0ZWQgcmVhZC1vbmx5IG1lbWJlcnNcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UubWF4fSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBtYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtYXg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5tYXhTaXplfSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBtYXhTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWF4U2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNvbXB1dGVkIHNpemUgb2YgaXRlbXMgaW4gdGhlIGNhY2hlIChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IGNhbGN1bGF0ZWRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2FsY3VsYXRlZFNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaXRlbXMgc3RvcmVkIGluIHRoZSBjYWNoZSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBmZXRjaE1ldGhvZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZldGNoTWV0aG9kO1xuICAgIH1cbiAgICBnZXQgbWVtb01ldGhvZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21lbW9NZXRob2Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5kaXNwb3NlfSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBkaXNwb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGlzcG9zZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm9uSW5zZXJ0fSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBvbkluc2VydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI29uSW5zZXJ0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZGlzcG9zZUFmdGVyfSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBkaXNwb3NlQWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkaXNwb3NlQWZ0ZXI7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBtYXggPSAwLCB0dGwsIHR0bFJlc29sdXRpb24gPSAxLCB0dGxBdXRvcHVyZ2UsIHVwZGF0ZUFnZU9uR2V0LCB1cGRhdGVBZ2VPbkhhcywgYWxsb3dTdGFsZSwgZGlzcG9zZSwgb25JbnNlcnQsIGRpc3Bvc2VBZnRlciwgbm9EaXNwb3NlT25TZXQsIG5vVXBkYXRlVFRMLCBtYXhTaXplID0gMCwgbWF4RW50cnlTaXplID0gMCwgc2l6ZUNhbGN1bGF0aW9uLCBmZXRjaE1ldGhvZCwgbWVtb01ldGhvZCwgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLCBub0RlbGV0ZU9uU3RhbGVHZXQsIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLCBhbGxvd1N0YWxlT25GZXRjaEFib3J0LCBpZ25vcmVGZXRjaEFib3J0LCB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKG1heCAhPT0gMCAmJiAhaXNQb3NJbnQobWF4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4IG9wdGlvbiBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFVpbnRBcnJheSA9IG1heCA/IGdldFVpbnRBcnJheShtYXgpIDogQXJyYXk7XG4gICAgICAgIGlmICghVWludEFycmF5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4IHZhbHVlOiAnICsgbWF4KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNtYXggPSBtYXg7XG4gICAgICAgIHRoaXMuI21heFNpemUgPSBtYXhTaXplO1xuICAgICAgICB0aGlzLm1heEVudHJ5U2l6ZSA9IG1heEVudHJ5U2l6ZSB8fCB0aGlzLiNtYXhTaXplO1xuICAgICAgICB0aGlzLnNpemVDYWxjdWxhdGlvbiA9IHNpemVDYWxjdWxhdGlvbjtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZUNhbGN1bGF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI21heFNpemUgJiYgIXRoaXMubWF4RW50cnlTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IHNldCBzaXplQ2FsY3VsYXRpb24gd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWVtb01ldGhvZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgbWVtb01ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWVtb01ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgZGVmaW5lZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI21lbW9NZXRob2QgPSBtZW1vTWV0aG9kO1xuICAgICAgICBpZiAoZmV0Y2hNZXRob2QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIGZldGNoTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZmV0Y2hNZXRob2QgPSBmZXRjaE1ldGhvZDtcbiAgICAgICAgdGhpcy4jaGFzRmV0Y2hNZXRob2QgPSAhIWZldGNoTWV0aG9kO1xuICAgICAgICB0aGlzLiNrZXlNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuI2tleUxpc3QgPSBuZXcgQXJyYXkobWF4KS5maWxsKHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuI3ZhbExpc3QgPSBuZXcgQXJyYXkobWF4KS5maWxsKHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuI25leHQgPSBuZXcgVWludEFycmF5KG1heCk7XG4gICAgICAgIHRoaXMuI3ByZXYgPSBuZXcgVWludEFycmF5KG1heCk7XG4gICAgICAgIHRoaXMuI2hlYWQgPSAwO1xuICAgICAgICB0aGlzLiN0YWlsID0gMDtcbiAgICAgICAgdGhpcy4jZnJlZSA9IFN0YWNrLmNyZWF0ZShtYXgpO1xuICAgICAgICB0aGlzLiNzaXplID0gMDtcbiAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2UgPSBkaXNwb3NlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb25JbnNlcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuI29uSW5zZXJ0ID0gb25JbnNlcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlQWZ0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlciA9IGRpc3Bvc2VBZnRlcjtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoYXNEaXNwb3NlID0gISF0aGlzLiNkaXNwb3NlO1xuICAgICAgICB0aGlzLiNoYXNPbkluc2VydCA9ICEhdGhpcy4jb25JbnNlcnQ7XG4gICAgICAgIHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciA9ICEhdGhpcy4jZGlzcG9zZUFmdGVyO1xuICAgICAgICB0aGlzLm5vRGlzcG9zZU9uU2V0ID0gISFub0Rpc3Bvc2VPblNldDtcbiAgICAgICAgdGhpcy5ub1VwZGF0ZVRUTCA9ICEhbm9VcGRhdGVUVEw7XG4gICAgICAgIHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gISFub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgICAgIHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24gPSAhIWFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uO1xuICAgICAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQgPSAhIWFsbG93U3RhbGVPbkZldGNoQWJvcnQ7XG4gICAgICAgIHRoaXMuaWdub3JlRmV0Y2hBYm9ydCA9ICEhaWdub3JlRmV0Y2hBYm9ydDtcbiAgICAgICAgLy8gTkI6IG1heEVudHJ5U2l6ZSBpcyBzZXQgdG8gbWF4U2l6ZSBpZiBpdCdzIHNldFxuICAgICAgICBpZiAodGhpcy5tYXhFbnRyeVNpemUgIT09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNtYXhTaXplICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLiNtYXhTaXplKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXhTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQb3NJbnQodGhpcy5tYXhFbnRyeVNpemUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZVNpemVUcmFja2luZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb3dTdGFsZSA9ICEhYWxsb3dTdGFsZTtcbiAgICAgICAgdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQgPSAhIW5vRGVsZXRlT25TdGFsZUdldDtcbiAgICAgICAgdGhpcy51cGRhdGVBZ2VPbkdldCA9ICEhdXBkYXRlQWdlT25HZXQ7XG4gICAgICAgIHRoaXMudXBkYXRlQWdlT25IYXMgPSAhIXVwZGF0ZUFnZU9uSGFzO1xuICAgICAgICB0aGlzLnR0bFJlc29sdXRpb24gPVxuICAgICAgICAgICAgaXNQb3NJbnQodHRsUmVzb2x1dGlvbikgfHwgdHRsUmVzb2x1dGlvbiA9PT0gMFxuICAgICAgICAgICAgICAgID8gdHRsUmVzb2x1dGlvblxuICAgICAgICAgICAgICAgIDogMTtcbiAgICAgICAgdGhpcy50dGxBdXRvcHVyZ2UgPSAhIXR0bEF1dG9wdXJnZTtcbiAgICAgICAgdGhpcy50dGwgPSB0dGwgfHwgMDtcbiAgICAgICAgaWYgKHRoaXMudHRsKSB7XG4gICAgICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMudHRsKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3R0bCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVUVExUcmFja2luZygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvIG5vdCBhbGxvdyBjb21wbGV0ZWx5IHVuYm91bmRlZCBjYWNoZXNcbiAgICAgICAgaWYgKHRoaXMuI21heCA9PT0gMCAmJiB0aGlzLnR0bCA9PT0gMCAmJiB0aGlzLiNtYXhTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBdCBsZWFzdCBvbmUgb2YgbWF4LCBtYXhTaXplLCBvciB0dGwgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHRsQXV0b3B1cmdlICYmICF0aGlzLiNtYXggJiYgIXRoaXMuI21heFNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSAnTFJVX0NBQ0hFX1VOQk9VTkRFRCc7XG4gICAgICAgICAgICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgICAgICAgICAgICAgIHdhcm5lZC5hZGQoY29kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gJ1RUTCBjYWNoaW5nIHdpdGhvdXQgdHRsQXV0b3B1cmdlLCBtYXgsIG9yIG1heFNpemUgY2FuICcgK1xuICAgICAgICAgICAgICAgICAgICAncmVzdWx0IGluIHVuYm91bmRlZCBtZW1vcnkgY29uc3VtcHRpb24uJztcbiAgICAgICAgICAgICAgICBlbWl0V2FybmluZyhtc2csICdVbmJvdW5kZWRDYWNoZVdhcm5pbmcnLCBjb2RlLCBMUlVDYWNoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbXMgbGVmdCBpbiB0aGUgaXRlbSdzIFRUTC4gSWYgaXRlbSBpcyBub3QgaW4gY2FjaGUsXG4gICAgICogcmV0dXJucyBgMGAuIFJldHVybnMgYEluZmluaXR5YCBpZiBpdGVtIGlzIGluIGNhY2hlIHdpdGhvdXQgYSBkZWZpbmVkIFRUTC5cbiAgICAgKi9cbiAgICBnZXRSZW1haW5pbmdUVEwoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNrZXlNYXAuaGFzKGtleSkgPyBJbmZpbml0eSA6IDA7XG4gICAgfVxuICAgICNpbml0aWFsaXplVFRMVHJhY2tpbmcoKSB7XG4gICAgICAgIGNvbnN0IHR0bHMgPSBuZXcgWmVyb0FycmF5KHRoaXMuI21heCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0cyA9IG5ldyBaZXJvQXJyYXkodGhpcy4jbWF4KTtcbiAgICAgICAgdGhpcy4jdHRscyA9IHR0bHM7XG4gICAgICAgIHRoaXMuI3N0YXJ0cyA9IHN0YXJ0cztcbiAgICAgICAgdGhpcy4jc2V0SXRlbVRUTCA9IChpbmRleCwgdHRsLCBzdGFydCA9IHBlcmYubm93KCkpID0+IHtcbiAgICAgICAgICAgIHN0YXJ0c1tpbmRleF0gPSB0dGwgIT09IDAgPyBzdGFydCA6IDA7XG4gICAgICAgICAgICB0dGxzW2luZGV4XSA9IHR0bDtcbiAgICAgICAgICAgIGlmICh0dGwgIT09IDAgJiYgdGhpcy50dGxBdXRvcHVyZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKHRoaXMuI2tleUxpc3RbaW5kZXhdLCAnZXhwaXJlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB0dGwgKyAxKTtcbiAgICAgICAgICAgICAgICAvLyB1bnJlZigpIG5vdCBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtc1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgICAgIGlmICh0LnVucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHQudW5yZWYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZSA9IGluZGV4ID0+IHtcbiAgICAgICAgICAgIHN0YXJ0c1tpbmRleF0gPSB0dGxzW2luZGV4XSAhPT0gMCA/IHBlcmYubm93KCkgOiAwO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzdGF0dXNUVEwgPSAoc3RhdHVzLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR0bHNbaW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHRsID0gdHRsc1tpbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICAgICAgaWYgKCF0dGwgfHwgIXN0YXJ0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgc3RhdHVzLnR0bCA9IHR0bDtcbiAgICAgICAgICAgICAgICBzdGF0dXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgICAgICBzdGF0dXMubm93ID0gY2FjaGVkTm93IHx8IGdldE5vdygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFnZSA9IHN0YXR1cy5ub3cgLSBzdGFydDtcbiAgICAgICAgICAgICAgICBzdGF0dXMucmVtYWluaW5nVFRMID0gdHRsIC0gYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBkZWJvdW5jZSBjYWxscyB0byBwZXJmLm5vdygpIHRvIDFzIHNvIHdlJ3JlIG5vdCBoaXR0aW5nXG4gICAgICAgIC8vIHRoYXQgY29zdGx5IGNhbGwgcmVwZWF0ZWRseS5cbiAgICAgICAgbGV0IGNhY2hlZE5vdyA9IDA7XG4gICAgICAgIGNvbnN0IGdldE5vdyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBwZXJmLm5vdygpO1xuICAgICAgICAgICAgaWYgKHRoaXMudHRsUmVzb2x1dGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICBjYWNoZWROb3cgPSBuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBzZXRUaW1lb3V0KCgpID0+IChjYWNoZWROb3cgPSAwKSwgdGhpcy50dGxSZXNvbHV0aW9uKTtcbiAgICAgICAgICAgICAgICAvLyBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXNcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICBpZiAodC51bnJlZikge1xuICAgICAgICAgICAgICAgICAgICB0LnVucmVmKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRSZW1haW5pbmdUVEwgPSBrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHRsID0gdHRsc1tpbmRleF07XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHN0YXJ0c1tpbmRleF07XG4gICAgICAgICAgICBpZiAoIXR0bCB8fCAhc3RhcnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhZ2UgPSAoY2FjaGVkTm93IHx8IGdldE5vdygpKSAtIHN0YXJ0O1xuICAgICAgICAgICAgcmV0dXJuIHR0bCAtIGFnZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jaXNTdGFsZSA9IGluZGV4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBzdGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgdCA9IHR0bHNbaW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuICEhdCAmJiAhIXMgJiYgKGNhY2hlZE5vdyB8fCBnZXROb3coKSkgLSBzID4gdDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gY29uZGl0aW9uYWxseSBzZXQgcHJpdmF0ZSBtZXRob2RzIHJlbGF0ZWQgdG8gVFRMXG4gICAgI3VwZGF0ZUl0ZW1BZ2UgPSAoKSA9PiB7IH07XG4gICAgI3N0YXR1c1RUTCA9ICgpID0+IHsgfTtcbiAgICAjc2V0SXRlbVRUTCA9ICgpID0+IHsgfTtcbiAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICNpc1N0YWxlID0gKCkgPT4gZmFsc2U7XG4gICAgI2luaXRpYWxpemVTaXplVHJhY2tpbmcoKSB7XG4gICAgICAgIGNvbnN0IHNpemVzID0gbmV3IFplcm9BcnJheSh0aGlzLiNtYXgpO1xuICAgICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuI3NpemVzID0gc2l6ZXM7XG4gICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplID0gaW5kZXggPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgLT0gc2l6ZXNbaW5kZXhdO1xuICAgICAgICAgICAgc2l6ZXNbaW5kZXhdID0gMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jcmVxdWlyZVNpemUgPSAoaywgdiwgc2l6ZSwgc2l6ZUNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBwcm92aXNpb25hbGx5IGFjY2VwdCBiYWNrZ3JvdW5kIGZldGNoZXMuXG4gICAgICAgICAgICAvLyBhY3R1YWwgdmFsdWUgc2l6ZSB3aWxsIGJlIGNoZWNrZWQgd2hlbiB0aGV5IHJldHVybi5cbiAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1Bvc0ludChzaXplKSkge1xuICAgICAgICAgICAgICAgIGlmIChzaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzaXplQ2FsY3VsYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemVDYWxjdWxhdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzaXplID0gc2l6ZUNhbGN1bGF0aW9uKHYsIGspO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUG9zSW50KHNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHNpemUgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcikuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1doZW4gbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUgaXMgdXNlZCwgc2l6ZUNhbGN1bGF0aW9uICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ29yIHNpemUgbXVzdCBiZSBzZXQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI2FkZEl0ZW1TaXplID0gKGluZGV4LCBzaXplLCBzdGF0dXMpID0+IHtcbiAgICAgICAgICAgIHNpemVzW2luZGV4XSA9IHNpemU7XG4gICAgICAgICAgICBpZiAodGhpcy4jbWF4U2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB0aGlzLiNtYXhTaXplIC0gc2l6ZXNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLiNjYWxjdWxhdGVkU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZXZpY3QodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgKz0gc2l6ZXNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5lbnRyeVNpemUgPSBzaXplO1xuICAgICAgICAgICAgICAgIHN0YXR1cy50b3RhbENhbGN1bGF0ZWRTaXplID0gdGhpcy4jY2FsY3VsYXRlZFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgICNyZW1vdmVJdGVtU2l6ZSA9IF9pID0+IHsgfTtcbiAgICAjYWRkSXRlbVNpemUgPSAoX2ksIF9zLCBfc3QpID0+IHsgfTtcbiAgICAjcmVxdWlyZVNpemUgPSAoX2ssIF92LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgaWYgKHNpemUgfHwgc2l6ZUNhbGN1bGF0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcbiAgICAqI2luZGV4ZXMoeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgICAgICBpZiAodGhpcy4jc2l6ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuI3RhaWw7IHRydWU7KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLiNpc1ZhbGlkSW5kZXgoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd1N0YWxlIHx8ICF0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSB0aGlzLiNoZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI3ByZXZbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICojcmluZGV4ZXMoeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgICAgICBpZiAodGhpcy4jc2l6ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuI2hlYWQ7IHRydWU7KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLiNpc1ZhbGlkSW5kZXgoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd1N0YWxlIHx8ICF0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI25leHRbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICNpc1ZhbGlkSW5kZXgoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIChpbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0aGlzLiNrZXlNYXAuZ2V0KHRoaXMuI2tleUxpc3RbaW5kZXhdKSA9PT0gaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgYFtrZXksIHZhbHVlXWAgcGFpcnMsXG4gICAgICogaW4gb3JkZXIgZnJvbSBtb3N0IHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqZW50cmllcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIFt0aGlzLiNrZXlMaXN0W2ldLCB0aGlzLiN2YWxMaXN0W2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZlcnNlIG9yZGVyIHZlcnNpb24gb2Yge0BsaW5rIExSVUNhY2hlLmVudHJpZXN9XG4gICAgICpcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgYFtrZXksIHZhbHVlXWAgcGFpcnMsXG4gICAgICogaW4gb3JkZXIgZnJvbSBsZWFzdCByZWNlbnRseSB1c2VkIHRvIG1vc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqcmVudHJpZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jdmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgdGhpcy4ja2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgW3RoaXMuI2tleUxpc3RbaV0sIHRoaXMuI3ZhbExpc3RbaV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyB0aGUga2V5cyBpbiB0aGUgY2FjaGUsXG4gICAgICogaW4gb3JkZXIgZnJvbSBtb3N0IHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqa2V5cygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaV07XG4gICAgICAgICAgICBpZiAoayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZlcnNlIG9yZGVyIHZlcnNpb24gb2Yge0BsaW5rIExSVUNhY2hlLmtleXN9XG4gICAgICpcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIGtleXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnJrZXlzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaV07XG4gICAgICAgICAgICBpZiAoayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIHZhbHVlcyBpbiB0aGUgY2FjaGUsXG4gICAgICogaW4gb3JkZXIgZnJvbSBtb3N0IHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqdmFsdWVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludmVyc2Ugb3JkZXIgdmVyc2lvbiBvZiB7QGxpbmsgTFJVQ2FjaGUudmFsdWVzfVxuICAgICAqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSB2YWx1ZXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnJ2YWx1ZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGluZyBvdmVyIHRoZSBjYWNoZSBpdHNlbGYgeWllbGRzIHRoZSBzYW1lIHJlc3VsdHMgYXNcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuZW50cmllc31cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIFN0cmluZyB2YWx1ZSB0aGF0IGlzIHVzZWQgaW4gdGhlIGNyZWF0aW9uIG9mIHRoZSBkZWZhdWx0IHN0cmluZ1xuICAgICAqIGRlc2NyaXB0aW9uIG9mIGFuIG9iamVjdC4gQ2FsbGVkIGJ5IHRoZSBidWlsdC1pbiBtZXRob2RcbiAgICAgKiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICovXG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTFJVQ2FjaGUnO1xuICAgIC8qKlxuICAgICAqIEZpbmQgYSB2YWx1ZSBmb3Igd2hpY2ggdGhlIHN1cHBsaWVkIGZuIG1ldGhvZCByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLFxuICAgICAqIHNpbWlsYXIgdG8gYEFycmF5LmZpbmQoKWAuIGZuIGlzIGNhbGxlZCBhcyBgZm4odmFsdWUsIGtleSwgY2FjaGUpYC5cbiAgICAgKi9cbiAgICBmaW5kKGZuLCBnZXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZm4odmFsdWUsIHRoaXMuI2tleUxpc3RbaV0sIHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuI2tleUxpc3RbaV0sIGdldE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbSBpbiB0aGUgY2FjaGUsIGluIG9yZGVyIGZyb20gbW9zdFxuICAgICAqIHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKlxuICAgICAqIGBmbmAgaXMgY2FsbGVkIGFzIGBmbih2YWx1ZSwga2V5LCBjYWNoZSlgLlxuICAgICAqXG4gICAgICogSWYgYHRoaXNwYCBpcyBwcm92aWRlZCwgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGB0aGlzYC1jb250ZXh0IG9mXG4gICAgICogdGhlIHByb3ZpZGVkIG9iamVjdCwgb3IgdGhlIGNhY2hlIGlmIG5vIGB0aGlzcGAgb2JqZWN0IGlzIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogRG9lcyBub3QgdXBkYXRlIGFnZSBvciByZWNlbnR5IG9mIHVzZSwgb3IgaXRlcmF0ZSBvdmVyIHN0YWxlIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmb3JFYWNoKGZuLCB0aGlzcCA9IHRoaXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXNwLCB2YWx1ZSwgdGhpcy4ja2V5TGlzdFtpXSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMge0BsaW5rIExSVUNhY2hlLmZvckVhY2h9IGJ1dCBpdGVtcyBhcmUgaXRlcmF0ZWQgb3ZlciBpblxuICAgICAqIHJldmVyc2Ugb3JkZXIuICAoaWUsIGxlc3MgcmVjZW50bHkgdXNlZCBpdGVtcyBhcmUgaXRlcmF0ZWQgb3ZlciBmaXJzdC4pXG4gICAgICovXG4gICAgcmZvckVhY2goZm4sIHRoaXNwID0gdGhpcykge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXNwLCB2YWx1ZSwgdGhpcy4ja2V5TGlzdFtpXSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIGFueSBzdGFsZSBlbnRyaWVzLiBSZXR1cm5zIHRydWUgaWYgYW55dGhpbmcgd2FzIHJlbW92ZWQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1cmdlU3RhbGUoKSB7XG4gICAgICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKHRoaXMuI2tleUxpc3RbaV0sICdleHBpcmUnKTtcbiAgICAgICAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsZXRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBleHRlbmRlZCBpbmZvIGFib3V0IGEgZ2l2ZW4gZW50cnksIHRvIGdldCBpdHMgdmFsdWUsIHNpemUsIGFuZFxuICAgICAqIFRUTCBpbmZvIHNpbXVsdGFuZW91c2x5LiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQuXG4gICAgICpcbiAgICAgKiBVbmxpa2Uge0BsaW5rIExSVUNhY2hlI2R1bXB9LCB3aGljaCBpcyBkZXNpZ25lZCB0byBiZSBwb3J0YWJsZSBhbmQgc3Vydml2ZVxuICAgICAqIHNlcmlhbGl6YXRpb24sIHRoZSBgc3RhcnRgIHZhbHVlIGlzIGFsd2F5cyB0aGUgY3VycmVudCB0aW1lc3RhbXAsIGFuZCB0aGVcbiAgICAgKiBgdHRsYCBpcyBhIGNhbGN1bGF0ZWQgcmVtYWluaW5nIHRpbWUgdG8gbGl2ZSAobmVnYXRpdmUgaWYgZXhwaXJlZCkuXG4gICAgICpcbiAgICAgKiBBbHdheXMgcmV0dXJucyBzdGFsZSB2YWx1ZXMsIGlmIHRoZWlyIGluZm8gaXMgZm91bmQgaW4gdGhlIGNhY2hlLCBzbyBiZVxuICAgICAqIHN1cmUgdG8gY2hlY2sgZm9yIGV4cGlyYXRpb25zIChpZSwgYSBuZWdhdGl2ZSB7QGxpbmsgTFJVQ2FjaGUuRW50cnkjdHRsfSlcbiAgICAgKiBpZiByZWxldmFudC5cbiAgICAgKi9cbiAgICBpbmZvKGtleSkge1xuICAgICAgICBjb25zdCBpID0gdGhpcy4ja2V5TWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoaSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgOiB2O1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0geyB2YWx1ZSB9O1xuICAgICAgICBpZiAodGhpcy4jdHRscyAmJiB0aGlzLiNzdGFydHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHR0bCA9IHRoaXMuI3R0bHNbaV07XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuI3N0YXJ0c1tpXTtcbiAgICAgICAgICAgIGlmICh0dGwgJiYgc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1haW4gPSB0dGwgLSAocGVyZi5ub3coKSAtIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICBlbnRyeS50dGwgPSByZW1haW47XG4gICAgICAgICAgICAgICAgZW50cnkuc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuI3NpemVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIFtrZXksIHtAbGluayBMUlVDYWNoZS5FbnRyeX1dIHR1cGxlcyB3aGljaCBjYW4gYmVcbiAgICAgKiBwYXNzZWQgdG8ge0BsaW5rIExSVUNhY2hlI2xvYWR9LlxuICAgICAqXG4gICAgICogVGhlIGBzdGFydGAgZmllbGRzIGFyZSBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIGEgcG9ydGFibGUgYERhdGUubm93KClgXG4gICAgICogdGltZXN0YW1wLCBldmVuIGlmIGBwZXJmb3JtYW5jZS5ub3coKWAgaXMgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogU3RhbGUgZW50cmllcyBhcmUgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSBgZHVtcGAsIGV2ZW4gaWZcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZX0gaXMgZmFsc2UuXG4gICAgICpcbiAgICAgKiBOb3RlOiB0aGlzIHJldHVybnMgYW4gYWN0dWFsIGFycmF5LCBub3QgYSBnZW5lcmF0b3IsIHNvIGl0IGNhbiBiZSBtb3JlXG4gICAgICogZWFzaWx5IHBhc3NlZCBhcm91bmQuXG4gICAgICovXG4gICAgZHVtcCgpIHtcbiAgICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy4ja2V5TGlzdFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB7IHZhbHVlIH07XG4gICAgICAgICAgICBpZiAodGhpcy4jdHRscyAmJiB0aGlzLiNzdGFydHMpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS50dGwgPSB0aGlzLiN0dGxzW2ldO1xuICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBkdW1wIHRoZSBzdGFydCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIHRpbWVzdGFtcFxuICAgICAgICAgICAgICAgIC8vIGl0J3Mgb2sgZm9yIHRoaXMgdG8gYmUgYSBiaXQgc2xvdywgaXQncyBhIHJhcmUgb3BlcmF0aW9uLlxuICAgICAgICAgICAgICAgIGNvbnN0IGFnZSA9IHBlcmYubm93KCkgLSB0aGlzLiNzdGFydHNbaV07XG4gICAgICAgICAgICAgICAgZW50cnkuc3RhcnQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLSBhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuI3NpemVzKSB7XG4gICAgICAgICAgICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuI3NpemVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJyLnVuc2hpZnQoW2tleSwgZW50cnldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGUgY2FjaGUgYW5kIGxvYWQgaW4gdGhlIGl0ZW1zIGluIGVudHJpZXMgaW4gdGhlIG9yZGVyIGxpc3RlZC5cbiAgICAgKlxuICAgICAqIFRoZSBzaGFwZSBvZiB0aGUgcmVzdWx0aW5nIGNhY2hlIG1heSBiZSBkaWZmZXJlbnQgaWYgdGhlIHNhbWUgb3B0aW9ucyBhcmVcbiAgICAgKiBub3QgdXNlZCBpbiBib3RoIGNhY2hlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgc3RhcnRgIGZpZWxkcyBhcmUgYXNzdW1lZCB0byBiZSBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIGEgcG9ydGFibGVcbiAgICAgKiBgRGF0ZS5ub3coKWAgdGltZXN0YW1wLCBldmVuIGlmIGBwZXJmb3JtYW5jZS5ub3coKWAgaXMgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIGxvYWQoYXJyKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgYXJyKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAvLyBlbnRyeS5zdGFydCBpcyBhIHBvcnRhYmxlIHRpbWVzdGFtcCwgYnV0IHdlIG1heSBiZSB1c2luZ1xuICAgICAgICAgICAgICAgIC8vIG5vZGUncyBwZXJmb3JtYW5jZS5ub3coKSwgc28gY2FsY3VsYXRlIHRoZSBvZmZzZXQsIHNvIHRoYXRcbiAgICAgICAgICAgICAgICAvLyB3ZSBnZXQgdGhlIGludGVuZGVkIHJlbWFpbmluZyBUVEwsIG5vIG1hdHRlciBob3cgbG9uZyBpdCdzXG4gICAgICAgICAgICAgICAgLy8gYmVlbiBvbiBpY2UuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gZW50cnkuc3RhcnQ7XG4gICAgICAgICAgICAgICAgZW50cnkuc3RhcnQgPSBwZXJmLm5vdygpIC0gYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBlbnRyeS52YWx1ZSwgZW50cnkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIHZhbHVlIHRvIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IGlmIGB1bmRlZmluZWRgIGlzIHNwZWNpZmllZCBhcyBhIHZhbHVlLCB0aGlzIGlzIGFuIGFsaWFzIGZvclxuICAgICAqIHtAbGluayBMUlVDYWNoZSNkZWxldGV9XG4gICAgICpcbiAgICAgKiBGaWVsZHMgb24gdGhlIHtAbGluayBMUlVDYWNoZS5TZXRPcHRpb25zfSBvcHRpb25zIHBhcmFtIHdpbGwgb3ZlcnJpZGVcbiAgICAgKiB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucyBmb3IgdGhlIHNjb3BlXG4gICAgICogb2YgdGhpcyBzaW5nbGUgYHNldCgpYCBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBJZiBgc3RhcnRgIGlzIHByb3ZpZGVkLCB0aGVuIHRoYXQgd2lsbCBzZXQgdGhlIGVmZmVjdGl2ZSBzdGFydFxuICAgICAqIHRpbWUgZm9yIHRoZSBUVEwgY2FsY3VsYXRpb24uIE5vdGUgdGhhdCB0aGlzIG11c3QgYmUgYSBwcmV2aW91c1xuICAgICAqIHZhbHVlIG9mIGBwZXJmb3JtYW5jZS5ub3coKWAgaWYgc3VwcG9ydGVkLCBvciBhIHByZXZpb3VzIHZhbHVlIG9mXG4gICAgICogYERhdGUubm93KClgIGlmIG5vdC5cbiAgICAgKlxuICAgICAqIE9wdGlvbnMgb2JqZWN0IG1heSBhbHNvIGluY2x1ZGUgYHNpemVgLCB3aGljaCB3aWxsIHByZXZlbnRcbiAgICAgKiBjYWxsaW5nIHRoZSBgc2l6ZUNhbGN1bGF0aW9uYCBmdW5jdGlvbiBhbmQganVzdCB1c2UgdGhlIHNwZWNpZmllZFxuICAgICAqIG51bWJlciBpZiBpdCBpcyBhIHBvc2l0aXZlIGludGVnZXIsIGFuZCBgbm9EaXNwb3NlT25TZXRgIHdoaWNoXG4gICAgICogd2lsbCBwcmV2ZW50IGNhbGxpbmcgYSBgZGlzcG9zZWAgZnVuY3Rpb24gaW4gdGhlIGNhc2Ugb2ZcbiAgICAgKiBvdmVyd3JpdGVzLlxuICAgICAqXG4gICAgICogSWYgdGhlIGBzaXplYCAob3IgcmV0dXJuIHZhbHVlIG9mIGBzaXplQ2FsY3VsYXRpb25gKSBmb3IgYSBnaXZlblxuICAgICAqIGVudHJ5IGlzIGdyZWF0ZXIgdGhhbiBgbWF4RW50cnlTaXplYCwgdGhlbiB0aGUgaXRlbSB3aWxsIG5vdCBiZVxuICAgICAqIGFkZGVkIHRvIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFdpbGwgdXBkYXRlIHRoZSByZWNlbmN5IG9mIHRoZSBlbnRyeS5cbiAgICAgKlxuICAgICAqIElmIHRoZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgdGhlbiB0aGlzIGlzIGFuIGFsaWFzIGZvclxuICAgICAqIGBjYWNoZS5kZWxldGUoa2V5KWAuIGB1bmRlZmluZWRgIGlzIG5ldmVyIHN0b3JlZCBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgc2V0KGssIHYsIHNldE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShrKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdHRsID0gdGhpcy50dGwsIHN0YXJ0LCBub0Rpc3Bvc2VPblNldCA9IHRoaXMubm9EaXNwb3NlT25TZXQsIHNpemVDYWxjdWxhdGlvbiA9IHRoaXMuc2l6ZUNhbGN1bGF0aW9uLCBzdGF0dXMsIH0gPSBzZXRPcHRpb25zO1xuICAgICAgICBsZXQgeyBub1VwZGF0ZVRUTCA9IHRoaXMubm9VcGRhdGVUVEwgfSA9IHNldE9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLiNyZXF1aXJlU2l6ZShrLCB2LCBzZXRPcHRpb25zLnNpemUgfHwgMCwgc2l6ZUNhbGN1bGF0aW9uKTtcbiAgICAgICAgLy8gaWYgdGhlIGl0ZW0gZG9lc24ndCBmaXQsIGRvbid0IGRvIGFueXRoaW5nXG4gICAgICAgIC8vIE5COiBtYXhFbnRyeVNpemUgc2V0IHRvIG1heFNpemUgYnkgZGVmYXVsdFxuICAgICAgICBpZiAodGhpcy5tYXhFbnRyeVNpemUgJiYgc2l6ZSA+IHRoaXMubWF4RW50cnlTaXplKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnNldCA9ICdtaXNzJztcbiAgICAgICAgICAgICAgICBzdGF0dXMubWF4RW50cnlTaXplRXhjZWVkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGF2ZSB0byBkZWxldGUsIGluIGNhc2Ugc29tZXRoaW5nIGlzIHRoZXJlIGFscmVhZHkuXG4gICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ3NldCcpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy4jc2l6ZSA9PT0gMCA/IHVuZGVmaW5lZCA6IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBhZGRpdGlvblxuICAgICAgICAgICAgaW5kZXggPSAodGhpcy4jc2l6ZSA9PT0gMFxuICAgICAgICAgICAgICAgID8gdGhpcy4jdGFpbFxuICAgICAgICAgICAgICAgIDogdGhpcy4jZnJlZS5sZW5ndGggIT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLiNmcmVlLnBvcCgpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy4jc2l6ZSA9PT0gdGhpcy4jbWF4XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuI2V2aWN0KGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLiNzaXplKTtcbiAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaW5kZXhdID0gaztcbiAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gdjtcbiAgICAgICAgICAgIHRoaXMuI2tleU1hcC5zZXQoaywgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy4jbmV4dFt0aGlzLiN0YWlsXSA9IGluZGV4O1xuICAgICAgICAgICAgdGhpcy4jcHJldltpbmRleF0gPSB0aGlzLiN0YWlsO1xuICAgICAgICAgICAgdGhpcy4jdGFpbCA9IGluZGV4O1xuICAgICAgICAgICAgdGhpcy4jc2l6ZSsrO1xuICAgICAgICAgICAgdGhpcy4jYWRkSXRlbVNpemUoaW5kZXgsIHNpemUsIHN0YXR1cyk7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQgPSAnYWRkJztcbiAgICAgICAgICAgIG5vVXBkYXRlVFRMID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzT25JbnNlcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNvbkluc2VydD8uKHYsIGssICdhZGQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZVxuICAgICAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleCk7XG4gICAgICAgICAgICBjb25zdCBvbGRWYWwgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmICh2ICE9PSBvbGRWYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRmV0Y2hNZXRob2QgJiYgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2gob2xkVmFsKSkge1xuICAgICAgICAgICAgICAgICAgICBvbGRWYWwuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdyZXBsYWNlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBfX3N0YWxlV2hpbGVGZXRjaGluZzogcyB9ID0gb2xkVmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAocyAhPT0gdW5kZWZpbmVkICYmICFub0Rpc3Bvc2VPblNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4ocywgaywgJ3NldCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFtzLCBrLCAnc2V0J10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFub0Rpc3Bvc2VPblNldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKG9sZFZhbCwgaywgJ3NldCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFtvbGRWYWwsIGssICdzZXQnXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUoaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2FkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gdjtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQgPSAncmVwbGFjZSc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkVmFsICYmIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKG9sZFZhbClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb2xkVmFsLl9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9sZFZhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuc2V0ID0gJ3VwZGF0ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzT25JbnNlcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uSW5zZXJ0Py4odiwgaywgdiA9PT0gb2xkVmFsID8gJ3VwZGF0ZScgOiAncmVwbGFjZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0dGwgIT09IDAgJiYgIXRoaXMuI3R0bHMpIHtcbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVUVExUcmFja2luZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiN0dGxzKSB7XG4gICAgICAgICAgICBpZiAoIW5vVXBkYXRlVFRMKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jc2V0SXRlbVRUTChpbmRleCwgdHRsLCBzdGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vRGlzcG9zZU9uU2V0ICYmIHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZDtcbiAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV2aWN0IHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW0sIHJldHVybmluZyBpdHMgdmFsdWUgb3JcbiAgICAgKiBgdW5kZWZpbmVkYCBpZiBjYWNoZSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBwb3AoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy4jc2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuI3ZhbExpc3RbdGhpcy4jaGVhZF07XG4gICAgICAgICAgICAgICAgdGhpcy4jZXZpY3QodHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMuI2Rpc3Bvc2VkO1xuICAgICAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXI/LiguLi50YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2V2aWN0KGZyZWUpIHtcbiAgICAgICAgY29uc3QgaGVhZCA9IHRoaXMuI2hlYWQ7XG4gICAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2hlYWRdO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtoZWFkXTtcbiAgICAgICAgaWYgKHRoaXMuI2hhc0ZldGNoTWV0aG9kICYmIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZXZpY3RlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLiNoYXNEaXNwb3NlIHx8IHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4odiwgaywgJ2V2aWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3YsIGssICdldmljdCddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZShoZWFkKTtcbiAgICAgICAgLy8gaWYgd2UgYXJlbid0IGFib3V0IHRvIHVzZSB0aGUgaW5kZXgsIHRoZW4gbnVsbCB0aGVzZSBvdXRcbiAgICAgICAgaWYgKGZyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaGVhZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2hlYWRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy4jZnJlZS5wdXNoKGhlYWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzaXplID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jdGFpbCA9IDA7XG4gICAgICAgICAgICB0aGlzLiNmcmVlLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jbmV4dFtoZWFkXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNrZXlNYXAuZGVsZXRlKGspO1xuICAgICAgICB0aGlzLiNzaXplLS07XG4gICAgICAgIHJldHVybiBoZWFkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGtleSBpcyBpbiB0aGUgY2FjaGUsIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHJlY2VuY3kgb2YgdXNlLlxuICAgICAqIFdpbGwgcmV0dXJuIGZhbHNlIGlmIHRoZSBpdGVtIGlzIHN0YWxlLCBldmVuIHRob3VnaCBpdCBpcyB0ZWNobmljYWxseVxuICAgICAqIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIENoZWNrIGlmIGEga2V5IGlzIGluIHRoZSBjYWNoZSwgd2l0aG91dCB1cGRhdGluZyB0aGUgcmVjZW5jeSBvZlxuICAgICAqIHVzZS4gQWdlIGlzIHVwZGF0ZWQgaWYge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uSGFzfSBpcyBzZXRcbiAgICAgKiB0byBgdHJ1ZWAgaW4gZWl0aGVyIHRoZSBvcHRpb25zIG9yIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFdpbGwgcmV0dXJuIGBmYWxzZWAgaWYgdGhlIGl0ZW0gaXMgc3RhbGUsIGV2ZW4gdGhvdWdoIGl0IGlzIHRlY2huaWNhbGx5IGluXG4gICAgICogdGhlIGNhY2hlLiBUaGUgZGlmZmVyZW5jZSBjYW4gYmUgZGV0ZXJtaW5lZCAoaWYgaXQgbWF0dGVycykgYnkgdXNpbmcgYVxuICAgICAqIGBzdGF0dXNgIGFyZ3VtZW50LCBhbmQgaW5zcGVjdGluZyB0aGUgYGhhc2AgZmllbGQuXG4gICAgICpcbiAgICAgKiBXaWxsIG5vdCB1cGRhdGUgaXRlbSBhZ2UgdW5sZXNzXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uSGFzfSBpcyBzZXQuXG4gICAgICovXG4gICAgaGFzKGssIGhhc09wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHVwZGF0ZUFnZU9uSGFzID0gdGhpcy51cGRhdGVBZ2VPbkhhcywgc3RhdHVzIH0gPSBoYXNPcHRpb25zO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikgJiZcbiAgICAgICAgICAgICAgICB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2lzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUFnZU9uSGFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UoaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5oYXMgPSAnaGl0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5oYXMgPSAnc3RhbGUnO1xuICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHN0YXR1cy5oYXMgPSAnbWlzcyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaWtlIHtAbGluayBMUlVDYWNoZSNnZXR9IGJ1dCBkb2Vzbid0IHVwZGF0ZSByZWNlbmN5IG9yIGRlbGV0ZSBzdGFsZVxuICAgICAqIGl0ZW1zLlxuICAgICAqXG4gICAgICogUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgaXRlbSBpcyBzdGFsZSwgdW5sZXNzXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGV9IGlzIHNldC5cbiAgICAgKi9cbiAgICBwZWVrKGssIHBlZWtPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSBwZWVrT3B0aW9ucztcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKCFhbGxvd1N0YWxlICYmIHRoaXMuI2lzU3RhbGUoaW5kZXgpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgLy8gZWl0aGVyIHN0YWxlIGFuZCBhbGxvd2VkLCBvciBmb3JjaW5nIGEgcmVmcmVzaCBvZiBub24tc3RhbGUgdmFsdWVcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHY7XG4gICAgfVxuICAgICNiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgdiA9IGluZGV4ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhYyA9IG5ldyBBQygpO1xuICAgICAgICBjb25zdCB7IHNpZ25hbCB9ID0gb3B0aW9ucztcbiAgICAgICAgLy8gd2hlbi9pZiBvdXIgQUMgc2lnbmFscywgdGhlbiBzdG9wIGxpc3RlbmluZyB0byB0aGVpcnMuXG4gICAgICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiBhYy5hYm9ydChzaWduYWwucmVhc29uKSwge1xuICAgICAgICAgICAgc2lnbmFsOiBhYy5zaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBmZXRjaE9wdHMgPSB7XG4gICAgICAgICAgICBzaWduYWw6IGFjLnNpZ25hbCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjYiA9ICh2LCB1cGRhdGVDYWNoZSA9IGZhbHNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGFib3J0ZWQgfSA9IGFjLnNpZ25hbDtcbiAgICAgICAgICAgIGNvbnN0IGlnbm9yZUFib3J0ID0gb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0ICYmIHYgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGlmIChhYm9ydGVkICYmICF1cGRhdGVDYWNoZSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEVycm9yID0gYWMuc2lnbmFsLnJlYXNvbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZUFib3J0KVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hBYm9ydElnbm9yZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFib3J0ZWQgJiYgIWlnbm9yZUFib3J0ICYmICF1cGRhdGVDYWNoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaEZhaWwoYWMuc2lnbmFsLnJlYXNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlaXRoZXIgd2UgZGlkbid0IGFib3J0LCBhbmQgYXJlIHN0aWxsIGhlcmUsIG9yIHdlIGRpZCwgYW5kIGlnbm9yZWRcbiAgICAgICAgICAgIGNvbnN0IGJmID0gcDtcbiAgICAgICAgICAgIGlmICh0aGlzLiN2YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICAgICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdmZXRjaCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMpXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChrLCB2LCBmZXRjaE9wdHMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGViID0gKGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEVycm9yID0gZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hGYWlsKGVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmV0Y2hGYWlsID0gKGVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGFib3J0ZWQgfSA9IGFjLnNpZ25hbDtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93U3RhbGVBYm9ydGVkID0gYWJvcnRlZCAmJiBvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQ7XG4gICAgICAgICAgICBjb25zdCBhbGxvd1N0YWxlID0gYWxsb3dTdGFsZUFib3J0ZWQgfHwgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IG5vRGVsZXRlID0gYWxsb3dTdGFsZSB8fCBvcHRpb25zLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGJmID0gcDtcbiAgICAgICAgICAgIGlmICh0aGlzLiN2YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFsbG93IHN0YWxlIG9uIGZldGNoIHJlamVjdGlvbnMsIHRoZW4gd2UgbmVlZCB0byBlbnN1cmUgdGhhdFxuICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFsZSB2YWx1ZSBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSB3aGVuIHRoZSBmZXRjaCBmYWlscy5cbiAgICAgICAgICAgICAgICBjb25zdCBkZWwgPSAhbm9EZWxldGUgfHwgYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoZGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnZmV0Y2gnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWFsbG93U3RhbGVBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIHJlcGxhY2UgdGhlICpwcm9taXNlKiB3aXRoIHRoZSBzdGFsZSB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgYXJlIGRvbmUgd2l0aCB0aGUgcHJvbWlzZSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSBpdCB1bnRvdWNoZWQgaWYgd2UncmUgc3RpbGwgd2FpdGluZyBmb3IgYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWJvcnRlZCBiYWNrZ3JvdW5kIGZldGNoIHRoYXQgaGFzbid0IHlldCByZXR1cm5lZC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWxsb3dTdGFsZSkge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cyAmJiBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiZi5fX3JldHVybmVkID09PSBiZikge1xuICAgICAgICAgICAgICAgIHRocm93IGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwY2FsbCA9IChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm1wID0gdGhpcy4jZmV0Y2hNZXRob2Q/LihrLCB2LCBmZXRjaE9wdHMpO1xuICAgICAgICAgICAgaWYgKGZtcCAmJiBmbXAgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgZm1wLnRoZW4odiA9PiByZXModiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdiksIHJlaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZ25vcmVkLCB3ZSBnbyB1bnRpbCB3ZSBmaW5pc2gsIHJlZ2FyZGxlc3MuXG4gICAgICAgICAgICAvLyBkZWZlciBjaGVjayB1bnRpbCB3ZSBhcmUgYWN0dWFsbHkgYWJvcnRpbmcsXG4gICAgICAgICAgICAvLyBzbyBmZXRjaE1ldGhvZCBjYW4gb3ZlcnJpZGUuXG4gICAgICAgICAgICBhYy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUZldGNoQWJvcnQgfHxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGl0IGV2ZW50dWFsbHkgcmVzb2x2ZXMsIHVwZGF0ZSB0aGUgY2FjaGUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHYgPT4gY2IodiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKVxuICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hEaXNwYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKHBjYWxsKS50aGVuKGNiLCBlYik7XG4gICAgICAgIGNvbnN0IGJmID0gT2JqZWN0LmFzc2lnbihwLCB7XG4gICAgICAgICAgICBfX2Fib3J0Q29udHJvbGxlcjogYWMsXG4gICAgICAgICAgICBfX3N0YWxlV2hpbGVGZXRjaGluZzogdixcbiAgICAgICAgICAgIF9fcmV0dXJuZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBpbnRlcm5hbCwgZG9uJ3QgZXhwb3NlIHN0YXR1cy5cbiAgICAgICAgICAgIHRoaXMuc2V0KGssIGJmLCB7IC4uLmZldGNoT3B0cy5vcHRpb25zLCBzdGF0dXM6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gYmY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJmO1xuICAgIH1cbiAgICAjaXNCYWNrZ3JvdW5kRmV0Y2gocCkge1xuICAgICAgICBpZiAoIXRoaXMuI2hhc0ZldGNoTWV0aG9kKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBiID0gcDtcbiAgICAgICAgcmV0dXJuICghIWIgJiZcbiAgICAgICAgICAgIGIgaW5zdGFuY2VvZiBQcm9taXNlICYmXG4gICAgICAgICAgICBiLmhhc093blByb3BlcnR5KCdfX3N0YWxlV2hpbGVGZXRjaGluZycpICYmXG4gICAgICAgICAgICBiLl9fYWJvcnRDb250cm9sbGVyIGluc3RhbmNlb2YgQUMpO1xuICAgIH1cbiAgICBhc3luYyBmZXRjaChrLCBmZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IFxuICAgICAgICAvLyBnZXQgb3B0aW9uc1xuICAgICAgICBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlLCB1cGRhdGVBZ2VPbkdldCA9IHRoaXMudXBkYXRlQWdlT25HZXQsIG5vRGVsZXRlT25TdGFsZUdldCA9IHRoaXMubm9EZWxldGVPblN0YWxlR2V0LCBcbiAgICAgICAgLy8gc2V0IG9wdGlvbnNcbiAgICAgICAgdHRsID0gdGhpcy50dGwsIG5vRGlzcG9zZU9uU2V0ID0gdGhpcy5ub0Rpc3Bvc2VPblNldCwgc2l6ZSA9IDAsIHNpemVDYWxjdWxhdGlvbiA9IHRoaXMuc2l6ZUNhbGN1bGF0aW9uLCBub1VwZGF0ZVRUTCA9IHRoaXMubm9VcGRhdGVUVEwsIFxuICAgICAgICAvLyBmZXRjaCBleGNsdXNpdmUgb3B0aW9uc1xuICAgICAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24gPSB0aGlzLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiwgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24gPSB0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLCBpZ25vcmVGZXRjaEFib3J0ID0gdGhpcy5pZ25vcmVGZXRjaEFib3J0LCBhbGxvd1N0YWxlT25GZXRjaEFib3J0ID0gdGhpcy5hbGxvd1N0YWxlT25GZXRjaEFib3J0LCBjb250ZXh0LCBmb3JjZVJlZnJlc2ggPSBmYWxzZSwgc3RhdHVzLCBzaWduYWwsIH0gPSBmZXRjaE9wdGlvbnM7XG4gICAgICAgIGlmICghdGhpcy4jaGFzRmV0Y2hNZXRob2QpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gJ2dldCc7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoaywge1xuICAgICAgICAgICAgICAgIGFsbG93U3RhbGUsXG4gICAgICAgICAgICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICAgICAgICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhbGxvd1N0YWxlLFxuICAgICAgICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICAgICAgICBub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICAgICAgICB0dGwsXG4gICAgICAgICAgICBub0Rpc3Bvc2VPblNldCxcbiAgICAgICAgICAgIHNpemUsXG4gICAgICAgICAgICBzaXplQ2FsY3VsYXRpb24sXG4gICAgICAgICAgICBub1VwZGF0ZVRUTCxcbiAgICAgICAgICAgIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbixcbiAgICAgICAgICAgIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxcbiAgICAgICAgICAgIGlnbm9yZUZldGNoQWJvcnQsXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH07XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdtaXNzJztcbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLiNiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIChwLl9fcmV0dXJuZWQgPSBwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluIGNhY2hlLCBtYXliZSBhbHJlYWR5IGZldGNoaW5nXG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFsZSA9IGFsbG93U3RhbGUgJiYgdi5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gJ2luZmxpZ2h0JztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhbGUgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nIDogKHYuX19yZXR1cm5lZCA9IHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgd2UgZm9yY2UgYSByZWZyZXNoLCB0aGF0IG1lYW5zIGRvIE5PVCBzZXJ2ZSB0aGUgY2FjaGVkIHZhbHVlLFxuICAgICAgICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIHJlZnJlc2hpbmcgdGhlIGNhY2hlLlxuICAgICAgICAgICAgY29uc3QgaXNTdGFsZSA9IHRoaXMuI2lzU3RhbGUoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgIWlzU3RhbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSAnaGl0JztcbiAgICAgICAgICAgICAgICB0aGlzLiNtb3ZlVG9UYWlsKGluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlQWdlT25HZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZShpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG9rLCBpdCBpcyBzdGFsZSBvciBhIGZvcmNlZCByZWZyZXNoLCBhbmQgbm90IGFscmVhZHkgZmV0Y2hpbmcuXG4gICAgICAgICAgICAvLyByZWZyZXNoIHRoZSBjYWNoZS5cbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLiNiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc3QgaGFzU3RhbGUgPSBwLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBzdGFsZVZhbCA9IGhhc1N0YWxlICYmIGFsbG93U3RhbGU7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gaXNTdGFsZSA/ICdzdGFsZScgOiAncmVmcmVzaCc7XG4gICAgICAgICAgICAgICAgaWYgKHN0YWxlVmFsICYmIGlzU3RhbGUpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdGFsZVZhbCA/IHAuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiAocC5fX3JldHVybmVkID0gcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZm9yY2VGZXRjaChrLCBmZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB2ID0gYXdhaXQgdGhpcy5mZXRjaChrLCBmZXRjaE9wdGlvbnMpO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmZXRjaCgpIHJldHVybmVkIHVuZGVmaW5lZCcpO1xuICAgICAgICByZXR1cm4gdjtcbiAgICB9XG4gICAgbWVtbyhrLCBtZW1vT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG1lbW9NZXRob2QgPSB0aGlzLiNtZW1vTWV0aG9kO1xuICAgICAgICBpZiAoIW1lbW9NZXRob2QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gbWVtb01ldGhvZCBwcm92aWRlZCB0byBjb25zdHJ1Y3RvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgY29udGV4dCwgZm9yY2VSZWZyZXNoLCAuLi5vcHRpb25zIH0gPSBtZW1vT3B0aW9ucztcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuZ2V0KGssIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIWZvcmNlUmVmcmVzaCAmJiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY29uc3QgdnYgPSBtZW1vTWV0aG9kKGssIHYsIHtcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXQoaywgdnYsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdnY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHZhbHVlIGZyb20gdGhlIGNhY2hlLiBXaWxsIHVwZGF0ZSB0aGUgcmVjZW5jeSBvZiB0aGUgY2FjaGVcbiAgICAgKiBlbnRyeSBmb3VuZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCBnZXQoKSB3aWxsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAgICAgKi9cbiAgICBnZXQoaywgZ2V0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSwgdXBkYXRlQWdlT25HZXQgPSB0aGlzLnVwZGF0ZUFnZU9uR2V0LCBub0RlbGV0ZU9uU3RhbGVHZXQgPSB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCwgc3RhdHVzLCB9ID0gZ2V0T3B0aW9ucztcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGZldGNoaW5nID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godmFsdWUpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0ID0gJ3N0YWxlJztcbiAgICAgICAgICAgICAgICAvLyBkZWxldGUgb25seSBpZiBub3QgYW4gaW4tZmxpZ2h0IGJhY2tncm91bmQgZmV0Y2hcbiAgICAgICAgICAgICAgICBpZiAoIWZldGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9EZWxldGVPblN0YWxlR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ2V4cGlyZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiYgYWxsb3dTdGFsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93U3RhbGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dTdGFsZSA/IHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5nZXQgPSAnaGl0JztcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBjdXJyZW50bHkgZmV0Y2hpbmcgaXQsIHdlIGRvbid0IGFjdHVhbGx5IGhhdmUgaXQgeWV0XG4gICAgICAgICAgICAgICAgLy8gaXQncyBub3Qgc3RhbGUsIHdoaWNoIG1lYW5zIHRoaXMgaXNuJ3QgYSBzdGFsZVdoaWxlUmVmZXRjaGluZy5cbiAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBzdGFsZSwgYW5kIGZldGNoaW5nLCBBTkQgaGFzIGEgX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSwgdGhlbiB0aGF0IG1lYW5zIHRoZSB1c2VyIGZldGNoZWQgd2l0aCB7Zm9yY2VSZWZyZXNoOnRydWV9LFxuICAgICAgICAgICAgICAgIC8vIHNvIGl0J3Mgc2FmZSB0byByZXR1cm4gdGhhdCB2YWx1ZS5cbiAgICAgICAgICAgICAgICBpZiAoZmV0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLiNtb3ZlVG9UYWlsKGluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlQWdlT25HZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZShpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHN0YXR1cy5nZXQgPSAnbWlzcyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2Nvbm5lY3QocCwgbikge1xuICAgICAgICB0aGlzLiNwcmV2W25dID0gcDtcbiAgICAgICAgdGhpcy4jbmV4dFtwXSA9IG47XG4gICAgfVxuICAgICNtb3ZlVG9UYWlsKGluZGV4KSB7XG4gICAgICAgIC8vIGlmIHRhaWwgYWxyZWFkeSwgbm90aGluZyB0byBkb1xuICAgICAgICAvLyBpZiBoZWFkLCBtb3ZlIGhlYWQgdG8gbmV4dFtpbmRleF1cbiAgICAgICAgLy8gZWxzZVxuICAgICAgICAvLyAgIG1vdmUgbmV4dFtwcmV2W2luZGV4XV0gdG8gbmV4dFtpbmRleF0gKGhlYWQgaGFzIG5vIHByZXYpXG4gICAgICAgIC8vICAgbW92ZSBwcmV2W25leHRbaW5kZXhdXSB0byBwcmV2W2luZGV4XVxuICAgICAgICAvLyBwcmV2W2luZGV4XSA9IHRhaWxcbiAgICAgICAgLy8gbmV4dFt0YWlsXSA9IGluZGV4XG4gICAgICAgIC8vIHRhaWwgPSBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09IHRoaXMuI3RhaWwpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy4jaGVhZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2hlYWQgPSB0aGlzLiNuZXh0W2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Nvbm5lY3QodGhpcy4jcHJldltpbmRleF0sIHRoaXMuI25leHRbaW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2Nvbm5lY3QodGhpcy4jdGFpbCwgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy4jdGFpbCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgYSBrZXkgb3V0IG9mIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IHdhcyBkZWxldGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZGVsZXRlKGspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RlbGV0ZShrLCAnZGVsZXRlJyk7XG4gICAgfVxuICAgICNkZWxldGUoaywgcmVhc29uKSB7XG4gICAgICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLiNzaXplICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNzaXplID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2NsZWFyKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZShpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZGVsZXRlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLiNoYXNEaXNwb3NlIHx8IHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4odiwgaywgcmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbdiwgaywgcmVhc29uXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5TWFwLmRlbGV0ZShrKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5TGlzdFtpbmRleF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuI3RhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3RhaWwgPSB0aGlzLiNwcmV2W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gdGhpcy4jaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI25leHRbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGkgPSB0aGlzLiNwcmV2W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI25leHRbcGldID0gdGhpcy4jbmV4dFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuaSA9IHRoaXMuI25leHRbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jcHJldltuaV0gPSB0aGlzLiNwcmV2W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNzaXplLS07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2ZyZWUucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZDtcbiAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoZSBjYWNoZSBlbnRpcmVseSwgdGhyb3dpbmcgYXdheSBhbGwgdmFsdWVzLlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2xlYXIoJ2RlbGV0ZScpO1xuICAgIH1cbiAgICAjY2xlYXIocmVhc29uKSB7XG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgdGhpcy4jcmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZGVsZXRlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4odiwgaywgcmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbdiwgaywgcmVhc29uXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2tleU1hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLiN2YWxMaXN0LmZpbGwodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy4ja2V5TGlzdC5maWxsKHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0aGlzLiN0dGxzICYmIHRoaXMuI3N0YXJ0cykge1xuICAgICAgICAgICAgdGhpcy4jdHRscy5maWxsKDApO1xuICAgICAgICAgICAgdGhpcy4jc3RhcnRzLmZpbGwoMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3NpemVzKSB7XG4gICAgICAgICAgICB0aGlzLiNzaXplcy5maWxsKDApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2hlYWQgPSAwO1xuICAgICAgICB0aGlzLiN0YWlsID0gMDtcbiAgICAgICAgdGhpcy4jZnJlZS5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuI3NpemUgPSAwO1xuICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMuI2Rpc3Bvc2VkO1xuICAgICAgICAgICAgbGV0IHRhc2s7XG4gICAgICAgICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXI/LiguLi50YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IHsgcG9zaXgsIHdpbjMyIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBsc3RhdFN5bmMsIHJlYWRkaXIgYXMgcmVhZGRpckNCLCByZWFkZGlyU3luYywgcmVhZGxpbmtTeW5jLCByZWFscGF0aFN5bmMgYXMgcnBzLCB9IGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIGFjdHVhbEZTIGZyb20gJ25vZGU6ZnMnO1xuY29uc3QgcmVhbHBhdGhTeW5jID0gcnBzLm5hdGl2ZTtcbi8vIFRPRE86IHRlc3QgcGVyZiBvZiBmcy9wcm9taXNlcyByZWFscGF0aCB2cyByZWFscGF0aENCLFxuLy8gc2luY2UgdGhlIHByb21pc2VzIG9uZSB1c2VzIHJlYWxwYXRoLm5hdGl2ZVxuaW1wb3J0IHsgbHN0YXQsIHJlYWRkaXIsIHJlYWRsaW5rLCByZWFscGF0aCB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgTWluaXBhc3MgfSBmcm9tICdtaW5pcGFzcyc7XG5jb25zdCBkZWZhdWx0RlMgPSB7XG4gICAgbHN0YXRTeW5jLFxuICAgIHJlYWRkaXI6IHJlYWRkaXJDQixcbiAgICByZWFkZGlyU3luYyxcbiAgICByZWFkbGlua1N5bmMsXG4gICAgcmVhbHBhdGhTeW5jLFxuICAgIHByb21pc2VzOiB7XG4gICAgICAgIGxzdGF0LFxuICAgICAgICByZWFkZGlyLFxuICAgICAgICByZWFkbGluayxcbiAgICAgICAgcmVhbHBhdGgsXG4gICAgfSxcbn07XG4vLyBpZiB0aGV5IGp1c3QgZ2F2ZSB1cyByZXF1aXJlKCdmcycpIHRoZW4gdXNlIG91ciBkZWZhdWx0XG5jb25zdCBmc0Zyb21PcHRpb24gPSAoZnNPcHRpb24pID0+ICFmc09wdGlvbiB8fCBmc09wdGlvbiA9PT0gZGVmYXVsdEZTIHx8IGZzT3B0aW9uID09PSBhY3R1YWxGUyA/XG4gICAgZGVmYXVsdEZTXG4gICAgOiB7XG4gICAgICAgIC4uLmRlZmF1bHRGUyxcbiAgICAgICAgLi4uZnNPcHRpb24sXG4gICAgICAgIHByb21pc2VzOiB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0RlMucHJvbWlzZXMsXG4gICAgICAgICAgICAuLi4oZnNPcHRpb24ucHJvbWlzZXMgfHwge30pLFxuICAgICAgICB9LFxuICAgIH07XG4vLyB0dXJuIHNvbWV0aGluZyBsaWtlIC8vPy9jOi8gaW50byBjOlxcXG5jb25zdCB1bmNEcml2ZVJlZ2V4cCA9IC9eXFxcXFxcXFxcXD9cXFxcKFthLXpdOilcXFxcPyQvaTtcbmNvbnN0IHVuY1RvRHJpdmUgPSAocm9vdFBhdGgpID0+IHJvb3RQYXRoLnJlcGxhY2UoL1xcLy9nLCAnXFxcXCcpLnJlcGxhY2UodW5jRHJpdmVSZWdleHAsICckMVxcXFwnKTtcbi8vIHdpbmRvd3MgcGF0aHMgYXJlIHNlcGFyYXRlZCBieSBlaXRoZXIgLyBvciBcXFxuY29uc3QgZWl0aGVyU2VwID0gL1tcXFxcXFwvXS87XG5jb25zdCBVTktOT1dOID0gMDsgLy8gbWF5IG5vdCBldmVuIGV4aXN0LCBmb3IgYWxsIHdlIGtub3dcbmNvbnN0IElGSUZPID0gMGIwMDAxO1xuY29uc3QgSUZDSFIgPSAwYjAwMTA7XG5jb25zdCBJRkRJUiA9IDBiMDEwMDtcbmNvbnN0IElGQkxLID0gMGIwMTEwO1xuY29uc3QgSUZSRUcgPSAwYjEwMDA7XG5jb25zdCBJRkxOSyA9IDBiMTAxMDtcbmNvbnN0IElGU09DSyA9IDBiMTEwMDtcbmNvbnN0IElGTVQgPSAwYjExMTE7XG4vLyBtYXNrIHRvIHVuc2V0IGxvdyA0IGJpdHNcbmNvbnN0IElGTVRfVU5LTk9XTiA9IH5JRk1UO1xuLy8gc2V0IGFmdGVyIHN1Y2Nlc3NmdWxseSBjYWxsaW5nIHJlYWRkaXIoKSBhbmQgZ2V0dGluZyBlbnRyaWVzLlxuY29uc3QgUkVBRERJUl9DQUxMRUQgPSAwYjAwMDBfMDAwMV8wMDAwO1xuLy8gc2V0IGFmdGVyIGEgc3VjY2Vzc2Z1bCBsc3RhdCgpXG5jb25zdCBMU1RBVF9DQUxMRUQgPSAwYjAwMDBfMDAxMF8wMDAwO1xuLy8gc2V0IGlmIGFuIGVudHJ5IChvciBvbmUgb2YgaXRzIHBhcmVudHMpIGlzIGRlZmluaXRlbHkgbm90IGEgZGlyXG5jb25zdCBFTk9URElSID0gMGIwMDAwXzAxMDBfMDAwMDtcbi8vIHNldCBpZiBhbiBlbnRyeSAob3Igb25lIG9mIGl0cyBwYXJlbnRzKSBkb2VzIG5vdCBleGlzdFxuLy8gKGNhbiBhbHNvIGJlIHNldCBvbiBsc3RhdCBlcnJvcnMgbGlrZSBFQUNDRVMgb3IgRU5BTUVUT09MT05HKVxuY29uc3QgRU5PRU5UID0gMGIwMDAwXzEwMDBfMDAwMDtcbi8vIGNhbm5vdCBoYXZlIGNoaWxkIGVudHJpZXMgLS0gYWxzbyB2ZXJpZnkgJklGTVQgaXMgZWl0aGVyIElGRElSIG9yIElGTE5LXG4vLyBzZXQgaWYgd2UgZmFpbCB0byByZWFkbGlua1xuY29uc3QgRU5PUkVBRExJTksgPSAwYjAwMDFfMDAwMF8wMDAwO1xuLy8gc2V0IGlmIHdlIGtub3cgcmVhbHBhdGgoKSB3aWxsIGZhaWxcbmNvbnN0IEVOT1JFQUxQQVRIID0gMGIwMDEwXzAwMDBfMDAwMDtcbmNvbnN0IEVOT0NISUxEID0gRU5PVERJUiB8IEVOT0VOVCB8IEVOT1JFQUxQQVRIO1xuY29uc3QgVFlQRU1BU0sgPSAwYjAwMTFfMTExMV8xMTExO1xuY29uc3QgZW50VG9UeXBlID0gKHMpID0+IHMuaXNGaWxlKCkgPyBJRlJFR1xuICAgIDogcy5pc0RpcmVjdG9yeSgpID8gSUZESVJcbiAgICAgICAgOiBzLmlzU3ltYm9saWNMaW5rKCkgPyBJRkxOS1xuICAgICAgICAgICAgOiBzLmlzQ2hhcmFjdGVyRGV2aWNlKCkgPyBJRkNIUlxuICAgICAgICAgICAgICAgIDogcy5pc0Jsb2NrRGV2aWNlKCkgPyBJRkJMS1xuICAgICAgICAgICAgICAgICAgICA6IHMuaXNTb2NrZXQoKSA/IElGU09DS1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBzLmlzRklGTygpID8gSUZJRk9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFVOS05PV047XG4vLyBub3JtYWxpemUgdW5pY29kZSBwYXRoIG5hbWVzXG5jb25zdCBub3JtYWxpemVDYWNoZSA9IG5ldyBNYXAoKTtcbmNvbnN0IG5vcm1hbGl6ZSA9IChzKSA9PiB7XG4gICAgY29uc3QgYyA9IG5vcm1hbGl6ZUNhY2hlLmdldChzKTtcbiAgICBpZiAoYylcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgY29uc3QgbiA9IHMubm9ybWFsaXplKCdORktEJyk7XG4gICAgbm9ybWFsaXplQ2FjaGUuc2V0KHMsIG4pO1xuICAgIHJldHVybiBuO1xufTtcbmNvbnN0IG5vcm1hbGl6ZU5vY2FzZUNhY2hlID0gbmV3IE1hcCgpO1xuY29uc3Qgbm9ybWFsaXplTm9jYXNlID0gKHMpID0+IHtcbiAgICBjb25zdCBjID0gbm9ybWFsaXplTm9jYXNlQ2FjaGUuZ2V0KHMpO1xuICAgIGlmIChjKVxuICAgICAgICByZXR1cm4gYztcbiAgICBjb25zdCBuID0gbm9ybWFsaXplKHMudG9Mb3dlckNhc2UoKSk7XG4gICAgbm9ybWFsaXplTm9jYXNlQ2FjaGUuc2V0KHMsIG4pO1xuICAgIHJldHVybiBuO1xufTtcbi8qKlxuICogQW4gTFJVQ2FjaGUgZm9yIHN0b3JpbmcgcmVzb2x2ZWQgcGF0aCBzdHJpbmdzIG9yIFBhdGggb2JqZWN0cy5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgUmVzb2x2ZUNhY2hlIGV4dGVuZHMgTFJVQ2FjaGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcih7IG1heDogMjU2IH0pO1xuICAgIH1cbn1cbi8vIEluIG9yZGVyIHRvIHByZXZlbnQgYmxvd2luZyBvdXQgdGhlIGpzIGhlYXAgYnkgYWxsb2NhdGluZyBodW5kcmVkcyBvZlxuLy8gdGhvdXNhbmRzIG9mIFBhdGggZW50cmllcyB3aGVuIHdhbGtpbmcgZXh0cmVtZWx5IGxhcmdlIHRyZWVzLCB0aGUgXCJjaGlsZHJlblwiXG4vLyBpbiB0aGlzIHRyZWUgYXJlIHJlcHJlc2VudGVkIGJ5IHN0b3JpbmcgYW4gYXJyYXkgb2YgUGF0aCBlbnRyaWVzIGluIGFuXG4vLyBMUlVDYWNoZSwgaW5kZXhlZCBieSB0aGUgcGFyZW50LiAgQXQgYW55IHRpbWUsIFBhdGguY2hpbGRyZW4oKSBtYXkgcmV0dXJuIGFuXG4vLyBlbXB0eSBhcnJheSwgaW5kaWNhdGluZyB0aGF0IGl0IGRvZXNuJ3Qga25vdyBhYm91dCBhbnkgb2YgaXRzIGNoaWxkcmVuLCBhbmRcbi8vIHRodXMgaGFzIHRvIHJlYnVpbGQgdGhhdCBjYWNoZS4gIFRoaXMgaXMgZmluZSwgaXQganVzdCBtZWFucyB0aGF0IHdlIGRvbid0XG4vLyBiZW5lZml0IGFzIG11Y2ggZnJvbSBoYXZpbmcgdGhlIGNhY2hlZCBlbnRyaWVzLCBidXQgaHVnZSBkaXJlY3Rvcnkgd2Fsa3Ncbi8vIGRvbid0IGJsb3cgb3V0IHRoZSBzdGFjaywgYW5kIHNtYWxsZXIgb25lcyBhcmUgc3RpbGwgYXMgZmFzdCBhcyBwb3NzaWJsZS5cbi8vXG4vL0l0IGRvZXMgaW1wb3NlIHNvbWUgY29tcGxleGl0eSB3aGVuIGJ1aWxkaW5nIHVwIHRoZSByZWFkZGlyIGRhdGEsIGJlY2F1c2Ugd2Vcbi8vbmVlZCB0byBwYXNzIGEgcmVmZXJlbmNlIHRvIHRoZSBjaGlsZHJlbiBhcnJheSB0aGF0IHdlIHN0YXJ0ZWQgd2l0aC5cbi8qKlxuICogYW4gTFJVQ2FjaGUgZm9yIHN0b3JpbmcgY2hpbGQgZW50cmllcy5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2hpbGRyZW5DYWNoZSBleHRlbmRzIExSVUNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcihtYXhTaXplID0gMTYgKiAxMDI0KSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIG1heFNpemUsXG4gICAgICAgICAgICAvLyBwYXJlbnQgKyBjaGlsZHJlblxuICAgICAgICAgICAgc2l6ZUNhbGN1bGF0aW9uOiBhID0+IGEubGVuZ3RoICsgMSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuY29uc3Qgc2V0QXNDd2QgPSBTeW1ib2woJ1BhdGhTY3Vycnkgc2V0QXNDd2QnKTtcbi8qKlxuICogUGF0aCBvYmplY3RzIGFyZSBzb3J0IG9mIGxpa2UgYSBzdXBlci1wb3dlcmVkXG4gKiB7QGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2RvY3MvbGF0ZXN0L2FwaS9mcy5odG1sI2NsYXNzLWZzZGlyZW50IGZzLkRpcmVudH1cbiAqXG4gKiBFYWNoIG9uZSByZXByZXNlbnRzIGEgc2luZ2xlIGZpbGVzeXN0ZW0gZW50cnkgb24gZGlzaywgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAqIGV4aXN0LiBJdCBpbmNsdWRlcyBtZXRob2RzIGZvciByZWFkaW5nIHZhcmlvdXMgdHlwZXMgb2YgaW5mb3JtYXRpb24gdmlhXG4gKiBsc3RhdCwgcmVhZGxpbmssIGFuZCByZWFkZGlyLCBhbmQgY2FjaGVzIGFsbCBpbmZvcm1hdGlvbiB0byB0aGUgZ3JlYXRlc3RcbiAqIGRlZ3JlZSBwb3NzaWJsZS5cbiAqXG4gKiBOb3RlIHRoYXQgZnMgb3BlcmF0aW9ucyB0aGF0IHdvdWxkIG5vcm1hbGx5IHRocm93IHdpbGwgaW5zdGVhZCByZXR1cm4gYW5cbiAqIFwiZW1wdHlcIiB2YWx1ZS4gVGhpcyBpcyBpbiBvcmRlciB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBvdmVyaGVhZCBmcm9tIGVycm9yXG4gKiBzdGFjayB0cmFjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoQmFzZSB7XG4gICAgLyoqXG4gICAgICogdGhlIGJhc2VuYW1lIG9mIHRoaXMgcGF0aFxuICAgICAqXG4gICAgICogKipJbXBvcnRhbnQqKjogKmFsd2F5cyogdGVzdCB0aGUgcGF0aCBuYW1lIGFnYWluc3QgYW55IHRlc3Qgc3RyaW5nXG4gICAgICogdXNpbmd0aGUge0BsaW5rIGlzTmFtZWR9IG1ldGhvZCwgYW5kIG5vdCBieSBkaXJlY3RseSBjb21wYXJpbmcgdGhpc1xuICAgICAqIHN0cmluZy4gT3RoZXJ3aXNlLCB1bmljb2RlIHBhdGggc3RyaW5ncyB0aGF0IHRoZSBzeXN0ZW0gc2VlcyBhcyBpZGVudGljYWxcbiAgICAgKiB3aWxsIG5vdCBiZSBwcm9wZXJseSB0cmVhdGVkIGFzIHRoZSBzYW1lIHBhdGgsIGxlYWRpbmcgdG8gaW5jb3JyZWN0XG4gICAgICogYmVoYXZpb3IgYW5kIHBvc3NpYmxlIHNlY3VyaXR5IGlzc3Vlcy5cbiAgICAgKi9cbiAgICBuYW1lO1xuICAgIC8qKlxuICAgICAqIHRoZSBQYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggcm9vdC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHJvb3Q7XG4gICAgLyoqXG4gICAgICogQWxsIHJvb3RzIGZvdW5kIHdpdGhpbiB0aGUgY3VycmVudCBQYXRoU2N1cnJ5IGZhbWlseVxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcm9vdHM7XG4gICAgLyoqXG4gICAgICogYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBwYXRoLCBvciB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2Ygcm9vdCBlbnRyaWVzXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwYXJlbnQ7XG4gICAgLyoqXG4gICAgICogYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcGF0aHMgYXJlIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmVseVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIG5vY2FzZTtcbiAgICAvKipcbiAgICAgKiBib29sZWFuIGluZGljYXRpbmcgdGhhdCB0aGlzIHBhdGggaXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnlcbiAgICAgKiBvZiB0aGUgUGF0aFNjdXJyeSBjb2xsZWN0aW9uIHRoYXQgY29udGFpbnMgaXQuXG4gICAgICovXG4gICAgaXNDV0QgPSBmYWxzZTtcbiAgICAvLyBwb3RlbnRpYWwgZGVmYXVsdCBmcyBvdmVycmlkZVxuICAgICNmcztcbiAgICAvLyBTdGF0cyBmaWVsZHNcbiAgICAjZGV2O1xuICAgIGdldCBkZXYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZXY7XG4gICAgfVxuICAgICNtb2RlO1xuICAgIGdldCBtb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbW9kZTtcbiAgICB9XG4gICAgI25saW5rO1xuICAgIGdldCBubGluaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25saW5rO1xuICAgIH1cbiAgICAjdWlkO1xuICAgIGdldCB1aWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN1aWQ7XG4gICAgfVxuICAgICNnaWQ7XG4gICAgZ2V0IGdpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2dpZDtcbiAgICB9XG4gICAgI3JkZXY7XG4gICAgZ2V0IHJkZXYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZGV2O1xuICAgIH1cbiAgICAjYmxrc2l6ZTtcbiAgICBnZXQgYmxrc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Jsa3NpemU7XG4gICAgfVxuICAgICNpbm87XG4gICAgZ2V0IGlubygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lubztcbiAgICB9XG4gICAgI3NpemU7XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzaXplO1xuICAgIH1cbiAgICAjYmxvY2tzO1xuICAgIGdldCBibG9ja3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNibG9ja3M7XG4gICAgfVxuICAgICNhdGltZU1zO1xuICAgIGdldCBhdGltZU1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXRpbWVNcztcbiAgICB9XG4gICAgI210aW1lTXM7XG4gICAgZ2V0IG10aW1lTXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtdGltZU1zO1xuICAgIH1cbiAgICAjY3RpbWVNcztcbiAgICBnZXQgY3RpbWVNcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2N0aW1lTXM7XG4gICAgfVxuICAgICNiaXJ0aHRpbWVNcztcbiAgICBnZXQgYmlydGh0aW1lTXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNiaXJ0aHRpbWVNcztcbiAgICB9XG4gICAgI2F0aW1lO1xuICAgIGdldCBhdGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2F0aW1lO1xuICAgIH1cbiAgICAjbXRpbWU7XG4gICAgZ2V0IG10aW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbXRpbWU7XG4gICAgfVxuICAgICNjdGltZTtcbiAgICBnZXQgY3RpbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjdGltZTtcbiAgICB9XG4gICAgI2JpcnRodGltZTtcbiAgICBnZXQgYmlydGh0aW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYmlydGh0aW1lO1xuICAgIH1cbiAgICAjbWF0Y2hOYW1lO1xuICAgICNkZXB0aDtcbiAgICAjZnVsbHBhdGg7XG4gICAgI2Z1bGxwYXRoUG9zaXg7XG4gICAgI3JlbGF0aXZlO1xuICAgICNyZWxhdGl2ZVBvc2l4O1xuICAgICN0eXBlO1xuICAgICNjaGlsZHJlbjtcbiAgICAjbGlua1RhcmdldDtcbiAgICAjcmVhbHBhdGg7XG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBEaXJlbnQgY2xhc3MgYXMgb2ZcbiAgICAgKiBOb2RlIHYyMCwgd2hlcmUgRGlyZW50WydwYXJlbnRQYXRoJ10gcmVmZXJzIHRvIHRoZSBwYXRoIG9mIHRoZVxuICAgICAqIGRpcmVjdG9yeSB0aGF0IHdhcyBwYXNzZWQgdG8gcmVhZGRpci4gRm9yIHJvb3QgZW50cmllcywgaXQncyB0aGUgcGF0aFxuICAgICAqIHRvIHRoZSBlbnRyeSBpdHNlbGYuXG4gICAgICovXG4gICAgZ2V0IHBhcmVudFBhdGgoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcykuZnVsbHBhdGgoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBhbGlhcyBmb3IgRGlyZW50WydwYXJlbnRQYXRoJ10gU29tZXdoYXQgY291bnRlcmludHVpdGl2ZWx5LFxuICAgICAqIHRoaXMgcHJvcGVydHkgcmVmZXJzIHRvIHRoZSAqcGFyZW50KiBwYXRoLCBub3QgdGhlIHBhdGggb2JqZWN0IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudFBhdGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERvIG5vdCBjcmVhdGUgbmV3IFBhdGggb2JqZWN0cyBkaXJlY3RseS4gIFRoZXkgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZFxuICAgICAqIHZpYSB0aGUgUGF0aFNjdXJyeSBjbGFzcyBvciBvdGhlciBtZXRob2RzIG9uIHRoZSBQYXRoIGNsYXNzLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSwgdHlwZSA9IFVOS05PV04sIHJvb3QsIHJvb3RzLCBub2Nhc2UsIGNoaWxkcmVuLCBvcHRzKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuI21hdGNoTmFtZSA9IG5vY2FzZSA/IG5vcm1hbGl6ZU5vY2FzZShuYW1lKSA6IG5vcm1hbGl6ZShuYW1lKTtcbiAgICAgICAgdGhpcy4jdHlwZSA9IHR5cGUgJiBUWVBFTUFTSztcbiAgICAgICAgdGhpcy5ub2Nhc2UgPSBub2Nhc2U7XG4gICAgICAgIHRoaXMucm9vdHMgPSByb290cztcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCB0aGlzO1xuICAgICAgICB0aGlzLiNjaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLiNmdWxscGF0aCA9IG9wdHMuZnVsbHBhdGg7XG4gICAgICAgIHRoaXMuI3JlbGF0aXZlID0gb3B0cy5yZWxhdGl2ZTtcbiAgICAgICAgdGhpcy4jcmVsYXRpdmVQb3NpeCA9IG9wdHMucmVsYXRpdmVQb3NpeDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBvcHRzLnBhcmVudDtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLiNmcyA9IHRoaXMucGFyZW50LiNmcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2ZzID0gZnNGcm9tT3B0aW9uKG9wdHMuZnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlcHRoIG9mIHRoZSBQYXRoIG9iamVjdCBmcm9tIGl0cyByb290LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIGEgcGF0aCBhdCBgL2Zvby9iYXJgIHdvdWxkIGhhdmUgYSBkZXB0aCBvZiAyLlxuICAgICAqL1xuICAgIGRlcHRoKCkge1xuICAgICAgICBpZiAodGhpcy4jZGVwdGggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZXB0aDtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudClcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jZGVwdGggPSAwKTtcbiAgICAgICAgcmV0dXJuICh0aGlzLiNkZXB0aCA9IHRoaXMucGFyZW50LmRlcHRoKCkgKyAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY2hpbGRyZW5DYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoaWxkcmVuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIFBhdGggb2JqZWN0IHJlZmVyZW5jZWQgYnkgdGhlIHN0cmluZyBwYXRoLCByZXNvbHZlZCBmcm9tIHRoaXMgUGF0aFxuICAgICAqL1xuICAgIHJlc29sdmUocGF0aCkge1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gdGhpcy5nZXRSb290U3RyaW5nKHBhdGgpO1xuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLnN1YnN0cmluZyhyb290UGF0aC5sZW5ndGgpO1xuICAgICAgICBjb25zdCBkaXJQYXJ0cyA9IGRpci5zcGxpdCh0aGlzLnNwbGl0U2VwKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcm9vdFBhdGggP1xuICAgICAgICAgICAgdGhpcy5nZXRSb290KHJvb3RQYXRoKS4jcmVzb2x2ZVBhcnRzKGRpclBhcnRzKVxuICAgICAgICAgICAgOiB0aGlzLiNyZXNvbHZlUGFydHMoZGlyUGFydHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAjcmVzb2x2ZVBhcnRzKGRpclBhcnRzKSB7XG4gICAgICAgIGxldCBwID0gdGhpcztcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGRpclBhcnRzKSB7XG4gICAgICAgICAgICBwID0gcC5jaGlsZChwYXJ0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2FjaGVkIGNoaWxkcmVuIFBhdGggb2JqZWN0cywgaWYgc3RpbGwgYXZhaWxhYmxlLiAgSWYgdGhleVxuICAgICAqIGhhdmUgZmFsbGVuIG91dCBvZiB0aGUgY2FjaGUsIHRoZW4gcmV0dXJucyBhbiBlbXB0eSBhcnJheSwgYW5kIHJlc2V0cyB0aGVcbiAgICAgKiBSRUFERElSX0NBTExFRCBiaXQsIHNvIHRoYXQgZnV0dXJlIGNhbGxzIHRvIHJlYWRkaXIoKSB3aWxsIHJlcXVpcmUgYW4gZnNcbiAgICAgKiBsb29rdXAuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjaGlsZHJlbigpIHtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy4jY2hpbGRyZW4uZ2V0KHRoaXMpO1xuICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gT2JqZWN0LmFzc2lnbihbXSwgeyBwcm92aXNpb25hbDogMCB9KTtcbiAgICAgICAgdGhpcy4jY2hpbGRyZW4uc2V0KHRoaXMsIGNoaWxkcmVuKTtcbiAgICAgICAgdGhpcy4jdHlwZSAmPSB+UkVBRERJUl9DQUxMRUQ7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYSBwYXRoIHBvcnRpb24gYW5kIHJldHVybnMgb3IgY3JlYXRlcyB0aGUgY2hpbGQgUGF0aC5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHRoaXNgIGlmIHBhdGhQYXJ0IGlzIGAnJ2Agb3IgYCcuJ2AsIG9yIGBwYXJlbnRgIGlmIHBhdGhQYXJ0IGlzXG4gICAgICogYCcuLidgLlxuICAgICAqXG4gICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gIElmIGBwYXRoUGFydGAgY29udGFpbnMgYW55IHBhdGhcbiAgICAgKiBzZXBhcmF0b3JzLCBpdCB3aWxsIGxlYWQgdG8gdW5zYWZlIHVuZGVmaW5lZCBiZWhhdmlvci5cbiAgICAgKlxuICAgICAqIFVzZSBgUGF0aC5yZXNvbHZlKClgIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjaGlsZChwYXRoUGFydCwgb3B0cykge1xuICAgICAgICBpZiAocGF0aFBhcnQgPT09ICcnIHx8IHBhdGhQYXJ0ID09PSAnLicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoUGFydCA9PT0gJy4uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50IHx8IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmluZCB0aGUgY2hpbGRcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuKCk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5vY2FzZSA/IG5vcm1hbGl6ZU5vY2FzZShwYXRoUGFydCkgOiBub3JtYWxpemUocGF0aFBhcnQpO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChwLiNtYXRjaE5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBkaWRuJ3QgZmluZCBpdCwgY3JlYXRlIHByb3Zpc2lvbmFsIGNoaWxkLCBzaW5jZSBpdCBtaWdodCBub3RcbiAgICAgICAgLy8gYWN0dWFsbHkgZXhpc3QuICBJZiB3ZSBrbm93IHRoZSBwYXJlbnQgaXNuJ3QgYSBkaXIsIHRoZW5cbiAgICAgICAgLy8gaW4gZmFjdCBpdCBDQU4nVCBleGlzdC5cbiAgICAgICAgY29uc3QgcyA9IHRoaXMucGFyZW50ID8gdGhpcy5zZXAgOiAnJztcbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSB0aGlzLiNmdWxscGF0aCA/IHRoaXMuI2Z1bGxwYXRoICsgcyArIHBhdGhQYXJ0IDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBwY2hpbGQgPSB0aGlzLm5ld0NoaWxkKHBhdGhQYXJ0LCBVTktOT1dOLCB7XG4gICAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgICAgcGFyZW50OiB0aGlzLFxuICAgICAgICAgICAgZnVsbHBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXRoaXMuY2FuUmVhZGRpcigpKSB7XG4gICAgICAgICAgICBwY2hpbGQuI3R5cGUgfD0gRU5PRU5UO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IGhhdmUgdG8gdXBkYXRlIHByb3Zpc2lvbmFsLCBiZWNhdXNlIGlmIHdlIGhhdmUgcmVhbCBjaGlsZHJlbixcbiAgICAgICAgLy8gdGhlbiBwcm92aXNpb25hbCBpcyBzZXQgdG8gY2hpbGRyZW4ubGVuZ3RoLCBvdGhlcndpc2UgYSBsb3dlciBudW1iZXJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChwY2hpbGQpO1xuICAgICAgICByZXR1cm4gcGNoaWxkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBjd2QuIElmIGl0IGRvZXMgbm90IHNoYXJlIGFuIGFuY2VzdG9yIHdpdGhcbiAgICAgKiB0aGUgY3dkLCB0aGVuIHRoaXMgZW5kcyB1cCBiZWluZyBlcXVpdmFsZW50IHRvIHRoZSBmdWxscGF0aCgpXG4gICAgICovXG4gICAgcmVsYXRpdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ1dEKVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICBpZiAodGhpcy4jcmVsYXRpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3JlbGF0aXZlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgaWYgKCFwKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI3JlbGF0aXZlID0gdGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdiA9IHAucmVsYXRpdmUoKTtcbiAgICAgICAgcmV0dXJuIHB2ICsgKCFwdiB8fCAhcC5wYXJlbnQgPyAnJyA6IHRoaXMuc2VwKSArIG5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGN3ZCwgdXNpbmcgLyBhcyB0aGUgcGF0aCBzZXBhcmF0b3IuXG4gICAgICogSWYgaXQgZG9lcyBub3Qgc2hhcmUgYW4gYW5jZXN0b3Igd2l0aFxuICAgICAqIHRoZSBjd2QsIHRoZW4gdGhpcyBlbmRzIHVwIGJlaW5nIGVxdWl2YWxlbnQgdG8gdGhlIGZ1bGxwYXRoUG9zaXgoKVxuICAgICAqIE9uIHBvc2l4IHN5c3RlbXMsIHRoaXMgaXMgaWRlbnRpY2FsIHRvIHJlbGF0aXZlKCkuXG4gICAgICovXG4gICAgcmVsYXRpdmVQb3NpeCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VwID09PSAnLycpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZSgpO1xuICAgICAgICBpZiAodGhpcy5pc0NXRClcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgaWYgKHRoaXMuI3JlbGF0aXZlUG9zaXggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNyZWxhdGl2ZVBvc2l4O1xuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICBjb25zdCBwID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgIGlmICghcCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNyZWxhdGl2ZVBvc2l4ID0gdGhpcy5mdWxscGF0aFBvc2l4KCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB2ID0gcC5yZWxhdGl2ZVBvc2l4KCk7XG4gICAgICAgIHJldHVybiBwdiArICghcHYgfHwgIXAucGFyZW50ID8gJycgOiAnLycpICsgbmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGx5IHJlc29sdmVkIHBhdGggc3RyaW5nIGZvciB0aGlzIFBhdGggZW50cnlcbiAgICAgKi9cbiAgICBmdWxscGF0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Z1bGxwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNmdWxscGF0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICBjb25zdCBwID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgIGlmICghcCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNmdWxscGF0aCA9IHRoaXMubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHYgPSBwLmZ1bGxwYXRoKCk7XG4gICAgICAgIGNvbnN0IGZwID0gcHYgKyAoIXAucGFyZW50ID8gJycgOiB0aGlzLnNlcCkgKyBuYW1lO1xuICAgICAgICByZXR1cm4gKHRoaXMuI2Z1bGxwYXRoID0gZnApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbiBwbGF0Zm9ybXMgb3RoZXIgdGhhbiB3aW5kb3dzLCB0aGlzIGlzIGlkZW50aWNhbCB0byBmdWxscGF0aC5cbiAgICAgKlxuICAgICAqIE9uIHdpbmRvd3MsIHRoaXMgaXMgb3ZlcnJpZGRlbiB0byByZXR1cm4gdGhlIGZvcndhcmQtc2xhc2ggZm9ybSBvZiB0aGVcbiAgICAgKiBmdWxsIFVOQyBwYXRoLlxuICAgICAqL1xuICAgIGZ1bGxwYXRoUG9zaXgoKSB7XG4gICAgICAgIGlmICh0aGlzLiNmdWxscGF0aFBvc2l4ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZnVsbHBhdGhQb3NpeDtcbiAgICAgICAgaWYgKHRoaXMuc2VwID09PSAnLycpXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI2Z1bGxwYXRoUG9zaXggPSB0aGlzLmZ1bGxwYXRoKCkpO1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy5mdWxscGF0aCgpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgICAgIGlmICgvXlthLXpdOlxcLy9pLnRlc3QocCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuI2Z1bGxwYXRoUG9zaXggPSBgLy8/LyR7cH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy4jZnVsbHBhdGhQb3NpeCA9IHApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgY29uc3QgcGZwcCA9IHAuZnVsbHBhdGhQb3NpeCgpO1xuICAgICAgICBjb25zdCBmcHAgPSBwZnBwICsgKCFwZnBwIHx8ICFwLnBhcmVudCA/ICcnIDogJy8nKSArIHRoaXMubmFtZTtcbiAgICAgICAgcmV0dXJuICh0aGlzLiNmdWxscGF0aFBvc2l4ID0gZnBwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIFBhdGggb2YgYW4gdW5rbm93biB0eXBlP1xuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHdlIG1pZ2h0IGtub3cgKnNvbWV0aGluZyogYWJvdXQgaXQgaWYgdGhlcmUgaGFzIGJlZW4gYSBwcmV2aW91c1xuICAgICAqIGZpbGVzeXN0ZW0gb3BlcmF0aW9uLCBmb3IgZXhhbXBsZSB0aGF0IGl0IGRvZXMgbm90IGV4aXN0LCBvciBpcyBub3QgYVxuICAgICAqIGxpbmssIG9yIHdoZXRoZXIgaXQgaGFzIGNoaWxkIGVudHJpZXMuXG4gICAgICovXG4gICAgaXNVbmtub3duKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI3R5cGUgJiBJRk1UKSA9PT0gVU5LTk9XTjtcbiAgICB9XG4gICAgaXNUeXBlKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbYGlzJHt0eXBlfWBdKCk7XG4gICAgfVxuICAgIGdldFR5cGUoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pc1Vua25vd24oKSA/ICdVbmtub3duJ1xuICAgICAgICAgICAgOiB0aGlzLmlzRGlyZWN0b3J5KCkgPyAnRGlyZWN0b3J5J1xuICAgICAgICAgICAgICAgIDogdGhpcy5pc0ZpbGUoKSA/ICdGaWxlJ1xuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuaXNTeW1ib2xpY0xpbmsoKSA/ICdTeW1ib2xpY0xpbmsnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuaXNGSUZPKCkgPyAnRklGTydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuaXNDaGFyYWN0ZXJEZXZpY2UoKSA/ICdDaGFyYWN0ZXJEZXZpY2UnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5pc0Jsb2NrRGV2aWNlKCkgPyAnQmxvY2tEZXZpY2UnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC8qIGM4IGlnbm9yZSBzdGFydCAqLyB0aGlzLmlzU29ja2V0KCkgPyAnU29ja2V0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1Vua25vd24nKTtcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIFBhdGggYSByZWd1bGFyIGZpbGU/XG4gICAgICovXG4gICAgaXNGaWxlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI3R5cGUgJiBJRk1UKSA9PT0gSUZSRUc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBQYXRoIGEgZGlyZWN0b3J5P1xuICAgICAqL1xuICAgIGlzRGlyZWN0b3J5KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI3R5cGUgJiBJRk1UKSA9PT0gSUZESVI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBwYXRoIGEgY2hhcmFjdGVyIGRldmljZT9cbiAgICAgKi9cbiAgICBpc0NoYXJhY3RlckRldmljZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiN0eXBlICYgSUZNVCkgPT09IElGQ0hSO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgcGF0aCBhIGJsb2NrIGRldmljZT9cbiAgICAgKi9cbiAgICBpc0Jsb2NrRGV2aWNlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI3R5cGUgJiBJRk1UKSA9PT0gSUZCTEs7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBwYXRoIGEgRklGTyBwaXBlP1xuICAgICAqL1xuICAgIGlzRklGTygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiN0eXBlICYgSUZNVCkgPT09IElGSUZPO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgcGF0aCBhIHNvY2tldD9cbiAgICAgKi9cbiAgICBpc1NvY2tldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiN0eXBlICYgSUZNVCkgPT09IElGU09DSztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIHBhdGggYSBzeW1ib2xpYyBsaW5rP1xuICAgICAqL1xuICAgIGlzU3ltYm9saWNMaW5rKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI3R5cGUgJiBJRkxOSykgPT09IElGTE5LO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGVudHJ5IGlmIGl0IGhhcyBiZWVuIHN1YmplY3Qgb2YgYSBzdWNjZXNzZnVsIGxzdGF0LCBvclxuICAgICAqIHVuZGVmaW5lZCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBEb2VzIG5vdCByZWFkIHRoZSBmaWxlc3lzdGVtLCBzbyBhbiB1bmRlZmluZWQgcmVzdWx0ICpjb3VsZCogc2ltcGx5XG4gICAgICogbWVhbiB0aGF0IHdlIGhhdmVuJ3QgY2FsbGVkIGxzdGF0IG9uIGl0LlxuICAgICAqL1xuICAgIGxzdGF0Q2FjaGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHlwZSAmIExTVEFUX0NBTExFRCA/IHRoaXMgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2FjaGVkIGxpbmsgdGFyZ2V0IGlmIHRoZSBlbnRyeSBoYXMgYmVlbiB0aGUgc3ViamVjdCBvZiBhXG4gICAgICogc3VjY2Vzc2Z1bCByZWFkbGluaywgb3IgdW5kZWZpbmVkIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHJlYWQgdGhlIGZpbGVzeXN0ZW0sIHNvIGFuIHVuZGVmaW5lZCByZXN1bHQgKmNvdWxkKiBqdXN0IG1lYW4gd2VcbiAgICAgKiBkb24ndCBoYXZlIGFueSBjYWNoZWQgZGF0YS4gT25seSB1c2UgaXQgaWYgeW91IGFyZSB2ZXJ5IHN1cmUgdGhhdCBhXG4gICAgICogcmVhZGxpbmsoKSBoYXMgYmVlbiBjYWxsZWQgYXQgc29tZSBwb2ludC5cbiAgICAgKi9cbiAgICByZWFkbGlua0NhY2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xpbmtUYXJnZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWFscGF0aCB0YXJnZXQgaWYgdGhlIGVudHJ5IGhhcyBiZWVuIHRoZSBzdWJqZWN0XG4gICAgICogb2YgYSBzdWNjZXNzZnVsIHJlYWxwYXRoLCBvciB1bmRlZmluZWQgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogRG9lcyBub3QgcmVhZCB0aGUgZmlsZXN5c3RlbSwgc28gYW4gdW5kZWZpbmVkIHJlc3VsdCAqY291bGQqIGp1c3QgbWVhbiB3ZVxuICAgICAqIGRvbid0IGhhdmUgYW55IGNhY2hlZCBkYXRhLiBPbmx5IHVzZSBpdCBpZiB5b3UgYXJlIHZlcnkgc3VyZSB0aGF0IGFcbiAgICAgKiByZWFscGF0aCgpIGhhcyBiZWVuIGNhbGxlZCBhdCBzb21lIHBvaW50LlxuICAgICAqL1xuICAgIHJlYWxwYXRoQ2FjaGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVhbHBhdGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCBjaGlsZCBQYXRoIGVudHJpZXMgYXJyYXkgaWYgdGhlIGVudHJ5IGhhcyBiZWVuIHRoZVxuICAgICAqIHN1YmplY3Qgb2YgYSBzdWNjZXNzZnVsIHJlYWRkaXIoKSwgb3IgW10gb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogRG9lcyBub3QgcmVhZCB0aGUgZmlsZXN5c3RlbSwgc28gYW4gZW1wdHkgYXJyYXkgKmNvdWxkKiBqdXN0IG1lYW4gd2VcbiAgICAgKiBkb24ndCBoYXZlIGFueSBjYWNoZWQgZGF0YS4gT25seSB1c2UgaXQgaWYgeW91IGFyZSB2ZXJ5IHN1cmUgdGhhdCBhXG4gICAgICogcmVhZGRpcigpIGhhcyBiZWVuIGNhbGxlZCByZWNlbnRseSBlbm91Z2ggdG8gc3RpbGwgYmUgdmFsaWQuXG4gICAgICovXG4gICAgcmVhZGRpckNhY2hlZCgpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuKCk7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5zbGljZSgwLCBjaGlsZHJlbi5wcm92aXNpb25hbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIGl0J3Mgd29ydGggdHJ5aW5nIHRvIHJlYWRsaW5rLiAgSWUsIHdlIGRvbid0ICh5ZXQpIGhhdmVcbiAgICAgKiBhbnkgaW5kaWNhdGlvbiB0aGF0IHJlYWRsaW5rIHdpbGwgZGVmaW5pdGVseSBmYWlsLlxuICAgICAqXG4gICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgcGF0aCBpcyBrbm93biB0byBub3QgYmUgYSBzeW1saW5rLCBpZiBhIHByZXZpb3VzXG4gICAgICogcmVhZGxpbmsgZmFpbGVkLCBvciBpZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QuXG4gICAgICovXG4gICAgY2FuUmVhZGxpbmsoKSB7XG4gICAgICAgIGlmICh0aGlzLiNsaW5rVGFyZ2V0KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIGNhc2VzIHdoZXJlIGl0IGNhbm5vdCBwb3NzaWJseSBzdWNjZWVkXG4gICAgICAgIGNvbnN0IGlmbXQgPSB0aGlzLiN0eXBlICYgSUZNVDtcbiAgICAgICAgcmV0dXJuICEoKGlmbXQgIT09IFVOS05PV04gJiYgaWZtdCAhPT0gSUZMTkspIHx8XG4gICAgICAgICAgICB0aGlzLiN0eXBlICYgRU5PUkVBRExJTksgfHxcbiAgICAgICAgICAgIHRoaXMuI3R5cGUgJiBFTk9FTlQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiByZWFkZGlyIGhhcyBwcmV2aW91c2x5IGJlZW4gc3VjY2Vzc2Z1bGx5IGNhbGxlZCBvbiB0aGlzXG4gICAgICogcGF0aCwgaW5kaWNhdGluZyB0aGF0IGNhY2hlZFJlYWRkaXIoKSBpcyBsaWtlbHkgdmFsaWQuXG4gICAgICovXG4gICAgY2FsbGVkUmVhZGRpcigpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuI3R5cGUgJiBSRUFERElSX0NBTExFRCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aCBpcyBrbm93biB0byBub3QgZXhpc3QuIFRoYXQgaXMsIGEgcHJldmlvdXMgbHN0YXRcbiAgICAgKiBvciByZWFkZGlyIGZhaWxlZCB0byB2ZXJpZnkgaXRzIGV4aXN0ZW5jZSB3aGVuIHRoYXQgd291bGQgaGF2ZSBiZWVuXG4gICAgICogZXhwZWN0ZWQsIG9yIGEgcGFyZW50IGVudHJ5IHdhcyBtYXJrZWQgZWl0aGVyIGVub2VudCBvciBlbm90ZGlyLlxuICAgICAqL1xuICAgIGlzRU5PRU5UKCkge1xuICAgICAgICByZXR1cm4gISEodGhpcy4jdHlwZSAmIEVOT0VOVCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXRoIGlzIGEgbWF0Y2ggZm9yIHRoZSBnaXZlbiBwYXRoIG5hbWUuICBUaGlzIGhhbmRsZXNcbiAgICAgKiBjYXNlIHNlbnNpdGl2aXR5IGFuZCB1bmljb2RlIG5vcm1hbGl6YXRpb24uXG4gICAgICpcbiAgICAgKiBOb3RlOiBldmVuIG9uIGNhc2Utc2Vuc2l0aXZlIHN5c3RlbXMsIGl0IGlzICoqbm90Kiogc2FmZSB0byB0ZXN0IHRoZVxuICAgICAqIGVxdWFsaXR5IG9mIHRoZSBgLm5hbWVgIHByb3BlcnR5IHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gcGF0aG5hbWVcbiAgICAgKiBtYXRjaGVzLCBkdWUgdG8gdW5pY29kZSBub3JtYWxpemF0aW9uIG1pc21hdGNoZXMuXG4gICAgICpcbiAgICAgKiBBbHdheXMgdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgdGVzdGluZyB0aGUgYHBhdGgubmFtZWAgcHJvcGVydHlcbiAgICAgKiBkaXJlY3RseS5cbiAgICAgKi9cbiAgICBpc05hbWVkKG4pIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLm5vY2FzZSA/XG4gICAgICAgICAgICB0aGlzLiNtYXRjaE5hbWUgPT09IG5vcm1hbGl6ZShuKVxuICAgICAgICAgICAgOiB0aGlzLiNtYXRjaE5hbWUgPT09IG5vcm1hbGl6ZU5vY2FzZShuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBQYXRoIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YXJnZXQgb2YgYSBzeW1ib2xpYyBsaW5rLlxuICAgICAqXG4gICAgICogSWYgdGhlIFBhdGggaXMgbm90IGEgc3ltYm9saWMgbGluaywgb3IgaWYgdGhlIHJlYWRsaW5rIGNhbGwgZmFpbHMgZm9yIGFueVxuICAgICAqIHJlYXNvbiwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBSZXN1bHQgaXMgY2FjaGVkLCBhbmQgdGh1cyBtYXkgYmUgb3V0ZGF0ZWQgaWYgdGhlIGZpbGVzeXN0ZW0gaXMgbXV0YXRlZC5cbiAgICAgKi9cbiAgICBhc3luYyByZWFkbGluaygpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4jbGlua1RhcmdldDtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY2FuUmVhZGxpbmsoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgLy8gYWxyZWFkeSBjb3ZlcmVkIGJ5IHRoZSBjYW5SZWFkbGluayB0ZXN0LCBoZXJlIGZvciB0cyBncnVtcGxlc1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZWFkID0gYXdhaXQgdGhpcy4jZnMucHJvbWlzZXMucmVhZGxpbmsodGhpcy5mdWxscGF0aCgpKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtUYXJnZXQgPSAoYXdhaXQgdGhpcy5wYXJlbnQucmVhbHBhdGgoKSk/LnJlc29sdmUocmVhZCk7XG4gICAgICAgICAgICBpZiAobGlua1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy4jbGlua1RhcmdldCA9IGxpbmtUYXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcikge1xuICAgICAgICAgICAgdGhpcy4jcmVhZGxpbmtGYWlsKGVyLmNvZGUpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91cyB7QGxpbmsgUGF0aEJhc2UucmVhZGxpbmt9XG4gICAgICovXG4gICAgcmVhZGxpbmtTeW5jKCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiNsaW5rVGFyZ2V0O1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jYW5SZWFkbGluaygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAvLyBhbHJlYWR5IGNvdmVyZWQgYnkgdGhlIGNhblJlYWRsaW5rIHRlc3QsIGhlcmUgZm9yIHRzIGdydW1wbGVzXG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWQgPSB0aGlzLiNmcy5yZWFkbGlua1N5bmModGhpcy5mdWxscGF0aCgpKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtUYXJnZXQgPSB0aGlzLnBhcmVudC5yZWFscGF0aFN5bmMoKT8ucmVzb2x2ZShyZWFkKTtcbiAgICAgICAgICAgIGlmIChsaW5rVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNsaW5rVGFyZ2V0ID0gbGlua1RhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZWFkbGlua0ZhaWwoZXIuY29kZSk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgICNyZWFkZGlyU3VjY2VzcyhjaGlsZHJlbikge1xuICAgICAgICAvLyBzdWNjZWVkZWQsIG1hcmsgcmVhZGRpciBjYWxsZWQgYml0XG4gICAgICAgIHRoaXMuI3R5cGUgfD0gUkVBRERJUl9DQUxMRUQ7XG4gICAgICAgIC8vIG1hcmsgYWxsIHJlbWFpbmluZyBwcm92aXNpb25hbCBjaGlsZHJlbiBhcyBFTk9FTlRcbiAgICAgICAgZm9yIChsZXQgcCA9IGNoaWxkcmVuLnByb3Zpc2lvbmFsOyBwIDwgY2hpbGRyZW4ubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBjaGlsZHJlbltwXTtcbiAgICAgICAgICAgIGlmIChjKVxuICAgICAgICAgICAgICAgIGMuI21hcmtFTk9FTlQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjbWFya0VOT0VOVCgpIHtcbiAgICAgICAgLy8gbWFyayBhcyBVTktOT1dOIGFuZCBFTk9FTlRcbiAgICAgICAgaWYgKHRoaXMuI3R5cGUgJiBFTk9FTlQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuI3R5cGUgPSAodGhpcy4jdHlwZSB8IEVOT0VOVCkgJiBJRk1UX1VOS05PV047XG4gICAgICAgIHRoaXMuI21hcmtDaGlsZHJlbkVOT0VOVCgpO1xuICAgIH1cbiAgICAjbWFya0NoaWxkcmVuRU5PRU5UKCkge1xuICAgICAgICAvLyBhbGwgY2hpbGRyZW4gYXJlIHByb3Zpc2lvbmFsIGFuZCBkbyBub3QgZXhpc3RcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuKCk7XG4gICAgICAgIGNoaWxkcmVuLnByb3Zpc2lvbmFsID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBwLiNtYXJrRU5PRU5UKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI21hcmtFTk9SRUFMUEFUSCgpIHtcbiAgICAgICAgdGhpcy4jdHlwZSB8PSBFTk9SRUFMUEFUSDtcbiAgICAgICAgdGhpcy4jbWFya0VOT1RESVIoKTtcbiAgICB9XG4gICAgLy8gc2F2ZSB0aGUgaW5mb3JtYXRpb24gd2hlbiB3ZSBrbm93IHRoZSBlbnRyeSBpcyBub3QgYSBkaXJcbiAgICAjbWFya0VOT1RESVIoKSB7XG4gICAgICAgIC8vIGVudHJ5IGlzIG5vdCBhIGRpcmVjdG9yeSwgc28gYW55IGNoaWxkcmVuIGNhbid0IGV4aXN0LlxuICAgICAgICAvLyB0aGlzICpzaG91bGQqIGJlIGltcG9zc2libGUsIHNpbmNlIGFueSBjaGlsZHJlbiBjcmVhdGVkXG4gICAgICAgIC8vIGFmdGVyIGl0J3MgYmVlbiBtYXJrZWQgRU5PVERJUiBzaG91bGQgYmUgbWFya2VkIEVOT0VOVCxcbiAgICAgICAgLy8gc28gaXQgd29uJ3QgZXZlbiBnZXQgdG8gdGhpcyBwb2ludC5cbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICh0aGlzLiN0eXBlICYgRU5PVERJUilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgbGV0IHQgPSB0aGlzLiN0eXBlO1xuICAgICAgICAvLyB0aGlzIGNvdWxkIGhhcHBlbiBpZiB3ZSBzdGF0IGEgZGlyLCB0aGVuIGRlbGV0ZSBpdCxcbiAgICAgICAgLy8gdGhlbiB0cnkgdG8gcmVhZCBpdCBvciBvbmUgb2YgaXRzIGNoaWxkcmVuLlxuICAgICAgICBpZiAoKHQgJiBJRk1UKSA9PT0gSUZESVIpXG4gICAgICAgICAgICB0ICY9IElGTVRfVU5LTk9XTjtcbiAgICAgICAgdGhpcy4jdHlwZSA9IHQgfCBFTk9URElSO1xuICAgICAgICB0aGlzLiNtYXJrQ2hpbGRyZW5FTk9FTlQoKTtcbiAgICB9XG4gICAgI3JlYWRkaXJGYWlsKGNvZGUgPSAnJykge1xuICAgICAgICAvLyBtYXJrRU5PVERJUiBhbmQgbWFya0VOT0VOVCBhbHNvIHNldCBwcm92aXNpb25hbD0wXG4gICAgICAgIGlmIChjb2RlID09PSAnRU5PVERJUicgfHwgY29kZSA9PT0gJ0VQRVJNJykge1xuICAgICAgICAgICAgdGhpcy4jbWFya0VOT1RESVIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgdGhpcy4jbWFya0VOT0VOVCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbigpLnByb3Zpc2lvbmFsID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjbHN0YXRGYWlsKGNvZGUgPSAnJykge1xuICAgICAgICAvLyBXaW5kb3dzIGp1c3QgcmFpc2VzIEVOT0VOVCBpbiB0aGlzIGNhc2UsIGRpc2FibGUgZm9yIHdpbiBDSVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKGNvZGUgPT09ICdFTk9URElSJykge1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBrbm93IGl0IGhhcyBhIHBhcmVudCBieSB0aGlzIHBvaW50XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICBwLiNtYXJrRU5PVERJUigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgdGhpcy4jbWFya0VOT0VOVCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNyZWFkbGlua0ZhaWwoY29kZSA9ICcnKSB7XG4gICAgICAgIGxldCB0ZXIgPSB0aGlzLiN0eXBlO1xuICAgICAgICB0ZXIgfD0gRU5PUkVBRExJTks7XG4gICAgICAgIGlmIChjb2RlID09PSAnRU5PRU5UJylcbiAgICAgICAgICAgIHRlciB8PSBFTk9FTlQ7XG4gICAgICAgIC8vIHdpbmRvd3MgZ2V0cyBhIHdlaXJkIGVycm9yIHdoZW4geW91IHRyeSB0byByZWFkbGluayBhIGZpbGVcbiAgICAgICAgaWYgKGNvZGUgPT09ICdFSU5WQUwnIHx8IGNvZGUgPT09ICdVTktOT1dOJykge1xuICAgICAgICAgICAgLy8gZXhpc3RzLCBidXQgbm90IGEgc3ltbGluaywgd2UgZG9uJ3Qga25vdyBXSEFUIGl0IGlzLCBzbyByZW1vdmVcbiAgICAgICAgICAgIC8vIGFsbCBJRk1UIGJpdHMuXG4gICAgICAgICAgICB0ZXIgJj0gSUZNVF9VTktOT1dOO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0ZXI7XG4gICAgICAgIC8vIHdpbmRvd3MganVzdCBnZXRzIEVOT0VOVCBpbiB0aGlzIGNhc2UuICBXZSBkbyBjb3ZlciB0aGUgY2FzZSxcbiAgICAgICAgLy8ganVzdCBkaXNhYmxlZCBiZWNhdXNlIGl0J3MgaW1wb3NzaWJsZSBvbiBXaW5kb3dzIENJXG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAoY29kZSA9PT0gJ0VOT1RESVInICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudC4jbWFya0VOT1RESVIoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgICAjcmVhZGRpckFkZENoaWxkKGUsIGMpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiNyZWFkZGlyTWF5YmVQcm9tb3RlQ2hpbGQoZSwgYykgfHxcbiAgICAgICAgICAgIHRoaXMuI3JlYWRkaXJBZGROZXdDaGlsZChlLCBjKSk7XG4gICAgfVxuICAgICNyZWFkZGlyQWRkTmV3Q2hpbGQoZSwgYykge1xuICAgICAgICAvLyBhbGxvYyBuZXcgZW50cnkgYXQgaGVhZCwgc28gaXQncyBuZXZlciBwcm92aXNpb25hbFxuICAgICAgICBjb25zdCB0eXBlID0gZW50VG9UeXBlKGUpO1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMubmV3Q2hpbGQoZS5uYW1lLCB0eXBlLCB7IHBhcmVudDogdGhpcyB9KTtcbiAgICAgICAgY29uc3QgaWZtdCA9IGNoaWxkLiN0eXBlICYgSUZNVDtcbiAgICAgICAgaWYgKGlmbXQgIT09IElGRElSICYmIGlmbXQgIT09IElGTE5LICYmIGlmbXQgIT09IFVOS05PV04pIHtcbiAgICAgICAgICAgIGNoaWxkLiN0eXBlIHw9IEVOT1RESVI7XG4gICAgICAgIH1cbiAgICAgICAgYy51bnNoaWZ0KGNoaWxkKTtcbiAgICAgICAgYy5wcm92aXNpb25hbCsrO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfVxuICAgICNyZWFkZGlyTWF5YmVQcm9tb3RlQ2hpbGQoZSwgYykge1xuICAgICAgICBmb3IgKGxldCBwID0gYy5wcm92aXNpb25hbDsgcCA8IGMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBjaGlsZCA9IGNbcF07XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5ub2Nhc2UgPyBub3JtYWxpemVOb2Nhc2UoZS5uYW1lKSA6IG5vcm1hbGl6ZShlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKG5hbWUgIT09IHBjaGlsZC4jbWF0Y2hOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jcmVhZGRpclByb21vdGVDaGlsZChlLCBwY2hpbGQsIHAsIGMpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNyZWFkZGlyUHJvbW90ZUNoaWxkKGUsIHAsIGluZGV4LCBjKSB7XG4gICAgICAgIGNvbnN0IHYgPSBwLm5hbWU7XG4gICAgICAgIC8vIHJldGFpbiBhbnkgb3RoZXIgZmxhZ3MsIGJ1dCBzZXQgaWZtdCBmcm9tIGRpcmVudFxuICAgICAgICBwLiN0eXBlID0gKHAuI3R5cGUgJiBJRk1UX1VOS05PV04pIHwgZW50VG9UeXBlKGUpO1xuICAgICAgICAvLyBjYXNlIHNlbnNpdGl2aXR5IGZpeGluZyB3aGVuIHdlIGxlYXJuIHRoZSB0cnVlIG5hbWUuXG4gICAgICAgIGlmICh2ICE9PSBlLm5hbWUpXG4gICAgICAgICAgICBwLm5hbWUgPSBlLm5hbWU7XG4gICAgICAgIC8vIGp1c3QgYWR2YW5jZSBwcm92aXNpb25hbCBpbmRleCAocG90ZW50aWFsbHkgb2ZmIHRoZSBsaXN0KSxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgdG8gc3BsaWNlL3BvcCBpdCBvdXQgYW5kIHJlLWluc2VydCBhdCBoZWFkXG4gICAgICAgIGlmIChpbmRleCAhPT0gYy5wcm92aXNpb25hbCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBjLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgYy5wb3AoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICBjLnVuc2hpZnQocCk7XG4gICAgICAgIH1cbiAgICAgICAgYy5wcm92aXNpb25hbCsrO1xuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBsc3RhdCgpIG9uIHRoaXMgUGF0aCwgYW5kIHVwZGF0ZSBhbGwga25vd24gaW5mb3JtYXRpb24gdGhhdCBjYW4gYmVcbiAgICAgKiBkZXRlcm1pbmVkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVubGlrZSBgZnMubHN0YXQoKWAsIHRoZSByZXR1cm5lZCB2YWx1ZSBkb2VzIG5vdCBjb250YWluIHNvbWVcbiAgICAgKiBpbmZvcm1hdGlvbiwgc3VjaCBhcyBgbW9kZWAsIGBkZXZgLCBgbmxpbmtgLCBhbmQgYGlub2AuICBJZiB0aGF0XG4gICAgICogaW5mb3JtYXRpb24gaXMgcmVxdWlyZWQsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgZnMubHN0YXRgIHlvdXJzZWxmLlxuICAgICAqXG4gICAgICogSWYgdGhlIFBhdGggcmVmZXJzIHRvIGEgbm9uZXhpc3RlbnQgZmlsZSwgb3IgaWYgdGhlIGxzdGF0IGNhbGwgZmFpbHMgZm9yXG4gICAgICogYW55IHJlYXNvbiwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UgdGhlIHVwZGF0ZWQgUGF0aCBvYmplY3QgaXNcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIFJlc3VsdHMgYXJlIGNhY2hlZCwgYW5kIHRodXMgbWF5IGJlIG91dCBvZiBkYXRlIGlmIHRoZSBmaWxlc3lzdGVtIGlzXG4gICAgICogbXV0YXRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBsc3RhdCgpIHtcbiAgICAgICAgaWYgKCh0aGlzLiN0eXBlICYgRU5PRU5UKSA9PT0gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNhcHBseVN0YXQoYXdhaXQgdGhpcy4jZnMucHJvbWlzZXMubHN0YXQodGhpcy5mdWxscGF0aCgpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNsc3RhdEZhaWwoZXIuY29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogc3luY2hyb25vdXMge0BsaW5rIFBhdGhCYXNlLmxzdGF0fVxuICAgICAqL1xuICAgIGxzdGF0U3luYygpIHtcbiAgICAgICAgaWYgKCh0aGlzLiN0eXBlICYgRU5PRU5UKSA9PT0gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNhcHBseVN0YXQodGhpcy4jZnMubHN0YXRTeW5jKHRoaXMuZnVsbHBhdGgoKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jbHN0YXRGYWlsKGVyLmNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICNhcHBseVN0YXQoc3QpIHtcbiAgICAgICAgY29uc3QgeyBhdGltZSwgYXRpbWVNcywgYmlydGh0aW1lLCBiaXJ0aHRpbWVNcywgYmxrc2l6ZSwgYmxvY2tzLCBjdGltZSwgY3RpbWVNcywgZGV2LCBnaWQsIGlubywgbW9kZSwgbXRpbWUsIG10aW1lTXMsIG5saW5rLCByZGV2LCBzaXplLCB1aWQsIH0gPSBzdDtcbiAgICAgICAgdGhpcy4jYXRpbWUgPSBhdGltZTtcbiAgICAgICAgdGhpcy4jYXRpbWVNcyA9IGF0aW1lTXM7XG4gICAgICAgIHRoaXMuI2JpcnRodGltZSA9IGJpcnRodGltZTtcbiAgICAgICAgdGhpcy4jYmlydGh0aW1lTXMgPSBiaXJ0aHRpbWVNcztcbiAgICAgICAgdGhpcy4jYmxrc2l6ZSA9IGJsa3NpemU7XG4gICAgICAgIHRoaXMuI2Jsb2NrcyA9IGJsb2NrcztcbiAgICAgICAgdGhpcy4jY3RpbWUgPSBjdGltZTtcbiAgICAgICAgdGhpcy4jY3RpbWVNcyA9IGN0aW1lTXM7XG4gICAgICAgIHRoaXMuI2RldiA9IGRldjtcbiAgICAgICAgdGhpcy4jZ2lkID0gZ2lkO1xuICAgICAgICB0aGlzLiNpbm8gPSBpbm87XG4gICAgICAgIHRoaXMuI21vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLiNtdGltZSA9IG10aW1lO1xuICAgICAgICB0aGlzLiNtdGltZU1zID0gbXRpbWVNcztcbiAgICAgICAgdGhpcy4jbmxpbmsgPSBubGluaztcbiAgICAgICAgdGhpcy4jcmRldiA9IHJkZXY7XG4gICAgICAgIHRoaXMuI3NpemUgPSBzaXplO1xuICAgICAgICB0aGlzLiN1aWQgPSB1aWQ7XG4gICAgICAgIGNvbnN0IGlmbXQgPSBlbnRUb1R5cGUoc3QpO1xuICAgICAgICAvLyByZXRhaW4gYW55IG90aGVyIGZsYWdzLCBidXQgc2V0IHRoZSBpZm10XG4gICAgICAgIHRoaXMuI3R5cGUgPSAodGhpcy4jdHlwZSAmIElGTVRfVU5LTk9XTikgfCBpZm10IHwgTFNUQVRfQ0FMTEVEO1xuICAgICAgICBpZiAoaWZtdCAhPT0gVU5LTk9XTiAmJiBpZm10ICE9PSBJRkRJUiAmJiBpZm10ICE9PSBJRkxOSykge1xuICAgICAgICAgICAgdGhpcy4jdHlwZSB8PSBFTk9URElSO1xuICAgICAgICB9XG4gICAgfVxuICAgICNvblJlYWRkaXJDQiA9IFtdO1xuICAgICNyZWFkZGlyQ0JJbkZsaWdodCA9IGZhbHNlO1xuICAgICNjYWxsT25SZWFkZGlyQ0IoY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy4jcmVhZGRpckNCSW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY2JzID0gdGhpcy4jb25SZWFkZGlyQ0Iuc2xpY2UoKTtcbiAgICAgICAgdGhpcy4jb25SZWFkZGlyQ0IubGVuZ3RoID0gMDtcbiAgICAgICAgY2JzLmZvckVhY2goY2IgPT4gY2IobnVsbCwgY2hpbGRyZW4pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgbm9kZS1zdHlsZSBjYWxsYmFjayBpbnRlcmZhY2UgdG8gZ2V0IGxpc3Qgb2YgZGlyZWN0b3J5IGVudHJpZXMuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgUGF0aCBjYW5ub3Qgb3IgZG9lcyBub3QgY29udGFpbiBhbnkgY2hpbGRyZW4sIHRoZW4gYW4gZW1wdHkgYXJyYXlcbiAgICAgKiBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIFJlc3VsdHMgYXJlIGNhY2hlZCwgYW5kIHRodXMgbWF5IGJlIG91dCBvZiBkYXRlIGlmIHRoZSBmaWxlc3lzdGVtIGlzXG4gICAgICogbXV0YXRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYiBUaGUgY2FsbGJhY2sgY2FsbGVkIHdpdGggKGVyLCBlbnRyaWVzKS4gIE5vdGUgdGhhdCB0aGUgYGVyYFxuICAgICAqIHBhcmFtIGlzIHNvbWV3aGF0IGV4dHJhbmVvdXMsIGFzIGFsbCByZWFkZGlyKCkgZXJyb3JzIGFyZSBoYW5kbGVkIGFuZFxuICAgICAqIHNpbXBseSByZXN1bHQgaW4gYW4gZW1wdHkgc2V0IG9mIGVudHJpZXMgYmVpbmcgcmV0dXJuZWQuXG4gICAgICogQHBhcmFtIGFsbG93WmFsZ28gQm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgaW1tZWRpYXRlbHkga25vd24gcmVzdWx0cyBzaG91bGRcbiAgICAgKiAqbm90KiBiZSBkZWZlcnJlZCB3aXRoIGBxdWV1ZU1pY3JvdGFza2AuIERlZmF1bHRzIHRvIGBmYWxzZWAuIFJlbGVhc2VcbiAgICAgKiB6YWxnbyBhdCB5b3VyIHBlcmlsLCB0aGUgZGFyayBwb255IGxvcmQgaXMgZGV2aW91cyBhbmQgdW5mb3JnaXZpbmcuXG4gICAgICovXG4gICAgcmVhZGRpckNCKGNiLCBhbGxvd1phbGdvID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgaWYgKGFsbG93WmFsZ28pXG4gICAgICAgICAgICAgICAgY2IobnVsbCwgW10pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGNiKG51bGwsIFtdKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuKCk7XG4gICAgICAgIGlmICh0aGlzLmNhbGxlZFJlYWRkaXIoKSkge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNoaWxkcmVuLnNsaWNlKDAsIGNoaWxkcmVuLnByb3Zpc2lvbmFsKTtcbiAgICAgICAgICAgIGlmIChhbGxvd1phbGdvKVxuICAgICAgICAgICAgICAgIGNiKG51bGwsIGMpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGNiKG51bGwsIGMpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHphbGdvIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIHRoaXMuI29uUmVhZGRpckNCLnB1c2goY2IpO1xuICAgICAgICBpZiAodGhpcy4jcmVhZGRpckNCSW5GbGlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNyZWFkZGlyQ0JJbkZsaWdodCA9IHRydWU7XG4gICAgICAgIC8vIGVsc2UgcmVhZCB0aGUgZGlyZWN0b3J5LCBmaWxsIHVwIGNoaWxkcmVuXG4gICAgICAgIC8vIGRlLXByb3Zpc2lvbmFsaXplIGFueSBwcm92aXNpb25hbCBjaGlsZHJlbi5cbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSB0aGlzLmZ1bGxwYXRoKCk7XG4gICAgICAgIHRoaXMuI2ZzLnJlYWRkaXIoZnVsbHBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9LCAoZXIsIGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI3JlYWRkaXJGYWlsKGVyLmNvZGUpO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnByb3Zpc2lvbmFsID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBnZXQgYW4gZXJyb3IsIHdlIGFsd2F5cyBnZXQgZW50cmllcy5cbiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNyZWFkZGlyQWRkQ2hpbGQoZSwgY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLiNyZWFkZGlyU3VjY2VzcyhjaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNjYWxsT25SZWFkZGlyQ0IoY2hpbGRyZW4uc2xpY2UoMCwgY2hpbGRyZW4ucHJvdmlzaW9uYWwpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICNhc3luY1JlYWRkaXJJbkZsaWdodDtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Yga25vd24gY2hpbGQgZW50cmllcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBQYXRoIGNhbm5vdCBvciBkb2VzIG5vdCBjb250YWluIGFueSBjaGlsZHJlbiwgdGhlbiBhbiBlbXB0eSBhcnJheVxuICAgICAqIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogUmVzdWx0cyBhcmUgY2FjaGVkLCBhbmQgdGh1cyBtYXkgYmUgb3V0IG9mIGRhdGUgaWYgdGhlIGZpbGVzeXN0ZW0gaXNcbiAgICAgKiBtdXRhdGVkLlxuICAgICAqL1xuICAgIGFzeW5jIHJlYWRkaXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5jYW5SZWFkZGlyKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4oKTtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGVkUmVhZGRpcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4uc2xpY2UoMCwgY2hpbGRyZW4ucHJvdmlzaW9uYWwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UgcmVhZCB0aGUgZGlyZWN0b3J5LCBmaWxsIHVwIGNoaWxkcmVuXG4gICAgICAgIC8vIGRlLXByb3Zpc2lvbmFsaXplIGFueSBwcm92aXNpb25hbCBjaGlsZHJlbi5cbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSB0aGlzLmZ1bGxwYXRoKCk7XG4gICAgICAgIGlmICh0aGlzLiNhc3luY1JlYWRkaXJJbkZsaWdodCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jYXN5bmNSZWFkZGlySW5GbGlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgIGxldCByZXNvbHZlID0gKCkgPT4geyB9O1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIHRoaXMuI2FzeW5jUmVhZGRpckluRmxpZ2h0ID0gbmV3IFByb21pc2UocmVzID0+IChyZXNvbHZlID0gcmVzKSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBhd2FpdCB0aGlzLiNmcy5wcm9taXNlcy5yZWFkZGlyKGZ1bGxwYXRoLCB7XG4gICAgICAgICAgICAgICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVhZGRpckFkZENoaWxkKGUsIGNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jcmVhZGRpclN1Y2Nlc3MoY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcmVhZGRpckZhaWwoZXIuY29kZSk7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHJvdmlzaW9uYWwgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jYXN5bmNSZWFkZGlySW5GbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuLnNsaWNlKDAsIGNoaWxkcmVuLnByb3Zpc2lvbmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogc3luY2hyb25vdXMge0BsaW5rIFBhdGhCYXNlLnJlYWRkaXJ9XG4gICAgICovXG4gICAgcmVhZGRpclN5bmMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jYW5SZWFkZGlyKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4oKTtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGVkUmVhZGRpcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4uc2xpY2UoMCwgY2hpbGRyZW4ucHJvdmlzaW9uYWwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UgcmVhZCB0aGUgZGlyZWN0b3J5LCBmaWxsIHVwIGNoaWxkcmVuXG4gICAgICAgIC8vIGRlLXByb3Zpc2lvbmFsaXplIGFueSBwcm92aXNpb25hbCBjaGlsZHJlbi5cbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSB0aGlzLmZ1bGxwYXRoKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy4jZnMucmVhZGRpclN5bmMoZnVsbHBhdGgsIHtcbiAgICAgICAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZWFkZGlyQWRkQ2hpbGQoZSwgY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jcmVhZGRpclN1Y2Nlc3MoY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcikge1xuICAgICAgICAgICAgdGhpcy4jcmVhZGRpckZhaWwoZXIuY29kZSk7XG4gICAgICAgICAgICBjaGlsZHJlbi5wcm92aXNpb25hbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuLnNsaWNlKDAsIGNoaWxkcmVuLnByb3Zpc2lvbmFsKTtcbiAgICB9XG4gICAgY2FuUmVhZGRpcigpIHtcbiAgICAgICAgaWYgKHRoaXMuI3R5cGUgJiBFTk9DSElMRClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgaWZtdCA9IElGTVQgJiB0aGlzLiN0eXBlO1xuICAgICAgICAvLyB3ZSBhbHdheXMgc2V0IEVOT1RESVIgd2hlbiBzZXR0aW5nIElGTVQsIHNvIHNob3VsZCBiZSBpbXBvc3NpYmxlXG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAoIShpZm10ID09PSBVTktOT1dOIHx8IGlmbXQgPT09IElGRElSIHx8IGlmbXQgPT09IElGTE5LKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzaG91bGRXYWxrKGRpcnMsIHdhbGtGaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuICgodGhpcy4jdHlwZSAmIElGRElSKSA9PT0gSUZESVIgJiZcbiAgICAgICAgICAgICEodGhpcy4jdHlwZSAmIEVOT0NISUxEKSAmJlxuICAgICAgICAgICAgIWRpcnMuaGFzKHRoaXMpICYmXG4gICAgICAgICAgICAoIXdhbGtGaWx0ZXIgfHwgd2Fsa0ZpbHRlcih0aGlzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIFBhdGggb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gcGF0aCBhcyByZXNvbHZlZFxuICAgICAqIGJ5IHJlYWxwYXRoKDMpLlxuICAgICAqXG4gICAgICogSWYgdGhlIHJlYWxwYXRoIGNhbGwgZmFpbHMgZm9yIGFueSByZWFzb24sIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogUmVzdWx0IGlzIGNhY2hlZCwgYW5kIHRodXMgbWF5IGJlIG91dGRhdGVkIGlmIHRoZSBmaWxlc3lzdGVtIGlzIG11dGF0ZWQuXG4gICAgICogT24gc3VjY2VzcywgcmV0dXJucyBhIFBhdGggb2JqZWN0LlxuICAgICAqL1xuICAgIGFzeW5jIHJlYWxwYXRoKCkge1xuICAgICAgICBpZiAodGhpcy4jcmVhbHBhdGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jcmVhbHBhdGg7XG4gICAgICAgIGlmICgoRU5PUkVBTFBBVEggfCBFTk9SRUFETElOSyB8IEVOT0VOVCkgJiB0aGlzLiN0eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJwID0gYXdhaXQgdGhpcy4jZnMucHJvbWlzZXMucmVhbHBhdGgodGhpcy5mdWxscGF0aCgpKTtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jcmVhbHBhdGggPSB0aGlzLnJlc29sdmUocnApKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgdGhpcy4jbWFya0VOT1JFQUxQQVRIKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU3luY2hyb25vdXMge0BsaW5rIHJlYWxwYXRofVxuICAgICAqL1xuICAgIHJlYWxwYXRoU3luYygpIHtcbiAgICAgICAgaWYgKHRoaXMuI3JlYWxwYXRoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3JlYWxwYXRoO1xuICAgICAgICBpZiAoKEVOT1JFQUxQQVRIIHwgRU5PUkVBRExJTksgfCBFTk9FTlQpICYgdGhpcy4jdHlwZSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBycCA9IHRoaXMuI2ZzLnJlYWxwYXRoU3luYyh0aGlzLmZ1bGxwYXRoKCkpO1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNyZWFscGF0aCA9IHRoaXMucmVzb2x2ZShycCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICB0aGlzLiNtYXJrRU5PUkVBTFBBVEgoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gbWFyayB0aGlzIFBhdGggb2JqZWN0IGFzIHRoZSBzY3VycnkgY3dkLFxuICAgICAqIGNhbGxlZCBieSB7QGxpbmsgUGF0aFNjdXJyeSNjaGRpcn1cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIFtzZXRBc0N3ZF0ob2xkQ3dkKSB7XG4gICAgICAgIGlmIChvbGRDd2QgPT09IHRoaXMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIG9sZEN3ZC5pc0NXRCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQ1dEID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IG5ldyBTZXQoW10pO1xuICAgICAgICBsZXQgcnAgPSBbXTtcbiAgICAgICAgbGV0IHAgPSB0aGlzO1xuICAgICAgICB3aGlsZSAocCAmJiBwLnBhcmVudCkge1xuICAgICAgICAgICAgY2hhbmdlZC5hZGQocCk7XG4gICAgICAgICAgICBwLiNyZWxhdGl2ZSA9IHJwLmpvaW4odGhpcy5zZXApO1xuICAgICAgICAgICAgcC4jcmVsYXRpdmVQb3NpeCA9IHJwLmpvaW4oJy8nKTtcbiAgICAgICAgICAgIHAgPSBwLnBhcmVudDtcbiAgICAgICAgICAgIHJwLnB1c2goJy4uJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm93IHVuLW1lbW9pemUgcGFyZW50cyBvZiBvbGQgY3dkXG4gICAgICAgIHAgPSBvbGRDd2Q7XG4gICAgICAgIHdoaWxlIChwICYmIHAucGFyZW50ICYmICFjaGFuZ2VkLmhhcyhwKSkge1xuICAgICAgICAgICAgcC4jcmVsYXRpdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBwLiNyZWxhdGl2ZVBvc2l4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcCA9IHAucGFyZW50O1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBQYXRoIGNsYXNzIHVzZWQgb24gd2luMzIgc3lzdGVtc1xuICpcbiAqIFVzZXMgYCdcXFxcJ2AgYXMgdGhlIHBhdGggc2VwYXJhdG9yIGZvciByZXR1cm5lZCBwYXRocywgZWl0aGVyIGAnXFxcXCdgIG9yIGAnLydgXG4gKiBhcyB0aGUgcGF0aCBzZXBhcmF0b3IgZm9yIHBhcnNpbmcgcGF0aHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoV2luMzIgZXh0ZW5kcyBQYXRoQmFzZSB7XG4gICAgLyoqXG4gICAgICogU2VwYXJhdG9yIGZvciBnZW5lcmF0aW5nIHBhdGggc3RyaW5ncy5cbiAgICAgKi9cbiAgICBzZXAgPSAnXFxcXCc7XG4gICAgLyoqXG4gICAgICogU2VwYXJhdG9yIGZvciBwYXJzaW5nIHBhdGggc3RyaW5ncy5cbiAgICAgKi9cbiAgICBzcGxpdFNlcCA9IGVpdGhlclNlcDtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgY3JlYXRlIG5ldyBQYXRoIG9iamVjdHMgZGlyZWN0bHkuICBUaGV5IHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWRcbiAgICAgKiB2aWEgdGhlIFBhdGhTY3VycnkgY2xhc3Mgb3Igb3RoZXIgbWV0aG9kcyBvbiB0aGUgUGF0aCBjbGFzcy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHR5cGUgPSBVTktOT1dOLCByb290LCByb290cywgbm9jYXNlLCBjaGlsZHJlbiwgb3B0cykge1xuICAgICAgICBzdXBlcihuYW1lLCB0eXBlLCByb290LCByb290cywgbm9jYXNlLCBjaGlsZHJlbiwgb3B0cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIG5ld0NoaWxkKG5hbWUsIHR5cGUgPSBVTktOT1dOLCBvcHRzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXRoV2luMzIobmFtZSwgdHlwZSwgdGhpcy5yb290LCB0aGlzLnJvb3RzLCB0aGlzLm5vY2FzZSwgdGhpcy5jaGlsZHJlbkNhY2hlKCksIG9wdHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRSb290U3RyaW5nKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHdpbjMyLnBhcnNlKHBhdGgpLnJvb3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldFJvb3Qocm9vdFBhdGgpIHtcbiAgICAgICAgcm9vdFBhdGggPSB1bmNUb0RyaXZlKHJvb3RQYXRoLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICBpZiAocm9vdFBhdGggPT09IHRoaXMucm9vdC5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgICAgICB9XG4gICAgICAgIC8vIG9rLCBub3QgdGhhdCBvbmUsIGNoZWNrIGlmIGl0IG1hdGNoZXMgYW5vdGhlciB3ZSBrbm93IGFib3V0XG4gICAgICAgIGZvciAoY29uc3QgW2NvbXBhcmUsIHJvb3RdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucm9vdHMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zYW1lUm9vdChyb290UGF0aCwgY29tcGFyZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMucm9vdHNbcm9vdFBhdGhdID0gcm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBvbmUuXG4gICAgICAgIHJldHVybiAodGhpcy5yb290c1tyb290UGF0aF0gPSBuZXcgUGF0aFNjdXJyeVdpbjMyKHJvb3RQYXRoLCB0aGlzKS5yb290KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc2FtZVJvb3Qocm9vdFBhdGgsIGNvbXBhcmUgPSB0aGlzLnJvb3QubmFtZSkge1xuICAgICAgICAvLyB3aW5kb3dzIGNhbiAocmFyZWx5KSBoYXZlIGNhc2Utc2Vuc2l0aXZlIGZpbGVzeXN0ZW0sIGJ1dFxuICAgICAgICAvLyBVTkMgYW5kIGRyaXZlIGxldHRlcnMgYXJlIGFsd2F5cyBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgY2Fub25pY2FsbHlcbiAgICAgICAgLy8gcmVwcmVzZW50ZWQgdXBwZXJjYXNlLlxuICAgICAgICByb290UGF0aCA9IHJvb3RQYXRoXG4gICAgICAgICAgICAudG9VcHBlckNhc2UoKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnXFxcXCcpXG4gICAgICAgICAgICAucmVwbGFjZSh1bmNEcml2ZVJlZ2V4cCwgJyQxXFxcXCcpO1xuICAgICAgICByZXR1cm4gcm9vdFBhdGggPT09IGNvbXBhcmU7XG4gICAgfVxufVxuLyoqXG4gKiBQYXRoIGNsYXNzIHVzZWQgb24gYWxsIHBvc2l4IHN5c3RlbXMuXG4gKlxuICogVXNlcyBgJy8nYCBhcyB0aGUgcGF0aCBzZXBhcmF0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoUG9zaXggZXh0ZW5kcyBQYXRoQmFzZSB7XG4gICAgLyoqXG4gICAgICogc2VwYXJhdG9yIGZvciBwYXJzaW5nIHBhdGggc3RyaW5nc1xuICAgICAqL1xuICAgIHNwbGl0U2VwID0gJy8nO1xuICAgIC8qKlxuICAgICAqIHNlcGFyYXRvciBmb3IgZ2VuZXJhdGluZyBwYXRoIHN0cmluZ3NcbiAgICAgKi9cbiAgICBzZXAgPSAnLyc7XG4gICAgLyoqXG4gICAgICogRG8gbm90IGNyZWF0ZSBuZXcgUGF0aCBvYmplY3RzIGRpcmVjdGx5LiAgVGhleSBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkXG4gICAgICogdmlhIHRoZSBQYXRoU2N1cnJ5IGNsYXNzIG9yIG90aGVyIG1ldGhvZHMgb24gdGhlIFBhdGggY2xhc3MuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB0eXBlID0gVU5LTk9XTiwgcm9vdCwgcm9vdHMsIG5vY2FzZSwgY2hpbGRyZW4sIG9wdHMpIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdHlwZSwgcm9vdCwgcm9vdHMsIG5vY2FzZSwgY2hpbGRyZW4sIG9wdHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRSb290U3RyaW5nKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguc3RhcnRzV2l0aCgnLycpID8gJy8nIDogJyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldFJvb3QoX3Jvb3RQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIG5ld0NoaWxkKG5hbWUsIHR5cGUgPSBVTktOT1dOLCBvcHRzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXRoUG9zaXgobmFtZSwgdHlwZSwgdGhpcy5yb290LCB0aGlzLnJvb3RzLCB0aGlzLm5vY2FzZSwgdGhpcy5jaGlsZHJlbkNhY2hlKCksIG9wdHMpO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBQYXRoU2N1cnJ5IGNsYXNzZXMsIHByb3ZpZGluZyB0aGUgaW50ZXJmYWNlIGZvciBwYXRoXG4gKiByZXNvbHV0aW9uIGFuZCBmaWxlc3lzdGVtIG9wZXJhdGlvbnMuXG4gKlxuICogVHlwaWNhbGx5LCB5b3Ugc2hvdWxkICpub3QqIGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHksIGJ1dCByYXRoZXIgb25lXG4gKiBvZiB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY2xhc3Nlcywgb3IgdGhlIGV4cG9ydGVkIHtAbGluayBQYXRoU2N1cnJ5fSB3aGljaFxuICogZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoU2N1cnJ5QmFzZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvb3QgUGF0aCBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhpcyBTY3VycnlcbiAgICAgKi9cbiAgICByb290O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcGF0aCBmb3IgdGhlIHJvb3Qgb2YgdGhpcyBTY3VycnkncyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICovXG4gICAgcm9vdFBhdGg7XG4gICAgLyoqXG4gICAgICogQSBjb2xsZWN0aW9uIG9mIGFsbCByb290cyBlbmNvdW50ZXJlZCwgcmVmZXJlbmNlZCBieSByb290UGF0aFxuICAgICAqL1xuICAgIHJvb3RzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBQYXRoU2N1cnJ5J3MgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBjd2Q7XG4gICAgI3Jlc29sdmVDYWNoZTtcbiAgICAjcmVzb2x2ZVBvc2l4Q2FjaGU7XG4gICAgI2NoaWxkcmVuO1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gcGF0aCBjb21wYXJpc29ucyBjYXNlLWluc2Vuc2l0aXZlbHkuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0cyB0cnVlIG9uIERhcndpbiBhbmQgV2luZG93cyBzeXN0ZW1zLCBmYWxzZSBlbHNld2hlcmUuXG4gICAgICovXG4gICAgbm9jYXNlO1xuICAgICNmcztcbiAgICAvKipcbiAgICAgKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuICAgICAqXG4gICAgICogVXNlIFBhdGhTY3VycnlXaW4zMiwgUGF0aFNjdXJyeURhcndpbiwgUGF0aFNjdXJyeVBvc2l4LCBvciBQYXRoU2N1cnJ5XG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjd2QgPSBwcm9jZXNzLmN3ZCgpLCBwYXRoSW1wbCwgc2VwLCB7IG5vY2FzZSwgY2hpbGRyZW5DYWNoZVNpemUgPSAxNiAqIDEwMjQsIGZzID0gZGVmYXVsdEZTLCB9ID0ge30pIHtcbiAgICAgICAgdGhpcy4jZnMgPSBmc0Zyb21PcHRpb24oZnMpO1xuICAgICAgICBpZiAoY3dkIGluc3RhbmNlb2YgVVJMIHx8IGN3ZC5zdGFydHNXaXRoKCdmaWxlOi8vJykpIHtcbiAgICAgICAgICAgIGN3ZCA9IGZpbGVVUkxUb1BhdGgoY3dkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZXNvbHZlIGFuZCBzcGxpdCByb290LCBhbmQgdGhlbiBhZGQgdG8gdGhlIHN0b3JlLlxuICAgICAgICAvLyB0aGlzIGlzIHRoZSBvbmx5IHRpbWUgd2UgY2FsbCBwYXRoLnJlc29sdmUoKVxuICAgICAgICBjb25zdCBjd2RQYXRoID0gcGF0aEltcGwucmVzb2x2ZShjd2QpO1xuICAgICAgICB0aGlzLnJvb3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5yb290UGF0aCA9IHRoaXMucGFyc2VSb290UGF0aChjd2RQYXRoKTtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZUNhY2hlID0gbmV3IFJlc29sdmVDYWNoZSgpO1xuICAgICAgICB0aGlzLiNyZXNvbHZlUG9zaXhDYWNoZSA9IG5ldyBSZXNvbHZlQ2FjaGUoKTtcbiAgICAgICAgdGhpcy4jY2hpbGRyZW4gPSBuZXcgQ2hpbGRyZW5DYWNoZShjaGlsZHJlbkNhY2hlU2l6ZSk7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gY3dkUGF0aC5zdWJzdHJpbmcodGhpcy5yb290UGF0aC5sZW5ndGgpLnNwbGl0KHNlcCk7XG4gICAgICAgIC8vIHJlc29sdmUoJy8nKSBsZWF2ZXMgJycsIHNwbGl0cyB0byBbJyddLCB3ZSBkb24ndCB3YW50IHRoYXQuXG4gICAgICAgIGlmIChzcGxpdC5sZW5ndGggPT09IDEgJiYgIXNwbGl0WzBdKSB7XG4gICAgICAgICAgICBzcGxpdC5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKG5vY2FzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdXN0IHByb3ZpZGUgbm9jYXNlIHNldHRpbmcgdG8gUGF0aFNjdXJyeUJhc2UgY3RvcicpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHRoaXMubm9jYXNlID0gbm9jYXNlO1xuICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLm5ld1Jvb3QodGhpcy4jZnMpO1xuICAgICAgICB0aGlzLnJvb3RzW3RoaXMucm9vdFBhdGhdID0gdGhpcy5yb290O1xuICAgICAgICBsZXQgcHJldiA9IHRoaXMucm9vdDtcbiAgICAgICAgbGV0IGxlbiA9IHNwbGl0Lmxlbmd0aCAtIDE7XG4gICAgICAgIGNvbnN0IGpvaW5TZXAgPSBwYXRoSW1wbC5zZXA7XG4gICAgICAgIGxldCBhYnMgPSB0aGlzLnJvb3RQYXRoO1xuICAgICAgICBsZXQgc2F3Rmlyc3QgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHNwbGl0KSB7XG4gICAgICAgICAgICBjb25zdCBsID0gbGVuLS07XG4gICAgICAgICAgICBwcmV2ID0gcHJldi5jaGlsZChwYXJ0LCB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IG5ldyBBcnJheShsKS5maWxsKCcuLicpLmpvaW4oam9pblNlcCksXG4gICAgICAgICAgICAgICAgcmVsYXRpdmVQb3NpeDogbmV3IEFycmF5KGwpLmZpbGwoJy4uJykuam9pbignLycpLFxuICAgICAgICAgICAgICAgIGZ1bGxwYXRoOiAoYWJzICs9IChzYXdGaXJzdCA/ICcnIDogam9pblNlcCkgKyBwYXJ0KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2F3Rmlyc3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3dkID0gcHJldjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkZXB0aCBvZiBhIHByb3ZpZGVkIHBhdGgsIHN0cmluZywgb3IgdGhlIGN3ZFxuICAgICAqL1xuICAgIGRlcHRoKHBhdGggPSB0aGlzLmN3ZCkge1xuICAgICAgICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwYXRoID0gdGhpcy5jd2QucmVzb2x2ZShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aC5kZXB0aCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGNhY2hlIG9mIGNoaWxkIGVudHJpZXMuICBFeHBvc2VkIHNvIHN1YmNsYXNzZXMgY2FuIGNyZWF0ZVxuICAgICAqIGNoaWxkIFBhdGggb2JqZWN0cyBpbiBhIHBsYXRmb3JtLXNwZWNpZmljIHdheS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNoaWxkcmVuQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjaGlsZHJlbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBvbmUgb3IgbW9yZSBwYXRoIHN0cmluZ3MgdG8gYSByZXNvbHZlZCBzdHJpbmdcbiAgICAgKlxuICAgICAqIFNhbWUgaW50ZXJmYWNlIGFzIHJlcXVpcmUoJ3BhdGgnKS5yZXNvbHZlLlxuICAgICAqXG4gICAgICogTXVjaCBmYXN0ZXIgdGhhbiBwYXRoLnJlc29sdmUoKSB3aGVuIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWVcbiAgICAgKiBwYXRoLCBiZWNhdXNlIHRoZSByZXNvbHZlZCBQYXRoIG9iamVjdHMgYXJlIGNhY2hlZC4gIE11Y2ggc2xvd2VyXG4gICAgICogb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHJlc29sdmUoLi4ucGF0aHMpIHtcbiAgICAgICAgLy8gZmlyc3QgZmlndXJlIG91dCB0aGUgbWluaW11bSBudW1iZXIgb2YgcGF0aHMgd2UgaGF2ZSB0byB0ZXN0XG4gICAgICAgIC8vIHdlIGFsd2F5cyBzdGFydCBhdCBjd2QsIGJ1dCBhbnkgYWJzb2x1dGVzIHdpbGwgYnVtcCB0aGUgc3RhcnRcbiAgICAgICAgbGV0IHIgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IHBhdGhzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gcGF0aHNbaV07XG4gICAgICAgICAgICBpZiAoIXAgfHwgcCA9PT0gJy4nKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgciA9IHIgPyBgJHtwfS8ke3J9YCA6IHA7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0Fic29sdXRlKHApKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy4jcmVzb2x2ZUNhY2hlLmdldChyKTtcbiAgICAgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY3dkLnJlc29sdmUocikuZnVsbHBhdGgoKTtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZUNhY2hlLnNldChyLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIG9uZSBvciBtb3JlIHBhdGggc3RyaW5ncyB0byBhIHJlc29sdmVkIHN0cmluZywgcmV0dXJuaW5nXG4gICAgICogdGhlIHBvc2l4IHBhdGguICBJZGVudGljYWwgdG8gLnJlc29sdmUoKSBvbiBwb3NpeCBzeXN0ZW1zLCBidXQgb25cbiAgICAgKiB3aW5kb3dzIHdpbGwgcmV0dXJuIGEgZm9yd2FyZC1zbGFzaCBzZXBhcmF0ZWQgVU5DIHBhdGguXG4gICAgICpcbiAgICAgKiBTYW1lIGludGVyZmFjZSBhcyByZXF1aXJlKCdwYXRoJykucmVzb2x2ZS5cbiAgICAgKlxuICAgICAqIE11Y2ggZmFzdGVyIHRoYW4gcGF0aC5yZXNvbHZlKCkgd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lXG4gICAgICogcGF0aCwgYmVjYXVzZSB0aGUgcmVzb2x2ZWQgUGF0aCBvYmplY3RzIGFyZSBjYWNoZWQuICBNdWNoIHNsb3dlclxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZXNvbHZlUG9zaXgoLi4ucGF0aHMpIHtcbiAgICAgICAgLy8gZmlyc3QgZmlndXJlIG91dCB0aGUgbWluaW11bSBudW1iZXIgb2YgcGF0aHMgd2UgaGF2ZSB0byB0ZXN0XG4gICAgICAgIC8vIHdlIGFsd2F5cyBzdGFydCBhdCBjd2QsIGJ1dCBhbnkgYWJzb2x1dGVzIHdpbGwgYnVtcCB0aGUgc3RhcnRcbiAgICAgICAgbGV0IHIgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IHBhdGhzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gcGF0aHNbaV07XG4gICAgICAgICAgICBpZiAoIXAgfHwgcCA9PT0gJy4nKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgciA9IHIgPyBgJHtwfS8ke3J9YCA6IHA7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0Fic29sdXRlKHApKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy4jcmVzb2x2ZVBvc2l4Q2FjaGUuZ2V0KHIpO1xuICAgICAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jd2QucmVzb2x2ZShyKS5mdWxscGF0aFBvc2l4KCk7XG4gICAgICAgIHRoaXMuI3Jlc29sdmVQb3NpeENhY2hlLnNldChyLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBmaW5kIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGN3ZCB0byB0aGUgc3VwcGxpZWQgcGF0aCBzdHJpbmcgb3IgZW50cnlcbiAgICAgKi9cbiAgICByZWxhdGl2ZShlbnRyeSA9IHRoaXMuY3dkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeS5yZWxhdGl2ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBmaW5kIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGN3ZCB0byB0aGUgc3VwcGxpZWQgcGF0aCBzdHJpbmcgb3JcbiAgICAgKiBlbnRyeSwgdXNpbmcgLyBhcyB0aGUgcGF0aCBkZWxpbWl0ZXIsIGV2ZW4gb24gV2luZG93cy5cbiAgICAgKi9cbiAgICByZWxhdGl2ZVBvc2l4KGVudHJ5ID0gdGhpcy5jd2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5LnJlbGF0aXZlUG9zaXgoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBiYXNlbmFtZSBmb3IgdGhlIHByb3ZpZGVkIHN0cmluZyBvciBQYXRoIG9iamVjdFxuICAgICAqL1xuICAgIGJhc2VuYW1lKGVudHJ5ID0gdGhpcy5jd2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5Lm5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgZGlybmFtZSBmb3IgdGhlIHByb3ZpZGVkIHN0cmluZyBvciBQYXRoIG9iamVjdFxuICAgICAqL1xuICAgIGRpcm5hbWUoZW50cnkgPSB0aGlzLmN3ZCkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGVudHJ5LnBhcmVudCB8fCBlbnRyeSkuZnVsbHBhdGgoKTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZGRpcihlbnRyeSA9IHRoaXMuY3dkLCBvcHRzID0ge1xuICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgIH0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShlbnRyeSBpbnN0YW5jZW9mIFBhdGhCYXNlKSkge1xuICAgICAgICAgICAgb3B0cyA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHdpdGhGaWxlVHlwZXMgfSA9IG9wdHM7XG4gICAgICAgIGlmICghZW50cnkuY2FuUmVhZGRpcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwID0gYXdhaXQgZW50cnkucmVhZGRpcigpO1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhGaWxlVHlwZXMgPyBwIDogcC5tYXAoZSA9PiBlLm5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlYWRkaXJTeW5jKGVudHJ5ID0gdGhpcy5jd2QsIG9wdHMgPSB7XG4gICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgfSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICBvcHRzID0gZW50cnk7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgd2l0aEZpbGVUeXBlcyA9IHRydWUgfSA9IG9wdHM7XG4gICAgICAgIGlmICghZW50cnkuY2FuUmVhZGRpcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2l0aEZpbGVUeXBlcykge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnJlYWRkaXJTeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkucmVhZGRpclN5bmMoKS5tYXAoZSA9PiBlLm5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgbHN0YXQoKSBvbiB0aGUgc3RyaW5nIG9yIFBhdGggb2JqZWN0LCBhbmQgdXBkYXRlIGFsbCBrbm93blxuICAgICAqIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGRldGVybWluZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdW5saWtlIGBmcy5sc3RhdCgpYCwgdGhlIHJldHVybmVkIHZhbHVlIGRvZXMgbm90IGNvbnRhaW4gc29tZVxuICAgICAqIGluZm9ybWF0aW9uLCBzdWNoIGFzIGBtb2RlYCwgYGRldmAsIGBubGlua2AsIGFuZCBgaW5vYC4gIElmIHRoYXRcbiAgICAgKiBpbmZvcm1hdGlvbiBpcyByZXF1aXJlZCwgeW91IHdpbGwgbmVlZCB0byBjYWxsIGBmcy5sc3RhdGAgeW91cnNlbGYuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgUGF0aCByZWZlcnMgdG8gYSBub25leGlzdGVudCBmaWxlLCBvciBpZiB0aGUgbHN0YXQgY2FsbCBmYWlscyBmb3JcbiAgICAgKiBhbnkgcmVhc29uLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSB0aGUgdXBkYXRlZCBQYXRoIG9iamVjdCBpc1xuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogUmVzdWx0cyBhcmUgY2FjaGVkLCBhbmQgdGh1cyBtYXkgYmUgb3V0IG9mIGRhdGUgaWYgdGhlIGZpbGVzeXN0ZW0gaXNcbiAgICAgKiBtdXRhdGVkLlxuICAgICAqL1xuICAgIGFzeW5jIGxzdGF0KGVudHJ5ID0gdGhpcy5jd2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5LmxzdGF0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHN5bmNocm9ub3VzIHtAbGluayBQYXRoU2N1cnJ5QmFzZS5sc3RhdH1cbiAgICAgKi9cbiAgICBsc3RhdFN5bmMoZW50cnkgPSB0aGlzLmN3ZCkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnkubHN0YXRTeW5jKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlYWRsaW5rKGVudHJ5ID0gdGhpcy5jd2QsIHsgd2l0aEZpbGVUeXBlcyB9ID0ge1xuICAgICAgICB3aXRoRmlsZVR5cGVzOiBmYWxzZSxcbiAgICB9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIHdpdGhGaWxlVHlwZXMgPSBlbnRyeS53aXRoRmlsZVR5cGVzO1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gYXdhaXQgZW50cnkucmVhZGxpbmsoKTtcbiAgICAgICAgcmV0dXJuIHdpdGhGaWxlVHlwZXMgPyBlIDogZT8uZnVsbHBhdGgoKTtcbiAgICB9XG4gICAgcmVhZGxpbmtTeW5jKGVudHJ5ID0gdGhpcy5jd2QsIHsgd2l0aEZpbGVUeXBlcyB9ID0ge1xuICAgICAgICB3aXRoRmlsZVR5cGVzOiBmYWxzZSxcbiAgICB9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIHdpdGhGaWxlVHlwZXMgPSBlbnRyeS53aXRoRmlsZVR5cGVzO1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gZW50cnkucmVhZGxpbmtTeW5jKCk7XG4gICAgICAgIHJldHVybiB3aXRoRmlsZVR5cGVzID8gZSA6IGU/LmZ1bGxwYXRoKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlYWxwYXRoKGVudHJ5ID0gdGhpcy5jd2QsIHsgd2l0aEZpbGVUeXBlcyB9ID0ge1xuICAgICAgICB3aXRoRmlsZVR5cGVzOiBmYWxzZSxcbiAgICB9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIHdpdGhGaWxlVHlwZXMgPSBlbnRyeS53aXRoRmlsZVR5cGVzO1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gYXdhaXQgZW50cnkucmVhbHBhdGgoKTtcbiAgICAgICAgcmV0dXJuIHdpdGhGaWxlVHlwZXMgPyBlIDogZT8uZnVsbHBhdGgoKTtcbiAgICB9XG4gICAgcmVhbHBhdGhTeW5jKGVudHJ5ID0gdGhpcy5jd2QsIHsgd2l0aEZpbGVUeXBlcyB9ID0ge1xuICAgICAgICB3aXRoRmlsZVR5cGVzOiBmYWxzZSxcbiAgICB9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIHdpdGhGaWxlVHlwZXMgPSBlbnRyeS53aXRoRmlsZVR5cGVzO1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gZW50cnkucmVhbHBhdGhTeW5jKCk7XG4gICAgICAgIHJldHVybiB3aXRoRmlsZVR5cGVzID8gZSA6IGU/LmZ1bGxwYXRoKCk7XG4gICAgfVxuICAgIGFzeW5jIHdhbGsoZW50cnkgPSB0aGlzLmN3ZCwgb3B0cyA9IHt9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIG9wdHMgPSBlbnRyeTtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB3aXRoRmlsZVR5cGVzID0gdHJ1ZSwgZm9sbG93ID0gZmFsc2UsIGZpbHRlciwgd2Fsa0ZpbHRlciwgfSA9IG9wdHM7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHdpdGhGaWxlVHlwZXMgPyBlbnRyeSA6IGVudHJ5LmZ1bGxwYXRoKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGNvbnN0IHdhbGsgPSAoZGlyLCBjYikgPT4ge1xuICAgICAgICAgICAgZGlycy5hZGQoZGlyKTtcbiAgICAgICAgICAgIGRpci5yZWFkZGlyQ0IoKGVyLCBlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgaWYgKGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYihlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IGVudHJpZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmICghbGVuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoLS1sZW4gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHdpdGhGaWxlVHlwZXMgPyBlIDogZS5mdWxscGF0aCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9sbG93ICYmIGUuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5yZWFscGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ociA9PiAocj8uaXNVbmtub3duKCkgPyByLmxzdGF0KCkgOiByKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyID0+IHI/LnNob3VsZFdhbGsoZGlycywgd2Fsa0ZpbHRlcikgPyB3YWxrKHIsIG5leHQpIDogbmV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnNob3VsZFdhbGsoZGlycywgd2Fsa0ZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrKGUsIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdHJ1ZSk7IC8vIHphbGdvb29vb29vXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZW50cnk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgIHdhbGsoc3RhcnQsIGVyID0+IHtcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICBpZiAoZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWooZXIpO1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICAgICAgcmVzKHJlc3VsdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3YWxrU3luYyhlbnRyeSA9IHRoaXMuY3dkLCBvcHRzID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShlbnRyeSBpbnN0YW5jZW9mIFBhdGhCYXNlKSkge1xuICAgICAgICAgICAgb3B0cyA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHdpdGhGaWxlVHlwZXMgPSB0cnVlLCBmb2xsb3cgPSBmYWxzZSwgZmlsdGVyLCB3YWxrRmlsdGVyLCB9ID0gb3B0cztcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIoZW50cnkpKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2god2l0aEZpbGVUeXBlcyA/IGVudHJ5IDogZW50cnkuZnVsbHBhdGgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlycyA9IG5ldyBTZXQoW2VudHJ5XSk7XG4gICAgICAgIGZvciAoY29uc3QgZGlyIG9mIGRpcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBkaXIucmVhZGRpclN5bmMoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh3aXRoRmlsZVR5cGVzID8gZSA6IGUuZnVsbHBhdGgoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByID0gZTtcbiAgICAgICAgICAgICAgICBpZiAoZS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGZvbGxvdyAmJiAociA9IGUucmVhbHBhdGhTeW5jKCkpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoci5pc1Vua25vd24oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHIubHN0YXRTeW5jKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyLnNob3VsZFdhbGsoZGlycywgd2Fsa0ZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlycy5hZGQocik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdXBwb3J0IGZvciBgZm9yIGF3YWl0YFxuICAgICAqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBQYXRoU2N1cnJ5QmFzZS5pdGVyYXRlfVxuICAgICAqXG4gICAgICogTm90ZTogQXMgb2YgTm9kZSAxOSwgdGhpcyBpcyB2ZXJ5IHNsb3csIGNvbXBhcmVkIHRvIG90aGVyIG1ldGhvZHMgb2ZcbiAgICAgKiB3YWxraW5nLiAgQ29uc2lkZXIgdXNpbmcge0BsaW5rIFBhdGhTY3VycnlCYXNlLnN0cmVhbX0gaWYgbWVtb3J5IG92ZXJoZWFkXG4gICAgICogYW5kIGJhY2twcmVzc3VyZSBhcmUgY29uY2VybnMsIG9yIHtAbGluayBQYXRoU2N1cnJ5QmFzZS53YWxrfSBpZiBub3QuXG4gICAgICovXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlcmF0ZSgpO1xuICAgIH1cbiAgICBpdGVyYXRlKGVudHJ5ID0gdGhpcy5jd2QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBpdGVyYXRpbmcgYXN5bmMgb3ZlciB0aGUgc3RyZWFtIGlzIHNpZ25pZmljYW50bHkgbW9yZSBwZXJmb3JtYW50LFxuICAgICAgICAvLyBlc3BlY2lhbGx5IGluIHRoZSB3YXJtLWNhY2hlIHNjZW5hcmlvLCBiZWNhdXNlIGl0IGJ1ZmZlcnMgdXAgZGlyZWN0b3J5XG4gICAgICAgIC8vIGVudHJpZXMgaW4gdGhlIGJhY2tncm91bmQgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBhIHlpZWxkIGZvciBlYWNoIG9uZS5cbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShlbnRyeSBpbnN0YW5jZW9mIFBhdGhCYXNlKSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0oZW50cnksIG9wdGlvbnMpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRpbmcgb3ZlciBhIFBhdGhTY3VycnkgcGVyZm9ybXMgYSBzeW5jaHJvbm91cyB3YWxrLlxuICAgICAqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBQYXRoU2N1cnJ5QmFzZS5pdGVyYXRlU3luY31cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlcmF0ZVN5bmMoKTtcbiAgICB9XG4gICAgKml0ZXJhdGVTeW5jKGVudHJ5ID0gdGhpcy5jd2QsIG9wdHMgPSB7fSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICBvcHRzID0gZW50cnk7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgd2l0aEZpbGVUeXBlcyA9IHRydWUsIGZvbGxvdyA9IGZhbHNlLCBmaWx0ZXIsIHdhbGtGaWx0ZXIsIH0gPSBvcHRzO1xuICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIoZW50cnkpKSB7XG4gICAgICAgICAgICB5aWVsZCB3aXRoRmlsZVR5cGVzID8gZW50cnkgOiBlbnRyeS5mdWxscGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpcnMgPSBuZXcgU2V0KFtlbnRyeV0pO1xuICAgICAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gZGlyLnJlYWRkaXJTeW5jKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihlKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCB3aXRoRmlsZVR5cGVzID8gZSA6IGUuZnVsbHBhdGgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHIgPSBlO1xuICAgICAgICAgICAgICAgIGlmIChlLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZm9sbG93ICYmIChyID0gZS5yZWFscGF0aFN5bmMoKSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyLmlzVW5rbm93bigpKVxuICAgICAgICAgICAgICAgICAgICAgICAgci5sc3RhdFN5bmMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHIuc2hvdWxkV2FsayhkaXJzLCB3YWxrRmlsdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJzLmFkZChyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RyZWFtKGVudHJ5ID0gdGhpcy5jd2QsIG9wdHMgPSB7fSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICBvcHRzID0gZW50cnk7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgd2l0aEZpbGVUeXBlcyA9IHRydWUsIGZvbGxvdyA9IGZhbHNlLCBmaWx0ZXIsIHdhbGtGaWx0ZXIsIH0gPSBvcHRzO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gbmV3IE1pbmlwYXNzKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgcmVzdWx0cy53cml0ZSh3aXRoRmlsZVR5cGVzID8gZW50cnkgOiBlbnRyeS5mdWxscGF0aCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXJzID0gbmV3IFNldCgpO1xuICAgICAgICBjb25zdCBxdWV1ZSA9IFtlbnRyeV07XG4gICAgICAgIGxldCBwcm9jZXNzaW5nID0gMDtcbiAgICAgICAgY29uc3QgcHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBwYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHdoaWxlICghcGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRpcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc2luZyA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2luZysrO1xuICAgICAgICAgICAgICAgIGRpcnMuYWRkKGRpcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgb25SZWFkZGlyID0gKGVyLCBlbnRyaWVzLCBkaWRSZWFscGF0aHMgPSBmYWxzZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMuZW1pdCgnZXJyb3InLCBlcik7XG4gICAgICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2xsb3cgJiYgIWRpZFJlYWxwYXRocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFscGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4gcj8uaXNVbmtub3duKCkgPyByLmxzdGF0KCkgOiByKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IG9uUmVhZGRpcihudWxsLCBlbnRyaWVzLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiAoIWZpbHRlciB8fCBmaWx0ZXIoZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRzLndyaXRlKHdpdGhGaWxlVHlwZXMgPyBlIDogZS5mdWxscGF0aCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nLS07XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gZS5yZWFscGF0aENhY2hlZCgpIHx8IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5zaG91bGRXYWxrKGRpcnMsIHdhbGtGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGF1c2VkICYmICFyZXN1bHRzLmZsb3dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMub25jZSgnZHJhaW4nLCBwcm9jZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghc3luYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyB6YWxnbyBjb250YWlubWVudFxuICAgICAgICAgICAgICAgIGxldCBzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkaXIucmVhZGRpckNCKG9uUmVhZGRpciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3luYyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwcm9jZXNzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICBzdHJlYW1TeW5jKGVudHJ5ID0gdGhpcy5jd2QsIG9wdHMgPSB7fSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICBvcHRzID0gZW50cnk7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgd2l0aEZpbGVUeXBlcyA9IHRydWUsIGZvbGxvdyA9IGZhbHNlLCBmaWx0ZXIsIHdhbGtGaWx0ZXIsIH0gPSBvcHRzO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gbmV3IE1pbmlwYXNzKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgZGlycyA9IG5ldyBTZXQoKTtcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgcmVzdWx0cy53cml0ZSh3aXRoRmlsZVR5cGVzID8gZW50cnkgOiBlbnRyeS5mdWxscGF0aCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWV1ZSA9IFtlbnRyeV07XG4gICAgICAgIGxldCBwcm9jZXNzaW5nID0gMDtcbiAgICAgICAgY29uc3QgcHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBwYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHdoaWxlICghcGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRpcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc2luZyA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2luZysrO1xuICAgICAgICAgICAgICAgIGRpcnMuYWRkKGRpcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGRpci5yZWFkZGlyU3luYygpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRzLndyaXRlKHdpdGhGaWxlVHlwZXMgPyBlIDogZS5mdWxscGF0aCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2luZy0tO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByID0gZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZm9sbG93ICYmIChyID0gZS5yZWFscGF0aFN5bmMoKSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuaXNVbmtub3duKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5sc3RhdFN5bmMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoci5zaG91bGRXYWxrKGRpcnMsIHdhbGtGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhdXNlZCAmJiAhcmVzdWx0cy5mbG93aW5nKVxuICAgICAgICAgICAgICAgIHJlc3VsdHMub25jZSgnZHJhaW4nLCBwcm9jZXNzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcHJvY2VzcygpO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgY2hkaXIocGF0aCA9IHRoaXMuY3dkKSB7XG4gICAgICAgIGNvbnN0IG9sZEN3ZCA9IHRoaXMuY3dkO1xuICAgICAgICB0aGlzLmN3ZCA9IHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJyA/IHRoaXMuY3dkLnJlc29sdmUocGF0aCkgOiBwYXRoO1xuICAgICAgICB0aGlzLmN3ZFtzZXRBc0N3ZF0ob2xkQ3dkKTtcbiAgICB9XG59XG4vKipcbiAqIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBhdGhTY3VycnlCYXNlfVxuICpcbiAqIERlZmF1bHRzIHRvIGNhc2UgaW5zZW5zaXR2ZSwgdXNlcyBgJ1xcXFwnYCB0byBnZW5lcmF0ZSBwYXRoIHN0cmluZ3MuICBVc2VzXG4gKiB7QGxpbmsgUGF0aFdpbjMyfSBmb3IgUGF0aCBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgUGF0aFNjdXJyeVdpbjMyIGV4dGVuZHMgUGF0aFNjdXJyeUJhc2Uge1xuICAgIC8qKlxuICAgICAqIHNlcGFyYXRvciBmb3IgZ2VuZXJhdGluZyBwYXRoIHN0cmluZ3NcbiAgICAgKi9cbiAgICBzZXAgPSAnXFxcXCc7XG4gICAgY29uc3RydWN0b3IoY3dkID0gcHJvY2Vzcy5jd2QoKSwgb3B0cyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgbm9jYXNlID0gdHJ1ZSB9ID0gb3B0cztcbiAgICAgICAgc3VwZXIoY3dkLCB3aW4zMiwgJ1xcXFwnLCB7IC4uLm9wdHMsIG5vY2FzZSB9KTtcbiAgICAgICAgdGhpcy5ub2Nhc2UgPSBub2Nhc2U7XG4gICAgICAgIGZvciAobGV0IHAgPSB0aGlzLmN3ZDsgcDsgcCA9IHAucGFyZW50KSB7XG4gICAgICAgICAgICBwLm5vY2FzZSA9IHRoaXMubm9jYXNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHBhcnNlUm9vdFBhdGgoZGlyKSB7XG4gICAgICAgIC8vIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGEgc2luZ2xlIHNlcGFyYXRvciwgaXQncyBub3QgYSBVTkMsIGFuZCB3ZSdsbFxuICAgICAgICAvLyBqdXN0IGdldCBzZXBhcmF0b3IgYXMgdGhlIHJvb3QsIGFuZCBkcml2ZUZyb21VTkMgd2lsbCByZXR1cm4gXFxcbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCBtb3VudCBcXCBvbiB0aGUgcm9vdCBmcm9tIHRoZSBjd2QuXG4gICAgICAgIHJldHVybiB3aW4zMi5wYXJzZShkaXIpLnJvb3QudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgbmV3Um9vdChmcykge1xuICAgICAgICByZXR1cm4gbmV3IFBhdGhXaW4zMih0aGlzLnJvb3RQYXRoLCBJRkRJUiwgdW5kZWZpbmVkLCB0aGlzLnJvb3RzLCB0aGlzLm5vY2FzZSwgdGhpcy5jaGlsZHJlbkNhY2hlKCksIHsgZnMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBwcm92aWRlZCBwYXRoIHN0cmluZyBpcyBhbiBhYnNvbHV0ZSBwYXRoXG4gICAgICovXG4gICAgaXNBYnNvbHV0ZShwKSB7XG4gICAgICAgIHJldHVybiAocC5zdGFydHNXaXRoKCcvJykgfHwgcC5zdGFydHNXaXRoKCdcXFxcJykgfHwgL15bYS16XTooXFwvfFxcXFwpL2kudGVzdChwKSk7XG4gICAgfVxufVxuLyoqXG4gKiB7QGxpbmsgUGF0aFNjdXJyeUJhc2V9IGltcGxlbWVudGF0aW9uIGZvciBhbGwgcG9zaXggc3lzdGVtcyBvdGhlciB0aGFuIERhcndpbi5cbiAqXG4gKiBEZWZhdWx0cyB0byBjYXNlLXNlbnNpdGl2ZSBtYXRjaGluZywgdXNlcyBgJy8nYCB0byBnZW5lcmF0ZSBwYXRoIHN0cmluZ3MuXG4gKlxuICogVXNlcyB7QGxpbmsgUGF0aFBvc2l4fSBmb3IgUGF0aCBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgUGF0aFNjdXJyeVBvc2l4IGV4dGVuZHMgUGF0aFNjdXJyeUJhc2Uge1xuICAgIC8qKlxuICAgICAqIHNlcGFyYXRvciBmb3IgZ2VuZXJhdGluZyBwYXRoIHN0cmluZ3NcbiAgICAgKi9cbiAgICBzZXAgPSAnLyc7XG4gICAgY29uc3RydWN0b3IoY3dkID0gcHJvY2Vzcy5jd2QoKSwgb3B0cyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgbm9jYXNlID0gZmFsc2UgfSA9IG9wdHM7XG4gICAgICAgIHN1cGVyKGN3ZCwgcG9zaXgsICcvJywgeyAuLi5vcHRzLCBub2Nhc2UgfSk7XG4gICAgICAgIHRoaXMubm9jYXNlID0gbm9jYXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwYXJzZVJvb3RQYXRoKF9kaXIpIHtcbiAgICAgICAgcmV0dXJuICcvJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgbmV3Um9vdChmcykge1xuICAgICAgICByZXR1cm4gbmV3IFBhdGhQb3NpeCh0aGlzLnJvb3RQYXRoLCBJRkRJUiwgdW5kZWZpbmVkLCB0aGlzLnJvb3RzLCB0aGlzLm5vY2FzZSwgdGhpcy5jaGlsZHJlbkNhY2hlKCksIHsgZnMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBwcm92aWRlZCBwYXRoIHN0cmluZyBpcyBhbiBhYnNvbHV0ZSBwYXRoXG4gICAgICovXG4gICAgaXNBYnNvbHV0ZShwKSB7XG4gICAgICAgIHJldHVybiBwLnN0YXJ0c1dpdGgoJy8nKTtcbiAgICB9XG59XG4vKipcbiAqIHtAbGluayBQYXRoU2N1cnJ5QmFzZX0gaW1wbGVtZW50YXRpb24gZm9yIERhcndpbiAobWFjT1MpIHN5c3RlbXMuXG4gKlxuICogRGVmYXVsdHMgdG8gY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlcyBgJy8nYCBmb3IgZ2VuZXJhdGluZyBwYXRoXG4gKiBzdHJpbmdzLlxuICpcbiAqIFVzZXMge0BsaW5rIFBhdGhQb3NpeH0gZm9yIFBhdGggb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhTY3VycnlEYXJ3aW4gZXh0ZW5kcyBQYXRoU2N1cnJ5UG9zaXgge1xuICAgIGNvbnN0cnVjdG9yKGN3ZCA9IHByb2Nlc3MuY3dkKCksIG9wdHMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IG5vY2FzZSA9IHRydWUgfSA9IG9wdHM7XG4gICAgICAgIHN1cGVyKGN3ZCwgeyAuLi5vcHRzLCBub2Nhc2UgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBEZWZhdWx0IHtAbGluayBQYXRoQmFzZX0gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICpcbiAqIHtAbGluayBQYXRoV2luMzJ9IG9uIFdpbmRvd3Mgc3lzdGVtcywge0BsaW5rIFBhdGhQb3NpeH0gb24gYWxsIG90aGVycy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBhdGggPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gUGF0aFdpbjMyIDogUGF0aFBvc2l4O1xuLyoqXG4gKiBEZWZhdWx0IHtAbGluayBQYXRoU2N1cnJ5QmFzZX0gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICpcbiAqIHtAbGluayBQYXRoU2N1cnJ5V2luMzJ9IG9uIFdpbmRvd3Mgc3lzdGVtcywge0BsaW5rIFBhdGhTY3VycnlEYXJ3aW59IG9uXG4gKiBEYXJ3aW4gKG1hY09TKSBzeXN0ZW1zLCB7QGxpbmsgUGF0aFNjdXJyeVBvc2l4fSBvbiBhbGwgb3RoZXJzLlxuICovXG5leHBvcnQgY29uc3QgUGF0aFNjdXJyeSA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBQYXRoU2N1cnJ5V2luMzJcbiAgICA6IHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nID8gUGF0aFNjdXJyeURhcndpblxuICAgICAgICA6IFBhdGhTY3VycnlQb3NpeDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiY29uc3QgcHJvYyA9IHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzXG4gICAgPyBwcm9jZXNzXG4gICAgOiB7XG4gICAgICAgIHN0ZG91dDogbnVsbCxcbiAgICAgICAgc3RkZXJyOiBudWxsLFxuICAgIH07XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdub2RlOmV2ZW50cyc7XG5pbXBvcnQgU3RyZWFtIGZyb20gJ25vZGU6c3RyZWFtJztcbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tICdub2RlOnN0cmluZ19kZWNvZGVyJztcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgTWluaXBhc3Mgc3RyZWFtLCBOb2RlIHN0cmVhbSwgb3Igc29tZXRoaW5nXG4gKiBlbHNlIHRoYXQgTWluaXBhc3MgY2FuIGludGVyYWN0IHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBpc1N0cmVhbSA9IChzKSA9PiAhIXMgJiZcbiAgICB0eXBlb2YgcyA9PT0gJ29iamVjdCcgJiZcbiAgICAocyBpbnN0YW5jZW9mIE1pbmlwYXNzIHx8XG4gICAgICAgIHMgaW5zdGFuY2VvZiBTdHJlYW0gfHxcbiAgICAgICAgaXNSZWFkYWJsZShzKSB8fFxuICAgICAgICBpc1dyaXRhYmxlKHMpKTtcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgdmFsaWQge0BsaW5rIE1pbmlwYXNzLlJlYWRhYmxlfVxuICovXG5leHBvcnQgY29uc3QgaXNSZWFkYWJsZSA9IChzKSA9PiAhIXMgJiZcbiAgICB0eXBlb2YgcyA9PT0gJ29iamVjdCcgJiZcbiAgICBzIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyICYmXG4gICAgdHlwZW9mIHMucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIC8vIG5vZGUgY29yZSBXcml0YWJsZSBzdHJlYW1zIGhhdmUgYSBwaXBlKCkgbWV0aG9kLCBidXQgaXQgdGhyb3dzXG4gICAgcy5waXBlICE9PSBTdHJlYW0uV3JpdGFibGUucHJvdG90eXBlLnBpcGU7XG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIHZhbGlkIHtAbGluayBNaW5pcGFzcy5Xcml0YWJsZX1cbiAqL1xuZXhwb3J0IGNvbnN0IGlzV3JpdGFibGUgPSAocykgPT4gISFzICYmXG4gICAgdHlwZW9mIHMgPT09ICdvYmplY3QnICYmXG4gICAgcyBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlciAmJlxuICAgIHR5cGVvZiBzLndyaXRlID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIHMuZW5kID09PSAnZnVuY3Rpb24nO1xuY29uc3QgRU9GID0gU3ltYm9sKCdFT0YnKTtcbmNvbnN0IE1BWUJFX0VNSVRfRU5EID0gU3ltYm9sKCdtYXliZUVtaXRFbmQnKTtcbmNvbnN0IEVNSVRURURfRU5EID0gU3ltYm9sKCdlbWl0dGVkRW5kJyk7XG5jb25zdCBFTUlUVElOR19FTkQgPSBTeW1ib2woJ2VtaXR0aW5nRW5kJyk7XG5jb25zdCBFTUlUVEVEX0VSUk9SID0gU3ltYm9sKCdlbWl0dGVkRXJyb3InKTtcbmNvbnN0IENMT1NFRCA9IFN5bWJvbCgnY2xvc2VkJyk7XG5jb25zdCBSRUFEID0gU3ltYm9sKCdyZWFkJyk7XG5jb25zdCBGTFVTSCA9IFN5bWJvbCgnZmx1c2gnKTtcbmNvbnN0IEZMVVNIQ0hVTksgPSBTeW1ib2woJ2ZsdXNoQ2h1bmsnKTtcbmNvbnN0IEVOQ09ESU5HID0gU3ltYm9sKCdlbmNvZGluZycpO1xuY29uc3QgREVDT0RFUiA9IFN5bWJvbCgnZGVjb2RlcicpO1xuY29uc3QgRkxPV0lORyA9IFN5bWJvbCgnZmxvd2luZycpO1xuY29uc3QgUEFVU0VEID0gU3ltYm9sKCdwYXVzZWQnKTtcbmNvbnN0IFJFU1VNRSA9IFN5bWJvbCgncmVzdW1lJyk7XG5jb25zdCBCVUZGRVIgPSBTeW1ib2woJ2J1ZmZlcicpO1xuY29uc3QgUElQRVMgPSBTeW1ib2woJ3BpcGVzJyk7XG5jb25zdCBCVUZGRVJMRU5HVEggPSBTeW1ib2woJ2J1ZmZlckxlbmd0aCcpO1xuY29uc3QgQlVGRkVSUFVTSCA9IFN5bWJvbCgnYnVmZmVyUHVzaCcpO1xuY29uc3QgQlVGRkVSU0hJRlQgPSBTeW1ib2woJ2J1ZmZlclNoaWZ0Jyk7XG5jb25zdCBPQkpFQ1RNT0RFID0gU3ltYm9sKCdvYmplY3RNb2RlJyk7XG4vLyBpbnRlcm5hbCBldmVudCB3aGVuIHN0cmVhbSBpcyBkZXN0cm95ZWRcbmNvbnN0IERFU1RST1lFRCA9IFN5bWJvbCgnZGVzdHJveWVkJyk7XG4vLyBpbnRlcm5hbCBldmVudCB3aGVuIHN0cmVhbSBoYXMgYW4gZXJyb3JcbmNvbnN0IEVSUk9SID0gU3ltYm9sKCdlcnJvcicpO1xuY29uc3QgRU1JVERBVEEgPSBTeW1ib2woJ2VtaXREYXRhJyk7XG5jb25zdCBFTUlURU5EID0gU3ltYm9sKCdlbWl0RW5kJyk7XG5jb25zdCBFTUlURU5EMiA9IFN5bWJvbCgnZW1pdEVuZDInKTtcbmNvbnN0IEFTWU5DID0gU3ltYm9sKCdhc3luYycpO1xuY29uc3QgQUJPUlQgPSBTeW1ib2woJ2Fib3J0Jyk7XG5jb25zdCBBQk9SVEVEID0gU3ltYm9sKCdhYm9ydGVkJyk7XG5jb25zdCBTSUdOQUwgPSBTeW1ib2woJ3NpZ25hbCcpO1xuY29uc3QgREFUQUxJU1RFTkVSUyA9IFN5bWJvbCgnZGF0YUxpc3RlbmVycycpO1xuY29uc3QgRElTQ0FSREVEID0gU3ltYm9sKCdkaXNjYXJkZWQnKTtcbmNvbnN0IGRlZmVyID0gKGZuKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZuKTtcbmNvbnN0IG5vZGVmZXIgPSAoZm4pID0+IGZuKCk7XG5jb25zdCBpc0VuZGlzaCA9IChldikgPT4gZXYgPT09ICdlbmQnIHx8IGV2ID09PSAnZmluaXNoJyB8fCBldiA9PT0gJ3ByZWZpbmlzaCc7XG5jb25zdCBpc0FycmF5QnVmZmVyTGlrZSA9IChiKSA9PiBiIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAoISFiICYmXG4gICAgICAgIHR5cGVvZiBiID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBiLmNvbnN0cnVjdG9yICYmXG4gICAgICAgIGIuY29uc3RydWN0b3IubmFtZSA9PT0gJ0FycmF5QnVmZmVyJyAmJlxuICAgICAgICBiLmJ5dGVMZW5ndGggPj0gMCk7XG5jb25zdCBpc0FycmF5QnVmZmVyVmlldyA9IChiKSA9PiAhQnVmZmVyLmlzQnVmZmVyKGIpICYmIEFycmF5QnVmZmVyLmlzVmlldyhiKTtcbi8qKlxuICogSW50ZXJuYWwgY2xhc3MgcmVwcmVzZW50aW5nIGEgcGlwZSB0byBhIGRlc3RpbmF0aW9uIHN0cmVhbS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgUGlwZSB7XG4gICAgc3JjO1xuICAgIGRlc3Q7XG4gICAgb3B0cztcbiAgICBvbmRyYWluO1xuICAgIGNvbnN0cnVjdG9yKHNyYywgZGVzdCwgb3B0cykge1xuICAgICAgICB0aGlzLnNyYyA9IHNyYztcbiAgICAgICAgdGhpcy5kZXN0ID0gZGVzdDtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5vbmRyYWluID0gKCkgPT4gc3JjW1JFU1VNRV0oKTtcbiAgICAgICAgdGhpcy5kZXN0Lm9uKCdkcmFpbicsIHRoaXMub25kcmFpbik7XG4gICAgfVxuICAgIHVucGlwZSgpIHtcbiAgICAgICAgdGhpcy5kZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIHRoaXMub25kcmFpbik7XG4gICAgfVxuICAgIC8vIG9ubHkgaGVyZSBmb3IgdGhlIHByb3RvdHlwZVxuICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgIHByb3h5RXJyb3JzKF9lcikgeyB9XG4gICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICBlbmQoKSB7XG4gICAgICAgIHRoaXMudW5waXBlKCk7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZW5kKVxuICAgICAgICAgICAgdGhpcy5kZXN0LmVuZCgpO1xuICAgIH1cbn1cbi8qKlxuICogSW50ZXJuYWwgY2xhc3MgcmVwcmVzZW50aW5nIGEgcGlwZSB0byBhIGRlc3RpbmF0aW9uIHN0cmVhbSB3aGVyZVxuICogZXJyb3JzIGFyZSBwcm94aWVkLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBQaXBlUHJveHlFcnJvcnMgZXh0ZW5kcyBQaXBlIHtcbiAgICB1bnBpcGUoKSB7XG4gICAgICAgIHRoaXMuc3JjLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIHRoaXMucHJveHlFcnJvcnMpO1xuICAgICAgICBzdXBlci51bnBpcGUoKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc3JjLCBkZXN0LCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKHNyYywgZGVzdCwgb3B0cyk7XG4gICAgICAgIHRoaXMucHJveHlFcnJvcnMgPSBlciA9PiBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgICAgICBzcmMub24oJ2Vycm9yJywgdGhpcy5wcm94eUVycm9ycyk7XG4gICAgfVxufVxuY29uc3QgaXNPYmplY3RNb2RlT3B0aW9ucyA9IChvKSA9PiAhIW8ub2JqZWN0TW9kZTtcbmNvbnN0IGlzRW5jb2RpbmdPcHRpb25zID0gKG8pID0+ICFvLm9iamVjdE1vZGUgJiYgISFvLmVuY29kaW5nICYmIG8uZW5jb2RpbmcgIT09ICdidWZmZXInO1xuLyoqXG4gKiBNYWluIGV4cG9ydCwgdGhlIE1pbmlwYXNzIGNsYXNzXG4gKlxuICogYFJUeXBlYCBpcyB0aGUgdHlwZSBvZiBkYXRhIGVtaXR0ZWQsIGRlZmF1bHRzIHRvIEJ1ZmZlclxuICpcbiAqIGBXVHlwZWAgaXMgdGhlIHR5cGUgb2YgZGF0YSB0byBiZSB3cml0dGVuLCBpZiBSVHlwZSBpcyBidWZmZXIgb3Igc3RyaW5nLFxuICogdGhlbiBhbnkge0BsaW5rIE1pbmlwYXNzLkNvbnRpZ3VvdXNEYXRhfSBpcyBhbGxvd2VkLlxuICpcbiAqIGBFdmVudHNgIGlzIHRoZSBzZXQgb2YgZXZlbnQgaGFuZGxlciBzaWduYXR1cmVzIHRoYXQgdGhpcyBvYmplY3RcbiAqIHdpbGwgZW1pdCwgc2VlIHtAbGluayBNaW5pcGFzcy5FdmVudHN9XG4gKi9cbmV4cG9ydCBjbGFzcyBNaW5pcGFzcyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgW0ZMT1dJTkddID0gZmFsc2U7XG4gICAgW1BBVVNFRF0gPSBmYWxzZTtcbiAgICBbUElQRVNdID0gW107XG4gICAgW0JVRkZFUl0gPSBbXTtcbiAgICBbT0JKRUNUTU9ERV07XG4gICAgW0VOQ09ESU5HXTtcbiAgICBbQVNZTkNdO1xuICAgIFtERUNPREVSXTtcbiAgICBbRU9GXSA9IGZhbHNlO1xuICAgIFtFTUlUVEVEX0VORF0gPSBmYWxzZTtcbiAgICBbRU1JVFRJTkdfRU5EXSA9IGZhbHNlO1xuICAgIFtDTE9TRURdID0gZmFsc2U7XG4gICAgW0VNSVRURURfRVJST1JdID0gbnVsbDtcbiAgICBbQlVGRkVSTEVOR1RIXSA9IDA7XG4gICAgW0RFU1RST1lFRF0gPSBmYWxzZTtcbiAgICBbU0lHTkFMXTtcbiAgICBbQUJPUlRFRF0gPSBmYWxzZTtcbiAgICBbREFUQUxJU1RFTkVSU10gPSAwO1xuICAgIFtESVNDQVJERURdID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiB0aGUgc3RyZWFtIGNhbiBiZSB3cml0dGVuXG4gICAgICovXG4gICAgd3JpdGFibGUgPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIHRydWUgaWYgdGhlIHN0cmVhbSBjYW4gYmUgcmVhZFxuICAgICAqL1xuICAgIHJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBJZiBgUlR5cGVgIGlzIEJ1ZmZlciwgdGhlbiBvcHRpb25zIGRvIG5vdCBuZWVkIHRvIGJlIHByb3ZpZGVkLlxuICAgICAqIE90aGVyd2lzZSwgYW4gb3B0aW9ucyBvYmplY3QgbXVzdCBiZSBwcm92aWRlZCB0byBzcGVjaWZ5IGVpdGhlclxuICAgICAqIHtAbGluayBNaW5pcGFzcy5TaGFyZWRPcHRpb25zLm9iamVjdE1vZGV9IG9yXG4gICAgICoge0BsaW5rIE1pbmlwYXNzLlNoYXJlZE9wdGlvbnMuZW5jb2Rpbmd9LCBhcyBhcHByb3ByaWF0ZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1swXSB8fFxuICAgICAgICAgICAge30pO1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAob3B0aW9ucy5vYmplY3RNb2RlICYmIHR5cGVvZiBvcHRpb25zLmVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW5jb2RpbmcgYW5kIG9iamVjdE1vZGUgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT2JqZWN0TW9kZU9wdGlvbnMob3B0aW9ucykpIHtcbiAgICAgICAgICAgIHRoaXNbT0JKRUNUTU9ERV0gPSB0cnVlO1xuICAgICAgICAgICAgdGhpc1tFTkNPRElOR10gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzRW5jb2RpbmdPcHRpb25zKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzW0VOQ09ESU5HXSA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gICAgICAgICAgICB0aGlzW09CSkVDVE1PREVdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzW09CSkVDVE1PREVdID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzW0VOQ09ESU5HXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpc1tBU1lOQ10gPSAhIW9wdGlvbnMuYXN5bmM7XG4gICAgICAgIHRoaXNbREVDT0RFUl0gPSB0aGlzW0VOQ09ESU5HXVxuICAgICAgICAgICAgPyBuZXcgU3RyaW5nRGVjb2Rlcih0aGlzW0VOQ09ESU5HXSlcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgLy9AdHMtaWdub3JlIC0gcHJpdmF0ZSBvcHRpb24gZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZ1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlYnVnRXhwb3NlQnVmZmVyID09PSB0cnVlKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2J1ZmZlcicsIHsgZ2V0OiAoKSA9PiB0aGlzW0JVRkZFUl0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9AdHMtaWdub3JlIC0gcHJpdmF0ZSBvcHRpb24gZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZ1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlYnVnRXhwb3NlUGlwZXMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncGlwZXMnLCB7IGdldDogKCkgPT4gdGhpc1tQSVBFU10gfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzaWduYWwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHRoaXNbU0lHTkFMXSA9IHNpZ25hbDtcbiAgICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXNbQUJPUlRdKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzW0FCT1JUXSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGRhdGEgc3RvcmVkIGluIHRoZSBidWZmZXIgd2FpdGluZyB0byBiZSByZWFkLlxuICAgICAqXG4gICAgICogRm9yIEJ1ZmZlciBzdHJpbmdzLCB0aGlzIHdpbGwgYmUgdGhlIHRvdGFsIGJ5dGUgbGVuZ3RoLlxuICAgICAqIEZvciBzdHJpbmcgZW5jb2Rpbmcgc3RyZWFtcywgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgY2hhcmFjdGVyIGxlbmd0aCxcbiAgICAgKiBhY2NvcmRpbmcgdG8gSmF2YVNjcmlwdCdzIGBzdHJpbmcubGVuZ3RoYCBsb2dpYy5cbiAgICAgKiBGb3Igb2JqZWN0TW9kZSBzdHJlYW1zLCB0aGlzIGlzIGEgY291bnQgb2YgdGhlIGl0ZW1zIHdhaXRpbmcgdG8gYmVcbiAgICAgKiBlbWl0dGVkLlxuICAgICAqL1xuICAgIGdldCBidWZmZXJMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW0JVRkZFUkxFTkdUSF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBgQnVmZmVyRW5jb2RpbmdgIGN1cnJlbnRseSBpbiB1c2UsIG9yIGBudWxsYFxuICAgICAqL1xuICAgIGdldCBlbmNvZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbRU5DT0RJTkddO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCAtIFRoaXMgaXMgYSByZWFkIG9ubHkgcHJvcGVydHlcbiAgICAgKi9cbiAgICBzZXQgZW5jb2RpbmcoX2VuYykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY29kaW5nIG11c3QgYmUgc2V0IGF0IGluc3RhbnRpYXRpb24gdGltZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCAtIEVuY29kaW5nIG1heSBvbmx5IGJlIHNldCBhdCBpbnN0YW50aWF0aW9uIHRpbWVcbiAgICAgKi9cbiAgICBzZXRFbmNvZGluZyhfZW5jKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5jb2RpbmcgbXVzdCBiZSBzZXQgYXQgaW5zdGFudGlhdGlvbiB0aW1lJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhpcyBpcyBhbiBvYmplY3RNb2RlIHN0cmVhbVxuICAgICAqL1xuICAgIGdldCBvYmplY3RNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tPQkpFQ1RNT0RFXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgLSBUaGlzIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5XG4gICAgICovXG4gICAgc2V0IG9iamVjdE1vZGUoX29tKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb2JqZWN0TW9kZSBtdXN0IGJlIHNldCBhdCBpbnN0YW50aWF0aW9uIHRpbWUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiB0aGlzIGlzIGFuIGFzeW5jIHN0cmVhbVxuICAgICAqL1xuICAgIGdldCBbJ2FzeW5jJ10oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW0FTWU5DXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRvIHRydWUgdG8gbWFrZSB0aGlzIHN0cmVhbSBhc3luYy5cbiAgICAgKlxuICAgICAqIE9uY2Ugc2V0LCBpdCBjYW5ub3QgYmUgdW5zZXQsIGFzIHRoaXMgd291bGQgcG90ZW50aWFsbHkgY2F1c2UgaW5jb3JyZWN0XG4gICAgICogYmVoYXZpb3IuICBJZSwgYSBzeW5jIHN0cmVhbSBjYW4gYmUgbWFkZSBhc3luYywgYnV0IGFuIGFzeW5jIHN0cmVhbVxuICAgICAqIGNhbm5vdCBiZSBzYWZlbHkgbWFkZSBzeW5jLlxuICAgICAqL1xuICAgIHNldCBbJ2FzeW5jJ10oYSkge1xuICAgICAgICB0aGlzW0FTWU5DXSA9IHRoaXNbQVNZTkNdIHx8ICEhYTtcbiAgICB9XG4gICAgLy8gZHJvcCBldmVyeXRoaW5nIGFuZCBnZXQgb3V0IG9mIHRoZSBmbG93IGNvbXBsZXRlbHlcbiAgICBbQUJPUlRdKCkge1xuICAgICAgICB0aGlzW0FCT1JURURdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbWl0KCdhYm9ydCcsIHRoaXNbU0lHTkFMXT8ucmVhc29uKTtcbiAgICAgICAgdGhpcy5kZXN0cm95KHRoaXNbU0lHTkFMXT8ucmVhc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGFib3J0ZWQuXG4gICAgICovXG4gICAgZ2V0IGFib3J0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW0FCT1JURURdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOby1vcCBzZXR0ZXIuIFN0cmVhbSBhYm9ydGVkIHN0YXR1cyBpcyBzZXQgdmlhIHRoZSBBYm9ydFNpZ25hbCBwcm92aWRlZFxuICAgICAqIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLlxuICAgICAqL1xuICAgIHNldCBhYm9ydGVkKF8pIHsgfVxuICAgIHdyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICAgICAgaWYgKHRoaXNbQUJPUlRFRF0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzW0VPRl0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAgICAgICBpZiAodGhpc1tERVNUUk9ZRURdKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIHdyaXRlIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWQnKSwgeyBjb2RlOiAnRVJSX1NUUkVBTV9ERVNUUk9ZRUQnIH0pKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgICAgICAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVuY29kaW5nKVxuICAgICAgICAgICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpc1tBU1lOQ10gPyBkZWZlciA6IG5vZGVmZXI7XG4gICAgICAgIC8vIGNvbnZlcnQgYXJyYXkgYnVmZmVycyBhbmQgdHlwZWQgYXJyYXkgdmlld3MgaW50byBidWZmZXJzXG4gICAgICAgIC8vIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSwgd2UgbWF5IHdhbnQgdG8gZG8gdGhlIG9wcG9zaXRlIVxuICAgICAgICAvLyBsZWF2ZSBzdHJpbmdzIGFuZCBidWZmZXJzIGFzLWlzXG4gICAgICAgIC8vIGFueXRoaW5nIGlzIG9ubHkgYWxsb3dlZCBpZiBpbiBvYmplY3QgbW9kZSwgc28gdGhyb3dcbiAgICAgICAgaWYgKCF0aGlzW09CSkVDVE1PREVdICYmICFCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlclZpZXcoY2h1bmspKSB7XG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlIC0gc2luZnVsIHVuc2FmZSB0eXBlIGNoYW5naW5nXG4gICAgICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuay5idWZmZXIsIGNodW5rLmJ5dGVPZmZzZXQsIGNodW5rLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUJ1ZmZlckxpa2UoY2h1bmspKSB7XG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlIC0gc2luZnVsIHVuc2FmZSB0eXBlIGNoYW5naW5nXG4gICAgICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb24tY29udGlndW91cyBkYXRhIHdyaXR0ZW4gdG8gbm9uLW9iamVjdE1vZGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGFuZGxlIG9iamVjdCBtb2RlIHVwIGZyb250LCBzaW5jZSBpdCdzIHNpbXBsZXJcbiAgICAgICAgLy8gdGhpcyB5aWVsZHMgYmV0dGVyIHBlcmZvcm1hbmNlLCBmZXdlciBjaGVja3MgbGF0ZXIuXG4gICAgICAgIGlmICh0aGlzW09CSkVDVE1PREVdKSB7XG4gICAgICAgICAgICAvLyBtYXliZSBpbXBvc3NpYmxlP1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICBpZiAodGhpc1tGTE9XSU5HXSAmJiB0aGlzW0JVRkZFUkxFTkdUSF0gIT09IDApXG4gICAgICAgICAgICAgICAgdGhpc1tGTFVTSF0odHJ1ZSk7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgaWYgKHRoaXNbRkxPV0lOR10pXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXNbQlVGRkVSUFVTSF0oY2h1bmspO1xuICAgICAgICAgICAgaWYgKHRoaXNbQlVGRkVSTEVOR1RIXSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlYWRhYmxlJyk7XG4gICAgICAgICAgICBpZiAoY2IpXG4gICAgICAgICAgICAgICAgZm4oY2IpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbRkxPV0lOR107XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgY2h1bmsgaXMgYSBidWZmZXIgb3Igc3RyaW5nXG4gICAgICAgIC8vIGRvbid0IGJ1ZmZlciBpdCB1cCBvciBzZW5kIGl0IHRvIHRoZSBkZWNvZGVyXG4gICAgICAgIGlmICghY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpc1tCVUZGRVJMRU5HVEhdICE9PSAwKVxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgncmVhZGFibGUnKTtcbiAgICAgICAgICAgIGlmIChjYilcbiAgICAgICAgICAgICAgICBmbihjYik7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1tGTE9XSU5HXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmYXN0LXBhdGggd3JpdGluZyBzdHJpbmdzIG9mIHNhbWUgZW5jb2RpbmcgdG8gYSBzdHJlYW0gd2l0aFxuICAgICAgICAvLyBhbiBlbXB0eSBidWZmZXIsIHNraXBwaW5nIHRoZSBidWZmZXIvZGVjb2RlciBkYW5jZVxuICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgLy8gdW5sZXNzIGl0IGlzIGEgc3RyaW5nIGFscmVhZHkgcmVhZHkgZm9yIHVzIHRvIHVzZVxuICAgICAgICAgICAgIShlbmNvZGluZyA9PT0gdGhpc1tFTkNPRElOR10gJiYgIXRoaXNbREVDT0RFUl0/Lmxhc3ROZWVkKSkge1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlIC0gc2luZnVsIHVuc2FmZSB0eXBlIGNoYW5nZVxuICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHRoaXNbRU5DT0RJTkddKSB7XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmUgLSBzaW5mdWwgdW5zYWZlIHR5cGUgY2hhbmdlXG4gICAgICAgICAgICBjaHVuayA9IHRoaXNbREVDT0RFUl0ud3JpdGUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IGZsdXNoaW5nIENBTiBwb3RlbnRpYWxseSBzd2l0Y2ggdXMgaW50byBub3QtZmxvd2luZyBtb2RlXG4gICAgICAgIGlmICh0aGlzW0ZMT1dJTkddICYmIHRoaXNbQlVGRkVSTEVOR1RIXSAhPT0gMClcbiAgICAgICAgICAgIHRoaXNbRkxVU0hdKHRydWUpO1xuICAgICAgICBpZiAodGhpc1tGTE9XSU5HXSlcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpc1tCVUZGRVJQVVNIXShjaHVuayk7XG4gICAgICAgIGlmICh0aGlzW0JVRkZFUkxFTkdUSF0gIT09IDApXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlYWRhYmxlJyk7XG4gICAgICAgIGlmIChjYilcbiAgICAgICAgICAgIGZuKGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXNbRkxPV0lOR107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvdy1sZXZlbCBleHBsaWNpdCByZWFkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEluIG9iamVjdE1vZGUsIHRoZSBhcmd1bWVudCBpcyBpZ25vcmVkLCBhbmQgb25lIGl0ZW0gaXMgcmV0dXJuZWQgaWZcbiAgICAgKiBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBgbmAgaXMgdGhlIG51bWJlciBvZiBieXRlcyAob3IgaW4gdGhlIGNhc2Ugb2YgZW5jb2Rpbmcgc3RyZWFtcyxcbiAgICAgKiBjaGFyYWN0ZXJzKSB0byBjb25zdW1lLiBJZiBgbmAgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoZSBlbnRpcmUgYnVmZmVyXG4gICAgICogaXMgcmV0dXJuZWQsIG9yIGBudWxsYCBpcyByZXR1cm5lZCBpZiBubyBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIElmIGBuYCBpcyBncmVhdGVyIHRoYXQgdGhlIGFtb3VudCBvZiBkYXRhIGluIHRoZSBpbnRlcm5hbCBidWZmZXIsXG4gICAgICogdGhlbiBgbnVsbGAgaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcmVhZChuKSB7XG4gICAgICAgIGlmICh0aGlzW0RFU1RST1lFRF0pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpc1tESVNDQVJERURdID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzW0JVRkZFUkxFTkdUSF0gPT09IDAgfHxcbiAgICAgICAgICAgIG4gPT09IDAgfHxcbiAgICAgICAgICAgIChuICYmIG4gPiB0aGlzW0JVRkZFUkxFTkdUSF0pKSB7XG4gICAgICAgICAgICB0aGlzW01BWUJFX0VNSVRfRU5EXSgpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXNbT0JKRUNUTU9ERV0pXG4gICAgICAgICAgICBuID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXNbQlVGRkVSXS5sZW5ndGggPiAxICYmICF0aGlzW09CSkVDVE1PREVdKSB7XG4gICAgICAgICAgICAvLyBub3Qgb2JqZWN0IG1vZGUsIHNvIGlmIHdlIGhhdmUgYW4gZW5jb2RpbmcsIHRoZW4gUlR5cGUgaXMgc3RyaW5nXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UsIG11c3QgYmUgQnVmZmVyXG4gICAgICAgICAgICB0aGlzW0JVRkZFUl0gPSBbXG4gICAgICAgICAgICAgICAgKHRoaXNbRU5DT0RJTkddXG4gICAgICAgICAgICAgICAgICAgID8gdGhpc1tCVUZGRVJdLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgICAgIDogQnVmZmVyLmNvbmNhdCh0aGlzW0JVRkZFUl0sIHRoaXNbQlVGRkVSTEVOR1RIXSkpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXQgPSB0aGlzW1JFQURdKG4gfHwgbnVsbCwgdGhpc1tCVUZGRVJdWzBdKTtcbiAgICAgICAgdGhpc1tNQVlCRV9FTUlUX0VORF0oKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgW1JFQURdKG4sIGNodW5rKSB7XG4gICAgICAgIGlmICh0aGlzW09CSkVDVE1PREVdKVxuICAgICAgICAgICAgdGhpc1tCVUZGRVJTSElGVF0oKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY2h1bms7XG4gICAgICAgICAgICBpZiAobiA9PT0gYy5sZW5ndGggfHwgbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICB0aGlzW0JVRkZFUlNISUZUXSgpO1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tCVUZGRVJdWzBdID0gYy5zbGljZShuKTtcbiAgICAgICAgICAgICAgICBjaHVuayA9IGMuc2xpY2UoMCwgbik7XG4gICAgICAgICAgICAgICAgdGhpc1tCVUZGRVJMRU5HVEhdIC09IG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzW0JVRkZFUl1bMF0gPSBjLnN1YmFycmF5KG4pO1xuICAgICAgICAgICAgICAgIGNodW5rID0gYy5zdWJhcnJheSgwLCBuKTtcbiAgICAgICAgICAgICAgICB0aGlzW0JVRkZFUkxFTkdUSF0gLT0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgIGlmICghdGhpc1tCVUZGRVJdLmxlbmd0aCAmJiAhdGhpc1tFT0ZdKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkcmFpbicpO1xuICAgICAgICByZXR1cm4gY2h1bms7XG4gICAgfVxuICAgIGVuZChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNiID0gY2h1bms7XG4gICAgICAgICAgICBjaHVuayA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYiA9IGVuY29kaW5nO1xuICAgICAgICAgICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNodW5rICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICAgIGlmIChjYilcbiAgICAgICAgICAgIHRoaXMub25jZSgnZW5kJywgY2IpO1xuICAgICAgICB0aGlzW0VPRl0gPSB0cnVlO1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIC8vIGlmIHdlIGhhdmVuJ3Qgd3JpdHRlbiBhbnl0aGluZywgdGhlbiBnbyBhaGVhZCBhbmQgZW1pdCxcbiAgICAgICAgLy8gZXZlbiBpZiB3ZSdyZSBub3QgcmVhZGluZy5cbiAgICAgICAgLy8gd2UnbGwgcmUtZW1pdCBpZiBhIG5ldyAnZW5kJyBsaXN0ZW5lciBpcyBhZGRlZCBhbnl3YXkuXG4gICAgICAgIC8vIFRoaXMgbWFrZXMgTVAgbW9yZSBzdWl0YWJsZSB0byB3cml0ZS1vbmx5IHVzZSBjYXNlcy5cbiAgICAgICAgaWYgKHRoaXNbRkxPV0lOR10gfHwgIXRoaXNbUEFVU0VEXSlcbiAgICAgICAgICAgIHRoaXNbTUFZQkVfRU1JVF9FTkRdKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBkb24ndCBsZXQgdGhlIGludGVybmFsIHJlc3VtZSBiZSBvdmVyd3JpdHRlblxuICAgIFtSRVNVTUVdKCkge1xuICAgICAgICBpZiAodGhpc1tERVNUUk9ZRURdKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXNbREFUQUxJU1RFTkVSU10gJiYgIXRoaXNbUElQRVNdLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpc1tESVNDQVJERURdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzW1BBVVNFRF0gPSBmYWxzZTtcbiAgICAgICAgdGhpc1tGTE9XSU5HXSA9IHRydWU7XG4gICAgICAgIHRoaXMuZW1pdCgncmVzdW1lJyk7XG4gICAgICAgIGlmICh0aGlzW0JVRkZFUl0ubGVuZ3RoKVxuICAgICAgICAgICAgdGhpc1tGTFVTSF0oKTtcbiAgICAgICAgZWxzZSBpZiAodGhpc1tFT0ZdKVxuICAgICAgICAgICAgdGhpc1tNQVlCRV9FTUlUX0VORF0oKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkcmFpbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIHN0cmVhbSBpZiBpdCBpcyBjdXJyZW50bHkgaW4gYSBwYXVzZWQgc3RhdGVcbiAgICAgKlxuICAgICAqIElmIGNhbGxlZCB3aGVuIHRoZXJlIGFyZSBubyBwaXBlIGRlc3RpbmF0aW9ucyBvciBgZGF0YWAgZXZlbnQgbGlzdGVuZXJzLFxuICAgICAqIHRoaXMgd2lsbCBwbGFjZSB0aGUgc3RyZWFtIGluIGEgXCJkaXNjYXJkZWRcIiBzdGF0ZSwgd2hlcmUgYWxsIGRhdGEgd2lsbFxuICAgICAqIGJlIHRocm93biBhd2F5LiBUaGUgZGlzY2FyZGVkIHN0YXRlIGlzIHJlbW92ZWQgaWYgYSBwaXBlIGRlc3RpbmF0aW9uIG9yXG4gICAgICogZGF0YSBoYW5kbGVyIGlzIGFkZGVkLCBpZiBwYXVzZSgpIGlzIGNhbGxlZCwgb3IgaWYgYW55IHN5bmNocm9ub3VzIG9yXG4gICAgICogYXN5bmNocm9ub3VzIGl0ZXJhdGlvbiBpcyBzdGFydGVkLlxuICAgICAqL1xuICAgIHJlc3VtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbUkVTVU1FXSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgc3RyZWFtXG4gICAgICovXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXNbRkxPV0lOR10gPSBmYWxzZTtcbiAgICAgICAgdGhpc1tQQVVTRURdID0gdHJ1ZTtcbiAgICAgICAgdGhpc1tESVNDQVJERURdID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHRydWUgaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBmb3JjaWJseSBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBnZXQgZGVzdHJveWVkKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tERVNUUk9ZRURdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgY3VycmVudGx5IGluIGEgZmxvd2luZyBzdGF0ZSwgbWVhbmluZyB0aGF0XG4gICAgICogYW55IHdyaXRlcyB3aWxsIGJlIGltbWVkaWF0ZWx5IGVtaXR0ZWQuXG4gICAgICovXG4gICAgZ2V0IGZsb3dpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW0ZMT1dJTkddO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgY3VycmVudGx5IGluIGEgcGF1c2VkIHN0YXRlXG4gICAgICovXG4gICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbUEFVU0VEXTtcbiAgICB9XG4gICAgW0JVRkZFUlBVU0hdKGNodW5rKSB7XG4gICAgICAgIGlmICh0aGlzW09CSkVDVE1PREVdKVxuICAgICAgICAgICAgdGhpc1tCVUZGRVJMRU5HVEhdICs9IDE7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXNbQlVGRkVSTEVOR1RIXSArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgIHRoaXNbQlVGRkVSXS5wdXNoKGNodW5rKTtcbiAgICB9XG4gICAgW0JVRkZFUlNISUZUXSgpIHtcbiAgICAgICAgaWYgKHRoaXNbT0JKRUNUTU9ERV0pXG4gICAgICAgICAgICB0aGlzW0JVRkZFUkxFTkdUSF0gLT0gMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpc1tCVUZGRVJMRU5HVEhdIC09IHRoaXNbQlVGRkVSXVswXS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzW0JVRkZFUl0uc2hpZnQoKTtcbiAgICB9XG4gICAgW0ZMVVNIXShub0RyYWluID0gZmFsc2UpIHtcbiAgICAgICAgZG8geyB9IHdoaWxlICh0aGlzW0ZMVVNIQ0hVTktdKHRoaXNbQlVGRkVSU0hJRlRdKCkpICYmXG4gICAgICAgICAgICB0aGlzW0JVRkZFUl0ubGVuZ3RoKTtcbiAgICAgICAgaWYgKCFub0RyYWluICYmICF0aGlzW0JVRkZFUl0ubGVuZ3RoICYmICF0aGlzW0VPRl0pXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RyYWluJyk7XG4gICAgfVxuICAgIFtGTFVTSENIVU5LXShjaHVuaykge1xuICAgICAgICB0aGlzLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgIHJldHVybiB0aGlzW0ZMT1dJTkddO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQaXBlIGFsbCBkYXRhIGVtaXR0ZWQgYnkgdGhpcyBzdHJlYW0gaW50byB0aGUgZGVzdGluYXRpb24gcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBUcmlnZ2VycyB0aGUgZmxvdyBvZiBkYXRhLlxuICAgICAqL1xuICAgIHBpcGUoZGVzdCwgb3B0cykge1xuICAgICAgICBpZiAodGhpc1tERVNUUk9ZRURdKVxuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIHRoaXNbRElTQ0FSREVEXSA9IGZhbHNlO1xuICAgICAgICBjb25zdCBlbmRlZCA9IHRoaXNbRU1JVFRFRF9FTkRdO1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICAgICAgaWYgKGRlc3QgPT09IHByb2Muc3Rkb3V0IHx8IGRlc3QgPT09IHByb2Muc3RkZXJyKVxuICAgICAgICAgICAgb3B0cy5lbmQgPSBmYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgb3B0cy5lbmQgPSBvcHRzLmVuZCAhPT0gZmFsc2U7XG4gICAgICAgIG9wdHMucHJveHlFcnJvcnMgPSAhIW9wdHMucHJveHlFcnJvcnM7XG4gICAgICAgIC8vIHBpcGluZyBhbiBlbmRlZCBzdHJlYW0gZW5kcyBpbW1lZGlhdGVseVxuICAgICAgICBpZiAoZW5kZWQpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLmVuZClcbiAgICAgICAgICAgICAgICBkZXN0LmVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gXCJhc1wiIGhlcmUganVzdCBpZ25vcmVzIHRoZSBXVHlwZSwgd2hpY2ggcGlwZXMgZG9uJ3QgY2FyZSBhYm91dCxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgb25seSBjb25zdW1pbmcgZnJvbSB1cywgYW5kIHdyaXRpbmcgdG8gdGhlIGRlc3RcbiAgICAgICAgICAgIHRoaXNbUElQRVNdLnB1c2goIW9wdHMucHJveHlFcnJvcnNcbiAgICAgICAgICAgICAgICA/IG5ldyBQaXBlKHRoaXMsIGRlc3QsIG9wdHMpXG4gICAgICAgICAgICAgICAgOiBuZXcgUGlwZVByb3h5RXJyb3JzKHRoaXMsIGRlc3QsIG9wdHMpKTtcbiAgICAgICAgICAgIGlmICh0aGlzW0FTWU5DXSlcbiAgICAgICAgICAgICAgICBkZWZlcigoKSA9PiB0aGlzW1JFU1VNRV0oKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpc1tSRVNVTUVdKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZ1bGx5IHVuaG9vayBhIHBpcGVkIGRlc3RpbmF0aW9uIHN0cmVhbS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gd2FzIHRoZSBvbmx5IGNvbnN1bWVyIG9mIHRoaXMgc3RyZWFtIChpZSxcbiAgICAgKiB0aGVyZSBhcmUgbm8gb3RoZXIgcGlwZWQgZGVzdGluYXRpb25zIG9yIGAnZGF0YSdgIGV2ZW50IGxpc3RlbmVycylcbiAgICAgKiB0aGVuIHRoZSBmbG93IG9mIGRhdGEgd2lsbCBzdG9wIHVudGlsIHRoZXJlIGlzIGFub3RoZXIgY29uc3VtZXIgb3JcbiAgICAgKiB7QGxpbmsgTWluaXBhc3MjcmVzdW1lfSBpcyBleHBsaWNpdGx5IGNhbGxlZC5cbiAgICAgKi9cbiAgICB1bnBpcGUoZGVzdCkge1xuICAgICAgICBjb25zdCBwID0gdGhpc1tQSVBFU10uZmluZChwID0+IHAuZGVzdCA9PT0gZGVzdCk7XG4gICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICBpZiAodGhpc1tQSVBFU10ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbRkxPV0lOR10gJiYgdGhpc1tEQVRBTElTVEVORVJTXSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW0ZMT1dJTkddID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXNbUElQRVNdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpc1tQSVBFU10uc3BsaWNlKHRoaXNbUElQRVNdLmluZGV4T2YocCksIDEpO1xuICAgICAgICAgICAgcC51bnBpcGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Ige0BsaW5rIE1pbmlwYXNzI29ufVxuICAgICAqL1xuICAgIGFkZExpc3RlbmVyKGV2LCBoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9uKGV2LCBoYW5kbGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW9zdGx5IGlkZW50aWNhbCB0byBgRXZlbnRFbWl0dGVyLm9uYCwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAgICogYmVoYXZpb3IgZGlmZmVyZW5jZXMgdG8gcHJldmVudCBkYXRhIGxvc3MgYW5kIHVubmVjZXNzYXJ5IGhhbmdzOlxuICAgICAqXG4gICAgICogLSBBZGRpbmcgYSAnZGF0YScgZXZlbnQgaGFuZGxlciB3aWxsIHRyaWdnZXIgdGhlIGZsb3cgb2YgZGF0YVxuICAgICAqXG4gICAgICogLSBBZGRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGhhbmRsZXIgd2hlbiB0aGVyZSBpcyBkYXRhIHdhaXRpbmcgdG8gYmUgcmVhZFxuICAgICAqICAgd2lsbCBjYXVzZSAncmVhZGFibGUnIHRvIGJlIGVtaXR0ZWQgaW1tZWRpYXRlbHkuXG4gICAgICpcbiAgICAgKiAtIEFkZGluZyBhbiAnZW5kaXNoJyBldmVudCBoYW5kbGVyICgnZW5kJywgJ2ZpbmlzaCcsIGV0Yy4pIHdoaWNoIGhhc1xuICAgICAqICAgYWxyZWFkeSBwYXNzZWQgd2lsbCBjYXVzZSB0aGUgZXZlbnQgdG8gYmUgZW1pdHRlZCBpbW1lZGlhdGVseSBhbmQgYWxsXG4gICAgICogICBoYW5kbGVycyByZW1vdmVkLlxuICAgICAqXG4gICAgICogLSBBZGRpbmcgYW4gJ2Vycm9yJyBldmVudCBoYW5kbGVyIGFmdGVyIGFuIGVycm9yIGhhcyBiZWVuIGVtaXR0ZWQgd2lsbFxuICAgICAqICAgY2F1c2UgdGhlIGV2ZW50IHRvIGJlIHJlLWVtaXR0ZWQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZXJyb3IgcHJldmlvdXNseVxuICAgICAqICAgcmFpc2VkLlxuICAgICAqL1xuICAgIG9uKGV2LCBoYW5kbGVyKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IHN1cGVyLm9uKGV2LCBoYW5kbGVyKTtcbiAgICAgICAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIHRoaXNbRElTQ0FSREVEXSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpc1tEQVRBTElTVEVORVJTXSsrO1xuICAgICAgICAgICAgaWYgKCF0aGlzW1BJUEVTXS5sZW5ndGggJiYgIXRoaXNbRkxPV0lOR10pIHtcbiAgICAgICAgICAgICAgICB0aGlzW1JFU1VNRV0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiB0aGlzW0JVRkZFUkxFTkdUSF0gIT09IDApIHtcbiAgICAgICAgICAgIHN1cGVyLmVtaXQoJ3JlYWRhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNFbmRpc2goZXYpICYmIHRoaXNbRU1JVFRFRF9FTkRdKSB7XG4gICAgICAgICAgICBzdXBlci5lbWl0KGV2KTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGV2KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldiA9PT0gJ2Vycm9yJyAmJiB0aGlzW0VNSVRURURfRVJST1JdKSB7XG4gICAgICAgICAgICBjb25zdCBoID0gaGFuZGxlcjtcbiAgICAgICAgICAgIGlmICh0aGlzW0FTWU5DXSlcbiAgICAgICAgICAgICAgICBkZWZlcigoKSA9PiBoLmNhbGwodGhpcywgdGhpc1tFTUlUVEVEX0VSUk9SXSkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGguY2FsbCh0aGlzLCB0aGlzW0VNSVRURURfRVJST1JdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Ige0BsaW5rIE1pbmlwYXNzI29mZn1cbiAgICAgKi9cbiAgICByZW1vdmVMaXN0ZW5lcihldiwgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmYoZXYsIGhhbmRsZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb3N0bHkgaWRlbnRpY2FsIHRvIGBFdmVudEVtaXR0ZXIub2ZmYFxuICAgICAqXG4gICAgICogSWYgYSAnZGF0YScgZXZlbnQgaGFuZGxlciBpcyByZW1vdmVkLCBhbmQgaXQgd2FzIHRoZSBsYXN0IGNvbnN1bWVyXG4gICAgICogKGllLCB0aGVyZSBhcmUgbm8gcGlwZSBkZXN0aW5hdGlvbnMgb3Igb3RoZXIgJ2RhdGEnIGV2ZW50IGxpc3RlbmVycyksXG4gICAgICogdGhlbiB0aGUgZmxvdyBvZiBkYXRhIHdpbGwgc3RvcCB1bnRpbCB0aGVyZSBpcyBhbm90aGVyIGNvbnN1bWVyIG9yXG4gICAgICoge0BsaW5rIE1pbmlwYXNzI3Jlc3VtZX0gaXMgZXhwbGljaXRseSBjYWxsZWQuXG4gICAgICovXG4gICAgb2ZmKGV2LCBoYW5kbGVyKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IHN1cGVyLm9mZihldiwgaGFuZGxlcik7XG4gICAgICAgIC8vIGlmIHdlIHByZXZpb3VzbHkgaGFkIGxpc3RlbmVycywgYW5kIG5vdyB3ZSBkb24ndCwgYW5kIHdlIGRvbid0XG4gICAgICAgIC8vIGhhdmUgYW55IHBpcGVzLCB0aGVuIHN0b3AgdGhlIGZsb3csIHVubGVzcyBpdCdzIGJlZW4gZXhwbGljaXRseVxuICAgICAgICAvLyBwdXQgaW4gYSBkaXNjYXJkZWQgZmxvd2luZyBzdGF0ZSB2aWEgc3RyZWFtLnJlc3VtZSgpLlxuICAgICAgICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgdGhpc1tEQVRBTElTVEVORVJTXSA9IHRoaXMubGlzdGVuZXJzKCdkYXRhJykubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHRoaXNbREFUQUxJU1RFTkVSU10gPT09IDAgJiZcbiAgICAgICAgICAgICAgICAhdGhpc1tESVNDQVJERURdICYmXG4gICAgICAgICAgICAgICAgIXRoaXNbUElQRVNdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXNbRkxPV0lOR10gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb3N0bHkgaWRlbnRpY2FsIHRvIGBFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzYFxuICAgICAqXG4gICAgICogSWYgYWxsICdkYXRhJyBldmVudCBoYW5kbGVycyBhcmUgcmVtb3ZlZCwgYW5kIHRoZXkgd2VyZSB0aGUgbGFzdCBjb25zdW1lclxuICAgICAqIChpZSwgdGhlcmUgYXJlIG5vIHBpcGUgZGVzdGluYXRpb25zKSwgdGhlbiB0aGUgZmxvdyBvZiBkYXRhIHdpbGwgc3RvcFxuICAgICAqIHVudGlsIHRoZXJlIGlzIGFub3RoZXIgY29uc3VtZXIgb3Ige0BsaW5rIE1pbmlwYXNzI3Jlc3VtZX0gaXMgZXhwbGljaXRseVxuICAgICAqIGNhbGxlZC5cbiAgICAgKi9cbiAgICByZW1vdmVBbGxMaXN0ZW5lcnMoZXYpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGV2KTtcbiAgICAgICAgaWYgKGV2ID09PSAnZGF0YScgfHwgZXYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpc1tEQVRBTElTVEVORVJTXSA9IDA7XG4gICAgICAgICAgICBpZiAoIXRoaXNbRElTQ0FSREVEXSAmJiAhdGhpc1tQSVBFU10ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tGTE9XSU5HXSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHRydWUgaWYgdGhlICdlbmQnIGV2ZW50IGhhcyBiZWVuIGVtaXR0ZWRcbiAgICAgKi9cbiAgICBnZXQgZW1pdHRlZEVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbRU1JVFRFRF9FTkRdO1xuICAgIH1cbiAgICBbTUFZQkVfRU1JVF9FTkRdKCkge1xuICAgICAgICBpZiAoIXRoaXNbRU1JVFRJTkdfRU5EXSAmJlxuICAgICAgICAgICAgIXRoaXNbRU1JVFRFRF9FTkRdICYmXG4gICAgICAgICAgICAhdGhpc1tERVNUUk9ZRURdICYmXG4gICAgICAgICAgICB0aGlzW0JVRkZFUl0ubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICB0aGlzW0VPRl0pIHtcbiAgICAgICAgICAgIHRoaXNbRU1JVFRJTkdfRU5EXSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJyk7XG4gICAgICAgICAgICBpZiAodGhpc1tDTE9TRURdKVxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgICAgICAgICAgIHRoaXNbRU1JVFRJTkdfRU5EXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vc3RseSBpZGVudGljYWwgdG8gYEV2ZW50RW1pdHRlci5lbWl0YCwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAgICogYmVoYXZpb3IgZGlmZmVyZW5jZXMgdG8gcHJldmVudCBkYXRhIGxvc3MgYW5kIHVubmVjZXNzYXJ5IGhhbmdzOlxuICAgICAqXG4gICAgICogSWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBkZXN0cm95ZWQsIGFuZCB0aGUgZXZlbnQgaXMgc29tZXRoaW5nIG90aGVyXG4gICAgICogdGhhbiAnY2xvc2UnIG9yICdlcnJvcicsIHRoZW4gYGZhbHNlYCBpcyByZXR1cm5lZCBhbmQgbm8gaGFuZGxlcnNcbiAgICAgKiBhcmUgY2FsbGVkLlxuICAgICAqXG4gICAgICogSWYgdGhlIGV2ZW50IGlzICdlbmQnLCBhbmQgaGFzIGFscmVhZHkgYmVlbiBlbWl0dGVkLCB0aGVuIHRoZSBldmVudFxuICAgICAqIGlzIGlnbm9yZWQuIElmIHRoZSBzdHJlYW0gaXMgaW4gYSBwYXVzZWQgb3Igbm9uLWZsb3dpbmcgc3RhdGUsIHRoZW5cbiAgICAgKiB0aGUgZXZlbnQgd2lsbCBiZSBkZWZlcnJlZCB1bnRpbCBkYXRhIGZsb3cgcmVzdW1lcy4gSWYgdGhlIHN0cmVhbSBpc1xuICAgICAqIGFzeW5jLCB0aGVuIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBuZXh0IHRpY2sgcmF0aGVyIHRoYW5cbiAgICAgKiBpbW1lZGlhdGVseS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBldmVudCBpcyAnY2xvc2UnLCBhbmQgJ2VuZCcgaGFzIG5vdCB5ZXQgYmVlbiBlbWl0dGVkLCB0aGVuXG4gICAgICogdGhlIGV2ZW50IHdpbGwgYmUgZGVmZXJyZWQgdW50aWwgYWZ0ZXIgJ2VuZCcgaXMgZW1pdHRlZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBldmVudCBpcyAnZXJyb3InLCBhbmQgYW4gQWJvcnRTaWduYWwgd2FzIHByb3ZpZGVkIGZvciB0aGUgc3RyZWFtLFxuICAgICAqIGFuZCB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLCB0aGVuIHRoZSBldmVudCBpcyBpZ25vcmVkLCBtYXRjaGluZyB0aGVcbiAgICAgKiBiZWhhdmlvciBvZiBub2RlIGNvcmUgc3RyZWFtcyBpbiB0aGUgcHJlc2Vuc2Ugb2YgYW4gQWJvcnRTaWduYWwuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZXZlbnQgaXMgJ2ZpbmlzaCcgb3IgJ3ByZWZpbmlzaCcsIHRoZW4gYWxsIGxpc3RlbmVycyB3aWxsIGJlXG4gICAgICogcmVtb3ZlZCBhZnRlciBlbWl0dGluZyB0aGUgZXZlbnQsIHRvIHByZXZlbnQgZG91YmxlLWZpcmluZy5cbiAgICAgKi9cbiAgICBlbWl0KGV2LCAuLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhcmdzWzBdO1xuICAgICAgICAvLyBlcnJvciBhbmQgY2xvc2UgYXJlIG9ubHkgZXZlbnRzIGFsbG93ZWQgYWZ0ZXIgY2FsbGluZyBkZXN0cm95KClcbiAgICAgICAgaWYgKGV2ICE9PSAnZXJyb3InICYmXG4gICAgICAgICAgICBldiAhPT0gJ2Nsb3NlJyAmJlxuICAgICAgICAgICAgZXYgIT09IERFU1RST1lFRCAmJlxuICAgICAgICAgICAgdGhpc1tERVNUUk9ZRURdKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzW09CSkVDVE1PREVdICYmICFkYXRhXG4gICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgIDogdGhpc1tBU1lOQ11cbiAgICAgICAgICAgICAgICAgICAgPyAoZGVmZXIoKCkgPT4gdGhpc1tFTUlUREFUQV0oZGF0YSkpLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXNbRU1JVERBVEFdKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ID09PSAnZW5kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbRU1JVEVORF0oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldiA9PT0gJ2Nsb3NlJykge1xuICAgICAgICAgICAgdGhpc1tDTE9TRURdID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGRvbid0IGVtaXQgY2xvc2UgYmVmb3JlICdlbmQnIGFuZCAnZmluaXNoJ1xuICAgICAgICAgICAgaWYgKCF0aGlzW0VNSVRURURfRU5EXSAmJiAhdGhpc1tERVNUUk9ZRURdKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHN1cGVyLmVtaXQoJ2Nsb3NlJyk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXYgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHRoaXNbRU1JVFRFRF9FUlJPUl0gPSBkYXRhO1xuICAgICAgICAgICAgc3VwZXIuZW1pdChFUlJPUiwgZGF0YSk7XG4gICAgICAgICAgICBjb25zdCByZXQgPSAhdGhpc1tTSUdOQUxdIHx8IHRoaXMubGlzdGVuZXJzKCdlcnJvcicpLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gc3VwZXIuZW1pdCgnZXJyb3InLCBkYXRhKVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICB0aGlzW01BWUJFX0VNSVRfRU5EXSgpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldiA9PT0gJ3Jlc3VtZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHN1cGVyLmVtaXQoJ3Jlc3VtZScpO1xuICAgICAgICAgICAgdGhpc1tNQVlCRV9FTUlUX0VORF0oKTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXYgPT09ICdmaW5pc2gnIHx8IGV2ID09PSAncHJlZmluaXNoJykge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gc3VwZXIuZW1pdChldik7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhldik7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvbWUgb3RoZXIgdW5rbm93biBldmVudFxuICAgICAgICBjb25zdCByZXQgPSBzdXBlci5lbWl0KGV2LCAuLi5hcmdzKTtcbiAgICAgICAgdGhpc1tNQVlCRV9FTUlUX0VORF0oKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgW0VNSVREQVRBXShkYXRhKSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzW1BJUEVTXSkge1xuICAgICAgICAgICAgaWYgKHAuZGVzdC53cml0ZShkYXRhKSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXNbRElTQ0FSREVEXSA/IGZhbHNlIDogc3VwZXIuZW1pdCgnZGF0YScsIGRhdGEpO1xuICAgICAgICB0aGlzW01BWUJFX0VNSVRfRU5EXSgpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBbRU1JVEVORF0oKSB7XG4gICAgICAgIGlmICh0aGlzW0VNSVRURURfRU5EXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpc1tFTUlUVEVEX0VORF0gPSB0cnVlO1xuICAgICAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzW0FTWU5DXVxuICAgICAgICAgICAgPyAoZGVmZXIoKCkgPT4gdGhpc1tFTUlURU5EMl0oKSksIHRydWUpXG4gICAgICAgICAgICA6IHRoaXNbRU1JVEVORDJdKCk7XG4gICAgfVxuICAgIFtFTUlURU5EMl0oKSB7XG4gICAgICAgIGlmICh0aGlzW0RFQ09ERVJdKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpc1tERUNPREVSXS5lbmQoKTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXNbUElQRVNdKSB7XG4gICAgICAgICAgICAgICAgICAgIHAuZGVzdC53cml0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzW0RJU0NBUkRFRF0pXG4gICAgICAgICAgICAgICAgICAgIHN1cGVyLmVtaXQoJ2RhdGEnLCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpc1tQSVBFU10pIHtcbiAgICAgICAgICAgIHAuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gc3VwZXIuZW1pdCgnZW5kJyk7XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdlbmQnKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGFsbCBlbWl0dGVkIGRhdGEgb25jZVxuICAgICAqIHRoZSBzdHJlYW0gZW5kcy5cbiAgICAgKi9cbiAgICBhc3luYyBjb2xsZWN0KCkge1xuICAgICAgICBjb25zdCBidWYgPSBPYmplY3QuYXNzaWduKFtdLCB7XG4gICAgICAgICAgICBkYXRhTGVuZ3RoOiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0aGlzW09CSkVDVE1PREVdKVxuICAgICAgICAgICAgYnVmLmRhdGFMZW5ndGggPSAwO1xuICAgICAgICAvLyBzZXQgdGhlIHByb21pc2UgZmlyc3QsIGluIGNhc2UgYW4gZXJyb3IgaXMgcmFpc2VkXG4gICAgICAgIC8vIGJ5IHRyaWdnZXJpbmcgdGhlIGZsb3cgaGVyZS5cbiAgICAgICAgY29uc3QgcCA9IHRoaXMucHJvbWlzZSgpO1xuICAgICAgICB0aGlzLm9uKCdkYXRhJywgYyA9PiB7XG4gICAgICAgICAgICBidWYucHVzaChjKTtcbiAgICAgICAgICAgIGlmICghdGhpc1tPQkpFQ1RNT0RFXSlcbiAgICAgICAgICAgICAgICBidWYuZGF0YUxlbmd0aCArPSBjLmxlbmd0aDtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHA7XG4gICAgICAgIHJldHVybiBidWY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbGwgZW1pdHRlZCBkYXRhXG4gICAgICogb25jZSB0aGUgc3RyZWFtIGVuZHMuXG4gICAgICpcbiAgICAgKiBOb3QgYWxsb3dlZCBvbiBvYmplY3RNb2RlIHN0cmVhbXMuXG4gICAgICovXG4gICAgYXN5bmMgY29uY2F0KCkge1xuICAgICAgICBpZiAodGhpc1tPQkpFQ1RNT0RFXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY29uY2F0IGluIG9iamVjdE1vZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWYgPSBhd2FpdCB0aGlzLmNvbGxlY3QoKTtcbiAgICAgICAgcmV0dXJuICh0aGlzW0VOQ09ESU5HXVxuICAgICAgICAgICAgPyBidWYuam9pbignJylcbiAgICAgICAgICAgIDogQnVmZmVyLmNvbmNhdChidWYsIGJ1Zi5kYXRhTGVuZ3RoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHZvaWQgUHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN0cmVhbSBlbmRzLlxuICAgICAqL1xuICAgIGFzeW5jIHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uKERFU1RST1lFRCwgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignc3RyZWFtIGRlc3Ryb3llZCcpKSk7XG4gICAgICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGVyID0+IHJlamVjdChlcikpO1xuICAgICAgICAgICAgdGhpcy5vbignZW5kJywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzeW5jaHJvbm91cyBgZm9yIGF3YWl0IG9mYCBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgY29udGludWUgZW1pdHRpbmcgYWxsIGNodW5rcyB1bnRpbCB0aGUgc3RyZWFtIHRlcm1pbmF0ZXMuXG4gICAgICovXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgLy8gc2V0IHRoaXMgdXAgZnJvbnQsIGluIGNhc2UgdGhlIGNvbnN1bWVyIGRvZXNuJ3QgY2FsbCBuZXh0KClcbiAgICAgICAgLy8gcmlnaHQgYXdheS5cbiAgICAgICAgdGhpc1tESVNDQVJERURdID0gZmFsc2U7XG4gICAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHN0b3AgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV4dCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdG9wcGVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdG9wKCk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLnJlYWQoKTtcbiAgICAgICAgICAgIGlmIChyZXMgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmVzIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXNbRU9GXSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RvcCgpO1xuICAgICAgICAgICAgbGV0IHJlc29sdmU7XG4gICAgICAgICAgICBsZXQgcmVqZWN0O1xuICAgICAgICAgICAgY29uc3Qgb25lcnIgPSAoZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZignZGF0YScsIG9uZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoJ2VuZCcsIG9uZW5kKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZihERVNUUk9ZRUQsIG9uZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgc3RvcCgpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgb25kYXRhID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoJ2Vycm9yJywgb25lcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmKCdlbmQnLCBvbmVuZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoREVTVFJPWUVELCBvbmRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgdmFsdWUsIGRvbmU6ICEhdGhpc1tFT0ZdIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IG9uZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmKCdlcnJvcicsIG9uZXJyKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZignZGF0YScsIG9uZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoREVTVFJPWUVELCBvbmRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgIHN0b3AoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBvbmRlc3Ryb3kgPSAoKSA9PiBvbmVycihuZXcgRXJyb3IoJ3N0cmVhbSBkZXN0cm95ZWQnKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0ID0gcmVqO1xuICAgICAgICAgICAgICAgIHJlc29sdmUgPSByZXM7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKERFU1RST1lFRCwgb25kZXN0cm95KTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2UoJ2Vycm9yJywgb25lcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xuICAgICAgICAgICAgICAgIHRoaXMub25jZSgnZGF0YScsIG9uZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICB0aHJvdzogc3RvcCxcbiAgICAgICAgICAgIHJldHVybjogc3RvcCxcbiAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91cyBgZm9yIG9mYCBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBUaGUgaXRlcmF0aW9uIHdpbGwgdGVybWluYXRlIHdoZW4gdGhlIGludGVybmFsIGJ1ZmZlciBydW5zIG91dCwgZXZlblxuICAgICAqIGlmIHRoZSBzdHJlYW0gaGFzIG5vdCB5ZXQgdGVybWluYXRlZC5cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgLy8gc2V0IHRoaXMgdXAgZnJvbnQsIGluIGNhc2UgdGhlIGNvbnN1bWVyIGRvZXNuJ3QgY2FsbCBuZXh0KClcbiAgICAgICAgLy8gcmlnaHQgYXdheS5cbiAgICAgICAgdGhpc1tESVNDQVJERURdID0gZmFsc2U7XG4gICAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHN0b3AgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICAgICAgICB0aGlzLm9mZihFUlJPUiwgc3RvcCk7XG4gICAgICAgICAgICB0aGlzLm9mZihERVNUUk9ZRUQsIHN0b3ApO1xuICAgICAgICAgICAgdGhpcy5vZmYoJ2VuZCcsIHN0b3ApO1xuICAgICAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RvcHBlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RvcCgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWQoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IHN0b3AoKSA6IHsgZG9uZTogZmFsc2UsIHZhbHVlIH07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25jZSgnZW5kJywgc3RvcCk7XG4gICAgICAgIHRoaXMub25jZShFUlJPUiwgc3RvcCk7XG4gICAgICAgIHRoaXMub25jZShERVNUUk9ZRUQsIHN0b3ApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgIHRocm93OiBzdG9wLFxuICAgICAgICAgICAgcmV0dXJuOiBzdG9wLFxuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGEgc3RyZWFtLCBwcmV2ZW50aW5nIGl0IGZyb20gYmVpbmcgdXNlZCBmb3IgYW55IGZ1cnRoZXIgcHVycG9zZS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBzdHJlYW0gaGFzIGEgYGNsb3NlKClgIG1ldGhvZCwgdGhlbiBpdCB3aWxsIGJlIGNhbGxlZCBvblxuICAgICAqIGRlc3RydWN0aW9uLlxuICAgICAqXG4gICAgICogQWZ0ZXIgZGVzdHJ1Y3Rpb24sIGFueSBhdHRlbXB0IHRvIHdyaXRlIGRhdGEsIHJlYWQgZGF0YSwgb3IgZW1pdCBtb3N0XG4gICAgICogZXZlbnRzIHdpbGwgYmUgaWdub3JlZC5cbiAgICAgKlxuICAgICAqIElmIGFuIGVycm9yIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCB0aGVuIGl0IHdpbGwgYmUgZW1pdHRlZCBpbiBhblxuICAgICAqICdlcnJvcicgZXZlbnQuXG4gICAgICovXG4gICAgZGVzdHJveShlcikge1xuICAgICAgICBpZiAodGhpc1tERVNUUk9ZRURdKSB7XG4gICAgICAgICAgICBpZiAoZXIpXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoREVTVFJPWUVEKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXNbREVTVFJPWUVEXSA9IHRydWU7XG4gICAgICAgIHRoaXNbRElTQ0FSREVEXSA9IHRydWU7XG4gICAgICAgIC8vIHRocm93IGF3YXkgYWxsIGJ1ZmZlcmVkIGRhdGEsIGl0J3MgbmV2ZXIgY29taW5nIG91dFxuICAgICAgICB0aGlzW0JVRkZFUl0ubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpc1tCVUZGRVJMRU5HVEhdID0gMDtcbiAgICAgICAgY29uc3Qgd2MgPSB0aGlzO1xuICAgICAgICBpZiAodHlwZW9mIHdjLmNsb3NlID09PSAnZnVuY3Rpb24nICYmICF0aGlzW0NMT1NFRF0pXG4gICAgICAgICAgICB3Yy5jbG9zZSgpO1xuICAgICAgICBpZiAoZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgICAgICAvLyBpZiBubyBlcnJvciB0byBlbWl0LCBzdGlsbCByZWplY3QgcGVuZGluZyBwcm9taXNlc1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmVtaXQoREVTVFJPWUVEKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgaXNTdHJlYW19XG4gICAgICpcbiAgICAgKiBGb3JtZXIgZXhwb3J0IGxvY2F0aW9uLCBtYWludGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3RhdGljIGdldCBpc1N0cmVhbSgpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyZWFtO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiLy8gdGhpcyBpcyBqdXN0IGEgdmVyeSBsaWdodCB3cmFwcGVyIGFyb3VuZCAyIGFycmF5cyB3aXRoIGFuIG9mZnNldCBpbmRleFxuaW1wb3J0IHsgR0xPQlNUQVIgfSBmcm9tICdtaW5pbWF0Y2gnO1xuY29uc3QgaXNQYXR0ZXJuTGlzdCA9IChwbCkgPT4gcGwubGVuZ3RoID49IDE7XG5jb25zdCBpc0dsb2JMaXN0ID0gKGdsKSA9PiBnbC5sZW5ndGggPj0gMTtcbi8qKlxuICogQW4gaW1tdXRhYmxlLWlzaCB2aWV3IG9uIGFuIGFycmF5IG9mIGdsb2IgcGFydHMgYW5kIHRoZWlyIHBhcnNlZFxuICogcmVzdWx0c1xuICovXG5leHBvcnQgY2xhc3MgUGF0dGVybiB7XG4gICAgI3BhdHRlcm5MaXN0O1xuICAgICNnbG9iTGlzdDtcbiAgICAjaW5kZXg7XG4gICAgbGVuZ3RoO1xuICAgICNwbGF0Zm9ybTtcbiAgICAjcmVzdDtcbiAgICAjZ2xvYlN0cmluZztcbiAgICAjaXNEcml2ZTtcbiAgICAjaXNVTkM7XG4gICAgI2lzQWJzb2x1dGU7XG4gICAgI2ZvbGxvd0dsb2JzdGFyID0gdHJ1ZTtcbiAgICBjb25zdHJ1Y3RvcihwYXR0ZXJuTGlzdCwgZ2xvYkxpc3QsIGluZGV4LCBwbGF0Zm9ybSkge1xuICAgICAgICBpZiAoIWlzUGF0dGVybkxpc3QocGF0dGVybkxpc3QpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbXB0eSBwYXR0ZXJuIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzR2xvYkxpc3QoZ2xvYkxpc3QpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbXB0eSBnbG9iIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2xvYkxpc3QubGVuZ3RoICE9PSBwYXR0ZXJuTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21pc21hdGNoZWQgcGF0dGVybiBsaXN0IGFuZCBnbG9iIGxpc3QgbGVuZ3RocycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGVuZ3RoID0gcGF0dGVybkxpc3QubGVuZ3RoO1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwYXR0ZXJuTGlzdCA9IHBhdHRlcm5MaXN0O1xuICAgICAgICB0aGlzLiNnbG9iTGlzdCA9IGdsb2JMaXN0O1xuICAgICAgICB0aGlzLiNpbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLiNwbGF0Zm9ybSA9IHBsYXRmb3JtO1xuICAgICAgICAvLyBub3JtYWxpemUgcm9vdCBlbnRyaWVzIG9mIGFic29sdXRlIHBhdHRlcm5zIG9uIGluaXRpYWwgY3JlYXRpb24uXG4gICAgICAgIGlmICh0aGlzLiNpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gYzogPT4gWydjOi8nXVxuICAgICAgICAgICAgLy8gQzovID0+IFsnQzovJ11cbiAgICAgICAgICAgIC8vIEM6L3ggPT4gWydDOi8nLCAneCddXG4gICAgICAgICAgICAvLyAvL2hvc3Qvc2hhcmUgPT4gWycvL2hvc3Qvc2hhcmUvJ11cbiAgICAgICAgICAgIC8vIC8vaG9zdC9zaGFyZS8gPT4gWycvL2hvc3Qvc2hhcmUvJ11cbiAgICAgICAgICAgIC8vIC8vaG9zdC9zaGFyZS94ID0+IFsnLy9ob3N0L3NoYXJlLycsICd4J11cbiAgICAgICAgICAgIC8vIC9ldGMgPT4gWycvJywgJ2V0YyddXG4gICAgICAgICAgICAvLyAvID0+IFsnLyddXG4gICAgICAgICAgICBpZiAodGhpcy5pc1VOQygpKSB7XG4gICAgICAgICAgICAgICAgLy8gJycgLyAnJyAvICdob3N0JyAvICdzaGFyZSdcbiAgICAgICAgICAgICAgICBjb25zdCBbcDAsIHAxLCBwMiwgcDMsIC4uLnByZXN0XSA9IHRoaXMuI3BhdHRlcm5MaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IFtnMCwgZzEsIGcyLCBnMywgLi4uZ3Jlc3RdID0gdGhpcy4jZ2xvYkxpc3Q7XG4gICAgICAgICAgICAgICAgaWYgKHByZXN0WzBdID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbmRzIGluIC9cbiAgICAgICAgICAgICAgICAgICAgcHJlc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZ3Jlc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IFtwMCwgcDEsIHAyLCBwMywgJyddLmpvaW4oJy8nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBnID0gW2cwLCBnMSwgZzIsIGczLCAnJ10uam9pbignLycpO1xuICAgICAgICAgICAgICAgIHRoaXMuI3BhdHRlcm5MaXN0ID0gW3AsIC4uLnByZXN0XTtcbiAgICAgICAgICAgICAgICB0aGlzLiNnbG9iTGlzdCA9IFtnLCAuLi5ncmVzdF07XG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLiNwYXR0ZXJuTGlzdC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzRHJpdmUoKSB8fCB0aGlzLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtwMSwgLi4ucHJlc3RdID0gdGhpcy4jcGF0dGVybkxpc3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgW2cxLCAuLi5ncmVzdF0gPSB0aGlzLiNnbG9iTGlzdDtcbiAgICAgICAgICAgICAgICBpZiAocHJlc3RbMF0gPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuZHMgaW4gL1xuICAgICAgICAgICAgICAgICAgICBwcmVzdC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBncmVzdC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwID0gcDEgKyAnLyc7XG4gICAgICAgICAgICAgICAgY29uc3QgZyA9IGcxICsgJy8nO1xuICAgICAgICAgICAgICAgIHRoaXMuI3BhdHRlcm5MaXN0ID0gW3AsIC4uLnByZXN0XTtcbiAgICAgICAgICAgICAgICB0aGlzLiNnbG9iTGlzdCA9IFtnLCAuLi5ncmVzdF07XG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLiNwYXR0ZXJuTGlzdC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBwYXJzZWQgbGlzdCBvZiBwYXR0ZXJuc1xuICAgICAqL1xuICAgIHBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwYXR0ZXJuTGlzdFt0aGlzLiNpbmRleF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHRydWUgb2YgaWYgcGF0dGVybigpIHJldHVybnMgYSBzdHJpbmdcbiAgICAgKi9cbiAgICBpc1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLiNwYXR0ZXJuTGlzdFt0aGlzLiNpbmRleF0gPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIG9mIGlmIHBhdHRlcm4oKSByZXR1cm5zIEdMT0JTVEFSXG4gICAgICovXG4gICAgaXNHbG9ic3RhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhdHRlcm5MaXN0W3RoaXMuI2luZGV4XSA9PT0gR0xPQlNUQVI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHRydWUgaWYgcGF0dGVybigpIHJldHVybnMgYSByZWdleHBcbiAgICAgKi9cbiAgICBpc1JlZ0V4cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhdHRlcm5MaXN0W3RoaXMuI2luZGV4XSBpbnN0YW5jZW9mIFJlZ0V4cDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIC8tam9pbmVkIHNldCBvZiBnbG9iIHBhcnRzIHRoYXQgbWFrZSB1cCB0aGlzIHBhdHRlcm5cbiAgICAgKi9cbiAgICBnbG9iU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI2dsb2JTdHJpbmcgPVxuICAgICAgICAgICAgdGhpcy4jZ2xvYlN0cmluZyB8fFxuICAgICAgICAgICAgICAgICh0aGlzLiNpbmRleCA9PT0gMCA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBYnNvbHV0ZSgpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2dsb2JMaXN0WzBdICsgdGhpcy4jZ2xvYkxpc3Quc2xpY2UoMSkuam9pbignLycpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuI2dsb2JMaXN0LmpvaW4oJy8nKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuI2dsb2JMaXN0LnNsaWNlKHRoaXMuI2luZGV4KS5qb2luKCcvJykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiB0aGVyZSBhcmUgbW9yZSBwYXR0ZXJuIHBhcnRzIGFmdGVyIHRoaXMgb25lXG4gICAgICovXG4gICAgaGFzTW9yZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gdGhpcy4jaW5kZXggKyAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVzdCBvZiB0aGUgcGF0dGVybiBhZnRlciB0aGlzIHBhcnQsIG9yIG51bGwgaWYgdGhpcyBpcyB0aGUgZW5kXG4gICAgICovXG4gICAgcmVzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI3Jlc3QgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNyZXN0O1xuICAgICAgICBpZiAoIXRoaXMuaGFzTW9yZSgpKVxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNyZXN0ID0gbnVsbCk7XG4gICAgICAgIHRoaXMuI3Jlc3QgPSBuZXcgUGF0dGVybih0aGlzLiNwYXR0ZXJuTGlzdCwgdGhpcy4jZ2xvYkxpc3QsIHRoaXMuI2luZGV4ICsgMSwgdGhpcy4jcGxhdGZvcm0pO1xuICAgICAgICB0aGlzLiNyZXN0LiNpc0Fic29sdXRlID0gdGhpcy4jaXNBYnNvbHV0ZTtcbiAgICAgICAgdGhpcy4jcmVzdC4jaXNVTkMgPSB0aGlzLiNpc1VOQztcbiAgICAgICAgdGhpcy4jcmVzdC4jaXNEcml2ZSA9IHRoaXMuI2lzRHJpdmU7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIHRoZSBwYXR0ZXJuIHJlcHJlc2VudHMgYSAvL3VuYy9wYXRoLyBvbiB3aW5kb3dzXG4gICAgICovXG4gICAgaXNVTkMoKSB7XG4gICAgICAgIGNvbnN0IHBsID0gdGhpcy4jcGF0dGVybkxpc3Q7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc1VOQyAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHRoaXMuI2lzVU5DXG4gICAgICAgICAgICA6ICh0aGlzLiNpc1VOQyA9XG4gICAgICAgICAgICAgICAgdGhpcy4jcGxhdGZvcm0gPT09ICd3aW4zMicgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jaW5kZXggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgcGxbMF0gPT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgIHBsWzFdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcGxbMl0gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgICEhcGxbMl0gJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBsWzNdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAhIXBsWzNdKTtcbiAgICB9XG4gICAgLy8gcGF0dGVybiBsaWtlIEM6Ly4uLlxuICAgIC8vIHNwbGl0ID0gWydDOicsIC4uLl1cbiAgICAvLyBYWFg6IHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIHBhdHRlcm5zIGxpa2UgYGM6KmAgdG8gdGVzdCB0aGUgY3dkXG4gICAgLy8gaW4gYzogZm9yICosIGJ1dCBJIGRvbid0IGtub3cgb2YgYSB3YXkgdG8gZXZlbiBmaWd1cmUgb3V0IHdoYXQgdGhhdFxuICAgIC8vIGN3ZCBpcyB3aXRob3V0IGFjdHVhbGx5IGNoZGlyJ2luZyBpbnRvIGl0P1xuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhlIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBkcml2ZSBsZXR0ZXIgb24gV2luZG93c1xuICAgICAqL1xuICAgIGlzRHJpdmUoKSB7XG4gICAgICAgIGNvbnN0IHBsID0gdGhpcy4jcGF0dGVybkxpc3Q7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc0RyaXZlICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdGhpcy4jaXNEcml2ZVxuICAgICAgICAgICAgOiAodGhpcy4jaXNEcml2ZSA9XG4gICAgICAgICAgICAgICAgdGhpcy4jcGxhdGZvcm0gPT09ICd3aW4zMicgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jaW5kZXggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPiAxICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwbFswXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgL15bYS16XTokL2kudGVzdChwbFswXSkpO1xuICAgIH1cbiAgICAvLyBwYXR0ZXJuID0gJy8nIG9yICcvLi4uJyBvciAnL3gvLi4uJ1xuICAgIC8vIHNwbGl0ID0gWycnLCAnJ10gb3IgWycnLCAuLi5dIG9yIFsnJywgJ3gnLCAuLi5dXG4gICAgLy8gRHJpdmUgYW5kIFVOQyBib3RoIGNvbnNpZGVyZWQgYWJzb2x1dGUgb24gd2luZG93c1xuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhlIHBhdHRlcm4gaXMgcm9vdGVkIG9uIGFuIGFic29sdXRlIHBhdGhcbiAgICAgKi9cbiAgICBpc0Fic29sdXRlKCkge1xuICAgICAgICBjb25zdCBwbCA9IHRoaXMuI3BhdHRlcm5MaXN0O1xuICAgICAgICByZXR1cm4gdGhpcy4jaXNBYnNvbHV0ZSAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHRoaXMuI2lzQWJzb2x1dGVcbiAgICAgICAgICAgIDogKHRoaXMuI2lzQWJzb2x1dGUgPVxuICAgICAgICAgICAgICAgIChwbFswXSA9PT0gJycgJiYgcGwubGVuZ3RoID4gMSkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0RyaXZlKCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VOQygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogY29uc3VtZSB0aGUgcm9vdCBvZiB0aGUgcGF0dGVybiwgYW5kIHJldHVybiBpdFxuICAgICAqL1xuICAgIHJvb3QoKSB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLiNwYXR0ZXJuTGlzdFswXTtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgcCA9PT0gJ3N0cmluZycgJiYgdGhpcy5pc0Fic29sdXRlKCkgJiYgdGhpcy4jaW5kZXggPT09IDApID9cbiAgICAgICAgICAgIHBcbiAgICAgICAgICAgIDogJyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgY3VycmVudCBnbG9ic3RhciBwYXR0ZXJuIGlzIGFsbG93ZWQgdG8gZm9sbG93XG4gICAgICogYSBzeW1ib2xpYyBsaW5rLlxuICAgICAqL1xuICAgIGNoZWNrRm9sbG93R2xvYnN0YXIoKSB7XG4gICAgICAgIHJldHVybiAhKHRoaXMuI2luZGV4ID09PSAwIHx8XG4gICAgICAgICAgICAhdGhpcy5pc0dsb2JzdGFyKCkgfHxcbiAgICAgICAgICAgICF0aGlzLiNmb2xsb3dHbG9ic3Rhcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhhdCB0aGUgY3VycmVudCBnbG9ic3RhciBwYXR0ZXJuIGlzIGZvbGxvd2luZyBhIHN5bWJvbGljIGxpbmtcbiAgICAgKi9cbiAgICBtYXJrRm9sbG93R2xvYnN0YXIoKSB7XG4gICAgICAgIGlmICh0aGlzLiNpbmRleCA9PT0gMCB8fCAhdGhpcy5pc0dsb2JzdGFyKCkgfHwgIXRoaXMuI2ZvbGxvd0dsb2JzdGFyKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLiNmb2xsb3dHbG9ic3RhciA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXR0ZXJuLmpzLm1hcCIsCiAgICAiLy8gZ2l2ZSBpdCBhIHBhdHRlcm4sIGFuZCBpdCdsbCBiZSBhYmxlIHRvIHRlbGwgeW91IGlmXG4vLyBhIGdpdmVuIHBhdGggc2hvdWxkIGJlIGlnbm9yZWQuXG4vLyBJZ25vcmluZyBhIHBhdGggaWdub3JlcyBpdHMgY2hpbGRyZW4gaWYgdGhlIHBhdHRlcm4gZW5kcyBpbiAvKipcbi8vIElnbm9yZXMgYXJlIGFsd2F5cyBwYXJzZWQgaW4gZG90OnRydWUgbW9kZVxuaW1wb3J0IHsgTWluaW1hdGNoIH0gZnJvbSAnbWluaW1hdGNoJztcbmltcG9ydCB7IFBhdHRlcm4gfSBmcm9tICcuL3BhdHRlcm4uanMnO1xuY29uc3QgZGVmYXVsdFBsYXRmb3JtID0gKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICAgIHByb2Nlc3MgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3N0cmluZycpID9cbiAgICBwcm9jZXNzLnBsYXRmb3JtXG4gICAgOiAnbGludXgnO1xuLyoqXG4gKiBDbGFzcyB1c2VkIHRvIHByb2Nlc3MgaWdub3JlZCBwYXR0ZXJuc1xuICovXG5leHBvcnQgY2xhc3MgSWdub3JlIHtcbiAgICByZWxhdGl2ZTtcbiAgICByZWxhdGl2ZUNoaWxkcmVuO1xuICAgIGFic29sdXRlO1xuICAgIGFic29sdXRlQ2hpbGRyZW47XG4gICAgcGxhdGZvcm07XG4gICAgbW1vcHRzO1xuICAgIGNvbnN0cnVjdG9yKGlnbm9yZWQsIHsgbm9icmFjZSwgbm9jYXNlLCBub2V4dCwgbm9nbG9ic3RhciwgcGxhdGZvcm0gPSBkZWZhdWx0UGxhdGZvcm0sIH0pIHtcbiAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IFtdO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gW107XG4gICAgICAgIHRoaXMucmVsYXRpdmVDaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmFic29sdXRlQ2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IHBsYXRmb3JtO1xuICAgICAgICB0aGlzLm1tb3B0cyA9IHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIG5vYnJhY2UsXG4gICAgICAgICAgICBub2Nhc2UsXG4gICAgICAgICAgICBub2V4dCxcbiAgICAgICAgICAgIG5vZ2xvYnN0YXIsXG4gICAgICAgICAgICBvcHRpbWl6YXRpb25MZXZlbDogMixcbiAgICAgICAgICAgIHBsYXRmb3JtLFxuICAgICAgICAgICAgbm9jb21tZW50OiB0cnVlLFxuICAgICAgICAgICAgbm9uZWdhdGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgaWduIG9mIGlnbm9yZWQpXG4gICAgICAgICAgICB0aGlzLmFkZChpZ24pO1xuICAgIH1cbiAgICBhZGQoaWduKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgYSBsaXR0bGUgd2VpcmQsIGJ1dCBpdCBnaXZlcyB1cyBhIGNsZWFuIHNldCBvZiBvcHRpbWl6ZWRcbiAgICAgICAgLy8gbWluaW1hdGNoIG1hdGNoZXJzLCB3aXRob3V0IGdldHRpbmcgdHJpcHBlZCB1cCBpZiBvbmUgb2YgdGhlbVxuICAgICAgICAvLyBlbmRzIGluIC8qKiBpbnNpZGUgYSBicmFjZSBzZWN0aW9uLCBhbmQgaXQncyBvbmx5IGluZWZmaWNpZW50IGF0XG4gICAgICAgIC8vIHRoZSBzdGFydCBvZiB0aGUgd2Fsaywgbm90IGFsb25nIGl0LlxuICAgICAgICAvLyBJdCdkIGJlIG5pY2UgaWYgdGhlIFBhdHRlcm4gY2xhc3MganVzdCBoYWQgYSAudGVzdCgpIG1ldGhvZCwgYnV0XG4gICAgICAgIC8vIGhhbmRsaW5nIGdsb2JzdGFycyBpcyBhIGJpdCBvZiBhIHBpdGEsIGFuZCB0aGF0IGNvZGUgYWxyZWFkeSBsaXZlc1xuICAgICAgICAvLyBpbiBtaW5pbWF0Y2ggYW55d2F5LlxuICAgICAgICAvLyBBbm90aGVyIHdheSB3b3VsZCBiZSBpZiBtYXliZSBNaW5pbWF0Y2ggY291bGQgdGFrZSBpdHMgc2V0L2dsb2JQYXJ0c1xuICAgICAgICAvLyBhcyBhbiBvcHRpb24sIGFuZCB0aGVuIHdlIGNvdWxkIGF0IGxlYXN0IGp1c3QgdXNlIFBhdHRlcm4gdG8gdGVzdFxuICAgICAgICAvLyBmb3IgYWJzb2x1dGUtbmVzcy5cbiAgICAgICAgLy8gWWV0IGFub3RoZXIgd2F5LCBNaW5pbWF0Y2ggY291bGQgdGFrZSBhbiBhcnJheSBvZiBnbG9iIHN0cmluZ3MsIGFuZFxuICAgICAgICAvLyBhIGN3ZCBvcHRpb24sIGFuZCBkbyB0aGUgcmlnaHQgdGhpbmcuXG4gICAgICAgIGNvbnN0IG1tID0gbmV3IE1pbmltYXRjaChpZ24sIHRoaXMubW1vcHRzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtbS5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IG1tLnNldFtpXTtcbiAgICAgICAgICAgIGNvbnN0IGdsb2JQYXJ0cyA9IG1tLmdsb2JQYXJ0c1tpXTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQgfHwgIWdsb2JQYXJ0cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwYXR0ZXJuIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc3RyaXAgb2ZmIGxlYWRpbmcgLi8gcG9ydGlvbnNcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1nbG9iL2lzc3Vlcy81NzBcbiAgICAgICAgICAgIHdoaWxlIChwYXJzZWRbMF0gPT09ICcuJyAmJiBnbG9iUGFydHNbMF0gPT09ICcuJykge1xuICAgICAgICAgICAgICAgIHBhcnNlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGdsb2JQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIGNvbnN0IHAgPSBuZXcgUGF0dGVybihwYXJzZWQsIGdsb2JQYXJ0cywgMCwgdGhpcy5wbGF0Zm9ybSk7XG4gICAgICAgICAgICBjb25zdCBtID0gbmV3IE1pbmltYXRjaChwLmdsb2JTdHJpbmcoKSwgdGhpcy5tbW9wdHMpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBnbG9iUGFydHNbZ2xvYlBhcnRzLmxlbmd0aCAtIDFdID09PSAnKionO1xuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGUgPSBwLmlzQWJzb2x1dGUoKTtcbiAgICAgICAgICAgIGlmIChhYnNvbHV0ZSlcbiAgICAgICAgICAgICAgICB0aGlzLmFic29sdXRlLnB1c2gobSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZS5wdXNoKG0pO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFic29sdXRlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFic29sdXRlQ2hpbGRyZW4ucHVzaChtKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmVDaGlsZHJlbi5wdXNoKG0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlnbm9yZWQocCkge1xuICAgICAgICBjb25zdCBmdWxscGF0aCA9IHAuZnVsbHBhdGgoKTtcbiAgICAgICAgY29uc3QgZnVsbHBhdGhzID0gYCR7ZnVsbHBhdGh9L2A7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlID0gcC5yZWxhdGl2ZSgpIHx8ICcuJztcbiAgICAgICAgY29uc3QgcmVsYXRpdmVzID0gYCR7cmVsYXRpdmV9L2A7XG4gICAgICAgIGZvciAoY29uc3QgbSBvZiB0aGlzLnJlbGF0aXZlKSB7XG4gICAgICAgICAgICBpZiAobS5tYXRjaChyZWxhdGl2ZSkgfHwgbS5tYXRjaChyZWxhdGl2ZXMpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbSBvZiB0aGlzLmFic29sdXRlKSB7XG4gICAgICAgICAgICBpZiAobS5tYXRjaChmdWxscGF0aCkgfHwgbS5tYXRjaChmdWxscGF0aHMpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2hpbGRyZW5JZ25vcmVkKHApIHtcbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSBwLmZ1bGxwYXRoKCkgKyAnLyc7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlID0gKHAucmVsYXRpdmUoKSB8fCAnLicpICsgJy8nO1xuICAgICAgICBmb3IgKGNvbnN0IG0gb2YgdGhpcy5yZWxhdGl2ZUNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAobS5tYXRjaChyZWxhdGl2ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBtIG9mIHRoaXMuYWJzb2x1dGVDaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKG0ubWF0Y2goZnVsbHBhdGgpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pZ25vcmUuanMubWFwIiwKICAgICIvLyBzeW5jaHJvbm91cyB1dGlsaXR5IGZvciBmaWx0ZXJpbmcgZW50cmllcyBhbmQgY2FsY3VsYXRpbmcgc3Vid2Fsa3NcbmltcG9ydCB7IEdMT0JTVEFSIH0gZnJvbSAnbWluaW1hdGNoJztcbi8qKlxuICogQSBjYWNoZSBvZiB3aGljaCBwYXR0ZXJucyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGZvciBhIGdpdmVuIFBhdGhcbiAqL1xuZXhwb3J0IGNsYXNzIEhhc1dhbGtlZENhY2hlIHtcbiAgICBzdG9yZTtcbiAgICBjb25zdHJ1Y3RvcihzdG9yZSA9IG5ldyBNYXAoKSkge1xuICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gICAgfVxuICAgIGNvcHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSGFzV2Fsa2VkQ2FjaGUobmV3IE1hcCh0aGlzLnN0b3JlKSk7XG4gICAgfVxuICAgIGhhc1dhbGtlZCh0YXJnZXQsIHBhdHRlcm4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0KHRhcmdldC5mdWxscGF0aCgpKT8uaGFzKHBhdHRlcm4uZ2xvYlN0cmluZygpKTtcbiAgICB9XG4gICAgc3RvcmVXYWxrZWQodGFyZ2V0LCBwYXR0ZXJuKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gdGFyZ2V0LmZ1bGxwYXRoKCk7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc3RvcmUuZ2V0KGZ1bGxwYXRoKTtcbiAgICAgICAgaWYgKGNhY2hlZClcbiAgICAgICAgICAgIGNhY2hlZC5hZGQocGF0dGVybi5nbG9iU3RyaW5nKCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldChmdWxscGF0aCwgbmV3IFNldChbcGF0dGVybi5nbG9iU3RyaW5nKCldKSk7XG4gICAgfVxufVxuLyoqXG4gKiBBIHJlY29yZCBvZiB3aGljaCBwYXRocyBoYXZlIGJlZW4gbWF0Y2hlZCBpbiBhIGdpdmVuIHdhbGsgc3RlcCxcbiAqIGFuZCB3aGV0aGVyIHRoZXkgb25seSBhcmUgY29uc2lkZXJlZCBhIG1hdGNoIGlmIHRoZXkgYXJlIGEgZGlyZWN0b3J5LFxuICogYW5kIHdoZXRoZXIgdGhlaXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCBzaG91bGQgYmUgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRjaFJlY29yZCB7XG4gICAgc3RvcmUgPSBuZXcgTWFwKCk7XG4gICAgYWRkKHRhcmdldCwgYWJzb2x1dGUsIGlmRGlyKSB7XG4gICAgICAgIGNvbnN0IG4gPSAoYWJzb2x1dGUgPyAyIDogMCkgfCAoaWZEaXIgPyAxIDogMCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnN0b3JlLmdldCh0YXJnZXQpO1xuICAgICAgICB0aGlzLnN0b3JlLnNldCh0YXJnZXQsIGN1cnJlbnQgPT09IHVuZGVmaW5lZCA/IG4gOiBuICYgY3VycmVudCk7XG4gICAgfVxuICAgIC8vIG1hdGNoLCBhYnNvbHV0ZSwgaWZkaXJcbiAgICBlbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuc3RvcmUuZW50cmllcygpXS5tYXAoKFtwYXRoLCBuXSkgPT4gW1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICEhKG4gJiAyKSxcbiAgICAgICAgICAgICEhKG4gJiAxKSxcbiAgICAgICAgXSk7XG4gICAgfVxufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgcGF0dGVybnMgdGhhdCBtdXN0IGJlIHByb2Nlc3NlZCBpbiBhIHN1YnNlcXVlbnQgc3RlcFxuICogZm9yIGEgZ2l2ZW4gcGF0aC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1YldhbGtzIHtcbiAgICBzdG9yZSA9IG5ldyBNYXAoKTtcbiAgICBhZGQodGFyZ2V0LCBwYXR0ZXJuKSB7XG4gICAgICAgIGlmICghdGFyZ2V0LmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN1YnMgPSB0aGlzLnN0b3JlLmdldCh0YXJnZXQpO1xuICAgICAgICBpZiAoc3Vicykge1xuICAgICAgICAgICAgaWYgKCFzdWJzLmZpbmQocCA9PiBwLmdsb2JTdHJpbmcoKSA9PT0gcGF0dGVybi5nbG9iU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgc3Vicy5wdXNoKHBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0KHRhcmdldCwgW3BhdHRlcm5dKTtcbiAgICB9XG4gICAgZ2V0KHRhcmdldCkge1xuICAgICAgICBjb25zdCBzdWJzID0gdGhpcy5zdG9yZS5nZXQodGFyZ2V0KTtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICghc3Vicykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0aW5nIHRvIHdhbGsgdW5rbm93biBwYXRoJyk7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgcmV0dXJuIHN1YnM7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleXMoKS5tYXAoayA9PiBbaywgdGhpcy5zdG9yZS5nZXQoayldKTtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnN0b3JlLmtleXMoKV0uZmlsdGVyKHQgPT4gdC5jYW5SZWFkZGlyKCkpO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGNsYXNzIHRoYXQgcHJvY2Vzc2VzIHBhdHRlcm5zIGZvciBhIGdpdmVuIHBhdGguXG4gKlxuICogSGFuZGxlcyBjaGlsZCBlbnRyeSBmaWx0ZXJpbmcsIGFuZCBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcGF0aCdzXG4gKiBkaXJlY3RvcnkgY29udGVudHMgbXVzdCBiZSByZWFkLlxuICovXG5leHBvcnQgY2xhc3MgUHJvY2Vzc29yIHtcbiAgICBoYXNXYWxrZWRDYWNoZTtcbiAgICBtYXRjaGVzID0gbmV3IE1hdGNoUmVjb3JkKCk7XG4gICAgc3Vid2Fsa3MgPSBuZXcgU3ViV2Fsa3MoKTtcbiAgICBwYXR0ZXJucztcbiAgICBmb2xsb3c7XG4gICAgZG90O1xuICAgIG9wdHM7XG4gICAgY29uc3RydWN0b3Iob3B0cywgaGFzV2Fsa2VkQ2FjaGUpIHtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5mb2xsb3cgPSAhIW9wdHMuZm9sbG93O1xuICAgICAgICB0aGlzLmRvdCA9ICEhb3B0cy5kb3Q7XG4gICAgICAgIHRoaXMuaGFzV2Fsa2VkQ2FjaGUgPVxuICAgICAgICAgICAgaGFzV2Fsa2VkQ2FjaGUgPyBoYXNXYWxrZWRDYWNoZS5jb3B5KCkgOiBuZXcgSGFzV2Fsa2VkQ2FjaGUoKTtcbiAgICB9XG4gICAgcHJvY2Vzc1BhdHRlcm5zKHRhcmdldCwgcGF0dGVybnMpIHtcbiAgICAgICAgdGhpcy5wYXR0ZXJucyA9IHBhdHRlcm5zO1xuICAgICAgICBjb25zdCBwcm9jZXNzaW5nU2V0ID0gcGF0dGVybnMubWFwKHAgPT4gW3RhcmdldCwgcF0pO1xuICAgICAgICAvLyBtYXAgb2YgcGF0aHMgdG8gdGhlIG1hZ2ljLXN0YXJ0aW5nIHN1YndhbGtzIHRoZXkgbmVlZCB0byB3YWxrXG4gICAgICAgIC8vIGZpcnN0IGl0ZW0gaW4gcGF0dGVybnMgaXMgdGhlIGZpbHRlclxuICAgICAgICBmb3IgKGxldCBbdCwgcGF0dGVybl0gb2YgcHJvY2Vzc2luZ1NldCkge1xuICAgICAgICAgICAgdGhpcy5oYXNXYWxrZWRDYWNoZS5zdG9yZVdhbGtlZCh0LCBwYXR0ZXJuKTtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBwYXR0ZXJuLnJvb3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlID0gcGF0dGVybi5pc0Fic29sdXRlKCkgJiYgdGhpcy5vcHRzLmFic29sdXRlICE9PSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHN0YXJ0IGFic29sdXRlIHBhdHRlcm5zIGF0IHJvb3RcbiAgICAgICAgICAgIGlmIChyb290KSB7XG4gICAgICAgICAgICAgICAgdCA9IHQucmVzb2x2ZShyb290ID09PSAnLycgJiYgdGhpcy5vcHRzLnJvb3QgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5yb290XG4gICAgICAgICAgICAgICAgICAgIDogcm9vdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdCA9IHBhdHRlcm4ucmVzdCgpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZXMuYWRkKHQsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcmVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodC5pc0VOT0VOVCgpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHA7XG4gICAgICAgICAgICBsZXQgcmVzdDtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAodHlwZW9mIChwID0gcGF0dGVybi5wYXR0ZXJuKCkpID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIChyZXN0ID0gcGF0dGVybi5yZXN0KCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHQucmVzb2x2ZShwKTtcbiAgICAgICAgICAgICAgICB0ID0gYztcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcmVzdDtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHAgPSBwYXR0ZXJuLnBhdHRlcm4oKTtcbiAgICAgICAgICAgIHJlc3QgPSBwYXR0ZXJuLnJlc3QoKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzV2Fsa2VkQ2FjaGUuaGFzV2Fsa2VkKHQsIHBhdHRlcm4pKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1dhbGtlZENhY2hlLnN0b3JlV2Fsa2VkKHQsIHBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbm93IHdlIGhhdmUgZWl0aGVyIGEgZmluYWwgc3RyaW5nIGZvciBhIGtub3duIGVudHJ5LFxuICAgICAgICAgICAgLy8gbW9yZSBzdHJpbmdzIGZvciBhbiB1bmtub3duIGVudHJ5LFxuICAgICAgICAgICAgLy8gb3IgYSBwYXR0ZXJuIHN0YXJ0aW5nIHdpdGggbWFnaWMsIG1vdW50ZWQgb24gdC5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBtdXN0IG5vdCBiZSBmaW5hbCBlbnRyeSwgb3RoZXJ3aXNlIHdlIHdvdWxkIGhhdmVcbiAgICAgICAgICAgICAgICAvLyBjb25jYXRlbmF0ZWQgaXQgZWFybGllci5cbiAgICAgICAgICAgICAgICBjb25zdCBpZkRpciA9IHAgPT09ICcuLicgfHwgcCA9PT0gJycgfHwgcCA9PT0gJy4nO1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcy5hZGQodC5yZXNvbHZlKHApLCBhYnNvbHV0ZSwgaWZEaXIpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gR0xPQlNUQVIpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBubyByZXN0LCBtYXRjaCBhbmQgc3Vid2FsayBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgLy8gaWYgcmVzdCwgcHJvY2VzcyByZXN0IGFuZCBzdWJ3YWxrIHBhdHRlcm5cbiAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGEgc3ltbGluaywgYnV0IHdlIGRpZG4ndCBnZXQgaGVyZSBieSB3YXkgb2YgYVxuICAgICAgICAgICAgICAgIC8vIGdsb2JzdGFyIG1hdGNoIChtZWFuaW5nIGl0J3MgdGhlIGZpcnN0IHRpbWUgVEhJUyBnbG9ic3RhclxuICAgICAgICAgICAgICAgIC8vIGhhcyB0cmF2ZXJzZWQgYSBzeW1saW5rKSwgdGhlbiB3ZSBmb2xsb3cgaXQuIE90aGVyd2lzZSwgc3RvcC5cbiAgICAgICAgICAgICAgICBpZiAoIXQuaXNTeW1ib2xpY0xpbmsoKSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvbGxvdyB8fFxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLmNoZWNrRm9sbG93R2xvYnN0YXIoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZCh0LCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcnAgPSByZXN0Py5wYXR0ZXJuKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcnJlc3QgPSByZXN0Py5yZXN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN0IHx8ICgocnAgPT09ICcnIHx8IHJwID09PSAnLicpICYmICFycmVzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBIQVMgdG8gYmUgYSBkaXIgaWYgaXQgZW5kcyBpbiAqKi8gb3IgKiovLlxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgZW5kaW5nIGluICoqIHdpbGwgbWF0Y2ggZmlsZXMgYXMgd2VsbC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVzLmFkZCh0LCBhYnNvbHV0ZSwgcnAgPT09ICcnIHx8IHJwID09PSAnLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJwID09PSAnLi4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdvdWxkIG1lYW4geW91J3JlIG1hdGNoaW5nICoqLy4uIGF0IHRoZSBmcyByb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5vIHRoYW5rcywgSSdtIG5vdCBnb25uYSB0ZXN0IHRoYXQgc3BlY2lmaWMgY2FzZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHAgPSB0LnBhcmVudCB8fCB0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcnJlc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVzLmFkZCh0cCwgYWJzb2x1dGUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuaGFzV2Fsa2VkQ2FjaGUuaGFzV2Fsa2VkKHRwLCBycmVzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZCh0cCwgcnJlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vid2Fsa3MuYWRkKHQsIHBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdWJ3YWxrVGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vid2Fsa3Mua2V5cygpO1xuICAgIH1cbiAgICBjaGlsZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzb3IodGhpcy5vcHRzLCB0aGlzLmhhc1dhbGtlZENhY2hlKTtcbiAgICB9XG4gICAgLy8gcmV0dXJuIGEgbmV3IFByb2Nlc3NvciBjb250YWluaW5nIHRoZSBzdWJ3YWxrcyBmb3IgZWFjaFxuICAgIC8vIGNoaWxkIGVudHJ5LCBhbmQgYSBzZXQgb2YgbWF0Y2hlcywgYW5kXG4gICAgLy8gYSBoYXNXYWxrZWRDYWNoZSB0aGF0J3MgYSBjb3B5IG9mIHRoaXMgb25lXG4gICAgLy8gdGhlbiB3ZSdyZSBnb2luZyB0byBjYWxsXG4gICAgZmlsdGVyRW50cmllcyhwYXJlbnQsIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLnN1YndhbGtzLmdldChwYXJlbnQpO1xuICAgICAgICAvLyBwdXQgbWF0Y2hlcyBhbmQgZW50cnkgd2Fsa3MgaW50byB0aGUgcmVzdWx0cyBwcm9jZXNzb3JcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuY2hpbGQoKTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFic29sdXRlID0gcGF0dGVybi5pc0Fic29sdXRlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHBhdHRlcm4ucGF0dGVybigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBwYXR0ZXJuLnJlc3QoKTtcbiAgICAgICAgICAgICAgICBpZiAocCA9PT0gR0xPQlNUQVIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy50ZXN0R2xvYnN0YXIoZSwgcGF0dGVybiwgcmVzdCwgYWJzb2x1dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMudGVzdFJlZ0V4cChlLCBwLCByZXN0LCBhYnNvbHV0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnRlc3RTdHJpbmcoZSwgcCwgcmVzdCwgYWJzb2x1dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgdGVzdEdsb2JzdGFyKGUsIHBhdHRlcm4sIHJlc3QsIGFic29sdXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmRvdCB8fCAhZS5uYW1lLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgaWYgKCFwYXR0ZXJuLmhhc01vcmUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcy5hZGQoZSwgYWJzb2x1dGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlLmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGZvbGxvdyBtb2RlIG9yIGl0J3Mgbm90IGEgc3ltbGluaywganVzdCBrZWVwXG4gICAgICAgICAgICAgICAgLy8gdGVzdGluZyB0aGUgc2FtZSBwYXR0ZXJuLiBJZiB0aGVyZSdzIG1vcmUgYWZ0ZXIgdGhlIGdsb2JzdGFyLFxuICAgICAgICAgICAgICAgIC8vIHRoZW4gdGhpcyBzeW1saW5rIGNvbnN1bWVzIHRoZSBnbG9ic3Rhci4gSWYgbm90LCB0aGVuIHdlIGNhblxuICAgICAgICAgICAgICAgIC8vIGZvbGxvdyBhdCBtb3N0IE9ORSBzeW1saW5rIGFsb25nIHRoZSB3YXksIHNvIHdlIG1hcmsgaXQsIHdoaWNoXG4gICAgICAgICAgICAgICAgLy8gYWxzbyBjaGVja3MgdG8gZW5zdXJlIHRoYXQgaXQgd2Fzbid0IGFscmVhZHkgbWFya2VkLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvbGxvdyB8fCAhZS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vid2Fsa3MuYWRkKGUsIHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3QgJiYgcGF0dGVybi5jaGVja0ZvbGxvd0dsb2JzdGFyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vid2Fsa3MuYWRkKGUsIHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhdHRlcm4ubWFya0ZvbGxvd0dsb2JzdGFyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vid2Fsa3MuYWRkKGUsIHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHRoZSBORVhUIHRoaW5nIG1hdGNoZXMgdGhpcyBlbnRyeSwgdGhlbiBhbHNvIGFkZFxuICAgICAgICAvLyB0aGUgcmVzdC5cbiAgICAgICAgaWYgKHJlc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHJwID0gcmVzdC5wYXR0ZXJuKCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJwID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIC8vIGRvdHMgYW5kIGVtcHR5IHdlcmUgaGFuZGxlZCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgcnAgIT09ICcuLicgJiZcbiAgICAgICAgICAgICAgICBycCAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICBycCAhPT0gJy4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXN0U3RyaW5nKGUsIHJwLCByZXN0LnJlc3QoKSwgYWJzb2x1dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocnAgPT09ICcuLicpIHtcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBlcCA9IGUucGFyZW50IHx8IGU7XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZChlcCwgcmVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChycCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGVzdFJlZ0V4cChlLCBycCwgcmVzdC5yZXN0KCksIGFic29sdXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB0ZXN0UmVnRXhwKGUsIHAsIHJlc3QsIGFic29sdXRlKSB7XG4gICAgICAgIGlmICghcC50ZXN0KGUubmFtZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghcmVzdCkge1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVzLmFkZChlLCBhYnNvbHV0ZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdWJ3YWxrcy5hZGQoZSwgcmVzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGVzdFN0cmluZyhlLCBwLCByZXN0LCBhYnNvbHV0ZSkge1xuICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuP1xuICAgICAgICBpZiAoIWUuaXNOYW1lZChwKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKCFyZXN0KSB7XG4gICAgICAgICAgICB0aGlzLm1hdGNoZXMuYWRkKGUsIGFic29sdXRlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZChlLCByZXN0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb2Nlc3Nvci5qcy5tYXAiLAogICAgIi8qKlxuICogU2luZ2xlLXVzZSB1dGlsaXR5IGNsYXNzZXMgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IHRvIHRoZSB7QGxpbmsgR2xvYn1cbiAqIG1ldGhvZHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBNaW5pcGFzcyB9IGZyb20gJ21pbmlwYXNzJztcbmltcG9ydCB7IElnbm9yZSB9IGZyb20gJy4vaWdub3JlLmpzJztcbmltcG9ydCB7IFByb2Nlc3NvciB9IGZyb20gJy4vcHJvY2Vzc29yLmpzJztcbmNvbnN0IG1ha2VJZ25vcmUgPSAoaWdub3JlLCBvcHRzKSA9PiB0eXBlb2YgaWdub3JlID09PSAnc3RyaW5nJyA/IG5ldyBJZ25vcmUoW2lnbm9yZV0sIG9wdHMpXG4gICAgOiBBcnJheS5pc0FycmF5KGlnbm9yZSkgPyBuZXcgSWdub3JlKGlnbm9yZSwgb3B0cylcbiAgICAgICAgOiBpZ25vcmU7XG4vKipcbiAqIGJhc2ljIHdhbGtpbmcgdXRpbGl0aWVzIHRoYXQgYWxsIHRoZSBnbG9iIHdhbGtlciB0eXBlcyB1c2VcbiAqL1xuZXhwb3J0IGNsYXNzIEdsb2JVdGlsIHtcbiAgICBwYXRoO1xuICAgIHBhdHRlcm5zO1xuICAgIG9wdHM7XG4gICAgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICBhYm9ydGVkID0gZmFsc2U7XG4gICAgI29uUmVzdW1lID0gW107XG4gICAgI2lnbm9yZTtcbiAgICAjc2VwO1xuICAgIHNpZ25hbDtcbiAgICBtYXhEZXB0aDtcbiAgICBpbmNsdWRlQ2hpbGRNYXRjaGVzO1xuICAgIGNvbnN0cnVjdG9yKHBhdHRlcm5zLCBwYXRoLCBvcHRzKSB7XG4gICAgICAgIHRoaXMucGF0dGVybnMgPSBwYXR0ZXJucztcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy4jc2VwID0gIW9wdHMucG9zaXggJiYgb3B0cy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICdcXFxcJyA6ICcvJztcbiAgICAgICAgdGhpcy5pbmNsdWRlQ2hpbGRNYXRjaGVzID0gb3B0cy5pbmNsdWRlQ2hpbGRNYXRjaGVzICE9PSBmYWxzZTtcbiAgICAgICAgaWYgKG9wdHMuaWdub3JlIHx8ICF0aGlzLmluY2x1ZGVDaGlsZE1hdGNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI2lnbm9yZSA9IG1ha2VJZ25vcmUob3B0cy5pZ25vcmUgPz8gW10sIG9wdHMpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmluY2x1ZGVDaGlsZE1hdGNoZXMgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy4jaWdub3JlLmFkZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG0gPSAnY2Fubm90IGlnbm9yZSBjaGlsZCBtYXRjaGVzLCBpZ25vcmUgbGFja3MgYWRkKCkgbWV0aG9kLic7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlnbm9yZSwgYWx3YXlzIHNldCB3aXRoIG1heERlcHRoLCBidXQgaXQncyBvcHRpb25hbCBvbiB0aGVcbiAgICAgICAgLy8gR2xvYk9wdGlvbnMgdHlwZVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgdGhpcy5tYXhEZXB0aCA9IG9wdHMubWF4RGVwdGggfHwgSW5maW5pdHk7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIGlmIChvcHRzLnNpZ25hbCkge1xuICAgICAgICAgICAgdGhpcy5zaWduYWwgPSBvcHRzLnNpZ25hbDtcbiAgICAgICAgICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI29uUmVzdW1lLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjaWdub3JlZChwYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZW4uaGFzKHBhdGgpIHx8ICEhdGhpcy4jaWdub3JlPy5pZ25vcmVkPy4ocGF0aCk7XG4gICAgfVxuICAgICNjaGlsZHJlbklnbm9yZWQocGF0aCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLiNpZ25vcmU/LmNoaWxkcmVuSWdub3JlZD8uKHBhdGgpO1xuICAgIH1cbiAgICAvLyBiYWNrcHJlc3N1cmUgbWVjaGFuaXNtXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMucGF1c2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmVzdW1lKCkge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgZm4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHdoaWxlICghdGhpcy5wYXVzZWQgJiYgKGZuID0gdGhpcy4jb25SZXN1bWUuc2hpZnQoKSkpIHtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25SZXN1bWUoZm4pIHtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKCF0aGlzLnBhdXNlZCkge1xuICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICB0aGlzLiNvblJlc3VtZS5wdXNoKGZuKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkbyB0aGUgcmVxdWlzaXRlIHJlYWxwYXRoL3N0YXQgY2hlY2tpbmcsIGFuZCByZXR1cm4gdGhlIHBhdGhcbiAgICAvLyB0byBhZGQgb3IgdW5kZWZpbmVkIHRvIGZpbHRlciBpdCBvdXQuXG4gICAgYXN5bmMgbWF0Y2hDaGVjayhlLCBpZkRpcikge1xuICAgICAgICBpZiAoaWZEaXIgJiYgdGhpcy5vcHRzLm5vZGlyKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHJwYztcbiAgICAgICAgaWYgKHRoaXMub3B0cy5yZWFscGF0aCkge1xuICAgICAgICAgICAgcnBjID0gZS5yZWFscGF0aENhY2hlZCgpIHx8IChhd2FpdCBlLnJlYWxwYXRoKCkpO1xuICAgICAgICAgICAgaWYgKCFycGMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGUgPSBycGM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmVlZFN0YXQgPSBlLmlzVW5rbm93bigpIHx8IHRoaXMub3B0cy5zdGF0O1xuICAgICAgICBjb25zdCBzID0gbmVlZFN0YXQgPyBhd2FpdCBlLmxzdGF0KCkgOiBlO1xuICAgICAgICBpZiAodGhpcy5vcHRzLmZvbGxvdyAmJiB0aGlzLm9wdHMubm9kaXIgJiYgcz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgcy5yZWFscGF0aCgpO1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICBpZiAodGFyZ2V0ICYmICh0YXJnZXQuaXNVbmtub3duKCkgfHwgdGhpcy5vcHRzLnN0YXQpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGFyZ2V0LmxzdGF0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoQ2hlY2tUZXN0KHMsIGlmRGlyKTtcbiAgICB9XG4gICAgbWF0Y2hDaGVja1Rlc3QoZSwgaWZEaXIpIHtcbiAgICAgICAgcmV0dXJuIChlICYmXG4gICAgICAgICAgICAodGhpcy5tYXhEZXB0aCA9PT0gSW5maW5pdHkgfHwgZS5kZXB0aCgpIDw9IHRoaXMubWF4RGVwdGgpICYmXG4gICAgICAgICAgICAoIWlmRGlyIHx8IGUuY2FuUmVhZGRpcigpKSAmJlxuICAgICAgICAgICAgKCF0aGlzLm9wdHMubm9kaXIgfHwgIWUuaXNEaXJlY3RvcnkoKSkgJiZcbiAgICAgICAgICAgICghdGhpcy5vcHRzLm5vZGlyIHx8XG4gICAgICAgICAgICAgICAgIXRoaXMub3B0cy5mb2xsb3cgfHxcbiAgICAgICAgICAgICAgICAhZS5pc1N5bWJvbGljTGluaygpIHx8XG4gICAgICAgICAgICAgICAgIWUucmVhbHBhdGhDYWNoZWQoKT8uaXNEaXJlY3RvcnkoKSkgJiZcbiAgICAgICAgICAgICF0aGlzLiNpZ25vcmVkKGUpKSA/XG4gICAgICAgICAgICBlXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbWF0Y2hDaGVja1N5bmMoZSwgaWZEaXIpIHtcbiAgICAgICAgaWYgKGlmRGlyICYmIHRoaXMub3B0cy5ub2RpcilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBycGM7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucmVhbHBhdGgpIHtcbiAgICAgICAgICAgIHJwYyA9IGUucmVhbHBhdGhDYWNoZWQoKSB8fCBlLnJlYWxwYXRoU3luYygpO1xuICAgICAgICAgICAgaWYgKCFycGMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGUgPSBycGM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmVlZFN0YXQgPSBlLmlzVW5rbm93bigpIHx8IHRoaXMub3B0cy5zdGF0O1xuICAgICAgICBjb25zdCBzID0gbmVlZFN0YXQgPyBlLmxzdGF0U3luYygpIDogZTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5mb2xsb3cgJiYgdGhpcy5vcHRzLm5vZGlyICYmIHM/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHMucmVhbHBhdGhTeW5jKCk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0ICYmICh0YXJnZXQ/LmlzVW5rbm93bigpIHx8IHRoaXMub3B0cy5zdGF0KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5sc3RhdFN5bmMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaENoZWNrVGVzdChzLCBpZkRpcik7XG4gICAgfVxuICAgIG1hdGNoRmluaXNoKGUsIGFic29sdXRlKSB7XG4gICAgICAgIGlmICh0aGlzLiNpZ25vcmVkKGUpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyB3ZSBrbm93IHdlIGhhdmUgYW4gaWdub3JlIGlmIHRoaXMgaXMgZmFsc2UsIGJ1dCBUUyBkb2Vzbid0XG4gICAgICAgIGlmICghdGhpcy5pbmNsdWRlQ2hpbGRNYXRjaGVzICYmIHRoaXMuI2lnbm9yZT8uYWRkKSB7XG4gICAgICAgICAgICBjb25zdCBpZ24gPSBgJHtlLnJlbGF0aXZlUG9zaXgoKX0vKipgO1xuICAgICAgICAgICAgdGhpcy4jaWdub3JlLmFkZChpZ24pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFicyA9IHRoaXMub3B0cy5hYnNvbHV0ZSA9PT0gdW5kZWZpbmVkID8gYWJzb2x1dGUgOiB0aGlzLm9wdHMuYWJzb2x1dGU7XG4gICAgICAgIHRoaXMuc2Vlbi5hZGQoZSk7XG4gICAgICAgIGNvbnN0IG1hcmsgPSB0aGlzLm9wdHMubWFyayAmJiBlLmlzRGlyZWN0b3J5KCkgPyB0aGlzLiNzZXAgOiAnJztcbiAgICAgICAgLy8gb2ssIHdlIGhhdmUgd2hhdCB3ZSBuZWVkIVxuICAgICAgICBpZiAodGhpcy5vcHRzLndpdGhGaWxlVHlwZXMpIHtcbiAgICAgICAgICAgIHRoaXMubWF0Y2hFbWl0KGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFicykge1xuICAgICAgICAgICAgY29uc3QgYWJzID0gdGhpcy5vcHRzLnBvc2l4ID8gZS5mdWxscGF0aFBvc2l4KCkgOiBlLmZ1bGxwYXRoKCk7XG4gICAgICAgICAgICB0aGlzLm1hdGNoRW1pdChhYnMgKyBtYXJrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbCA9IHRoaXMub3B0cy5wb3NpeCA/IGUucmVsYXRpdmVQb3NpeCgpIDogZS5yZWxhdGl2ZSgpO1xuICAgICAgICAgICAgY29uc3QgcHJlID0gdGhpcy5vcHRzLmRvdFJlbGF0aXZlICYmICFyZWwuc3RhcnRzV2l0aCgnLi4nICsgdGhpcy4jc2VwKSA/XG4gICAgICAgICAgICAgICAgJy4nICsgdGhpcy4jc2VwXG4gICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgIHRoaXMubWF0Y2hFbWl0KCFyZWwgPyAnLicgKyBtYXJrIDogcHJlICsgcmVsICsgbWFyayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgbWF0Y2goZSwgYWJzb2x1dGUsIGlmRGlyKSB7XG4gICAgICAgIGNvbnN0IHAgPSBhd2FpdCB0aGlzLm1hdGNoQ2hlY2soZSwgaWZEaXIpO1xuICAgICAgICBpZiAocClcbiAgICAgICAgICAgIHRoaXMubWF0Y2hGaW5pc2gocCwgYWJzb2x1dGUpO1xuICAgIH1cbiAgICBtYXRjaFN5bmMoZSwgYWJzb2x1dGUsIGlmRGlyKSB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLm1hdGNoQ2hlY2tTeW5jKGUsIGlmRGlyKTtcbiAgICAgICAgaWYgKHApXG4gICAgICAgICAgICB0aGlzLm1hdGNoRmluaXNoKHAsIGFic29sdXRlKTtcbiAgICB9XG4gICAgd2Fsa0NCKHRhcmdldCwgcGF0dGVybnMsIGNiKSB7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpXG4gICAgICAgICAgICBjYigpO1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB0aGlzLndhbGtDQjIodGFyZ2V0LCBwYXR0ZXJucywgbmV3IFByb2Nlc3Nvcih0aGlzLm9wdHMpLCBjYik7XG4gICAgfVxuICAgIHdhbGtDQjIodGFyZ2V0LCBwYXR0ZXJucywgcHJvY2Vzc29yLCBjYikge1xuICAgICAgICBpZiAodGhpcy4jY2hpbGRyZW5JZ25vcmVkKHRhcmdldCkpXG4gICAgICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKVxuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgaWYgKHRoaXMucGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzdW1lKCgpID0+IHRoaXMud2Fsa0NCMih0YXJnZXQsIHBhdHRlcm5zLCBwcm9jZXNzb3IsIGNiKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NQYXR0ZXJucyh0YXJnZXQsIHBhdHRlcm5zKTtcbiAgICAgICAgLy8gZG9uZSBwcm9jZXNzaW5nLiAgYWxsIG9mIHRoZSBhYm92ZSBpcyBzeW5jLCBjYW4gYmUgYWJzdHJhY3RlZCBvdXQuXG4gICAgICAgIC8vIHN1YndhbGtzIGlzIGEgbWFwIG9mIHBhdGhzIHRvIHRoZSBlbnRyeSBmaWx0ZXJzIHRoZXkgbmVlZFxuICAgICAgICAvLyBtYXRjaGVzIGlzIGEgbWFwIG9mIHBhdGhzIHRvIFthYnNvbHV0ZSwgaWZEaXJdIHR1cGxlcy5cbiAgICAgICAgbGV0IHRhc2tzID0gMTtcbiAgICAgICAgY29uc3QgbmV4dCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICgtLXRhc2tzID09PSAwKVxuICAgICAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgW20sIGFic29sdXRlLCBpZkRpcl0gb2YgcHJvY2Vzc29yLm1hdGNoZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaWdub3JlZChtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHRhc2tzKys7XG4gICAgICAgICAgICB0aGlzLm1hdGNoKG0sIGFic29sdXRlLCBpZkRpcikudGhlbigoKSA9PiBuZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBwcm9jZXNzb3Iuc3Vid2Fsa1RhcmdldHMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWF4RGVwdGggIT09IEluZmluaXR5ICYmIHQuZGVwdGgoKSA+PSB0aGlzLm1heERlcHRoKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXNrcysrO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5DYWNoZWQgPSB0LnJlYWRkaXJDYWNoZWQoKTtcbiAgICAgICAgICAgIGlmICh0LmNhbGxlZFJlYWRkaXIoKSlcbiAgICAgICAgICAgICAgICB0aGlzLndhbGtDQjModCwgY2hpbGRyZW5DYWNoZWQsIHByb2Nlc3NvciwgbmV4dCk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0LnJlYWRkaXJDQigoXywgZW50cmllcykgPT4gdGhpcy53YWxrQ0IzKHQsIGVudHJpZXMsIHByb2Nlc3NvciwgbmV4dCksIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5leHQoKTtcbiAgICB9XG4gICAgd2Fsa0NCMyh0YXJnZXQsIGVudHJpZXMsIHByb2Nlc3NvciwgY2IpIHtcbiAgICAgICAgcHJvY2Vzc29yID0gcHJvY2Vzc29yLmZpbHRlckVudHJpZXModGFyZ2V0LCBlbnRyaWVzKTtcbiAgICAgICAgbGV0IHRhc2tzID0gMTtcbiAgICAgICAgY29uc3QgbmV4dCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICgtLXRhc2tzID09PSAwKVxuICAgICAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgW20sIGFic29sdXRlLCBpZkRpcl0gb2YgcHJvY2Vzc29yLm1hdGNoZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaWdub3JlZChtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHRhc2tzKys7XG4gICAgICAgICAgICB0aGlzLm1hdGNoKG0sIGFic29sdXRlLCBpZkRpcikudGhlbigoKSA9PiBuZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW3RhcmdldCwgcGF0dGVybnNdIG9mIHByb2Nlc3Nvci5zdWJ3YWxrcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHRhc2tzKys7XG4gICAgICAgICAgICB0aGlzLndhbGtDQjIodGFyZ2V0LCBwYXR0ZXJucywgcHJvY2Vzc29yLmNoaWxkKCksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIG5leHQoKTtcbiAgICB9XG4gICAgd2Fsa0NCU3luYyh0YXJnZXQsIHBhdHRlcm5zLCBjYikge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKVxuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgdGhpcy53YWxrQ0IyU3luYyh0YXJnZXQsIHBhdHRlcm5zLCBuZXcgUHJvY2Vzc29yKHRoaXMub3B0cyksIGNiKTtcbiAgICB9XG4gICAgd2Fsa0NCMlN5bmModGFyZ2V0LCBwYXR0ZXJucywgcHJvY2Vzc29yLCBjYikge1xuICAgICAgICBpZiAodGhpcy4jY2hpbGRyZW5JZ25vcmVkKHRhcmdldCkpXG4gICAgICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKVxuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgaWYgKHRoaXMucGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzdW1lKCgpID0+IHRoaXMud2Fsa0NCMlN5bmModGFyZ2V0LCBwYXR0ZXJucywgcHJvY2Vzc29yLCBjYikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzUGF0dGVybnModGFyZ2V0LCBwYXR0ZXJucyk7XG4gICAgICAgIC8vIGRvbmUgcHJvY2Vzc2luZy4gIGFsbCBvZiB0aGUgYWJvdmUgaXMgc3luYywgY2FuIGJlIGFic3RyYWN0ZWQgb3V0LlxuICAgICAgICAvLyBzdWJ3YWxrcyBpcyBhIG1hcCBvZiBwYXRocyB0byB0aGUgZW50cnkgZmlsdGVycyB0aGV5IG5lZWRcbiAgICAgICAgLy8gbWF0Y2hlcyBpcyBhIG1hcCBvZiBwYXRocyB0byBbYWJzb2x1dGUsIGlmRGlyXSB0dXBsZXMuXG4gICAgICAgIGxldCB0YXNrcyA9IDE7XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoLS10YXNrcyA9PT0gMClcbiAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IFttLCBhYnNvbHV0ZSwgaWZEaXJdIG9mIHByb2Nlc3Nvci5tYXRjaGVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lnbm9yZWQobSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLm1hdGNoU3luYyhtLCBhYnNvbHV0ZSwgaWZEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBwcm9jZXNzb3Iuc3Vid2Fsa1RhcmdldHMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWF4RGVwdGggIT09IEluZmluaXR5ICYmIHQuZGVwdGgoKSA+PSB0aGlzLm1heERlcHRoKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXNrcysrO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0LnJlYWRkaXJTeW5jKCk7XG4gICAgICAgICAgICB0aGlzLndhbGtDQjNTeW5jKHQsIGNoaWxkcmVuLCBwcm9jZXNzb3IsIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIG5leHQoKTtcbiAgICB9XG4gICAgd2Fsa0NCM1N5bmModGFyZ2V0LCBlbnRyaWVzLCBwcm9jZXNzb3IsIGNiKSB7XG4gICAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3Nvci5maWx0ZXJFbnRyaWVzKHRhcmdldCwgZW50cmllcyk7XG4gICAgICAgIGxldCB0YXNrcyA9IDE7XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoLS10YXNrcyA9PT0gMClcbiAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IFttLCBhYnNvbHV0ZSwgaWZEaXJdIG9mIHByb2Nlc3Nvci5tYXRjaGVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lnbm9yZWQobSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLm1hdGNoU3luYyhtLCBhYnNvbHV0ZSwgaWZEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW3RhcmdldCwgcGF0dGVybnNdIG9mIHByb2Nlc3Nvci5zdWJ3YWxrcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHRhc2tzKys7XG4gICAgICAgICAgICB0aGlzLndhbGtDQjJTeW5jKHRhcmdldCwgcGF0dGVybnMsIHByb2Nlc3Nvci5jaGlsZCgpLCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0KCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEdsb2JXYWxrZXIgZXh0ZW5kcyBHbG9iVXRpbCB7XG4gICAgbWF0Y2hlcyA9IG5ldyBTZXQoKTtcbiAgICBjb25zdHJ1Y3RvcihwYXR0ZXJucywgcGF0aCwgb3B0cykge1xuICAgICAgICBzdXBlcihwYXR0ZXJucywgcGF0aCwgb3B0cyk7XG4gICAgfVxuICAgIG1hdGNoRW1pdChlKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcy5hZGQoZSk7XG4gICAgfVxuICAgIGFzeW5jIHdhbGsoKSB7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIHRocm93IHRoaXMuc2lnbmFsLnJlYXNvbjtcbiAgICAgICAgaWYgKHRoaXMucGF0aC5pc1Vua25vd24oKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wYXRoLmxzdGF0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndhbGtDQih0aGlzLnBhdGgsIHRoaXMucGF0dGVybnMsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqKHRoaXMuc2lnbmFsLnJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXModGhpcy5tYXRjaGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXM7XG4gICAgfVxuICAgIHdhbGtTeW5jKCkge1xuICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpXG4gICAgICAgICAgICB0aHJvdyB0aGlzLnNpZ25hbC5yZWFzb247XG4gICAgICAgIGlmICh0aGlzLnBhdGguaXNVbmtub3duKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGF0aC5sc3RhdFN5bmMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3RoaW5nIGZvciB0aGUgY2FsbGJhY2sgdG8gZG8sIGJlY2F1c2UgdGhpcyBuZXZlciBwYXVzZXNcbiAgICAgICAgdGhpcy53YWxrQ0JTeW5jKHRoaXMucGF0aCwgdGhpcy5wYXR0ZXJucywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHRocm93IHRoaXMuc2lnbmFsLnJlYXNvbjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXM7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEdsb2JTdHJlYW0gZXh0ZW5kcyBHbG9iVXRpbCB7XG4gICAgcmVzdWx0cztcbiAgICBjb25zdHJ1Y3RvcihwYXR0ZXJucywgcGF0aCwgb3B0cykge1xuICAgICAgICBzdXBlcihwYXR0ZXJucywgcGF0aCwgb3B0cyk7XG4gICAgICAgIHRoaXMucmVzdWx0cyA9IG5ldyBNaW5pcGFzcyh7XG4gICAgICAgICAgICBzaWduYWw6IHRoaXMuc2lnbmFsLFxuICAgICAgICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzdWx0cy5vbignZHJhaW4nLCAoKSA9PiB0aGlzLnJlc3VtZSgpKTtcbiAgICAgICAgdGhpcy5yZXN1bHRzLm9uKCdyZXN1bWUnLCAoKSA9PiB0aGlzLnJlc3VtZSgpKTtcbiAgICB9XG4gICAgbWF0Y2hFbWl0KGUpIHtcbiAgICAgICAgdGhpcy5yZXN1bHRzLndyaXRlKGUpO1xuICAgICAgICBpZiAoIXRoaXMucmVzdWx0cy5mbG93aW5nKVxuICAgICAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgIH1cbiAgICBzdHJlYW0oKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucGF0aDtcbiAgICAgICAgaWYgKHRhcmdldC5pc1Vua25vd24oKSkge1xuICAgICAgICAgICAgdGFyZ2V0LmxzdGF0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53YWxrQ0IodGFyZ2V0LCB0aGlzLnBhdHRlcm5zLCAoKSA9PiB0aGlzLnJlc3VsdHMuZW5kKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndhbGtDQih0YXJnZXQsIHRoaXMucGF0dGVybnMsICgpID0+IHRoaXMucmVzdWx0cy5lbmQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0cztcbiAgICB9XG4gICAgc3RyZWFtU3luYygpIHtcbiAgICAgICAgaWYgKHRoaXMucGF0aC5pc1Vua25vd24oKSkge1xuICAgICAgICAgICAgdGhpcy5wYXRoLmxzdGF0U3luYygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2Fsa0NCU3luYyh0aGlzLnBhdGgsIHRoaXMucGF0dGVybnMsICgpID0+IHRoaXMucmVzdWx0cy5lbmQoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdHM7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2Fsa2VyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgTWluaW1hdGNoIH0gZnJvbSAnbWluaW1hdGNoJztcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm5zIHByb3ZpZGVkIGNvbnRhaW4gYW55IG1hZ2ljIGdsb2IgY2hhcmFjdGVycyxcbiAqIGdpdmVuIHRoZSBvcHRpb25zIHByb3ZpZGVkLlxuICpcbiAqIEJyYWNlIGV4cGFuc2lvbiBpcyBub3QgY29uc2lkZXJlZCBcIm1hZ2ljXCIgdW5sZXNzIHRoZSBgbWFnaWNhbEJyYWNlc2Agb3B0aW9uXG4gKiBpcyBzZXQsIGFzIGJyYWNlIGV4cGFuc2lvbiBqdXN0IHR1cm5zIG9uZSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogU28gYSBwYXR0ZXJuIGxpa2UgYCd4e2EsYn15J2Agd291bGQgcmV0dXJuIGBmYWxzZWAsIGJlY2F1c2UgYCd4YXknYCBhbmRcbiAqIGAneGJ5J2AgYm90aCBkbyBub3QgY29udGFpbiBhbnkgbWFnaWMgZ2xvYiBjaGFyYWN0ZXJzLCBhbmQgaXQncyB0cmVhdGVkIHRoZVxuICogc2FtZSBhcyBpZiB5b3UgaGFkIGNhbGxlZCBpdCBvbiBgWyd4YXknLCAneGJ5J11gLiBXaGVuIGBtYWdpY2FsQnJhY2VzOnRydWVgXG4gKiBpcyBpbiB0aGUgb3B0aW9ucywgYnJhY2UgZXhwYW5zaW9uIF9pc18gdHJlYXRlZCBhcyBhIHBhdHRlcm4gaGF2aW5nIG1hZ2ljLlxuICovXG5leHBvcnQgY29uc3QgaGFzTWFnaWMgPSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7XG4gICAgICAgIHBhdHRlcm4gPSBbcGF0dGVybl07XG4gICAgfVxuICAgIGZvciAoY29uc3QgcCBvZiBwYXR0ZXJuKSB7XG4gICAgICAgIGlmIChuZXcgTWluaW1hdGNoKHAsIG9wdGlvbnMpLmhhc01hZ2ljKCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhcy1tYWdpYy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVzY2FwZSwgdW5lc2NhcGUgfSBmcm9tICdtaW5pbWF0Y2gnO1xuaW1wb3J0IHsgR2xvYiB9IGZyb20gJy4vZ2xvYi5qcyc7XG5pbXBvcnQgeyBoYXNNYWdpYyB9IGZyb20gJy4vaGFzLW1hZ2ljLmpzJztcbmV4cG9ydCB7IGVzY2FwZSwgdW5lc2NhcGUgfSBmcm9tICdtaW5pbWF0Y2gnO1xuZXhwb3J0IHsgR2xvYiB9IGZyb20gJy4vZ2xvYi5qcyc7XG5leHBvcnQgeyBoYXNNYWdpYyB9IGZyb20gJy4vaGFzLW1hZ2ljLmpzJztcbmV4cG9ydCB7IElnbm9yZSB9IGZyb20gJy4vaWdub3JlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBnbG9iU3RyZWFtU3luYyhwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IEdsb2IocGF0dGVybiwgb3B0aW9ucykuc3RyZWFtU3luYygpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JTdHJlYW0ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBHbG9iKHBhdHRlcm4sIG9wdGlvbnMpLnN0cmVhbSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JTeW5jKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgR2xvYihwYXR0ZXJuLCBvcHRpb25zKS53YWxrU3luYygpO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2xvYl8ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBHbG9iKHBhdHRlcm4sIG9wdGlvbnMpLndhbGsoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnbG9iSXRlcmF0ZVN5bmMocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBHbG9iKHBhdHRlcm4sIG9wdGlvbnMpLml0ZXJhdGVTeW5jKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2xvYkl0ZXJhdGUocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBHbG9iKHBhdHRlcm4sIG9wdGlvbnMpLml0ZXJhdGUoKTtcbn1cbi8vIGFsaWFzZXM6IGdsb2Iuc3luYy5zdHJlYW0oKSBnbG9iLnN0cmVhbS5zeW5jKCkgZ2xvYi5zeW5jKCkgZXRjXG5leHBvcnQgY29uc3Qgc3RyZWFtU3luYyA9IGdsb2JTdHJlYW1TeW5jO1xuZXhwb3J0IGNvbnN0IHN0cmVhbSA9IE9iamVjdC5hc3NpZ24oZ2xvYlN0cmVhbSwgeyBzeW5jOiBnbG9iU3RyZWFtU3luYyB9KTtcbmV4cG9ydCBjb25zdCBpdGVyYXRlU3luYyA9IGdsb2JJdGVyYXRlU3luYztcbmV4cG9ydCBjb25zdCBpdGVyYXRlID0gT2JqZWN0LmFzc2lnbihnbG9iSXRlcmF0ZSwge1xuICAgIHN5bmM6IGdsb2JJdGVyYXRlU3luYyxcbn0pO1xuZXhwb3J0IGNvbnN0IHN5bmMgPSBPYmplY3QuYXNzaWduKGdsb2JTeW5jLCB7XG4gICAgc3RyZWFtOiBnbG9iU3RyZWFtU3luYyxcbiAgICBpdGVyYXRlOiBnbG9iSXRlcmF0ZVN5bmMsXG59KTtcbmV4cG9ydCBjb25zdCBnbG9iID0gT2JqZWN0LmFzc2lnbihnbG9iXywge1xuICAgIGdsb2I6IGdsb2JfLFxuICAgIGdsb2JTeW5jLFxuICAgIHN5bmMsXG4gICAgZ2xvYlN0cmVhbSxcbiAgICBzdHJlYW0sXG4gICAgZ2xvYlN0cmVhbVN5bmMsXG4gICAgc3RyZWFtU3luYyxcbiAgICBnbG9iSXRlcmF0ZSxcbiAgICBpdGVyYXRlLFxuICAgIGdsb2JJdGVyYXRlU3luYyxcbiAgICBpdGVyYXRlU3luYyxcbiAgICBHbG9iLFxuICAgIGhhc01hZ2ljLFxuICAgIGVzY2FwZSxcbiAgICB1bmVzY2FwZSxcbn0pO1xuZ2xvYi5nbG9iID0gZ2xvYjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZ2xvYiB9IGZyb20gXCJnbG9iXCI7XHJcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XHJcbmltcG9ydCB7IGN3ZCwgZW52IH0gZnJvbSBcIm5vZGU6cHJvY2Vzc1wiO1xyXG5pbXBvcnQgdHlwZSB7IE1pbGtpb0FkYXB0ZXIsIFZpdGVJbnB1dCwgVml0ZU91dHB1dCB9IGZyb20gXCIuL2luZGV4LnRzXCI7XHJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcclxuXHJcbmNvbnN0IGFkYXB0ZXJOYW1lID0gXCJlZGdlLW9uZVwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVkZ2VPbmVBZGFwdGVyKCk6IE1pbGtpb0FkYXB0ZXIge1xyXG4gIHJldHVybiB7XHJcbiAgICBuYW1lOiBhZGFwdGVyTmFtZSxcclxuICAgIGFkYXB0ZXI6IGFzeW5jIChvcHRpb25zOiB7fSkgPT4ge1xyXG4gICAgICAvKipcclxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAqIEBzdGVwIGlucHV0XHJcbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgKi9cclxuICAgICAgY29uc3QgaW5wdXQ6IFZpdGVJbnB1dCA9IHt9O1xyXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZ2xvYihcImNvbnRyb2xsZXIvKiovKi57YWN0aW9uLHN0cmVhbX0udHNcIik7XHJcbiAgICAgIGNvbnN0IHRhc2tzOiBBcnJheTxQcm9taXNlPHZvaWQ+PiA9IFtdO1xyXG4gICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXJQYXRoIG9mIHJlc3VsdHMpIHtcclxuICAgICAgICB0YXNrcy5wdXNoKFxyXG4gICAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcGF0aFNwbGl0ID0gY29udHJvbGxlclBhdGhcclxuICAgICAgICAgICAgICAucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpXHJcbiAgICAgICAgICAgICAgLnNsaWNlKDAsIGNvbnRyb2xsZXJQYXRoLmxlbmd0aCAtIDEwKSAvLyAxMCA9PT0gXCIuYWN0aW9uLnRzXCIubGVuZ3RoIG9yIFwiLnN0cmVhbS50c1wiLmxlbmd0aFxyXG4gICAgICAgICAgICAgIC5zcGxpdChcIi9cIilcclxuICAgICAgICAgICAgICAuc2xpY2UoMSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxldmVsID0gcGF0aFNwbGl0Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IHBhdGhTcGxpdC5qb2luKFwiL1wiKTtcclxuICAgICAgICAgICAgY29uc3QgYmFja1RvUm9vdCA9IFwiLi4vXCIucmVwZWF0KGxldmVsICsgMSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlc0ZvbGRlciA9IGAubWlsa2lvL2dlbmVyYXRlZC9yb3V0ZXMvY29udHJvbGxlcl9fJHtwYXRoLnJlcGxhY2VBbGwoXCIvXCIsIFwiX19cIikucmVwbGFjZUFsbChcIi1cIiwgXCJfXCIpfWA7XHJcblxyXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSB0aGUgcm91dGVzIGdlbmVyYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGFuZCBzZWxlY3QgdGhlIGxhdGVzdCBwaWVjZSBvZiBkYXRhXHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlc0ZvbGRlckZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihyb3V0ZXNGb2xkZXIpO1xyXG4gICAgICAgICAgICBpZiAocm91dGVzRm9sZGVyRmlsZXMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHJvdXRlcyBmb3VuZCBpbiAke3JvdXRlc0ZvbGRlcn1gKTtcclxuICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIGZ1bGwgcGF0aHMgYW5kIHN0YXR1cyBpbmZvcm1hdGlvbiBvZiBhbGwgZmlsZXNcclxuICAgICAgICAgICAgY29uc3QgZmlsZXNXaXRoU3RhdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICByb3V0ZXNGb2xkZXJGaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihyb3V0ZXNGb2xkZXIsIGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IGZpbGVQYXRoLCBiaXJ0aFRpbWU6IHN0YXRzLmJpcnRodGltZSB9O1xyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCByb3V0ZVBhdGggPSBmaWxlc1dpdGhTdGF0cy5zb3J0KChhLCBiKSA9PiBiLmJpcnRoVGltZS5nZXRUaW1lKCkgLSBhLmJpcnRoVGltZS5nZXRUaW1lKCkpLmF0KDApPy5maWxlUGF0aDtcclxuICAgICAgICAgICAgaWYgKCFyb3V0ZVBhdGgpIHRocm93IG5ldyBFcnJvcihgTm8gcm91dGVzIGZvdW5kIGluICR7cm91dGVzRm9sZGVyfWApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGVkUGF0aCA9IGAubWlsa2lvLyR7YWRhcHRlck5hbWV9LyR7cGF0aH0udHNgO1xyXG4gICAgICAgICAgICBhd2FpdCBmcy5vdXRwdXRGaWxlKFxyXG4gICAgICAgICAgICAgIGdlbmVyYXRlZFBhdGgsXHJcbiAgICAgICAgICAgICAgYGltcG9ydCB7IGNyZWF0ZSB9IGZyb20gXCIke2JhY2tUb1Jvb3R9aW5kZXgudHNcIjtcclxuaW1wb3J0IHJvdXRlU2NoZW1hIGZyb20gXCIke2JhY2tUb1Jvb3R9JHtyb3V0ZVBhdGgucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpfVwiO1xyXG5cclxuY29uc3Qgd29ybGQgPSBjcmVhdGUoe1xyXG4gIGRldmVsb3A6ICR7ZW52Lk1JTEtJT19ERVZFTE9QID09PSBcIkVOQUJMRVwiID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJ9LFxyXG4gIGFyZ3Y6IFtdLFxyXG59KTtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvblJlcXVlc3QoY29udGV4dCkge1xyXG4gIHJldHVybiBhd2FpdCAoYXdhaXQgd29ybGQpLmxpc3RlbmVyLmZldGNoKHtcclxuICAgIHJlcXVlc3Q6IGNvbnRleHQucmVxdWVzdCxcclxuICAgIGVudjogY29udGV4dC5lbnYsXHJcbiAgICBlbnZNb2RlOiBcIiR7ZW52Lk1JTEtJT19ERVZFTE9QID09PSBcIkVOQUJMRVwiID8gXCJkZXZlbG9wbWVudFwiIDogXCJwcm9kdWN0aW9uXCJ9XCIsXHJcbiAgICByb3V0ZVNjaGVtYSxcclxuICB9KTtcclxufWAsXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpbnB1dFtwYXRoXSA9IGdlbmVyYXRlZFBhdGg7XHJcbiAgICAgICAgICB9KSgpLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGFza3MpO1xyXG5cclxuICAgICAgLyoqXHJcbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgKiBAc3RlcCBvdXRwdXRcclxuICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAqL1xyXG4gICAgICBjb25zdCBvdXRwdXQ6IFZpdGVPdXRwdXQgPSB7fTtcclxuICAgICAgb3V0cHV0LmVudHJ5RmlsZU5hbWVzID0gXCJmdW5jdGlvbnMvW25hbWVdLmpzXCI7XHJcbiAgICAgIG91dHB1dC5jaHVua0ZpbGVOYW1lcyA9IFwiZnVuY3Rpb25zLy5taWxraW8vW25hbWVdLVtoYXNoXS5qc1wiO1xyXG4gICAgICBvdXRwdXQuYXNzZXRGaWxlTmFtZXMgPSBcImZ1bmN0aW9ucy8ubWlsa2lvL1tuYW1lXS1baGFzaF1bZXh0bmFtZV1cIjtcclxuICAgICAgb3V0cHV0LnNvdXJjZW1hcCA9IFwiaW5saW5lXCI7XHJcbiAgICAgIG91dHB1dC5wcmVzZXJ2ZU1vZHVsZXMgPSBmYWxzZTtcclxuXHJcbiAgICAgIHJldHVybiB7IGlucHV0LCBvdXRwdXQgfTtcclxuICAgIH0sXHJcbiAgfSBzYXRpc2ZpZXMgTWlsa2lvQWRhcHRlcjtcclxufVxyXG4iLAogICAgImltcG9ydCB0eXBlIHsgVXNlckNvbmZpZyB9IGZyb20gXCJ2aXRlXCI7XHJcbmltcG9ydCB7IGVkZ2VPbmVBZGFwdGVyIH0gZnJvbSBcIi4vZWRnZS1vbmUudHNcIjtcclxuXHJcbmV4cG9ydCB0eXBlIFZpdGVJbnB1dCA9IEV4Y2x1ZGU8RXhjbHVkZTxVc2VyQ29uZmlnW1wiYnVpbGRcIl0sIHVuZGVmaW5lZD5bXCJyb2xsdXBPcHRpb25zXCJdLCB1bmRlZmluZWQ+W1wiaW5wdXRcIl07XHJcbmV4cG9ydCB0eXBlIFZpdGVPdXRwdXQgPSBFeGNsdWRlPEV4Y2x1ZGU8VXNlckNvbmZpZ1tcImJ1aWxkXCJdLCB1bmRlZmluZWQ+W1wicm9sbHVwT3B0aW9uc1wiXSwgdW5kZWZpbmVkPltcIm91dHB1dFwiXTtcclxuXHJcbmV4cG9ydCB0eXBlIE1pbGtpb0FkYXB0ZXIgPSB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGFkYXB0ZXI6IChvcHRpb25zOiB7fSkgPT4gUHJvbWlzZTx7XHJcbiAgICBpbnB1dDogVml0ZUlucHV0O1xyXG4gICAgb3V0cHV0OiBWaXRlT3V0cHV0O1xyXG4gIH0+O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGFkYXB0ZXJzOiBBcnJheTxNaWxraW9BZGFwdGVyPiA9IFtlZGdlT25lQWRhcHRlcigpXTtcclxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUNBLElBQU0sWUFBWTtBQUFBO0FBQUEsRUFDbEIsTUFBTSxvQkFBb0IsTUFBTTtBQUFBLElBRTlCLFdBQVksQ0FBQyxLQUFLLFVBQVUsWUFBWTtBQUFBLE1BQ3RDLE1BQU0sbUJBQW1CLEtBQUssVUFBVSxVQUFVO0FBQUEsTUFDbEQsS0FBSyxPQUFPO0FBQUEsTUFDWixLQUFLLE9BQU87QUFBQSxNQUNaLElBQUksTUFBTTtBQUFBLFFBQW1CLE1BQU0sa0JBQWtCLE1BQU0sV0FBVztBQUFBO0FBQUEsRUFFMUU7QUFBQTtBQUFBLEVBQ0EsTUFBTSxNQUFNO0FBQUEsSUFDVixXQUFZLENBQUMsUUFBUTtBQUFBLE1BQ25CLEtBQUssU0FBUztBQUFBLE1BQ2QsS0FBSyxNQUFNO0FBQUEsTUFDWCxLQUFLLFdBQVc7QUFBQSxNQUNoQixLQUFLLFNBQVM7QUFBQSxNQUNkLEtBQUssY0FBYztBQUFBLE1BQ25CLEtBQUssWUFBWTtBQUFBO0FBQUEsRUFFckI7QUFBQTtBQUFBLEVBQ0EsTUFBTSxPQUFPO0FBQUEsSUFDWCxXQUFZLEdBQUc7QUFBQSxNQUNiLEtBQUssTUFBTTtBQUFBLE1BQ1gsS0FBSyxNQUFNO0FBQUEsTUFDWCxLQUFLLE9BQU87QUFBQSxNQUNaLEtBQUssTUFBTSxDQUFDO0FBQUEsTUFDWixLQUFLLE1BQU0sS0FBSztBQUFBLE1BQ2hCLEtBQUssUUFBUSxDQUFDO0FBQUEsTUFDZCxLQUFLLE9BQU87QUFBQSxNQUNaLEtBQUssT0FBTztBQUFBLE1BQ1osS0FBSyxLQUFLO0FBQUEsTUFDVixLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssVUFBVTtBQUFBO0FBQUEsSUFHeEMsS0FBTSxDQUFDLEtBQUs7QUFBQSxNQUVWLElBQUks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QUFBLFFBQWMsT0FBTyxlQUFlLENBQUM7QUFBQSxNQUNqRCxPQUFPLGFBQWEsY0FBYztBQUFBLE1BR2xDLEtBQUssT0FBTztBQUFBLFFBQVMsT0FBTyxVQUFVLENBQUM7QUFBQSxNQUV2QyxPQUFPLFFBQVEsUUFBUTtBQUFBLFdBQ2pCLE9BQU8sUUFBUSxTQUFTLENBQUM7QUFBQSxNQUMvQjtBQUFBLE1BR0EsT0FBTyxNQUFNO0FBQUEsUUFDWCxZQUFZLGNBQWM7QUFBQSxNQUM1QjtBQUFBO0FBQUEsSUFHRixjQUFjLENBQUMsZ0JBQWdCO0FBQUEsTUFDN0IsU0FBUyxlQUFlLE1BQU0sVUFBVTtBQUFBO0FBQUEsU0FHcEMsWUFBVyxHQUFHO0FBQUEsTUFDbEIsTUFBTSxXQUFXLE1BQUssS0FBSSxHQUFHLFFBQVEsVUFBVTtBQUFBLE1BQy9DLE1BQU0sVUFBVSxVQUFVLElBQUksT0FBTztBQUFBO0FBQUEsRUFFekM7QUFBQTtBQUdGLFNBQVMsYUFBYSxHQUFHO0FBQUEsRUFFdkIsTUFBTSxNQUFNLENBQUMsT0FBTyxPQUFPO0FBQUEsRUFHM0IsSUFBSSxjQUFjLENBQUMsR0FBSSxXQUFXLE1BQUssS0FBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLGFBQVksTUFBSyxLQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFJLEdBQUksV0FBVyxNQUFLLEtBQUksR0FBRyxNQUFNLE1BQU0sY0FBYyxDQUFDLElBQUksYUFBWSxNQUFLLEtBQUksR0FBRyxNQUFNLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFFLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixXQUFXLFdBQVcsR0FBRyxDQUFDO0FBQUEsRUFFelIsY0FBYyxZQUFZLE9BQU8sQ0FBQyxlQUFlLGVBQWUsVUFBVTtBQUFBLEVBRTFFLE1BQU0sb0JBQW9CLFlBQVksSUFBSSxDQUFDLGVBQWdCLFdBQVcsV0FBVyxHQUFHLElBQUksSUFBSSxPQUFPLElBQUksYUFBYSxJQUFJLFVBQVc7QUFBQSxFQUVuSSxPQUFPLENBQUMsR0FBRyxLQUFLLEdBQUcsaUJBQWlCO0FBQUE7QUFHdEMsZUFBZSxzQkFBc0IsR0FBaUI7QUFBQSxFQUNwRCxNQUFNLGtCQUFrQixNQUFNLFNBQVMsTUFBSyxLQUFJLEdBQUcsTUFBTSxNQUFNLGVBQWUsR0FBRyxPQUFPO0FBQUEsRUFDeEYsTUFBTSxlQUFlLG9CQUFLLE1BQU0sZUFBZTtBQUFBLEVBQy9DLElBQUk7QUFBQSxFQUNKLFdBQVcsZUFBZSxhQUFhLFVBQWlCO0FBQUEsSUFFdEQsSUFBSSxNQUFLLEtBQUksQ0FBQyxNQUFNLE1BQUssS0FBSSxHQUFHLE1BQU0sV0FBVztBQUFBLE1BQUc7QUFBQSxJQUNwRCxVQUFXLGFBQWEsU0FBaUI7QUFBQSxJQUN6QztBQUFBLEVBQ0Y7QUFBQSxFQUNBLEtBQUs7QUFBQSxJQUFTLE1BQU0sSUFBSSxNQUFNLG9DQUFvQztBQUFBLEVBQ2xFLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIjA0MzU2Qzc2NTVCNTIwMDc2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
9786
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxAaWFybmFcXHRvbWxcXGxpYlxccGFyc2VyLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcQGlhcm5hXFx0b21sXFxsaWJcXGNyZWF0ZS1kYXRldGltZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXEBpYXJuYVxcdG9tbFxcbGliXFxmb3JtYXQtbnVtLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcQGlhcm5hXFx0b21sXFxsaWJcXGNyZWF0ZS1kYXRldGltZS1mbG9hdC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXEBpYXJuYVxcdG9tbFxcbGliXFxjcmVhdGUtZGF0ZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXEBpYXJuYVxcdG9tbFxcbGliXFxjcmVhdGUtdGltZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXEBpYXJuYVxcdG9tbFxcbGliXFx0b21sLXBhcnNlci5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXEBpYXJuYVxcdG9tbFxccGFyc2UtcHJldHR5LWVycm9yLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcQGlhcm5hXFx0b21sXFxwYXJzZS1zdHJpbmcuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxAaWFybmFcXHRvbWxcXHBhcnNlLWFzeW5jLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcQGlhcm5hXFx0b21sXFxwYXJzZS1zdHJlYW0uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxAaWFybmFcXHRvbWxcXHBhcnNlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcQGlhcm5hXFx0b21sXFxzdHJpbmdpZnkuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxAaWFybmFcXHRvbWxcXHRvbWwuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxiYWxhbmNlZC1tYXRjaFxcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxicmFjZS1leHBhbnNpb25cXGluZGV4LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcdW5pdmVyc2FsaWZ5XFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGdyYWNlZnVsLWZzXFxwb2x5ZmlsbHMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxncmFjZWZ1bC1mc1xcbGVnYWN5LXN0cmVhbXMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxncmFjZWZ1bC1mc1xcY2xvbmUuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxncmFjZWZ1bC1mc1xcZ3JhY2VmdWwtZnMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxmc1xcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxta2RpcnNcXHV0aWxzLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcbWtkaXJzXFxtYWtlLWRpci5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXG1rZGlyc1xcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxwYXRoLWV4aXN0c1xcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFx1dGlsXFx1dGltZXMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFx1dGlsXFxzdGF0LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcY29weVxcY29weS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGNvcHlcXGNvcHktc3luYy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGNvcHlcXGluZGV4LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxccmVtb3ZlXFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGVtcHR5XFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGVuc3VyZVxcZmlsZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGVuc3VyZVxcbGluay5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGVuc3VyZVxcc3ltbGluay1wYXRocy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGVuc3VyZVxcc3ltbGluay10eXBlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcZW5zdXJlXFxzeW1saW5rLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcZW5zdXJlXFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGpzb25maWxlXFx1dGlscy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGpzb25maWxlXFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGZzLWV4dHJhXFxsaWJcXGpzb25cXGpzb25maWxlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcb3V0cHV0LWZpbGVcXGluZGV4LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcanNvblxcb3V0cHV0LWpzb24uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxqc29uXFxvdXRwdXQtanNvbi1zeW5jLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcanNvblxcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxtb3ZlXFxtb3ZlLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcbW92ZVxcbW92ZS1zeW5jLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZnMtZXh0cmFcXGxpYlxcbW92ZVxcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxmcy1leHRyYVxcbGliXFxpbmRleC5qcyIsICIuLlxcaW5kZXgudHMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxtaW5pbWF0Y2hcXGRpc3RcXGVzbVxcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxtaW5pbWF0Y2hcXGRpc3RcXGVzbVxcYXNzZXJ0LXZhbGlkLXBhdHRlcm4uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxtaW5pbWF0Y2hcXGRpc3RcXGVzbVxcYnJhY2UtZXhwcmVzc2lvbnMuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxtaW5pbWF0Y2hcXGRpc3RcXGVzbVxcdW5lc2NhcGUuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxtaW5pbWF0Y2hcXGRpc3RcXGVzbVxcYXN0LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcbWluaW1hdGNoXFxkaXN0XFxlc21cXGVzY2FwZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGdsb2JcXGRpc3RcXGVzbVxcZ2xvYi5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGxydS1jYWNoZVxcZGlzdFxcZXNtXFxpbmRleC5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXHBhdGgtc2N1cnJ5XFxkaXN0XFxlc21cXGluZGV4LmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcbWluaXBhc3NcXGRpc3RcXGVzbVxcaW5kZXguanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxnbG9iXFxkaXN0XFxlc21cXHBhdHRlcm4uanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxnbG9iXFxkaXN0XFxlc21cXGlnbm9yZS5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGdsb2JcXGRpc3RcXGVzbVxccHJvY2Vzc29yLmpzIiwgIi4uXFwuLlxcLi5cXG5vZGVfbW9kdWxlc1xcZ2xvYlxcZGlzdFxcZXNtXFx3YWxrZXIuanMiLCAiLi5cXC4uXFwuLlxcbm9kZV9tb2R1bGVzXFxnbG9iXFxkaXN0XFxlc21cXGhhcy1tYWdpYy5qcyIsICIuLlxcLi5cXC4uXFxub2RlX21vZHVsZXNcXGdsb2JcXGRpc3RcXGVzbVxcaW5kZXguanMiLCAiLi5cXGFkYXB0ZXJzXFxlZGdlLW9uZS50cyIsICIuLlxcYWRhcHRlcnNcXGluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIid1c2Ugc3RyaWN0J1xuY29uc3QgUGFyc2VyRU5EID0gMHgxMTAwMDBcbmNsYXNzIFBhcnNlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdHJ1Y3RvciAobXNnLCBmaWxlbmFtZSwgbGluZW51bWJlcikge1xuICAgIHN1cGVyKCdbUGFyc2VyRXJyb3JdICcgKyBtc2csIGZpbGVuYW1lLCBsaW5lbnVtYmVyKVxuICAgIHRoaXMubmFtZSA9ICdQYXJzZXJFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnUGFyc2VyRXJyb3InXG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBQYXJzZXJFcnJvcilcbiAgfVxufVxuY2xhc3MgU3RhdGUge1xuICBjb25zdHJ1Y3RvciAocGFyc2VyKSB7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXJcbiAgICB0aGlzLmJ1ZiA9ICcnXG4gICAgdGhpcy5yZXR1cm5lZCA9IG51bGxcbiAgICB0aGlzLnJlc3VsdCA9IG51bGxcbiAgICB0aGlzLnJlc3VsdFRhYmxlID0gbnVsbFxuICAgIHRoaXMucmVzdWx0QXJyID0gbnVsbFxuICB9XG59XG5jbGFzcyBQYXJzZXIge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5wb3MgPSAwXG4gICAgdGhpcy5jb2wgPSAwXG4gICAgdGhpcy5saW5lID0gMFxuICAgIHRoaXMub2JqID0ge31cbiAgICB0aGlzLmN0eCA9IHRoaXMub2JqXG4gICAgdGhpcy5zdGFjayA9IFtdXG4gICAgdGhpcy5fYnVmID0gJydcbiAgICB0aGlzLmNoYXIgPSBudWxsXG4gICAgdGhpcy5paSA9IDBcbiAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKHRoaXMucGFyc2VTdGFydClcbiAgfVxuXG4gIHBhcnNlIChzdHIpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChzdHIubGVuZ3RoID09PSAwIHx8IHN0ci5sZW5ndGggPT0gbnVsbCkgcmV0dXJuXG5cbiAgICB0aGlzLl9idWYgPSBTdHJpbmcoc3RyKVxuICAgIHRoaXMuaWkgPSAtMVxuICAgIHRoaXMuY2hhciA9IC0xXG4gICAgbGV0IGdldE5leHRcbiAgICB3aGlsZSAoZ2V0TmV4dCA9PT0gZmFsc2UgfHwgdGhpcy5uZXh0Q2hhcigpKSB7XG4gICAgICBnZXROZXh0ID0gdGhpcy5ydW5PbmUoKVxuICAgIH1cbiAgICB0aGlzLl9idWYgPSBudWxsXG4gIH1cbiAgbmV4dENoYXIgKCkge1xuICAgIGlmICh0aGlzLmNoYXIgPT09IDB4MEEpIHtcbiAgICAgICsrdGhpcy5saW5lXG4gICAgICB0aGlzLmNvbCA9IC0xXG4gICAgfVxuICAgICsrdGhpcy5paVxuICAgIHRoaXMuY2hhciA9IHRoaXMuX2J1Zi5jb2RlUG9pbnRBdCh0aGlzLmlpKVxuICAgICsrdGhpcy5wb3NcbiAgICArK3RoaXMuY29sXG4gICAgcmV0dXJuIHRoaXMuaGF2ZUJ1ZmZlcigpXG4gIH1cbiAgaGF2ZUJ1ZmZlciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWkgPCB0aGlzLl9idWYubGVuZ3RoXG4gIH1cbiAgcnVuT25lICgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5wYXJzZXIuY2FsbCh0aGlzLCB0aGlzLnN0YXRlLnJldHVybmVkKVxuICB9XG4gIGZpbmlzaCAoKSB7XG4gICAgdGhpcy5jaGFyID0gUGFyc2VyRU5EXG4gICAgbGV0IGxhc3RcbiAgICBkbyB7XG4gICAgICBsYXN0ID0gdGhpcy5zdGF0ZS5wYXJzZXJcbiAgICAgIHRoaXMucnVuT25lKClcbiAgICB9IHdoaWxlICh0aGlzLnN0YXRlLnBhcnNlciAhPT0gbGFzdClcblxuICAgIHRoaXMuY3R4ID0gbnVsbFxuICAgIHRoaXMuc3RhdGUgPSBudWxsXG4gICAgdGhpcy5fYnVmID0gbnVsbFxuXG4gICAgcmV0dXJuIHRoaXMub2JqXG4gIH1cbiAgbmV4dCAoZm4pIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBQYXJzZXJFcnJvcignVHJpZWQgdG8gc2V0IHN0YXRlIHRvIG5vbi1leGlzdGVudCBzdGF0ZTogJyArIEpTT04uc3RyaW5naWZ5KGZuKSlcbiAgICB0aGlzLnN0YXRlLnBhcnNlciA9IGZuXG4gIH1cbiAgZ290byAoZm4pIHtcbiAgICB0aGlzLm5leHQoZm4pXG4gICAgcmV0dXJuIHRoaXMucnVuT25lKClcbiAgfVxuICBjYWxsIChmbiwgcmV0dXJuV2l0aCkge1xuICAgIGlmIChyZXR1cm5XaXRoKSB0aGlzLm5leHQocmV0dXJuV2l0aClcbiAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5zdGF0ZSlcbiAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKGZuKVxuICB9XG4gIGNhbGxOb3cgKGZuLCByZXR1cm5XaXRoKSB7XG4gICAgdGhpcy5jYWxsKGZuLCByZXR1cm5XaXRoKVxuICAgIHJldHVybiB0aGlzLnJ1bk9uZSgpXG4gIH1cbiAgcmV0dXJuICh2YWx1ZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID09PSAwKSB0aHJvdyB0aGlzLmVycm9yKG5ldyBQYXJzZXJFcnJvcignU3RhY2sgdW5kZXJmbG93JykpXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHZhbHVlID0gdGhpcy5zdGF0ZS5idWZcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGFjay5wb3AoKVxuICAgIHRoaXMuc3RhdGUucmV0dXJuZWQgPSB2YWx1ZVxuICB9XG4gIHJldHVybk5vdyAodmFsdWUpIHtcbiAgICB0aGlzLnJldHVybih2YWx1ZSlcbiAgICByZXR1cm4gdGhpcy5ydW5PbmUoKVxuICB9XG4gIGNvbnN1bWUgKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuY2hhciA9PT0gUGFyc2VyRU5EKSB0aHJvdyB0aGlzLmVycm9yKG5ldyBQYXJzZXJFcnJvcignVW5leHBlY3RlZCBlbmQtb2YtYnVmZmVyJykpXG4gICAgdGhpcy5zdGF0ZS5idWYgKz0gdGhpcy5fYnVmW3RoaXMuaWldXG4gIH1cbiAgZXJyb3IgKGVycikge1xuICAgIGVyci5saW5lID0gdGhpcy5saW5lXG4gICAgZXJyLmNvbCA9IHRoaXMuY29sXG4gICAgZXJyLnBvcyA9IHRoaXMucG9zXG4gICAgcmV0dXJuIGVyclxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHBhcnNlU3RhcnQgKCkge1xuICAgIHRocm93IG5ldyBQYXJzZXJFcnJvcignTXVzdCBkZWNsYXJlIGEgcGFyc2VTdGFydCBtZXRob2QnKVxuICB9XG59XG5QYXJzZXIuRU5EID0gUGFyc2VyRU5EXG5QYXJzZXIuRXJyb3IgPSBQYXJzZXJFcnJvclxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5tb2R1bGUuZXhwb3J0cyA9IHZhbHVlID0+IHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzTmFOKGRhdGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBEYXRldGltZScpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRhdGVcbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcbm1vZHVsZS5leHBvcnRzID0gKGQsIG51bSkgPT4ge1xuICBudW0gPSBTdHJpbmcobnVtKVxuICB3aGlsZSAobnVtLmxlbmd0aCA8IGQpIG51bSA9ICcwJyArIG51bVxuICByZXR1cm4gbnVtXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuY29uc3QgZiA9IHJlcXVpcmUoJy4vZm9ybWF0LW51bS5qcycpXG5cbmNsYXNzIEZsb2F0aW5nRGF0ZVRpbWUgZXh0ZW5kcyBEYXRlIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgc3VwZXIodmFsdWUgKyAnWicpXG4gICAgdGhpcy5pc0Zsb2F0aW5nID0gdHJ1ZVxuICB9XG4gIHRvSVNPU3RyaW5nICgpIHtcbiAgICBjb25zdCBkYXRlID0gYCR7dGhpcy5nZXRVVENGdWxsWWVhcigpfS0ke2YoMiwgdGhpcy5nZXRVVENNb250aCgpICsgMSl9LSR7ZigyLCB0aGlzLmdldFVUQ0RhdGUoKSl9YFxuICAgIGNvbnN0IHRpbWUgPSBgJHtmKDIsIHRoaXMuZ2V0VVRDSG91cnMoKSl9OiR7ZigyLCB0aGlzLmdldFVUQ01pbnV0ZXMoKSl9OiR7ZigyLCB0aGlzLmdldFVUQ1NlY29uZHMoKSl9LiR7ZigzLCB0aGlzLmdldFVUQ01pbGxpc2Vjb25kcygpKX1gXG4gICAgcmV0dXJuIGAke2RhdGV9VCR7dGltZX1gXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2YWx1ZSA9PiB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRmxvYXRpbmdEYXRlVGltZSh2YWx1ZSlcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc05hTihkYXRlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgRGF0ZXRpbWUnKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBkYXRlXG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5jb25zdCBmID0gcmVxdWlyZSgnLi9mb3JtYXQtbnVtLmpzJylcbmNvbnN0IERhdGVUaW1lID0gZ2xvYmFsLkRhdGVcblxuY2xhc3MgRGF0ZSBleHRlbmRzIERhdGVUaW1lIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgc3VwZXIodmFsdWUpXG4gICAgdGhpcy5pc0RhdGUgPSB0cnVlXG4gIH1cbiAgdG9JU09TdHJpbmcgKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmdldFVUQ0Z1bGxZZWFyKCl9LSR7ZigyLCB0aGlzLmdldFVUQ01vbnRoKCkgKyAxKX0tJHtmKDIsIHRoaXMuZ2V0VVRDRGF0ZSgpKX1gXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2YWx1ZSA9PiB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc05hTihkYXRlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgRGF0ZXRpbWUnKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBkYXRlXG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5jb25zdCBmID0gcmVxdWlyZSgnLi9mb3JtYXQtbnVtLmpzJylcblxuY2xhc3MgVGltZSBleHRlbmRzIERhdGUge1xuICBjb25zdHJ1Y3RvciAodmFsdWUpIHtcbiAgICBzdXBlcihgMDAwMC0wMS0wMVQke3ZhbHVlfVpgKVxuICAgIHRoaXMuaXNUaW1lID0gdHJ1ZVxuICB9XG4gIHRvSVNPU3RyaW5nICgpIHtcbiAgICByZXR1cm4gYCR7ZigyLCB0aGlzLmdldFVUQ0hvdXJzKCkpfToke2YoMiwgdGhpcy5nZXRVVENNaW51dGVzKCkpfToke2YoMiwgdGhpcy5nZXRVVENTZWNvbmRzKCkpfS4ke2YoMywgdGhpcy5nZXRVVENNaWxsaXNlY29uZHMoKSl9YFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWUgPT4ge1xuICBjb25zdCBkYXRlID0gbmV3IFRpbWUodmFsdWUpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoaXNOYU4oZGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIERhdGV0aW1lJylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGF0ZVxuICB9XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmV3LXdyYXBwZXJzLCBuby1ldmFsLCBjYW1lbGNhc2UsIG9wZXJhdG9yLWxpbmVicmVhayAqL1xubW9kdWxlLmV4cG9ydHMgPSBtYWtlUGFyc2VyQ2xhc3MocmVxdWlyZSgnLi9wYXJzZXIuanMnKSlcbm1vZHVsZS5leHBvcnRzLm1ha2VQYXJzZXJDbGFzcyA9IG1ha2VQYXJzZXJDbGFzc1xuXG5jbGFzcyBUb21sRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtc2cpIHtcbiAgICBzdXBlcihtc2cpXG4gICAgdGhpcy5uYW1lID0gJ1RvbWxFcnJvcidcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgVG9tbEVycm9yKVxuICAgIHRoaXMuZnJvbVRPTUwgPSB0cnVlXG4gICAgdGhpcy53cmFwcGVkID0gbnVsbFxuICB9XG59XG5Ub21sRXJyb3Iud3JhcCA9IGVyciA9PiB7XG4gIGNvbnN0IHRlcnIgPSBuZXcgVG9tbEVycm9yKGVyci5tZXNzYWdlKVxuICB0ZXJyLmNvZGUgPSBlcnIuY29kZVxuICB0ZXJyLndyYXBwZWQgPSBlcnJcbiAgcmV0dXJuIHRlcnJcbn1cbm1vZHVsZS5leHBvcnRzLlRvbWxFcnJvciA9IFRvbWxFcnJvclxuXG5jb25zdCBjcmVhdGVEYXRlVGltZSA9IHJlcXVpcmUoJy4vY3JlYXRlLWRhdGV0aW1lLmpzJylcbmNvbnN0IGNyZWF0ZURhdGVUaW1lRmxvYXQgPSByZXF1aXJlKCcuL2NyZWF0ZS1kYXRldGltZS1mbG9hdC5qcycpXG5jb25zdCBjcmVhdGVEYXRlID0gcmVxdWlyZSgnLi9jcmVhdGUtZGF0ZS5qcycpXG5jb25zdCBjcmVhdGVUaW1lID0gcmVxdWlyZSgnLi9jcmVhdGUtdGltZS5qcycpXG5cbmNvbnN0IENUUkxfSSA9IDB4MDlcbmNvbnN0IENUUkxfSiA9IDB4MEFcbmNvbnN0IENUUkxfTSA9IDB4MERcbmNvbnN0IENUUkxfQ0hBUl9CT1VOREFSWSA9IDB4MUYgLy8gdGhlIGxhc3Qgbm9uLWNoYXJhY3RlciBpbiB0aGUgbGF0aW4xIHJlZ2lvbiBvZiB1bmljb2RlLCBleGNlcHQgREVMXG5jb25zdCBDSEFSX1NQID0gMHgyMFxuY29uc3QgQ0hBUl9RVU9UID0gMHgyMlxuY29uc3QgQ0hBUl9OVU0gPSAweDIzXG5jb25zdCBDSEFSX0FQT1MgPSAweDI3XG5jb25zdCBDSEFSX1BMVVMgPSAweDJCXG5jb25zdCBDSEFSX0NPTU1BID0gMHgyQ1xuY29uc3QgQ0hBUl9IWVBIRU4gPSAweDJEXG5jb25zdCBDSEFSX1BFUklPRCA9IDB4MkVcbmNvbnN0IENIQVJfMCA9IDB4MzBcbmNvbnN0IENIQVJfMSA9IDB4MzFcbmNvbnN0IENIQVJfNyA9IDB4MzdcbmNvbnN0IENIQVJfOSA9IDB4MzlcbmNvbnN0IENIQVJfQ09MT04gPSAweDNBXG5jb25zdCBDSEFSX0VRVUFMUyA9IDB4M0RcbmNvbnN0IENIQVJfQSA9IDB4NDFcbmNvbnN0IENIQVJfRSA9IDB4NDVcbmNvbnN0IENIQVJfRiA9IDB4NDZcbmNvbnN0IENIQVJfVCA9IDB4NTRcbmNvbnN0IENIQVJfVSA9IDB4NTVcbmNvbnN0IENIQVJfWiA9IDB4NUFcbmNvbnN0IENIQVJfTE9XQkFSID0gMHg1RlxuY29uc3QgQ0hBUl9hID0gMHg2MVxuY29uc3QgQ0hBUl9iID0gMHg2MlxuY29uc3QgQ0hBUl9lID0gMHg2NVxuY29uc3QgQ0hBUl9mID0gMHg2NlxuY29uc3QgQ0hBUl9pID0gMHg2OVxuY29uc3QgQ0hBUl9sID0gMHg2Q1xuY29uc3QgQ0hBUl9uID0gMHg2RVxuY29uc3QgQ0hBUl9vID0gMHg2RlxuY29uc3QgQ0hBUl9yID0gMHg3MlxuY29uc3QgQ0hBUl9zID0gMHg3M1xuY29uc3QgQ0hBUl90ID0gMHg3NFxuY29uc3QgQ0hBUl91ID0gMHg3NVxuY29uc3QgQ0hBUl94ID0gMHg3OFxuY29uc3QgQ0hBUl96ID0gMHg3QVxuY29uc3QgQ0hBUl9MQ1VCID0gMHg3QlxuY29uc3QgQ0hBUl9SQ1VCID0gMHg3RFxuY29uc3QgQ0hBUl9MU1FCID0gMHg1QlxuY29uc3QgQ0hBUl9CU09MID0gMHg1Q1xuY29uc3QgQ0hBUl9SU1FCID0gMHg1RFxuY29uc3QgQ0hBUl9ERUwgPSAweDdGXG5jb25zdCBTVVJST0dBVEVfRklSU1QgPSAweEQ4MDBcbmNvbnN0IFNVUlJPR0FURV9MQVNUID0gMHhERkZGXG5cbmNvbnN0IGVzY2FwZXMgPSB7XG4gIFtDSEFSX2JdOiAnXFx1MDAwOCcsXG4gIFtDSEFSX3RdOiAnXFx1MDAwOScsXG4gIFtDSEFSX25dOiAnXFx1MDAwQScsXG4gIFtDSEFSX2ZdOiAnXFx1MDAwQycsXG4gIFtDSEFSX3JdOiAnXFx1MDAwRCcsXG4gIFtDSEFSX1FVT1RdOiAnXFx1MDAyMicsXG4gIFtDSEFSX0JTT0xdOiAnXFx1MDA1Qydcbn1cblxuZnVuY3Rpb24gaXNEaWdpdCAoY3ApIHtcbiAgcmV0dXJuIGNwID49IENIQVJfMCAmJiBjcCA8PSBDSEFSXzlcbn1cbmZ1bmN0aW9uIGlzSGV4aXQgKGNwKSB7XG4gIHJldHVybiAoY3AgPj0gQ0hBUl9BICYmIGNwIDw9IENIQVJfRikgfHwgKGNwID49IENIQVJfYSAmJiBjcCA8PSBDSEFSX2YpIHx8IChjcCA+PSBDSEFSXzAgJiYgY3AgPD0gQ0hBUl85KVxufVxuZnVuY3Rpb24gaXNCaXQgKGNwKSB7XG4gIHJldHVybiBjcCA9PT0gQ0hBUl8xIHx8IGNwID09PSBDSEFSXzBcbn1cbmZ1bmN0aW9uIGlzT2N0aXQgKGNwKSB7XG4gIHJldHVybiAoY3AgPj0gQ0hBUl8wICYmIGNwIDw9IENIQVJfNylcbn1cbmZ1bmN0aW9uIGlzQWxwaGFOdW1RdW90ZUh5cGhlbiAoY3ApIHtcbiAgcmV0dXJuIChjcCA+PSBDSEFSX0EgJiYgY3AgPD0gQ0hBUl9aKVxuICAgICAgfHwgKGNwID49IENIQVJfYSAmJiBjcCA8PSBDSEFSX3opXG4gICAgICB8fCAoY3AgPj0gQ0hBUl8wICYmIGNwIDw9IENIQVJfOSlcbiAgICAgIHx8IGNwID09PSBDSEFSX0FQT1NcbiAgICAgIHx8IGNwID09PSBDSEFSX1FVT1RcbiAgICAgIHx8IGNwID09PSBDSEFSX0xPV0JBUlxuICAgICAgfHwgY3AgPT09IENIQVJfSFlQSEVOXG59XG5mdW5jdGlvbiBpc0FscGhhTnVtSHlwaGVuIChjcCkge1xuICByZXR1cm4gKGNwID49IENIQVJfQSAmJiBjcCA8PSBDSEFSX1opXG4gICAgICB8fCAoY3AgPj0gQ0hBUl9hICYmIGNwIDw9IENIQVJfeilcbiAgICAgIHx8IChjcCA+PSBDSEFSXzAgJiYgY3AgPD0gQ0hBUl85KVxuICAgICAgfHwgY3AgPT09IENIQVJfTE9XQkFSXG4gICAgICB8fCBjcCA9PT0gQ0hBUl9IWVBIRU5cbn1cbmNvbnN0IF90eXBlID0gU3ltYm9sKCd0eXBlJylcbmNvbnN0IF9kZWNsYXJlZCA9IFN5bWJvbCgnZGVjbGFyZWQnKVxuXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbmNvbnN0IGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5XG5jb25zdCBkZXNjcmlwdG9yID0ge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWR9XG5cbmZ1bmN0aW9uIGhhc0tleSAob2JqLCBrZXkpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXR1cm4gdHJ1ZVxuICBpZiAoa2V5ID09PSAnX19wcm90b19fJykgZGVmaW5lUHJvcGVydHkob2JqLCAnX19wcm90b19fJywgZGVzY3JpcHRvcilcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IElOTElORV9UQUJMRSA9IFN5bWJvbCgnaW5saW5lLXRhYmxlJylcbmZ1bmN0aW9uIElubGluZVRhYmxlICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHt9LCB7XG4gICAgW190eXBlXToge3ZhbHVlOiBJTkxJTkVfVEFCTEV9XG4gIH0pXG59XG5mdW5jdGlvbiBpc0lubGluZVRhYmxlIChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIG9ialtfdHlwZV0gPT09IElOTElORV9UQUJMRVxufVxuXG5jb25zdCBUQUJMRSA9IFN5bWJvbCgndGFibGUnKVxuZnVuY3Rpb24gVGFibGUgKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoe30sIHtcbiAgICBbX3R5cGVdOiB7dmFsdWU6IFRBQkxFfSxcbiAgICBbX2RlY2xhcmVkXToge3ZhbHVlOiBmYWxzZSwgd3JpdGFibGU6IHRydWV9XG4gIH0pXG59XG5mdW5jdGlvbiBpc1RhYmxlIChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIG9ialtfdHlwZV0gPT09IFRBQkxFXG59XG5cbmNvbnN0IF9jb250ZW50VHlwZSA9IFN5bWJvbCgnY29udGVudC10eXBlJylcbmNvbnN0IElOTElORV9MSVNUID0gU3ltYm9sKCdpbmxpbmUtbGlzdCcpXG5mdW5jdGlvbiBJbmxpbmVMaXN0ICh0eXBlKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhbXSwge1xuICAgIFtfdHlwZV06IHt2YWx1ZTogSU5MSU5FX0xJU1R9LFxuICAgIFtfY29udGVudFR5cGVdOiB7dmFsdWU6IHR5cGV9XG4gIH0pXG59XG5mdW5jdGlvbiBpc0lubGluZUxpc3QgKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiAob2JqKSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZVxuICByZXR1cm4gb2JqW190eXBlXSA9PT0gSU5MSU5FX0xJU1Rcbn1cblxuY29uc3QgTElTVCA9IFN5bWJvbCgnbGlzdCcpXG5mdW5jdGlvbiBMaXN0ICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFtdLCB7XG4gICAgW190eXBlXToge3ZhbHVlOiBMSVNUfVxuICB9KVxufVxuZnVuY3Rpb24gaXNMaXN0IChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIG9ialtfdHlwZV0gPT09IExJU1Rcbn1cblxuLy8gaW4gYW4gZXZhbCwgdG8gbGV0IGJ1bmRsZXJzIG5vdCBzbHVycCBpbiBhIHV0aWwgcHJveHlcbmxldCBfY3VzdG9tXG50cnkge1xuICBjb25zdCB1dGlsSW5zcGVjdCA9IGV2YWwoXCJyZXF1aXJlKCd1dGlsJykuaW5zcGVjdFwiKVxuICBfY3VzdG9tID0gdXRpbEluc3BlY3QuY3VzdG9tXG59IGNhdGNoIChfKSB7XG4gIC8qIGV2YWwgcmVxdWlyZSBub3QgYXZhaWxhYmxlIGluIHRyYW5zcGlsZWQgYnVuZGxlICovXG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29uc3QgX2luc3BlY3QgPSBfY3VzdG9tIHx8ICdpbnNwZWN0J1xuXG5jbGFzcyBCb3hlZEJpZ0ludCB7XG4gIGNvbnN0cnVjdG9yICh2YWx1ZSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ2xvYmFsLkJpZ0ludC5hc0ludE4oNjQsIHZhbHVlKVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgX3R5cGUsIHt2YWx1ZTogSU5URUdFUn0pXG4gIH1cbiAgaXNOYU4gKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlID09PSBudWxsXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSlcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBbX2luc3BlY3RdICgpIHtcbiAgICByZXR1cm4gYFtCaWdJbnQ6ICR7dGhpcy50b1N0cmluZygpfV19YFxuICB9XG4gIHZhbHVlT2YgKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlXG4gIH1cbn1cblxuY29uc3QgSU5URUdFUiA9IFN5bWJvbCgnaW50ZWdlcicpXG5mdW5jdGlvbiBJbnRlZ2VyICh2YWx1ZSkge1xuICBsZXQgbnVtID0gTnVtYmVyKHZhbHVlKVxuICAvLyAtMCBpcyBhIGZsb2F0IHRoaW5nLCBub3QgYW4gaW50IHRoaW5nXG4gIGlmIChPYmplY3QuaXMobnVtLCAtMCkpIG51bSA9IDBcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGdsb2JhbC5CaWdJbnQgJiYgIU51bWJlci5pc1NhZmVJbnRlZ2VyKG51bSkpIHtcbiAgICByZXR1cm4gbmV3IEJveGVkQmlnSW50KHZhbHVlKVxuICB9IGVsc2Uge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG5ldyBOdW1iZXIobnVtKSwge1xuICAgICAgaXNOYU46IHt2YWx1ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gaXNOYU4odGhpcykgfX0sXG4gICAgICBbX3R5cGVdOiB7dmFsdWU6IElOVEVHRVJ9LFxuICAgICAgW19pbnNwZWN0XToge3ZhbHVlOiAoKSA9PiBgW0ludGVnZXI6ICR7dmFsdWV9XWB9XG4gICAgfSlcbiAgfVxufVxuZnVuY3Rpb24gaXNJbnRlZ2VyIChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIG9ialtfdHlwZV0gPT09IElOVEVHRVJcbn1cblxuY29uc3QgRkxPQVQgPSBTeW1ib2woJ2Zsb2F0JylcbmZ1bmN0aW9uIEZsb2F0ICh2YWx1ZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobmV3IE51bWJlcih2YWx1ZSksIHtcbiAgICBbX3R5cGVdOiB7dmFsdWU6IEZMT0FUfSxcbiAgICBbX2luc3BlY3RdOiB7dmFsdWU6ICgpID0+IGBbRmxvYXQ6ICR7dmFsdWV9XWB9XG4gIH0pXG59XG5mdW5jdGlvbiBpc0Zsb2F0IChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIG9ialtfdHlwZV0gPT09IEZMT0FUXG59XG5cbmZ1bmN0aW9uIHRvbWxUeXBlICh2YWx1ZSkge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlXG4gIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJ1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiAnZGF0ZXRpbWUnXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoX3R5cGUgaW4gdmFsdWUpIHtcbiAgICAgIHN3aXRjaCAodmFsdWVbX3R5cGVdKSB7XG4gICAgICAgIGNhc2UgSU5MSU5FX1RBQkxFOiByZXR1cm4gJ2lubGluZS10YWJsZSdcbiAgICAgICAgY2FzZSBJTkxJTkVfTElTVDogcmV0dXJuICdpbmxpbmUtbGlzdCdcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgY2FzZSBUQUJMRTogcmV0dXJuICd0YWJsZSdcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgY2FzZSBMSVNUOiByZXR1cm4gJ2xpc3QnXG4gICAgICAgIGNhc2UgRkxPQVQ6IHJldHVybiAnZmxvYXQnXG4gICAgICAgIGNhc2UgSU5URUdFUjogcmV0dXJuICdpbnRlZ2VyJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHlwZVxufVxuXG5mdW5jdGlvbiBtYWtlUGFyc2VyQ2xhc3MgKFBhcnNlcikge1xuICBjbGFzcyBUT01MUGFyc2VyIGV4dGVuZHMgUGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICBzdXBlcigpXG4gICAgICB0aGlzLmN0eCA9IHRoaXMub2JqID0gVGFibGUoKVxuICAgIH1cblxuICAgIC8qIE1BVENIIEhFTFBFUiAqL1xuICAgIGF0RW5kT2ZXb3JkICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYXIgPT09IENIQVJfTlVNIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9JIHx8IHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmF0RW5kT2ZMaW5lKClcbiAgICB9XG4gICAgYXRFbmRPZkxpbmUgKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2hhciA9PT0gUGFyc2VyLkVORCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSiB8fCB0aGlzLmNoYXIgPT09IENUUkxfTVxuICAgIH1cblxuICAgIHBhcnNlU3RhcnQgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gUGFyc2VyLkVORCkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTFNRQikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VUYWJsZU9yTGlzdClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX05VTSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VDb21tZW50KVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENUUkxfSiB8fCB0aGlzLmNoYXIgPT09IENIQVJfU1AgfHwgdGhpcy5jaGFyID09PSBDVFJMX0kgfHwgdGhpcy5jaGFyID09PSBDVFJMX00pIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0gZWxzZSBpZiAoaXNBbHBoYU51bVF1b3RlSHlwaGVuKHRoaXMuY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlQXNzaWduU3RhdGVtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKGBVbmtub3duIGNoYXJhY3RlciBcIiR7dGhpcy5jaGFyfVwiYCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSEVMUEVSLCB0aGlzIHN0cmlwcyBhbnkgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZVxuICAgIC8vIHRoZW4gUkVUVVJOUy4gTGFzdCBzdGF0ZSBpbiBhIHByb2R1Y3Rpb24uXG4gICAgcGFyc2VXaGl0ZXNwYWNlVG9FT0wgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSB8fCB0aGlzLmNoYXIgPT09IENUUkxfTSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTlVNKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUNvbW1lbnQpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gUGFyc2VyLkVORCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbmV4cGVjdGVkIGNoYXJhY3RlciwgZXhwZWN0ZWQgb25seSB3aGl0ZXNwYWNlIG9yIGNvbW1lbnRzIHRpbGwgZW5kIG9mIGxpbmUnKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBBU1NJR05NRU5UOiBrZXkgPSB2YWx1ZSAqL1xuICAgIHBhcnNlQXNzaWduU3RhdGVtZW50ICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGxOb3codGhpcy5wYXJzZUFzc2lnbiwgdGhpcy5yZWNvcmRBc3NpZ25TdGF0ZW1lbnQpXG4gICAgfVxuICAgIHJlY29yZEFzc2lnblN0YXRlbWVudCAoa3YpIHtcbiAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmN0eFxuICAgICAgbGV0IGZpbmFsS2V5ID0ga3Yua2V5LnBvcCgpXG4gICAgICBmb3IgKGxldCBrdyBvZiBrdi5rZXkpIHtcbiAgICAgICAgaWYgKGhhc0tleSh0YXJnZXQsIGt3KSAmJiAoIWlzVGFibGUodGFyZ2V0W2t3XSkgfHwgdGFyZ2V0W2t3XVtfZGVjbGFyZWRdKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSB0YXJnZXRba3ddID0gdGFyZ2V0W2t3XSB8fCBUYWJsZSgpXG4gICAgICB9XG4gICAgICBpZiAoaGFzS2V5KHRhcmdldCwgZmluYWxLZXkpKSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgIH1cbiAgICAgIC8vIHVuYm94IG91ciBudW1iZXJzXG4gICAgICBpZiAoaXNJbnRlZ2VyKGt2LnZhbHVlKSB8fCBpc0Zsb2F0KGt2LnZhbHVlKSkge1xuICAgICAgICB0YXJnZXRbZmluYWxLZXldID0ga3YudmFsdWUudmFsdWVPZigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbZmluYWxLZXldID0ga3YudmFsdWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZVdoaXRlc3BhY2VUb0VPTClcbiAgICB9XG5cbiAgICAvKiBBU1NTSUdOTUVOVCBleHByZXNzaW9uLCBrZXkgPSB2YWx1ZSBwb3NzaWJseSBpbnNpZGUgYW4gaW5saW5lIHRhYmxlICovXG4gICAgcGFyc2VBc3NpZ24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlS2V5d29yZCwgdGhpcy5yZWNvcmRBc3NpZ25LZXl3b3JkKVxuICAgIH1cbiAgICByZWNvcmRBc3NpZ25LZXl3b3JkIChrZXkpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnJlc3VsdFRhYmxlKSB7XG4gICAgICAgIHRoaXMuc3RhdGUucmVzdWx0VGFibGUucHVzaChrZXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLnJlc3VsdFRhYmxlID0gW2tleV1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUFzc2lnbktleXdvcmRQcmVEb3QpXG4gICAgfVxuICAgIHBhcnNlQXNzaWduS2V5d29yZFByZURvdCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1BFUklPRCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VBc3NpZ25LZXl3b3JkUG9zdERvdClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyICE9PSBDSEFSX1NQICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9JKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUFzc2lnbkVxdWFsKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUFzc2lnbktleXdvcmRQb3N0RG90ICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgIT09IENIQVJfU1AgJiYgdGhpcy5jaGFyICE9PSBDVFJMX0kpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlS2V5d29yZCwgdGhpcy5yZWNvcmRBc3NpZ25LZXl3b3JkKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlQXNzaWduRXF1YWwgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9FUVVBTFMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlQXNzaWduUHJlVmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyLCBleHBlY3RlZCBcIj1cIicpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUFzc2lnblByZVZhbHVlICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfU1AgfHwgdGhpcy5jaGFyID09PSBDVFJMX0kpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxOb3codGhpcy5wYXJzZVZhbHVlLCB0aGlzLnJlY29yZEFzc2lnblZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgICByZWNvcmRBc3NpZ25WYWx1ZSAodmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyh7a2V5OiB0aGlzLnN0YXRlLnJlc3VsdFRhYmxlLCB2YWx1ZTogdmFsdWV9KVxuICAgIH1cblxuICAgIC8qIENPTU1FTlRTOiAjLi4uZW9sICovXG4gICAgcGFyc2VDb21tZW50ICgpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhciA9PT0gUGFyc2VyLkVORCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSikge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJldHVybigpXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKHRoaXMubmV4dENoYXIoKSlcbiAgICB9XG5cbiAgICAvKiBUQUJMRVMgQU5EIExJU1RTLCBbZm9vXSBhbmQgW1tmb29dXSAqL1xuICAgIHBhcnNlVGFibGVPckxpc3QgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9MU1FCKSB7XG4gICAgICAgIHRoaXMubmV4dCh0aGlzLnBhcnNlTGlzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZVRhYmxlKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIFRBQkxFIFtmb28uYmFyLmJhel0gKi9cbiAgICBwYXJzZVRhYmxlICgpIHtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5vYmpcbiAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZVRhYmxlTmV4dClcbiAgICB9XG4gICAgcGFyc2VUYWJsZU5leHQgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlS2V5d29yZCwgdGhpcy5wYXJzZVRhYmxlTW9yZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VUYWJsZU1vcmUgKGtleXdvcmQpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfU1AgfHwgdGhpcy5jaGFyID09PSBDVFJMX0kpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1JTUUIpIHtcbiAgICAgICAgaWYgKGhhc0tleSh0aGlzLmN0eCwga2V5d29yZCkgJiYgKCFpc1RhYmxlKHRoaXMuY3R4W2tleXdvcmRdKSB8fCB0aGlzLmN0eFtrZXl3b3JkXVtfZGVjbGFyZWRdKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY3R4W2tleXdvcmRdID0gdGhpcy5jdHhba2V5d29yZF0gfHwgVGFibGUoKVxuICAgICAgICAgIHRoaXMuY3R4W19kZWNsYXJlZF0gPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlV2hpdGVzcGFjZVRvRU9MKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUEVSSU9EKSB7XG4gICAgICAgIGlmICghaGFzS2V5KHRoaXMuY3R4LCBrZXl3b3JkKSkge1xuICAgICAgICAgIHRoaXMuY3R4ID0gdGhpcy5jdHhba2V5d29yZF0gPSBUYWJsZSgpXG4gICAgICAgIH0gZWxzZSBpZiAoaXNUYWJsZSh0aGlzLmN0eFtrZXl3b3JkXSkpIHtcbiAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY3R4W2tleXdvcmRdXG4gICAgICAgIH0gZWxzZSBpZiAoaXNMaXN0KHRoaXMuY3R4W2tleXdvcmRdKSkge1xuICAgICAgICAgIHRoaXMuY3R4ID0gdGhpcy5jdHhba2V5d29yZF1bdGhpcy5jdHhba2V5d29yZF0ubGVuZ3RoIC0gMV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoXCJDYW4ndCByZWRlZmluZSBleGlzdGluZyBrZXlcIikpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlVGFibGVOZXh0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbmV4cGVjdGVkIGNoYXJhY3RlciwgZXhwZWN0ZWQgd2hpdGVzcGFjZSwgLiBvciBdJykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogTElTVCBbW2EuYi5jXV0gKi9cbiAgICBwYXJzZUxpc3QgKCkge1xuICAgICAgdGhpcy5jdHggPSB0aGlzLm9ialxuICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlTGlzdE5leHQpXG4gICAgfVxuICAgIHBhcnNlTGlzdE5leHQgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlS2V5d29yZCwgdGhpcy5wYXJzZUxpc3RNb3JlKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUxpc3RNb3JlIChrZXl3b3JkKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1NQIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9JKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9SU1FCKSB7XG4gICAgICAgIGlmICghaGFzS2V5KHRoaXMuY3R4LCBrZXl3b3JkKSkge1xuICAgICAgICAgIHRoaXMuY3R4W2tleXdvcmRdID0gTGlzdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSW5saW5lTGlzdCh0aGlzLmN0eFtrZXl3b3JkXSkpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoXCJDYW4ndCBleHRlbmQgYW4gaW5saW5lIGFycmF5XCIpKVxuICAgICAgICB9IGVsc2UgaWYgKGlzTGlzdCh0aGlzLmN0eFtrZXl3b3JkXSkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gVGFibGUoKVxuICAgICAgICAgIHRoaXMuY3R4W2tleXdvcmRdLnB1c2gobmV4dClcbiAgICAgICAgICB0aGlzLmN0eCA9IG5leHRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoXCJDYW4ndCByZWRlZmluZSBhbiBleGlzdGluZyBrZXlcIikpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTGlzdEVuZClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1BFUklPRCkge1xuICAgICAgICBpZiAoIWhhc0tleSh0aGlzLmN0eCwga2V5d29yZCkpIHtcbiAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY3R4W2tleXdvcmRdID0gVGFibGUoKVxuICAgICAgICB9IGVsc2UgaWYgKGlzSW5saW5lTGlzdCh0aGlzLmN0eFtrZXl3b3JkXSkpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoXCJDYW4ndCBleHRlbmQgYW4gaW5saW5lIGFycmF5XCIpKVxuICAgICAgICB9IGVsc2UgaWYgKGlzSW5saW5lVGFibGUodGhpcy5jdHhba2V5d29yZF0pKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKFwiQ2FuJ3QgZXh0ZW5kIGFuIGlubGluZSB0YWJsZVwiKSlcbiAgICAgICAgfSBlbHNlIGlmIChpc0xpc3QodGhpcy5jdHhba2V5d29yZF0pKSB7XG4gICAgICAgICAgdGhpcy5jdHggPSB0aGlzLmN0eFtrZXl3b3JkXVt0aGlzLmN0eFtrZXl3b3JkXS5sZW5ndGggLSAxXVxuICAgICAgICB9IGVsc2UgaWYgKGlzVGFibGUodGhpcy5jdHhba2V5d29yZF0pKSB7XG4gICAgICAgICAgdGhpcy5jdHggPSB0aGlzLmN0eFtrZXl3b3JkXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGFuIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VMaXN0TmV4dClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIsIGV4cGVjdGVkIHdoaXRlc3BhY2UsIC4gb3IgXScpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUxpc3RFbmQgKGtleXdvcmQpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUlNRQikge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VXaGl0ZXNwYWNlVG9FT0wpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyLCBleHBlY3RlZCB3aGl0ZXNwYWNlLCAuIG9yIF0nKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBWQUxVRSBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgaW5saW5lIGxpc3QsIGlubGluZSBvYmplY3QgKi9cbiAgICBwYXJzZVZhbHVlICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IFBhcnNlci5FTkQpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdLZXkgd2l0aG91dCB2YWx1ZScpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUVVPVCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VEb3VibGVTdHJpbmcpXG4gICAgICB9IGlmICh0aGlzLmNoYXIgPT09IENIQVJfQVBPUykge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VTaW5nbGVTdHJpbmcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9IWVBIRU4gfHwgdGhpcy5jaGFyID09PSBDSEFSX1BMVVMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlTnVtYmVyU2lnbilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX2kpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlSW5mKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfbikge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VOYW4pXG4gICAgICB9IGVsc2UgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VOdW1iZXJPckRhdGVUaW1lKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfdCB8fCB0aGlzLmNoYXIgPT09IENIQVJfZikge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VCb29sZWFuKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTFNRQikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VJbmxpbmVMaXN0LCB0aGlzLnJlY29yZFZhbHVlKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTENVQikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VJbmxpbmVUYWJsZSwgdGhpcy5yZWNvcmRWYWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIsIGV4cGVjdGluZyBzdHJpbmcsIG51bWJlciwgZGF0ZXRpbWUsIGJvb2xlYW4sIGlubGluZSBhcnJheSBvciBpbmxpbmUgdGFibGUnKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmVjb3JkVmFsdWUgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3codmFsdWUpXG4gICAgfVxuXG4gICAgcGFyc2VJbmYgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZUluZjIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyLCBleHBlY3RlZCBcImluZlwiLCBcIitpbmZcIiBvciBcIi1pbmZcIicpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUluZjIgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9mKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1ZiA9PT0gJy0nKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKC1JbmZpbml0eSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oSW5maW5pdHkpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIsIGV4cGVjdGVkIFwiaW5mXCIsIFwiK2luZlwiIG9yIFwiLWluZlwiJykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VOYW4gKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9hKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU5hbjIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyLCBleHBlY3RlZCBcIm5hblwiJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTmFuMiAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKE5hTilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIsIGV4cGVjdGVkIFwibmFuXCInKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBLRVlTLCBiYXJld29yZHMgb3IgYmFzaWMsIGxpdGVyYWwsIG9yIGRvdHRlZCAqL1xuICAgIHBhcnNlS2V5d29yZCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1FVT1QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlQmFzaWNTdHJpbmcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9BUE9TKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZUxpdGVyYWxTdHJpbmcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VCYXJlS2V5KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEtFWVM6IGJhcmV3b3JkcyAqL1xuICAgIHBhcnNlQmFyZUtleSAoKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICh0aGlzLmNoYXIgPT09IFBhcnNlci5FTkQpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0tleSBlbmRlZCB3aXRob3V0IHZhbHVlJykpXG4gICAgICAgIH0gZWxzZSBpZiAoaXNBbHBoYU51bUh5cGhlbih0aGlzLmNoYXIpKSB7XG4gICAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmJ1Zi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0VtcHR5IGJhcmUga2V5cyBhcmUgbm90IGFsbG93ZWQnKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3coKVxuICAgICAgICB9XG4gICAgICB9IHdoaWxlICh0aGlzLm5leHRDaGFyKCkpXG4gICAgfVxuXG4gICAgLyogU1RSSU5HUywgc2luZ2xlIHF1b3RlZCAobGl0ZXJhbCkgKi9cbiAgICBwYXJzZVNpbmdsZVN0cmluZyAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0FQT1MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTGl0ZXJhbE11bHRpU3RyaW5nTWF5YmUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VMaXRlcmFsU3RyaW5nKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUxpdGVyYWxTdHJpbmcgKCkge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0FQT1MpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXRFbmRPZkxpbmUoKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW50ZXJtaW5hdGVkIHN0cmluZycpKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9ERUwgfHwgKHRoaXMuY2hhciA8PSBDVFJMX0NIQVJfQk9VTkRBUlkgJiYgdGhpcy5jaGFyICE9PSBDVFJMX0kpKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvckNvbnRyb2xDaGFySW5TdHJpbmcoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKHRoaXMubmV4dENoYXIoKSlcbiAgICB9XG4gICAgcGFyc2VMaXRlcmFsTXVsdGlTdHJpbmdNYXliZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0FQT1MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTGl0ZXJhbE11bHRpU3RyaW5nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KClcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VMaXRlcmFsTXVsdGlTdHJpbmcgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9NKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9KKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZUxpdGVyYWxNdWx0aVN0cmluZ0NvbnRlbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VMaXRlcmFsTXVsdGlTdHJpbmdDb250ZW50KVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUxpdGVyYWxNdWx0aVN0cmluZ0NvbnRlbnQgKCkge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0FQT1MpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VMaXRlcmFsTXVsdGlFbmQpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBQYXJzZXIuRU5EKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbnRlcm1pbmF0ZWQgbXVsdGktbGluZSBzdHJpbmcnKSlcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfREVMIHx8ICh0aGlzLmNoYXIgPD0gQ1RSTF9DSEFSX0JPVU5EQVJZICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9JICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9KICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9NKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3JDb250cm9sQ2hhckluU3RyaW5nKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICB9XG4gICAgICB9IHdoaWxlICh0aGlzLm5leHRDaGFyKCkpXG4gICAgfVxuICAgIHBhcnNlTGl0ZXJhbE11bHRpRW5kICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQVBPUykge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VMaXRlcmFsTXVsdGlFbmQyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgKz0gXCInXCJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlTGl0ZXJhbE11bHRpU3RyaW5nQ29udGVudClcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VMaXRlcmFsTXVsdGlFbmQyICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQVBPUykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgKz0gXCInJ1wiXG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUxpdGVyYWxNdWx0aVN0cmluZ0NvbnRlbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogU1RSSU5HUyBkb3VibGUgcXVvdGVkICovXG4gICAgcGFyc2VEb3VibGVTdHJpbmcgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9RVU9UKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU11bHRpU3RyaW5nTWF5YmUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VCYXNpY1N0cmluZylcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VCYXNpY1N0cmluZyAoKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQlNPTCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZUVzY2FwZSwgdGhpcy5yZWNvcmRFc2NhcGVSZXBsYWNlbWVudClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUVVPVCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJldHVybigpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hdEVuZE9mTGluZSgpKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbnRlcm1pbmF0ZWQgc3RyaW5nJykpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0RFTCB8fCAodGhpcy5jaGFyIDw9IENUUkxfQ0hBUl9CT1VOREFSWSAmJiB0aGlzLmNoYXIgIT09IENUUkxfSSkpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yQ29udHJvbENoYXJJblN0cmluZygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAodGhpcy5uZXh0Q2hhcigpKVxuICAgIH1cbiAgICByZWNvcmRFc2NhcGVSZXBsYWNlbWVudCAocmVwbGFjZW1lbnQpIHtcbiAgICAgIHRoaXMuc3RhdGUuYnVmICs9IHJlcGxhY2VtZW50XG4gICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VCYXNpY1N0cmluZylcbiAgICB9XG4gICAgcGFyc2VNdWx0aVN0cmluZ01heWJlICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUVVPVCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VNdWx0aVN0cmluZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdygpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTXVsdGlTdHJpbmcgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9NKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9KKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU11bHRpU3RyaW5nQ29udGVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZU11bHRpU3RyaW5nQ29udGVudClcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VNdWx0aVN0cmluZ0NvbnRlbnQgKCkge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0JTT0wpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VNdWx0aUVzY2FwZSwgdGhpcy5yZWNvcmRNdWx0aUVzY2FwZVJlcGxhY2VtZW50KVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9RVU9UKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTXVsdGlFbmQpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBQYXJzZXIuRU5EKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbnRlcm1pbmF0ZWQgbXVsdGktbGluZSBzdHJpbmcnKSlcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfREVMIHx8ICh0aGlzLmNoYXIgPD0gQ1RSTF9DSEFSX0JPVU5EQVJZICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9JICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9KICYmIHRoaXMuY2hhciAhPT0gQ1RSTF9NKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3JDb250cm9sQ2hhckluU3RyaW5nKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICB9XG4gICAgICB9IHdoaWxlICh0aGlzLm5leHRDaGFyKCkpXG4gICAgfVxuICAgIGVycm9yQ29udHJvbENoYXJJblN0cmluZyAoKSB7XG4gICAgICBsZXQgZGlzcGxheUNvZGUgPSAnXFxcXHUwMCdcbiAgICAgIGlmICh0aGlzLmNoYXIgPCAxNikge1xuICAgICAgICBkaXNwbGF5Q29kZSArPSAnMCdcbiAgICAgIH1cbiAgICAgIGRpc3BsYXlDb2RlICs9IHRoaXMuY2hhci50b1N0cmluZygxNilcblxuICAgICAgcmV0dXJuIHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihgQ29udHJvbCBjaGFyYWN0ZXJzIChjb2RlcyA8IDB4MWYgYW5kIDB4N2YpIGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpbmdzLCB1c2UgJHtkaXNwbGF5Q29kZX0gaW5zdGVhZGApKVxuICAgIH1cbiAgICByZWNvcmRNdWx0aUVzY2FwZVJlcGxhY2VtZW50IChyZXBsYWNlbWVudCkge1xuICAgICAgdGhpcy5zdGF0ZS5idWYgKz0gcmVwbGFjZW1lbnRcbiAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZU11bHRpU3RyaW5nQ29udGVudClcbiAgICB9XG4gICAgcGFyc2VNdWx0aUVuZCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1FVT1QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTXVsdGlFbmQyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgKz0gJ1wiJ1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VNdWx0aVN0cmluZ0NvbnRlbnQpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTXVsdGlFbmQyICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUVVPVCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgKz0gJ1wiXCInXG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZU11bHRpU3RyaW5nQ29udGVudClcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VNdWx0aUVzY2FwZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDVFJMX00gfHwgdGhpcy5jaGFyID09PSBDVFJMX0opIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTXVsdGlUcmltKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfU1AgfHwgdGhpcy5jaGFyID09PSBDVFJMX0kpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlUHJlTXVsdGlUcmltKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlRXNjYXBlKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVByZU11bHRpVHJpbSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1NQIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9JKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9NIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9KKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU11bHRpVHJpbSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IGVzY2FwZSB3aGl0ZXNwYWNlXCIpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZU11bHRpVHJpbSAoKSB7XG4gICAgICAvLyBleHBsaWNpdGx5IHdoaXRlc3BhY2UgaGVyZSwgRU5EIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgcGF0aCBhcyBjaGFyc1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ1RSTF9KIHx8IHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSB8fCB0aGlzLmNoYXIgPT09IENUUkxfTSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KClcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VFc2NhcGUgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciBpbiBlc2NhcGVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybihlc2NhcGVzW3RoaXMuY2hhcl0pXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl91KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZVNtYWxsVW5pY29kZSwgdGhpcy5wYXJzZVVuaWNvZGVSZXR1cm4pXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9VKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZUxhcmdlVW5pY29kZSwgdGhpcy5wYXJzZVVuaWNvZGVSZXR1cm4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1Vua25vd24gZXNjYXBlIGNoYXJhY3RlcjogJyArIHRoaXMuY2hhcikpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlVW5pY29kZVJldHVybiAoY2hhcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29kZVBvaW50ID0gcGFyc2VJbnQoY2hhciwgMTYpXG4gICAgICAgIGlmIChjb2RlUG9pbnQgPj0gU1VSUk9HQVRFX0ZJUlNUICYmIGNvZGVQb2ludCA8PSBTVVJST0dBVEVfTEFTVCkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW52YWxpZCB1bmljb2RlLCBjaGFyYWN0ZXIgaW4gcmFuZ2UgMHhEODAwIC0gMHhERkZGIGlzIHJlc2VydmVkJykpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCkpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihUb21sRXJyb3Iud3JhcChlcnIpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVNtYWxsVW5pY29kZSAoKSB7XG4gICAgICBpZiAoIWlzSGV4aXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIHVuaWNvZGUgc2VxdWVuY2UsIGV4cGVjdGVkIGhleCcpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA+PSA0KSByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUxhcmdlVW5pY29kZSAoKSB7XG4gICAgICBpZiAoIWlzSGV4aXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIHVuaWNvZGUgc2VxdWVuY2UsIGV4cGVjdGVkIGhleCcpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA+PSA4KSByZXR1cm4gdGhpcy5yZXR1cm4oKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIE5VTUJFUlMgKi9cbiAgICBwYXJzZU51bWJlclNpZ24gKCkge1xuICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU1heWJlU2lnbmVkSW5mT3JOYW4pXG4gICAgfVxuICAgIHBhcnNlTWF5YmVTaWduZWRJbmZPck5hbiAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX2kpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlSW5mKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfbikge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VOYW4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsTm93KHRoaXMucGFyc2VOb1VuZGVyLCB0aGlzLnBhcnNlTnVtYmVySW50ZWdlclN0YXJ0KVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZU51bWJlckludGVnZXJTdGFydCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSXzApIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTnVtYmVySW50ZWdlckV4cG9uZW50T3JEZWNpbWFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlTnVtYmVySW50ZWdlcilcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VOdW1iZXJJbnRlZ2VyRXhwb25lbnRPckRlY2ltYWwgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9QRVJJT0QpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlTm9VbmRlciwgdGhpcy5wYXJzZU51bWJlckZsb2F0KVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfRSB8fCB0aGlzLmNoYXIgPT09IENIQVJfZSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VOdW1iZXJFeHBvbmVudFNpZ24pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3coSW50ZWdlcih0aGlzLnN0YXRlLmJ1ZikpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTnVtYmVySW50ZWdlciAoKSB7XG4gICAgICBpZiAoaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9MT1dCQVIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlTm9VbmRlcilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0UgfHwgdGhpcy5jaGFyID09PSBDSEFSX2UpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTnVtYmVyRXhwb25lbnRTaWduKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUEVSSU9EKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXIsIHRoaXMucGFyc2VOdW1iZXJGbG9hdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEludGVnZXIodGhpcy5zdGF0ZS5idWYpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocmVzdWx0LmlzTmFOKCkpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgbnVtYmVyJykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KHJlc3VsdClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZU5vVW5kZXIgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9MT1dCQVIgfHwgdGhpcy5jaGFyID09PSBDSEFSX1BFUklPRCB8fCB0aGlzLmNoYXIgPT09IENIQVJfRSB8fCB0aGlzLmNoYXIgPT09IENIQVJfZSkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyLCBleHBlY3RlZCBkaWdpdCcpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmF0RW5kT2ZXb3JkKCkpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbmNvbXBsZXRlIG51bWJlcicpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KClcbiAgICB9XG4gICAgcGFyc2VOb1VuZGVySGV4T2N0QmluTGl0ZXJhbCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0xPV0JBUiB8fCB0aGlzLmNoYXIgPT09IENIQVJfUEVSSU9EKSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIsIGV4cGVjdGVkIGRpZ2l0JykpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXRFbmRPZldvcmQoKSkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0luY29tcGxldGUgbnVtYmVyJykpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3coKVxuICAgIH1cbiAgICBwYXJzZU51bWJlckZsb2F0ICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTE9XQkFSKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXIsIHRoaXMucGFyc2VOdW1iZXJGbG9hdClcbiAgICAgIH0gZWxzZSBpZiAoaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9FIHx8IHRoaXMuY2hhciA9PT0gQ0hBUl9lKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZU51bWJlckV4cG9uZW50U2lnbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhGbG9hdCh0aGlzLnN0YXRlLmJ1ZikpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTnVtYmVyRXhwb25lbnRTaWduICgpIHtcbiAgICAgIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlTnVtYmVyRXhwb25lbnQpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9IWVBIRU4gfHwgdGhpcy5jaGFyID09PSBDSEFSX1BMVVMpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgdGhpcy5jYWxsKHRoaXMucGFyc2VOb1VuZGVyLCB0aGlzLnBhcnNlTnVtYmVyRXhwb25lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyLCBleHBlY3RlZCAtLCArIG9yIGRpZ2l0JykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlTnVtYmVyRXhwb25lbnQgKCkge1xuICAgICAgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTE9XQkFSKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3coRmxvYXQodGhpcy5zdGF0ZS5idWYpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIE5VTUJFUlMgb3IgREFURVRJTUVTICAqL1xuICAgIHBhcnNlTnVtYmVyT3JEYXRlVGltZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSXzApIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTnVtYmVyQmFzZU9yRGF0ZVRpbWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VOdW1iZXJPckRhdGVUaW1lT25seSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VOdW1iZXJPckRhdGVUaW1lT25seSAoKSB7XG4gICAgICAvLyBub3RlLCBpZiB0d28gemVyb3MgYXJlIGluIGEgcm93IHRoZW4gaXQgTVVTVCBiZSBhIGRhdGVcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTE9XQkFSKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXIsIHRoaXMucGFyc2VOdW1iZXJJbnRlZ2VyKVxuICAgICAgfSBlbHNlIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA+IDQpIHRoaXMubmV4dCh0aGlzLnBhcnNlTnVtYmVySW50ZWdlcilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0UgfHwgdGhpcy5jaGFyID09PSBDSEFSX2UpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlTnVtYmVyRXhwb25lbnRTaWduKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUEVSSU9EKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXIsIHRoaXMucGFyc2VOdW1iZXJGbG9hdClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0hZUEhFTikge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VEYXRlVGltZSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0NPTE9OKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZU9ubHlUaW1lSG91cilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhJbnRlZ2VyKHRoaXMuc3RhdGUuYnVmKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VEYXRlVGltZU9ubHkgKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN1bWUoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9DT0xPTikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZU9ubHlUaW1lSG91cilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0V4cGVjdGVkIGRpZ2l0IHdoaWxlIHBhcnNpbmcgeWVhciBwYXJ0IG9mIGEgZGF0ZScpKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0hZUEhFTikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZURhdGVUaW1lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignRXhwZWN0ZWQgaHlwaGVuICgtKSB3aGlsZSBwYXJzaW5nIHllYXIgcGFydCBvZiBkYXRlJykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VOdW1iZXJCYXNlT3JEYXRlVGltZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX2IpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlTm9VbmRlckhleE9jdEJpbkxpdGVyYWwsIHRoaXMucGFyc2VJbnRlZ2VyQmluKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfbykge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VOb1VuZGVySGV4T2N0QmluTGl0ZXJhbCwgdGhpcy5wYXJzZUludGVnZXJPY3QpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl94KSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXJIZXhPY3RCaW5MaXRlcmFsLCB0aGlzLnBhcnNlSW50ZWdlckhleClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1BFUklPRCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nb3RvKHRoaXMucGFyc2VOdW1iZXJJbnRlZ2VyKVxuICAgICAgfSBlbHNlIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlRGF0ZVRpbWVPbmx5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KEludGVnZXIodGhpcy5zdGF0ZS5idWYpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZUludGVnZXJIZXggKCkge1xuICAgICAgaWYgKGlzSGV4aXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfTE9XQkFSKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGwodGhpcy5wYXJzZU5vVW5kZXJIZXhPY3RCaW5MaXRlcmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gSW50ZWdlcih0aGlzLnN0YXRlLmJ1ZilcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChyZXN1bHQuaXNOYU4oKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW52YWxpZCBudW1iZXInKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3cocmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlSW50ZWdlck9jdCAoKSB7XG4gICAgICBpZiAoaXNPY3RpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9MT1dCQVIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlTm9VbmRlckhleE9jdEJpbkxpdGVyYWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBJbnRlZ2VyKHRoaXMuc3RhdGUuYnVmKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHJlc3VsdC5pc05hTigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbnZhbGlkIG51bWJlcicpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhyZXN1bHQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VJbnRlZ2VyQmluICgpIHtcbiAgICAgIGlmIChpc0JpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9MT1dCQVIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlTm9VbmRlckhleE9jdEJpbkxpdGVyYWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBJbnRlZ2VyKHRoaXMuc3RhdGUuYnVmKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHJlc3VsdC5pc05hTigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbnZhbGlkIG51bWJlcicpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhyZXN1bHQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBEQVRFVElNRSAqL1xuICAgIHBhcnNlRGF0ZVRpbWUgKCkge1xuICAgICAgLy8gd2UgZW50ZXIgaGVyZSBoYXZpbmcganVzdCBjb25zdW1lZCB0aGUgeWVhciBhbmQgYWJvdXQgdG8gY29uc3VtZSB0aGUgaHlwaGVuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5idWYubGVuZ3RoIDwgNCkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1llYXJzIGxlc3MgdGhhbiAxMDAwIG11c3QgYmUgemVybyBwYWRkZWQgdG8gZm91ciBjaGFyYWN0ZXJzJykpXG4gICAgICB9XG4gICAgICB0aGlzLnN0YXRlLnJlc3VsdCA9IHRoaXMuc3RhdGUuYnVmXG4gICAgICB0aGlzLnN0YXRlLmJ1ZiA9ICcnXG4gICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VEYXRlTW9udGgpXG4gICAgfVxuICAgIHBhcnNlRGF0ZU1vbnRoICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfSFlQSEVOKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1Zi5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdNb250aHMgbGVzcyB0aGFuIDEwIG11c3QgYmUgemVybyBwYWRkZWQgdG8gdHdvIGNoYXJhY3RlcnMnKSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlLnJlc3VsdCArPSAnLScgKyB0aGlzLnN0YXRlLmJ1ZlxuICAgICAgICB0aGlzLnN0YXRlLmJ1ZiA9ICcnXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZURhdGVEYXkpXG4gICAgICB9IGVsc2UgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbmNvbXBsZXRlIGRhdGV0aW1lJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlRGF0ZURheSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1QgfHwgdGhpcy5jaGFyID09PSBDSEFSX1NQKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1Zi5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdEYXlzIGxlc3MgdGhhbiAxMCBtdXN0IGJlIHplcm8gcGFkZGVkIHRvIHR3byBjaGFyYWN0ZXJzJykpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5yZXN1bHQgKz0gJy0nICsgdGhpcy5zdGF0ZS5idWZcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VTdGFydFRpbWVIb3VyKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmF0RW5kT2ZXb3JkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KGNyZWF0ZURhdGUodGhpcy5zdGF0ZS5yZXN1bHQgKyAnLScgKyB0aGlzLnN0YXRlLmJ1ZikpXG4gICAgICB9IGVsc2UgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbmNvbXBsZXRlIGRhdGV0aW1lJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlU3RhcnRUaW1lSG91ciAoKSB7XG4gICAgICBpZiAodGhpcy5hdEVuZE9mV29yZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhjcmVhdGVEYXRlKHRoaXMuc3RhdGUucmVzdWx0KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZVRpbWVIb3VyKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVRpbWVIb3VyICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQ09MT04pIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0hvdXJzIGxlc3MgdGhhbiAxMCBtdXN0IGJlIHplcm8gcGFkZGVkIHRvIHR3byBjaGFyYWN0ZXJzJykpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5yZXN1bHQgKz0gJ1QnICsgdGhpcy5zdGF0ZS5idWZcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VUaW1lTWluKVxuICAgICAgfSBlbHNlIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW5jb21wbGV0ZSBkYXRldGltZScpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVRpbWVNaW4gKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA8IDIgJiYgaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA9PT0gMiAmJiB0aGlzLmNoYXIgPT09IENIQVJfQ09MT04pIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5yZXN1bHQgKz0gJzonICsgdGhpcy5zdGF0ZS5idWZcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VUaW1lU2VjKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbmNvbXBsZXRlIGRhdGV0aW1lJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlVGltZVNlYyAoKSB7XG4gICAgICBpZiAoaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1Zi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlLnJlc3VsdCArPSAnOicgKyB0aGlzLnN0YXRlLmJ1ZlxuICAgICAgICAgIHRoaXMuc3RhdGUuYnVmID0gJydcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VUaW1lWm9uZU9yRnJhY3Rpb24pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW5jb21wbGV0ZSBkYXRldGltZScpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlT25seVRpbWVIb3VyICgpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX0NPTE9OKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1Zi5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdIb3VycyBsZXNzIHRoYW4gMTAgbXVzdCBiZSB6ZXJvIHBhZGRlZCB0byB0d28gY2hhcmFjdGVycycpKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUucmVzdWx0ID0gdGhpcy5zdGF0ZS5idWZcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VPbmx5VGltZU1pbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW5jb21wbGV0ZSB0aW1lJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlT25seVRpbWVNaW4gKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA8IDIgJiYgaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYnVmLmxlbmd0aCA9PT0gMiAmJiB0aGlzLmNoYXIgPT09IENIQVJfQ09MT04pIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5yZXN1bHQgKz0gJzonICsgdGhpcy5zdGF0ZS5idWZcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VPbmx5VGltZVNlYylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW5jb21wbGV0ZSB0aW1lJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlT25seVRpbWVTZWMgKCkge1xuICAgICAgaWYgKGlzRGlnaXQodGhpcy5jaGFyKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5idWYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlT25seVRpbWVGcmFjdGlvbk1heWJlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0luY29tcGxldGUgdGltZScpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZU9ubHlUaW1lRnJhY3Rpb25NYXliZSAoKSB7XG4gICAgICB0aGlzLnN0YXRlLnJlc3VsdCArPSAnOicgKyB0aGlzLnN0YXRlLmJ1ZlxuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9QRVJJT0QpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5idWYgPSAnJ1xuICAgICAgICB0aGlzLm5leHQodGhpcy5wYXJzZU9ubHlUaW1lRnJhY3Rpb24pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oY3JlYXRlVGltZSh0aGlzLnN0YXRlLnJlc3VsdCkpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlT25seVRpbWVGcmFjdGlvbiAoKSB7XG4gICAgICBpZiAoaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXRFbmRPZldvcmQoKSkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5idWYubGVuZ3RoID09PSAwKSB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0V4cGVjdGVkIGRpZ2l0IGluIG1pbGxpc2Vjb25kcycpKVxuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5Ob3coY3JlYXRlVGltZSh0aGlzLnN0YXRlLnJlc3VsdCArICcuJyArIHRoaXMuc3RhdGUuYnVmKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gZGF0ZXRpbWUsIGV4cGVjdGVkIHBlcmlvZCAoLiksIG1pbnVzICgtKSwgcGx1cyAoKykgb3IgWicpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlVGltZVpvbmVPckZyYWN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfUEVSSU9EKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHRoaXMubmV4dCh0aGlzLnBhcnNlRGF0ZVRpbWVGcmFjdGlvbilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX0hZUEhFTiB8fCB0aGlzLmNoYXIgPT09IENIQVJfUExVUykge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICB0aGlzLm5leHQodGhpcy5wYXJzZVRpbWVab25lSG91cilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1opIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKGNyZWF0ZURhdGVUaW1lKHRoaXMuc3RhdGUucmVzdWx0ICsgdGhpcy5zdGF0ZS5idWYpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmF0RW5kT2ZXb3JkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuTm93KGNyZWF0ZURhdGVUaW1lRmxvYXQodGhpcy5zdGF0ZS5yZXN1bHQgKyB0aGlzLnN0YXRlLmJ1ZikpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyIGluIGRhdGV0aW1lLCBleHBlY3RlZCBwZXJpb2QgKC4pLCBtaW51cyAoLSksIHBsdXMgKCspIG9yIFonKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VEYXRlVGltZUZyYWN0aW9uICgpIHtcbiAgICAgIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5idWYubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignRXhwZWN0ZWQgZGlnaXQgaW4gbWlsbGlzZWNvbmRzJykpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9IWVBIRU4gfHwgdGhpcy5jaGFyID09PSBDSEFSX1BMVVMpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgdGhpcy5uZXh0KHRoaXMucGFyc2VUaW1lWm9uZUhvdXIpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9aKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybihjcmVhdGVEYXRlVGltZSh0aGlzLnN0YXRlLnJlc3VsdCArIHRoaXMuc3RhdGUuYnVmKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hdEVuZE9mV29yZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybk5vdyhjcmVhdGVEYXRlVGltZUZsb2F0KHRoaXMuc3RhdGUucmVzdWx0ICsgdGhpcy5zdGF0ZS5idWYpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbmV4cGVjdGVkIGNoYXJhY3RlciBpbiBkYXRldGltZSwgZXhwZWN0ZWQgcGVyaW9kICguKSwgbWludXMgKC0pLCBwbHVzICgrKSBvciBaJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlVGltZVpvbmVIb3VyICgpIHtcbiAgICAgIGlmIChpc0RpZ2l0KHRoaXMuY2hhcikpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgLy8gRklYTUU6IE5vIG1vcmUgcmVnZXhwc1xuICAgICAgICBpZiAoL1xcZFxcZCQvLnRlc3QodGhpcy5zdGF0ZS5idWYpKSByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VUaW1lWm9uZVNlcClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gZGF0ZXRpbWUsIGV4cGVjdGVkIGRpZ2l0JykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlVGltZVpvbmVTZXAgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9DT0xPTikge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICB0aGlzLm5leHQodGhpcy5wYXJzZVRpbWVab25lTWluKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbmV4cGVjdGVkIGNoYXJhY3RlciBpbiBkYXRldGltZSwgZXhwZWN0ZWQgY29sb24nKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VUaW1lWm9uZU1pbiAoKSB7XG4gICAgICBpZiAoaXNEaWdpdCh0aGlzLmNoYXIpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIGlmICgvXFxkXFxkJC8udGVzdCh0aGlzLnN0YXRlLmJ1ZikpIHJldHVybiB0aGlzLnJldHVybihjcmVhdGVEYXRlVGltZSh0aGlzLnN0YXRlLnJlc3VsdCArIHRoaXMuc3RhdGUuYnVmKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gZGF0ZXRpbWUsIGV4cGVjdGVkIGRpZ2l0JykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogQk9PTEVBTiAqL1xuICAgIHBhcnNlQm9vbGVhbiAoKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl90KSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZVRydWVfcilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX2YpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlRmFsc2VfYSlcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VUcnVlX3IgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9yKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZVRydWVfdSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW52YWxpZCBib29sZWFuLCBleHBlY3RlZCB0cnVlIG9yIGZhbHNlJykpXG4gICAgICB9XG4gICAgfVxuICAgIHBhcnNlVHJ1ZV91ICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfdSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VUcnVlX2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgYm9vbGVhbiwgZXhwZWN0ZWQgdHJ1ZSBvciBmYWxzZScpKVxuICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVRydWVfZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgYm9vbGVhbiwgZXhwZWN0ZWQgdHJ1ZSBvciBmYWxzZScpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlRmFsc2VfYSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX2EpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKClcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlRmFsc2VfbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW52YWxpZCBib29sZWFuLCBleHBlY3RlZCB0cnVlIG9yIGZhbHNlJykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VGYWxzZV9sICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfbCkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHRoaXMucGFyc2VGYWxzZV9zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbnZhbGlkIGJvb2xlYW4sIGV4cGVjdGVkIHRydWUgb3IgZmFsc2UnKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJzZUZhbHNlX3MgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9zKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodGhpcy5wYXJzZUZhbHNlX2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ0ludmFsaWQgYm9vbGVhbiwgZXhwZWN0ZWQgdHJ1ZSBvciBmYWxzZScpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlRmFsc2VfZSAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKGZhbHNlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbnZhbGlkIGJvb2xlYW4sIGV4cGVjdGVkIHRydWUgb3IgZmFsc2UnKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJTkxJTkUgTElTVFMgKi9cbiAgICBwYXJzZUlubGluZUxpc3QgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSB8fCB0aGlzLmNoYXIgPT09IENUUkxfTSB8fCB0aGlzLmNoYXIgPT09IENUUkxfSikge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IFBhcnNlci5FTkQpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdVbnRlcm1pbmF0ZWQgaW5saW5lIGFycmF5JykpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9OVU0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnBhcnNlQ29tbWVudClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1JTUUIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKHRoaXMuc3RhdGUucmVzdWx0QXJyIHx8IElubGluZUxpc3QoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxOb3codGhpcy5wYXJzZVZhbHVlLCB0aGlzLnJlY29yZElubGluZUxpc3RWYWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmVjb3JkSW5saW5lTGlzdFZhbHVlICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUucmVzdWx0QXJyKSB7XG4gICAgICAgIGNvbnN0IGxpc3RUeXBlID0gdGhpcy5zdGF0ZS5yZXN1bHRBcnJbX2NvbnRlbnRUeXBlXVxuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0b21sVHlwZSh2YWx1ZSlcbiAgICAgICAgaWYgKGxpc3RUeXBlICE9PSB2YWx1ZVR5cGUpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoYElubGluZSBsaXN0cyBtdXN0IGJlIGEgc2luZ2xlIHR5cGUsIG5vdCBhIG1peCBvZiAke2xpc3RUeXBlfSBhbmQgJHt2YWx1ZVR5cGV9YCkpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhdGUucmVzdWx0QXJyID0gSW5saW5lTGlzdCh0b21sVHlwZSh2YWx1ZSkpXG4gICAgICB9XG4gICAgICBpZiAoaXNGbG9hdCh2YWx1ZSkgfHwgaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAvLyB1bmJveCBub3cgdGhhdCB3ZSd2ZSB2ZXJpZmllZCB0aGV5J3JlIG9rXG4gICAgICAgIHRoaXMuc3RhdGUucmVzdWx0QXJyLnB1c2godmFsdWUudmFsdWVPZigpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5yZXN1bHRBcnIucHVzaCh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUlubGluZUxpc3ROZXh0KVxuICAgIH1cbiAgICBwYXJzZUlubGluZUxpc3ROZXh0ICgpIHtcbiAgICAgIGlmICh0aGlzLmNoYXIgPT09IENIQVJfU1AgfHwgdGhpcy5jaGFyID09PSBDVFJMX0kgfHwgdGhpcy5jaGFyID09PSBDVFJMX00gfHwgdGhpcy5jaGFyID09PSBDVFJMX0opIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX05VTSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMucGFyc2VDb21tZW50KVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQ09NTUEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlSW5saW5lTGlzdClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1JTUUIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlSW5saW5lTGlzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIsIGV4cGVjdGVkIHdoaXRlc3BhY2UsIGNvbW1hICgsKSBvciBjbG9zZSBicmFja2V0IChdKScpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIElOTElORSBUQUJMRSAqL1xuICAgIHBhcnNlSW5saW5lVGFibGUgKCkge1xuICAgICAgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9TUCB8fCB0aGlzLmNoYXIgPT09IENUUkxfSSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IFBhcnNlci5FTkQgfHwgdGhpcy5jaGFyID09PSBDSEFSX05VTSB8fCB0aGlzLmNoYXIgPT09IENUUkxfSiB8fCB0aGlzLmNoYXIgPT09IENUUkxfTSkge1xuICAgICAgICB0aHJvdyB0aGlzLmVycm9yKG5ldyBUb21sRXJyb3IoJ1VudGVybWluYXRlZCBpbmxpbmUgYXJyYXknKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyID09PSBDSEFSX1JDVUIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuKHRoaXMuc3RhdGUucmVzdWx0VGFibGUgfHwgSW5saW5lVGFibGUoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5yZXN1bHRUYWJsZSkgdGhpcy5zdGF0ZS5yZXN1bHRUYWJsZSA9IElubGluZVRhYmxlKClcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE5vdyh0aGlzLnBhcnNlQXNzaWduLCB0aGlzLnJlY29yZElubGluZVRhYmxlVmFsdWUpXG4gICAgICB9XG4gICAgfVxuICAgIHJlY29yZElubGluZVRhYmxlVmFsdWUgKGt2KSB7XG4gICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5zdGF0ZS5yZXN1bHRUYWJsZVxuICAgICAgbGV0IGZpbmFsS2V5ID0ga3Yua2V5LnBvcCgpXG4gICAgICBmb3IgKGxldCBrdyBvZiBrdi5rZXkpIHtcbiAgICAgICAgaWYgKGhhc0tleSh0YXJnZXQsIGt3KSAmJiAoIWlzVGFibGUodGFyZ2V0W2t3XSkgfHwgdGFyZ2V0W2t3XVtfZGVjbGFyZWRdKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSB0YXJnZXRba3ddID0gdGFyZ2V0W2t3XSB8fCBUYWJsZSgpXG4gICAgICB9XG4gICAgICBpZiAoaGFzS2V5KHRhcmdldCwgZmluYWxLZXkpKSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcihcIkNhbid0IHJlZGVmaW5lIGV4aXN0aW5nIGtleVwiKSlcbiAgICAgIH1cbiAgICAgIGlmIChpc0ludGVnZXIoa3YudmFsdWUpIHx8IGlzRmxvYXQoa3YudmFsdWUpKSB7XG4gICAgICAgIHRhcmdldFtmaW5hbEtleV0gPSBrdi52YWx1ZS52YWx1ZU9mKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtmaW5hbEtleV0gPSBrdi52YWx1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ290byh0aGlzLnBhcnNlSW5saW5lVGFibGVOZXh0KVxuICAgIH1cbiAgICBwYXJzZUlubGluZVRhYmxlTmV4dCAoKSB7XG4gICAgICBpZiAodGhpcy5jaGFyID09PSBDSEFSX1NQIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9JKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gUGFyc2VyLkVORCB8fCB0aGlzLmNoYXIgPT09IENIQVJfTlVNIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9KIHx8IHRoaXMuY2hhciA9PT0gQ1RSTF9NKSB7XG4gICAgICAgIHRocm93IHRoaXMuZXJyb3IobmV3IFRvbWxFcnJvcignVW50ZXJtaW5hdGVkIGlubGluZSBhcnJheScpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXIgPT09IENIQVJfQ09NTUEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCh0aGlzLnBhcnNlSW5saW5lVGFibGUpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhciA9PT0gQ0hBUl9SQ1VCKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdvdG8odGhpcy5wYXJzZUlubGluZVRhYmxlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5lcnJvcihuZXcgVG9tbEVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciwgZXhwZWN0ZWQgd2hpdGVzcGFjZSwgY29tbWEgKCwpIG9yIGNsb3NlIGJyYWNrZXQgKF0pJykpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBUT01MUGFyc2VyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBwcmV0dHlFcnJvclxuXG5mdW5jdGlvbiBwcmV0dHlFcnJvciAoZXJyLCBidWYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChlcnIucG9zID09IG51bGwgfHwgZXJyLmxpbmUgPT0gbnVsbCkgcmV0dXJuIGVyclxuICBsZXQgbXNnID0gZXJyLm1lc3NhZ2VcbiAgbXNnICs9IGAgYXQgcm93ICR7ZXJyLmxpbmUgKyAxfSwgY29sICR7ZXJyLmNvbCArIDF9LCBwb3MgJHtlcnIucG9zfTpcXG5gXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGJ1ZiAmJiBidWYuc3BsaXQpIHtcbiAgICBjb25zdCBsaW5lcyA9IGJ1Zi5zcGxpdCgvXFxuLylcbiAgICBjb25zdCBsaW5lTnVtV2lkdGggPSBTdHJpbmcoTWF0aC5taW4obGluZXMubGVuZ3RoLCBlcnIubGluZSArIDMpKS5sZW5ndGhcbiAgICBsZXQgbGluZVBhZGRpbmcgPSAnICdcbiAgICB3aGlsZSAobGluZVBhZGRpbmcubGVuZ3RoIDwgbGluZU51bVdpZHRoKSBsaW5lUGFkZGluZyArPSAnICdcbiAgICBmb3IgKGxldCBpaSA9IE1hdGgubWF4KDAsIGVyci5saW5lIC0gMSk7IGlpIDwgTWF0aC5taW4obGluZXMubGVuZ3RoLCBlcnIubGluZSArIDIpOyArK2lpKSB7XG4gICAgICBsZXQgbGluZU51bSA9IFN0cmluZyhpaSArIDEpXG4gICAgICBpZiAobGluZU51bS5sZW5ndGggPCBsaW5lTnVtV2lkdGgpIGxpbmVOdW0gPSAnICcgKyBsaW5lTnVtXG4gICAgICBpZiAoZXJyLmxpbmUgPT09IGlpKSB7XG4gICAgICAgIG1zZyArPSBsaW5lTnVtICsgJz4gJyArIGxpbmVzW2lpXSArICdcXG4nXG4gICAgICAgIG1zZyArPSBsaW5lUGFkZGluZyArICcgICdcbiAgICAgICAgZm9yIChsZXQgaGggPSAwOyBoaCA8IGVyci5jb2w7ICsraGgpIHtcbiAgICAgICAgICBtc2cgKz0gJyAnXG4gICAgICAgIH1cbiAgICAgICAgbXNnICs9ICdeXFxuJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXNnICs9IGxpbmVOdW0gKyAnOiAnICsgbGluZXNbaWldICsgJ1xcbidcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZXJyLm1lc3NhZ2UgPSBtc2cgKyAnXFxuJ1xuICByZXR1cm4gZXJyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVN0cmluZ1xuXG5jb25zdCBUT01MUGFyc2VyID0gcmVxdWlyZSgnLi9saWIvdG9tbC1wYXJzZXIuanMnKVxuY29uc3QgcHJldHR5RXJyb3IgPSByZXF1aXJlKCcuL3BhcnNlLXByZXR0eS1lcnJvci5qcycpXG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nIChzdHIpIHtcbiAgaWYgKGdsb2JhbC5CdWZmZXIgJiYgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihzdHIpKSB7XG4gICAgc3RyID0gc3RyLnRvU3RyaW5nKCd1dGY4JylcbiAgfVxuICBjb25zdCBwYXJzZXIgPSBuZXcgVE9NTFBhcnNlcigpXG4gIHRyeSB7XG4gICAgcGFyc2VyLnBhcnNlKHN0cilcbiAgICByZXR1cm4gcGFyc2VyLmZpbmlzaCgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IHByZXR0eUVycm9yKGVyciwgc3RyKVxuICB9XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBwYXJzZUFzeW5jXG5cbmNvbnN0IFRPTUxQYXJzZXIgPSByZXF1aXJlKCcuL2xpYi90b21sLXBhcnNlci5qcycpXG5jb25zdCBwcmV0dHlFcnJvciA9IHJlcXVpcmUoJy4vcGFyc2UtcHJldHR5LWVycm9yLmpzJylcblxuZnVuY3Rpb24gcGFyc2VBc3luYyAoc3RyLCBvcHRzKSB7XG4gIGlmICghb3B0cykgb3B0cyA9IHt9XG4gIGNvbnN0IGluZGV4ID0gMFxuICBjb25zdCBibG9ja3NpemUgPSBvcHRzLmJsb2Nrc2l6ZSB8fCA0MDk2MFxuICBjb25zdCBwYXJzZXIgPSBuZXcgVE9NTFBhcnNlcigpXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2V0SW1tZWRpYXRlKHBhcnNlQXN5bmNOZXh0LCBpbmRleCwgYmxvY2tzaXplLCByZXNvbHZlLCByZWplY3QpXG4gIH0pXG4gIGZ1bmN0aW9uIHBhcnNlQXN5bmNOZXh0IChpbmRleCwgYmxvY2tzaXplLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICBpZiAoaW5kZXggPj0gc3RyLmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUocGFyc2VyLmZpbmlzaCgpKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QocHJldHR5RXJyb3IoZXJyLCBzdHIpKVxuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgcGFyc2VyLnBhcnNlKHN0ci5zbGljZShpbmRleCwgaW5kZXggKyBibG9ja3NpemUpKVxuICAgICAgc2V0SW1tZWRpYXRlKHBhcnNlQXN5bmNOZXh0LCBpbmRleCArIGJsb2Nrc2l6ZSwgYmxvY2tzaXplLCByZXNvbHZlLCByZWplY3QpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZWplY3QocHJldHR5RXJyb3IoZXJyLCBzdHIpKVxuICAgIH1cbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcbm1vZHVsZS5leHBvcnRzID0gcGFyc2VTdHJlYW1cblxuY29uc3Qgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IFRPTUxQYXJzZXIgPSByZXF1aXJlKCcuL2xpYi90b21sLXBhcnNlci5qcycpXG5cbmZ1bmN0aW9uIHBhcnNlU3RyZWFtIChzdG0pIHtcbiAgaWYgKHN0bSkge1xuICAgIHJldHVybiBwYXJzZVJlYWRhYmxlKHN0bSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcGFyc2VUcmFuc2Zvcm0oc3RtKVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVhZGFibGUgKHN0bSkge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgVE9NTFBhcnNlcigpXG4gIHN0bS5zZXRFbmNvZGluZygndXRmOCcpXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHJlYWRhYmxlXG4gICAgbGV0IGVuZGVkID0gZmFsc2VcbiAgICBsZXQgZXJyb3JlZCA9IGZhbHNlXG4gICAgZnVuY3Rpb24gZmluaXNoICgpIHtcbiAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgaWYgKHJlYWRhYmxlKSByZXR1cm5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmUocGFyc2VyLmZpbmlzaCgpKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpXG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVycm9yIChlcnIpIHtcbiAgICAgIGVycm9yZWQgPSB0cnVlXG4gICAgICByZWplY3QoZXJyKVxuICAgIH1cbiAgICBzdG0ub25jZSgnZW5kJywgZmluaXNoKVxuICAgIHN0bS5vbmNlKCdlcnJvcicsIGVycm9yKVxuICAgIHJlYWROZXh0KClcblxuICAgIGZ1bmN0aW9uIHJlYWROZXh0ICgpIHtcbiAgICAgIHJlYWRhYmxlID0gdHJ1ZVxuICAgICAgbGV0IGRhdGFcbiAgICAgIHdoaWxlICgoZGF0YSA9IHN0bS5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyc2VyLnBhcnNlKGRhdGEpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJldHVybiBlcnJvcihlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlYWRhYmxlID0gZmFsc2VcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVuZGVkKSByZXR1cm4gZmluaXNoKClcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVycm9yZWQpIHJldHVyblxuICAgICAgc3RtLm9uY2UoJ3JlYWRhYmxlJywgcmVhZE5leHQpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBwYXJzZVRyYW5zZm9ybSAoKSB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBUT01MUGFyc2VyKClcbiAgcmV0dXJuIG5ldyBzdHJlYW0uVHJhbnNmb3JtKHtcbiAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgIHRyYW5zZm9ybSAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VyLnBhcnNlKGNodW5rLnRvU3RyaW5nKGVuY29kaW5nKSlcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfVxuICAgICAgY2IoKVxuICAgIH0sXG4gICAgZmx1c2ggKGNiKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnB1c2gocGFyc2VyLmZpbmlzaCgpKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9XG4gICAgICBjYigpXG4gICAgfVxuICB9KVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9wYXJzZS1zdHJpbmcuanMnKVxubW9kdWxlLmV4cG9ydHMuYXN5bmMgPSByZXF1aXJlKCcuL3BhcnNlLWFzeW5jLmpzJylcbm1vZHVsZS5leHBvcnRzLnN0cmVhbSA9IHJlcXVpcmUoJy4vcGFyc2Utc3RyZWFtLmpzJylcbm1vZHVsZS5leHBvcnRzLnByZXR0eUVycm9yID0gcmVxdWlyZSgnLi9wYXJzZS1wcmV0dHktZXJyb3IuanMnKVxuIiwKICAgICIndXNlIHN0cmljdCdcbm1vZHVsZS5leHBvcnRzID0gc3RyaW5naWZ5XG5tb2R1bGUuZXhwb3J0cy52YWx1ZSA9IHN0cmluZ2lmeUlubGluZVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkgKG9iaikge1xuICBpZiAob2JqID09PSBudWxsKSB0aHJvdyB0eXBlRXJyb3IoJ251bGwnKVxuICBpZiAob2JqID09PSB2b2lkICgwKSkgdGhyb3cgdHlwZUVycm9yKCd1bmRlZmluZWQnKVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHRocm93IHR5cGVFcnJvcih0eXBlb2Ygb2JqKVxuXG4gIGlmICh0eXBlb2Ygb2JqLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykgb2JqID0gb2JqLnRvSlNPTigpXG4gIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgY29uc3QgdHlwZSA9IHRvbWxUeXBlKG9iailcbiAgaWYgKHR5cGUgIT09ICd0YWJsZScpIHRocm93IHR5cGVFcnJvcih0eXBlKVxuICByZXR1cm4gc3RyaW5naWZ5T2JqZWN0KCcnLCAnJywgb2JqKVxufVxuXG5mdW5jdGlvbiB0eXBlRXJyb3IgKHR5cGUpIHtcbiAgcmV0dXJuIG5ldyBFcnJvcignQ2FuIG9ubHkgc3RyaW5naWZ5IG9iamVjdHMsIG5vdCAnICsgdHlwZSlcbn1cblxuZnVuY3Rpb24gYXJyYXlPbmVUeXBlRXJyb3IgKCkge1xuICByZXR1cm4gbmV3IEVycm9yKFwiQXJyYXkgdmFsdWVzIGNhbid0IGhhdmUgbWl4ZWQgdHlwZXNcIilcbn1cblxuZnVuY3Rpb24gZ2V0SW5saW5lS2V5cyAob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmZpbHRlcihrZXkgPT4gaXNJbmxpbmUob2JqW2tleV0pKVxufVxuZnVuY3Rpb24gZ2V0Q29tcGxleEtleXMgKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5maWx0ZXIoa2V5ID0+ICFpc0lubGluZShvYmpba2V5XSkpXG59XG5cbmZ1bmN0aW9uIHRvSlNPTiAob2JqKSB7XG4gIGxldCBub2JqID0gQXJyYXkuaXNBcnJheShvYmopID8gW10gOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCAnX19wcm90b19fJykgPyB7WydfX3Byb3RvX18nXTogdW5kZWZpbmVkfSA6IHt9XG4gIGZvciAobGV0IHByb3Agb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmIChvYmpbcHJvcF0gJiYgdHlwZW9mIG9ialtwcm9wXS50b0pTT04gPT09ICdmdW5jdGlvbicgJiYgISgndG9JU09TdHJpbmcnIGluIG9ialtwcm9wXSkpIHtcbiAgICAgIG5vYmpbcHJvcF0gPSBvYmpbcHJvcF0udG9KU09OKClcbiAgICB9IGVsc2Uge1xuICAgICAgbm9ialtwcm9wXSA9IG9ialtwcm9wXVxuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ialxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHByZWZpeCwgaW5kZW50LCBvYmopIHtcbiAgb2JqID0gdG9KU09OKG9iailcbiAgdmFyIGlubGluZUtleXNcbiAgdmFyIGNvbXBsZXhLZXlzXG4gIGlubGluZUtleXMgPSBnZXRJbmxpbmVLZXlzKG9iailcbiAgY29tcGxleEtleXMgPSBnZXRDb21wbGV4S2V5cyhvYmopXG4gIHZhciByZXN1bHQgPSBbXVxuICB2YXIgaW5saW5lSW5kZW50ID0gaW5kZW50IHx8ICcnXG4gIGlubGluZUtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgIHZhciB0eXBlID0gdG9tbFR5cGUob2JqW2tleV0pXG4gICAgaWYgKHR5cGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGUgIT09ICdudWxsJykge1xuICAgICAgcmVzdWx0LnB1c2goaW5saW5lSW5kZW50ICsgc3RyaW5naWZ5S2V5KGtleSkgKyAnID0gJyArIHN0cmluZ2lmeUFueUlubGluZShvYmpba2V5XSwgdHJ1ZSkpXG4gICAgfVxuICB9KVxuICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHJlc3VsdC5wdXNoKCcnKVxuICB2YXIgY29tcGxleEluZGVudCA9IHByZWZpeCAmJiBpbmxpbmVLZXlzLmxlbmd0aCA+IDAgPyBpbmRlbnQgKyAnICAnIDogJydcbiAgY29tcGxleEtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgIHJlc3VsdC5wdXNoKHN0cmluZ2lmeUNvbXBsZXgocHJlZml4LCBjb21wbGV4SW5kZW50LCBrZXksIG9ialtrZXldKSlcbiAgfSlcbiAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKVxufVxuXG5mdW5jdGlvbiBpc0lubGluZSAodmFsdWUpIHtcbiAgc3dpdGNoICh0b21sVHlwZSh2YWx1ZSkpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgIGNhc2UgJ251bGwnOlxuICAgIGNhc2UgJ2ludGVnZXInOlxuICAgIGNhc2UgJ25hbic6XG4gICAgY2FzZSAnZmxvYXQnOlxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnZGF0ZXRpbWUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBjYXNlICdhcnJheSc6XG4gICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID09PSAwIHx8IHRvbWxUeXBlKHZhbHVlWzBdKSAhPT0gJ3RhYmxlJ1xuICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9tbFR5cGUgKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnXG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnXG4gIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLXR5cGVvZiAqL1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgKE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmICFPYmplY3QuaXModmFsdWUsIC0wKSkpIHtcbiAgICByZXR1cm4gJ2ludGVnZXInXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiAnZmxvYXQnXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gJ2Jvb2xlYW4nXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnc3RyaW5nJ1xuICB9IGVsc2UgaWYgKCd0b0lTT1N0cmluZycgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gaXNOYU4odmFsdWUpID8gJ3VuZGVmaW5lZCcgOiAnZGF0ZXRpbWUnXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJ2FycmF5J1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAndGFibGUnXG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5S2V5IChrZXkpIHtcbiAgdmFyIGtleVN0ciA9IFN0cmluZyhrZXkpXG4gIGlmICgvXlstQS1aYS16MC05X10rJC8udGVzdChrZXlTdHIpKSB7XG4gICAgcmV0dXJuIGtleVN0clxuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHJpbmdpZnlCYXNpY1N0cmluZyhrZXlTdHIpXG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QmFzaWNTdHJpbmcgKHN0cikge1xuICByZXR1cm4gJ1wiJyArIGVzY2FwZVN0cmluZyhzdHIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKSArICdcIidcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5TGl0ZXJhbFN0cmluZyAoc3RyKSB7XG4gIHJldHVybiBcIidcIiArIHN0ciArIFwiJ1wiXG59XG5cbmZ1bmN0aW9uIG51bXBhZCAobnVtLCBzdHIpIHtcbiAgd2hpbGUgKHN0ci5sZW5ndGggPCBudW0pIHN0ciA9ICcwJyArIHN0clxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKVxuICAgIC5yZXBsYWNlKC9bXFxiXS9nLCAnXFxcXGInKVxuICAgIC5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0JylcbiAgICAucmVwbGFjZSgvXFxuL2csICdcXFxcbicpXG4gICAgLnJlcGxhY2UoL1xcZi9nLCAnXFxcXGYnKVxuICAgIC5yZXBsYWNlKC9cXHIvZywgJ1xcXFxyJylcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgLnJlcGxhY2UoLyhbXFx1MDAwMC1cXHUwMDFmXFx1MDA3Zl0pLywgYyA9PiAnXFxcXHUnICsgbnVtcGFkKDQsIGMuY29kZVBvaW50QXQoMCkudG9TdHJpbmcoMTYpKSlcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnRyb2wtcmVnZXggKi9cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5TXVsdGlsaW5lU3RyaW5nIChzdHIpIHtcbiAgbGV0IGVzY2FwZWQgPSBzdHIuc3BsaXQoL1xcbi8pLm1hcChzdHIgPT4ge1xuICAgIHJldHVybiBlc2NhcGVTdHJpbmcoc3RyKS5yZXBsYWNlKC9cIig/PVwiXCIpL2csICdcXFxcXCInKVxuICB9KS5qb2luKCdcXG4nKVxuICBpZiAoZXNjYXBlZC5zbGljZSgtMSkgPT09ICdcIicpIGVzY2FwZWQgKz0gJ1xcXFxcXG4nXG4gIHJldHVybiAnXCJcIlwiXFxuJyArIGVzY2FwZWQgKyAnXCJcIlwiJ1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlBbnlJbmxpbmUgKHZhbHVlLCBtdWx0aWxpbmVPaykge1xuICBsZXQgdHlwZSA9IHRvbWxUeXBlKHZhbHVlKVxuICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAobXVsdGlsaW5lT2sgJiYgL1xcbi8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHR5cGUgPSAnc3RyaW5nLW11bHRpbGluZSdcbiAgICB9IGVsc2UgaWYgKCEvW1xcYlxcdFxcblxcZlxcciddLy50ZXN0KHZhbHVlKSAmJiAvXCIvLnRlc3QodmFsdWUpKSB7XG4gICAgICB0eXBlID0gJ3N0cmluZy1saXRlcmFsJ1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyaW5naWZ5SW5saW5lKHZhbHVlLCB0eXBlKVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlJbmxpbmUgKHZhbHVlLCB0eXBlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIXR5cGUpIHR5cGUgPSB0b21sVHlwZSh2YWx1ZSlcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nLW11bHRpbGluZSc6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5TXVsdGlsaW5lU3RyaW5nKHZhbHVlKVxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5QmFzaWNTdHJpbmcodmFsdWUpXG4gICAgY2FzZSAnc3RyaW5nLWxpdGVyYWwnOlxuICAgICAgcmV0dXJuIHN0cmluZ2lmeUxpdGVyYWxTdHJpbmcodmFsdWUpXG4gICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5SW50ZWdlcih2YWx1ZSlcbiAgICBjYXNlICdmbG9hdCc6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5RmxvYXQodmFsdWUpXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5Qm9vbGVhbih2YWx1ZSlcbiAgICBjYXNlICdkYXRldGltZSc6XG4gICAgICByZXR1cm4gc3RyaW5naWZ5RGF0ZXRpbWUodmFsdWUpXG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgcmV0dXJuIHN0cmluZ2lmeUlubGluZUFycmF5KHZhbHVlLmZpbHRlcihfID0+IHRvbWxUeXBlKF8pICE9PSAnbnVsbCcgJiYgdG9tbFR5cGUoXykgIT09ICd1bmRlZmluZWQnICYmIHRvbWxUeXBlKF8pICE9PSAnbmFuJykpXG4gICAgY2FzZSAndGFibGUnOlxuICAgICAgcmV0dXJuIHN0cmluZ2lmeUlubGluZVRhYmxlKHZhbHVlKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IHR5cGVFcnJvcih0eXBlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUludGVnZXIgKHZhbHVlKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIHNlY3VyaXR5L2RldGVjdC11bnNhZmUtcmVnZXggKi9cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJ18nKVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlGbG9hdCAodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIHJldHVybiAnaW5mJ1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSAtSW5maW5pdHkpIHtcbiAgICByZXR1cm4gJy1pbmYnXG4gIH0gZWxzZSBpZiAoT2JqZWN0LmlzKHZhbHVlLCBOYU4pKSB7XG4gICAgcmV0dXJuICduYW4nXG4gIH0gZWxzZSBpZiAoT2JqZWN0LmlzKHZhbHVlLCAtMCkpIHtcbiAgICByZXR1cm4gJy0wLjAnXG4gIH1cbiAgdmFyIGNodW5rcyA9IFN0cmluZyh2YWx1ZSkuc3BsaXQoJy4nKVxuICB2YXIgaW50ID0gY2h1bmtzWzBdXG4gIHZhciBkZWMgPSBjaHVua3NbMV0gfHwgMFxuICByZXR1cm4gc3RyaW5naWZ5SW50ZWdlcihpbnQpICsgJy4nICsgZGVjXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUJvb2xlYW4gKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeURhdGV0aW1lICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKVxufVxuXG5mdW5jdGlvbiBpc051bWJlciAodHlwZSkge1xuICByZXR1cm4gdHlwZSA9PT0gJ2Zsb2F0JyB8fCB0eXBlID09PSAnaW50ZWdlcidcbn1cbmZ1bmN0aW9uIGFycmF5VHlwZSAodmFsdWVzKSB7XG4gIHZhciBjb250ZW50VHlwZSA9IHRvbWxUeXBlKHZhbHVlc1swXSlcbiAgaWYgKHZhbHVlcy5ldmVyeShfID0+IHRvbWxUeXBlKF8pID09PSBjb250ZW50VHlwZSkpIHJldHVybiBjb250ZW50VHlwZVxuICAvLyBtaXhlZCBpbnRlZ2VyL2Zsb2F0LCBlbWl0IGFzIGZsb2F0c1xuICBpZiAodmFsdWVzLmV2ZXJ5KF8gPT4gaXNOdW1iZXIodG9tbFR5cGUoXykpKSkgcmV0dXJuICdmbG9hdCdcbiAgcmV0dXJuICdtaXhlZCdcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQXJyYXkgKHZhbHVlcykge1xuICBjb25zdCB0eXBlID0gYXJyYXlUeXBlKHZhbHVlcylcbiAgaWYgKHR5cGUgPT09ICdtaXhlZCcpIHtcbiAgICB0aHJvdyBhcnJheU9uZVR5cGVFcnJvcigpXG4gIH1cbiAgcmV0dXJuIHR5cGVcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5SW5saW5lQXJyYXkgKHZhbHVlcykge1xuICB2YWx1ZXMgPSB0b0pTT04odmFsdWVzKVxuICBjb25zdCB0eXBlID0gdmFsaWRhdGVBcnJheSh2YWx1ZXMpXG4gIHZhciByZXN1bHQgPSAnWydcbiAgdmFyIHN0cmluZ2lmaWVkID0gdmFsdWVzLm1hcChfID0+IHN0cmluZ2lmeUlubGluZShfLCB0eXBlKSlcbiAgaWYgKHN0cmluZ2lmaWVkLmpvaW4oJywgJykubGVuZ3RoID4gNjAgfHwgL1xcbi8udGVzdChzdHJpbmdpZmllZCkpIHtcbiAgICByZXN1bHQgKz0gJ1xcbiAgJyArIHN0cmluZ2lmaWVkLmpvaW4oJyxcXG4gICcpICsgJ1xcbidcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgKz0gJyAnICsgc3RyaW5naWZpZWQuam9pbignLCAnKSArIChzdHJpbmdpZmllZC5sZW5ndGggPiAwID8gJyAnIDogJycpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdCArICddJ1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlJbmxpbmVUYWJsZSAodmFsdWUpIHtcbiAgdmFsdWUgPSB0b0pTT04odmFsdWUpXG4gIHZhciByZXN1bHQgPSBbXVxuICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgIHJlc3VsdC5wdXNoKHN0cmluZ2lmeUtleShrZXkpICsgJyA9ICcgKyBzdHJpbmdpZnlBbnlJbmxpbmUodmFsdWVba2V5XSwgZmFsc2UpKVxuICB9KVxuICByZXR1cm4gJ3sgJyArIHJlc3VsdC5qb2luKCcsICcpICsgKHJlc3VsdC5sZW5ndGggPiAwID8gJyAnIDogJycpICsgJ30nXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNvbXBsZXggKHByZWZpeCwgaW5kZW50LCBrZXksIHZhbHVlKSB7XG4gIHZhciB2YWx1ZVR5cGUgPSB0b21sVHlwZSh2YWx1ZSlcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHZhbHVlVHlwZSA9PT0gJ2FycmF5Jykge1xuICAgIHJldHVybiBzdHJpbmdpZnlBcnJheU9mVGFibGVzKHByZWZpeCwgaW5kZW50LCBrZXksIHZhbHVlKVxuICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gJ3RhYmxlJykge1xuICAgIHJldHVybiBzdHJpbmdpZnlDb21wbGV4VGFibGUocHJlZml4LCBpbmRlbnQsIGtleSwgdmFsdWUpXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKHZhbHVlVHlwZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlBcnJheU9mVGFibGVzIChwcmVmaXgsIGluZGVudCwga2V5LCB2YWx1ZXMpIHtcbiAgdmFsdWVzID0gdG9KU09OKHZhbHVlcylcbiAgdmFsaWRhdGVBcnJheSh2YWx1ZXMpXG4gIHZhciBmaXJzdFZhbHVlVHlwZSA9IHRvbWxUeXBlKHZhbHVlc1swXSlcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChmaXJzdFZhbHVlVHlwZSAhPT0gJ3RhYmxlJykgdGhyb3cgdHlwZUVycm9yKGZpcnN0VmFsdWVUeXBlKVxuICB2YXIgZnVsbEtleSA9IHByZWZpeCArIHN0cmluZ2lmeUtleShrZXkpXG4gIHZhciByZXN1bHQgPSAnJ1xuICB2YWx1ZXMuZm9yRWFjaCh0YWJsZSA9PiB7XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSByZXN1bHQgKz0gJ1xcbidcbiAgICByZXN1bHQgKz0gaW5kZW50ICsgJ1tbJyArIGZ1bGxLZXkgKyAnXV1cXG4nXG4gICAgcmVzdWx0ICs9IHN0cmluZ2lmeU9iamVjdChmdWxsS2V5ICsgJy4nLCBpbmRlbnQsIHRhYmxlKVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNvbXBsZXhUYWJsZSAocHJlZml4LCBpbmRlbnQsIGtleSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxLZXkgPSBwcmVmaXggKyBzdHJpbmdpZnlLZXkoa2V5KVxuICB2YXIgcmVzdWx0ID0gJydcbiAgaWYgKGdldElubGluZUtleXModmFsdWUpLmxlbmd0aCA+IDApIHtcbiAgICByZXN1bHQgKz0gaW5kZW50ICsgJ1snICsgZnVsbEtleSArICddXFxuJ1xuICB9XG4gIHJldHVybiByZXN1bHQgKyBzdHJpbmdpZnlPYmplY3QoZnVsbEtleSArICcuJywgaW5kZW50LCB2YWx1ZSlcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5leHBvcnRzLnBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZS5qcycpXG5leHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5LmpzJylcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBiYWxhbmNlZDtcbmZ1bmN0aW9uIGJhbGFuY2VkKGEsIGIsIHN0cikge1xuICBpZiAoYSBpbnN0YW5jZW9mIFJlZ0V4cCkgYSA9IG1heWJlTWF0Y2goYSwgc3RyKTtcbiAgaWYgKGIgaW5zdGFuY2VvZiBSZWdFeHApIGIgPSBtYXliZU1hdGNoKGIsIHN0cik7XG5cbiAgdmFyIHIgPSByYW5nZShhLCBiLCBzdHIpO1xuXG4gIHJldHVybiByICYmIHtcbiAgICBzdGFydDogclswXSxcbiAgICBlbmQ6IHJbMV0sXG4gICAgcHJlOiBzdHIuc2xpY2UoMCwgclswXSksXG4gICAgYm9keTogc3RyLnNsaWNlKHJbMF0gKyBhLmxlbmd0aCwgclsxXSksXG4gICAgcG9zdDogc3RyLnNsaWNlKHJbMV0gKyBiLmxlbmd0aClcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWF5YmVNYXRjaChyZWcsIHN0cikge1xuICB2YXIgbSA9IHN0ci5tYXRjaChyZWcpO1xuICByZXR1cm4gbSA/IG1bMF0gOiBudWxsO1xufVxuXG5iYWxhbmNlZC5yYW5nZSA9IHJhbmdlO1xuZnVuY3Rpb24gcmFuZ2UoYSwgYiwgc3RyKSB7XG4gIHZhciBiZWdzLCBiZWcsIGxlZnQsIHJpZ2h0LCByZXN1bHQ7XG4gIHZhciBhaSA9IHN0ci5pbmRleE9mKGEpO1xuICB2YXIgYmkgPSBzdHIuaW5kZXhPZihiLCBhaSArIDEpO1xuICB2YXIgaSA9IGFpO1xuXG4gIGlmIChhaSA+PSAwICYmIGJpID4gMCkge1xuICAgIGlmKGE9PT1iKSB7XG4gICAgICByZXR1cm4gW2FpLCBiaV07XG4gICAgfVxuICAgIGJlZ3MgPSBbXTtcbiAgICBsZWZ0ID0gc3RyLmxlbmd0aDtcblxuICAgIHdoaWxlIChpID49IDAgJiYgIXJlc3VsdCkge1xuICAgICAgaWYgKGkgPT0gYWkpIHtcbiAgICAgICAgYmVncy5wdXNoKGkpO1xuICAgICAgICBhaSA9IHN0ci5pbmRleE9mKGEsIGkgKyAxKTtcbiAgICAgIH0gZWxzZSBpZiAoYmVncy5sZW5ndGggPT0gMSkge1xuICAgICAgICByZXN1bHQgPSBbIGJlZ3MucG9wKCksIGJpIF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiZWcgPSBiZWdzLnBvcCgpO1xuICAgICAgICBpZiAoYmVnIDwgbGVmdCkge1xuICAgICAgICAgIGxlZnQgPSBiZWc7XG4gICAgICAgICAgcmlnaHQgPSBiaTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJpID0gc3RyLmluZGV4T2YoYiwgaSArIDEpO1xuICAgICAgfVxuXG4gICAgICBpID0gYWkgPCBiaSAmJiBhaSA+PSAwID8gYWkgOiBiaTtcbiAgICB9XG5cbiAgICBpZiAoYmVncy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IFsgbGVmdCwgcmlnaHQgXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwKICAgICJ2YXIgYmFsYW5jZWQgPSByZXF1aXJlKCdiYWxhbmNlZC1tYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cGFuZFRvcDtcblxudmFyIGVzY1NsYXNoID0gJ1xcMFNMQVNIJytNYXRoLnJhbmRvbSgpKydcXDAnO1xudmFyIGVzY09wZW4gPSAnXFwwT1BFTicrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NDbG9zZSA9ICdcXDBDTE9TRScrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NDb21tYSA9ICdcXDBDT01NQScrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NQZXJpb2QgPSAnXFwwUEVSSU9EJytNYXRoLnJhbmRvbSgpKydcXDAnO1xuXG5mdW5jdGlvbiBudW1lcmljKHN0cikge1xuICByZXR1cm4gcGFyc2VJbnQoc3RyLCAxMCkgPT0gc3RyXG4gICAgPyBwYXJzZUludChzdHIsIDEwKVxuICAgIDogc3RyLmNoYXJDb2RlQXQoMCk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUJyYWNlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgnXFxcXFxcXFwnKS5qb2luKGVzY1NsYXNoKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxceycpLmpvaW4oZXNjT3BlbilcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXH0nKS5qb2luKGVzY0Nsb3NlKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxcLCcpLmpvaW4oZXNjQ29tbWEpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcXFwuJykuam9pbihlc2NQZXJpb2QpO1xufVxuXG5mdW5jdGlvbiB1bmVzY2FwZUJyYWNlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdChlc2NTbGFzaCkuam9pbignXFxcXCcpXG4gICAgICAgICAgICAuc3BsaXQoZXNjT3Blbikuam9pbigneycpXG4gICAgICAgICAgICAuc3BsaXQoZXNjQ2xvc2UpLmpvaW4oJ30nKVxuICAgICAgICAgICAgLnNwbGl0KGVzY0NvbW1hKS5qb2luKCcsJylcbiAgICAgICAgICAgIC5zcGxpdChlc2NQZXJpb2QpLmpvaW4oJy4nKTtcbn1cblxuXG4vLyBCYXNpY2FsbHkganVzdCBzdHIuc3BsaXQoXCIsXCIpLCBidXQgaGFuZGxpbmcgY2FzZXNcbi8vIHdoZXJlIHdlIGhhdmUgbmVzdGVkIGJyYWNlZCBzZWN0aW9ucywgd2hpY2ggc2hvdWxkIGJlXG4vLyB0cmVhdGVkIGFzIGluZGl2aWR1YWwgbWVtYmVycywgbGlrZSB7YSx7YixjfSxkfVxuZnVuY3Rpb24gcGFyc2VDb21tYVBhcnRzKHN0cikge1xuICBpZiAoIXN0cilcbiAgICByZXR1cm4gWycnXTtcblxuICB2YXIgcGFydHMgPSBbXTtcbiAgdmFyIG0gPSBiYWxhbmNlZCgneycsICd9Jywgc3RyKTtcblxuICBpZiAoIW0pXG4gICAgcmV0dXJuIHN0ci5zcGxpdCgnLCcpO1xuXG4gIHZhciBwcmUgPSBtLnByZTtcbiAgdmFyIGJvZHkgPSBtLmJvZHk7XG4gIHZhciBwb3N0ID0gbS5wb3N0O1xuICB2YXIgcCA9IHByZS5zcGxpdCgnLCcpO1xuXG4gIHBbcC5sZW5ndGgtMV0gKz0gJ3snICsgYm9keSArICd9JztcbiAgdmFyIHBvc3RQYXJ0cyA9IHBhcnNlQ29tbWFQYXJ0cyhwb3N0KTtcbiAgaWYgKHBvc3QubGVuZ3RoKSB7XG4gICAgcFtwLmxlbmd0aC0xXSArPSBwb3N0UGFydHMuc2hpZnQoKTtcbiAgICBwLnB1c2guYXBwbHkocCwgcG9zdFBhcnRzKTtcbiAgfVxuXG4gIHBhcnRzLnB1c2guYXBwbHkocGFydHMsIHApO1xuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuZnVuY3Rpb24gZXhwYW5kVG9wKHN0cikge1xuICBpZiAoIXN0cilcbiAgICByZXR1cm4gW107XG5cbiAgLy8gSSBkb24ndCBrbm93IHdoeSBCYXNoIDQuMyBkb2VzIHRoaXMsIGJ1dCBpdCBkb2VzLlxuICAvLyBBbnl0aGluZyBzdGFydGluZyB3aXRoIHt9IHdpbGwgaGF2ZSB0aGUgZmlyc3QgdHdvIGJ5dGVzIHByZXNlcnZlZFxuICAvLyBidXQgKm9ubHkqIGF0IHRoZSB0b3AgbGV2ZWwsIHNvIHt9LGF9YiB3aWxsIG5vdCBleHBhbmQgdG8gYW55dGhpbmcsXG4gIC8vIGJ1dCBhe30sYn1jIHdpbGwgYmUgZXhwYW5kZWQgdG8gW2F9YyxhYmNdLlxuICAvLyBPbmUgY291bGQgYXJndWUgdGhhdCB0aGlzIGlzIGEgYnVnIGluIEJhc2gsIGJ1dCBzaW5jZSB0aGUgZ29hbCBvZlxuICAvLyB0aGlzIG1vZHVsZSBpcyB0byBtYXRjaCBCYXNoJ3MgcnVsZXMsIHdlIGVzY2FwZSBhIGxlYWRpbmcge31cbiAgaWYgKHN0ci5zdWJzdHIoMCwgMikgPT09ICd7fScpIHtcbiAgICBzdHIgPSAnXFxcXHtcXFxcfScgKyBzdHIuc3Vic3RyKDIpO1xuICB9XG5cbiAgcmV0dXJuIGV4cGFuZChlc2NhcGVCcmFjZXMoc3RyKSwgdHJ1ZSkubWFwKHVuZXNjYXBlQnJhY2VzKTtcbn1cblxuZnVuY3Rpb24gZW1icmFjZShzdHIpIHtcbiAgcmV0dXJuICd7JyArIHN0ciArICd9Jztcbn1cbmZ1bmN0aW9uIGlzUGFkZGVkKGVsKSB7XG4gIHJldHVybiAvXi0/MFxcZC8udGVzdChlbCk7XG59XG5cbmZ1bmN0aW9uIGx0ZShpLCB5KSB7XG4gIHJldHVybiBpIDw9IHk7XG59XG5mdW5jdGlvbiBndGUoaSwgeSkge1xuICByZXR1cm4gaSA+PSB5O1xufVxuXG5mdW5jdGlvbiBleHBhbmQoc3RyLCBpc1RvcCkge1xuICB2YXIgZXhwYW5zaW9ucyA9IFtdO1xuXG4gIHZhciBtID0gYmFsYW5jZWQoJ3snLCAnfScsIHN0cik7XG4gIGlmICghbSkgcmV0dXJuIFtzdHJdO1xuXG4gIC8vIG5vIG5lZWQgdG8gZXhwYW5kIHByZSwgc2luY2UgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBmcmVlIG9mIGJyYWNlLXNldHNcbiAgdmFyIHByZSA9IG0ucHJlO1xuICB2YXIgcG9zdCA9IG0ucG9zdC5sZW5ndGhcbiAgICA/IGV4cGFuZChtLnBvc3QsIGZhbHNlKVxuICAgIDogWycnXTtcblxuICBpZiAoL1xcJCQvLnRlc3QobS5wcmUpKSB7ICAgIFxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcG9zdC5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIGV4cGFuc2lvbiA9IHByZSsgJ3snICsgbS5ib2R5ICsgJ30nICsgcG9zdFtrXTtcbiAgICAgIGV4cGFuc2lvbnMucHVzaChleHBhbnNpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXNOdW1lcmljU2VxdWVuY2UgPSAvXi0/XFxkK1xcLlxcLi0/XFxkKyg/OlxcLlxcLi0/XFxkKyk/JC8udGVzdChtLmJvZHkpO1xuICAgIHZhciBpc0FscGhhU2VxdWVuY2UgPSAvXlthLXpBLVpdXFwuXFwuW2EtekEtWl0oPzpcXC5cXC4tP1xcZCspPyQvLnRlc3QobS5ib2R5KTtcbiAgICB2YXIgaXNTZXF1ZW5jZSA9IGlzTnVtZXJpY1NlcXVlbmNlIHx8IGlzQWxwaGFTZXF1ZW5jZTtcbiAgICB2YXIgaXNPcHRpb25zID0gbS5ib2R5LmluZGV4T2YoJywnKSA+PSAwO1xuICAgIGlmICghaXNTZXF1ZW5jZSAmJiAhaXNPcHRpb25zKSB7XG4gICAgICAvLyB7YX0sYn1cbiAgICAgIGlmIChtLnBvc3QubWF0Y2goLywuKlxcfS8pKSB7XG4gICAgICAgIHN0ciA9IG0ucHJlICsgJ3snICsgbS5ib2R5ICsgZXNjQ2xvc2UgKyBtLnBvc3Q7XG4gICAgICAgIHJldHVybiBleHBhbmQoc3RyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc3RyXTtcbiAgICB9XG5cbiAgICB2YXIgbjtcbiAgICBpZiAoaXNTZXF1ZW5jZSkge1xuICAgICAgbiA9IG0uYm9keS5zcGxpdCgvXFwuXFwuLyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBwYXJzZUNvbW1hUGFydHMobS5ib2R5KTtcbiAgICAgIGlmIChuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyB4e3thLGJ9fXkgPT0+IHh7YX15IHh7Yn15XG4gICAgICAgIG4gPSBleHBhbmQoblswXSwgZmFsc2UpLm1hcChlbWJyYWNlKTtcbiAgICAgICAgaWYgKG4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHBvc3QubWFwKGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICAgIHJldHVybiBtLnByZSArIG5bMF0gKyBwO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgbiBpcyB0aGUgcGFydHMsIGFuZCB3ZSBrbm93IGl0J3Mgbm90IGEgY29tbWEgc2V0XG4gICAgLy8gd2l0aCBhIHNpbmdsZSBlbnRyeS5cbiAgICB2YXIgTjtcblxuICAgIGlmIChpc1NlcXVlbmNlKSB7XG4gICAgICB2YXIgeCA9IG51bWVyaWMoblswXSk7XG4gICAgICB2YXIgeSA9IG51bWVyaWMoblsxXSk7XG4gICAgICB2YXIgd2lkdGggPSBNYXRoLm1heChuWzBdLmxlbmd0aCwgblsxXS5sZW5ndGgpXG4gICAgICB2YXIgaW5jciA9IG4ubGVuZ3RoID09IDNcbiAgICAgICAgPyBNYXRoLmFicyhudW1lcmljKG5bMl0pKVxuICAgICAgICA6IDE7XG4gICAgICB2YXIgdGVzdCA9IGx0ZTtcbiAgICAgIHZhciByZXZlcnNlID0geSA8IHg7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICBpbmNyICo9IC0xO1xuICAgICAgICB0ZXN0ID0gZ3RlO1xuICAgICAgfVxuICAgICAgdmFyIHBhZCA9IG4uc29tZShpc1BhZGRlZCk7XG5cbiAgICAgIE4gPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IHg7IHRlc3QoaSwgeSk7IGkgKz0gaW5jcikge1xuICAgICAgICB2YXIgYztcbiAgICAgICAgaWYgKGlzQWxwaGFTZXF1ZW5jZSkge1xuICAgICAgICAgIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xuICAgICAgICAgIGlmIChjID09PSAnXFxcXCcpXG4gICAgICAgICAgICBjID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYyA9IFN0cmluZyhpKTtcbiAgICAgICAgICBpZiAocGFkKSB7XG4gICAgICAgICAgICB2YXIgbmVlZCA9IHdpZHRoIC0gYy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobmVlZCA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIHogPSBuZXcgQXJyYXkobmVlZCArIDEpLmpvaW4oJzAnKTtcbiAgICAgICAgICAgICAgaWYgKGkgPCAwKVxuICAgICAgICAgICAgICAgIGMgPSAnLScgKyB6ICsgYy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGMgPSB6ICsgYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgTi5wdXNoKGMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBOID0gW107XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbi5sZW5ndGg7IGorKykge1xuICAgICAgICBOLnB1c2guYXBwbHkoTiwgZXhwYW5kKG5bal0sIGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBOLmxlbmd0aDsgaisrKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHBvc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGV4cGFuc2lvbiA9IHByZSArIE5bal0gKyBwb3N0W2tdO1xuICAgICAgICBpZiAoIWlzVG9wIHx8IGlzU2VxdWVuY2UgfHwgZXhwYW5zaW9uKVxuICAgICAgICAgIGV4cGFuc2lvbnMucHVzaChleHBhbnNpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbnNpb25zO1xufVxuXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmZyb21DYWxsYmFjayA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBhcmdzLnB1c2goKGVyciwgcmVzKSA9PiAoZXJyICE9IG51bGwpID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcykpXG4gICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgICB9KVxuICAgIH1cbiAgfSwgJ25hbWUnLCB7IHZhbHVlOiBmbi5uYW1lIH0pXG59XG5cbmV4cG9ydHMuZnJvbVByb21pc2UgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGNvbnN0IGNiID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdXG4gICAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgZWxzZSB7XG4gICAgICBhcmdzLnBvcCgpXG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmdzKS50aGVuKHIgPT4gY2IobnVsbCwgciksIGNiKVxuICAgIH1cbiAgfSwgJ25hbWUnLCB7IHZhbHVlOiBmbi5uYW1lIH0pXG59XG4iLAogICAgInZhciBjb25zdGFudHMgPSByZXF1aXJlKCdjb25zdGFudHMnKVxuXG52YXIgb3JpZ0N3ZCA9IHByb2Nlc3MuY3dkXG52YXIgY3dkID0gbnVsbFxuXG52YXIgcGxhdGZvcm0gPSBwcm9jZXNzLmVudi5HUkFDRUZVTF9GU19QTEFURk9STSB8fCBwcm9jZXNzLnBsYXRmb3JtXG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24oKSB7XG4gIGlmICghY3dkKVxuICAgIGN3ZCA9IG9yaWdDd2QuY2FsbChwcm9jZXNzKVxuICByZXR1cm4gY3dkXG59XG50cnkge1xuICBwcm9jZXNzLmN3ZCgpXG59IGNhdGNoIChlcikge31cblxuLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgdW50aWwgbm9kZS5qcyAxMiBpcyByZXF1aXJlZFxuaWYgKHR5cGVvZiBwcm9jZXNzLmNoZGlyID09PSAnZnVuY3Rpb24nKSB7XG4gIHZhciBjaGRpciA9IHByb2Nlc3MuY2hkaXJcbiAgcHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkKSB7XG4gICAgY3dkID0gbnVsbFxuICAgIGNoZGlyLmNhbGwocHJvY2VzcywgZClcbiAgfVxuICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSBPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvY2Vzcy5jaGRpciwgY2hkaXIpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hcblxuZnVuY3Rpb24gcGF0Y2ggKGZzKSB7XG4gIC8vIChyZS0paW1wbGVtZW50IHNvbWUgdGhpbmdzIHRoYXQgYXJlIGtub3duIGJ1c3RlZCBvciBtaXNzaW5nLlxuXG4gIC8vIGxjaG1vZCwgYnJva2VuIHByaW9yIHRvIDAuNi4yXG4gIC8vIGJhY2stcG9ydCB0aGUgZml4IGhlcmUuXG4gIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkoJ09fU1lNTElOSycpICYmXG4gICAgICBwcm9jZXNzLnZlcnNpb24ubWF0Y2goL152MFxcLjZcXC5bMC0yXXxedjBcXC41XFwuLykpIHtcbiAgICBwYXRjaExjaG1vZChmcylcbiAgfVxuXG4gIC8vIGx1dGltZXMgaW1wbGVtZW50YXRpb24sIG9yIG5vLW9wXG4gIGlmICghZnMubHV0aW1lcykge1xuICAgIHBhdGNoTHV0aW1lcyhmcylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1ncmFjZWZ1bC1mcy9pc3N1ZXMvNFxuICAvLyBDaG93biBzaG91bGQgbm90IGZhaWwgb24gZWludmFsIG9yIGVwZXJtIGlmIG5vbi1yb290LlxuICAvLyBJdCBzaG91bGQgbm90IGZhaWwgb24gZW5vc3lzIGV2ZXIsIGFzIHRoaXMganVzdCBpbmRpY2F0ZXNcbiAgLy8gdGhhdCBhIGZzIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgaW50ZW5kZWQgb3BlcmF0aW9uLlxuXG4gIGZzLmNob3duID0gY2hvd25GaXgoZnMuY2hvd24pXG4gIGZzLmZjaG93biA9IGNob3duRml4KGZzLmZjaG93bilcbiAgZnMubGNob3duID0gY2hvd25GaXgoZnMubGNob3duKVxuXG4gIGZzLmNobW9kID0gY2htb2RGaXgoZnMuY2htb2QpXG4gIGZzLmZjaG1vZCA9IGNobW9kRml4KGZzLmZjaG1vZClcbiAgZnMubGNobW9kID0gY2htb2RGaXgoZnMubGNobW9kKVxuXG4gIGZzLmNob3duU3luYyA9IGNob3duRml4U3luYyhmcy5jaG93blN5bmMpXG4gIGZzLmZjaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMuZmNob3duU3luYylcbiAgZnMubGNob3duU3luYyA9IGNob3duRml4U3luYyhmcy5sY2hvd25TeW5jKVxuXG4gIGZzLmNobW9kU3luYyA9IGNobW9kRml4U3luYyhmcy5jaG1vZFN5bmMpXG4gIGZzLmZjaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMuZmNobW9kU3luYylcbiAgZnMubGNobW9kU3luYyA9IGNobW9kRml4U3luYyhmcy5sY2htb2RTeW5jKVxuXG4gIGZzLnN0YXQgPSBzdGF0Rml4KGZzLnN0YXQpXG4gIGZzLmZzdGF0ID0gc3RhdEZpeChmcy5mc3RhdClcbiAgZnMubHN0YXQgPSBzdGF0Rml4KGZzLmxzdGF0KVxuXG4gIGZzLnN0YXRTeW5jID0gc3RhdEZpeFN5bmMoZnMuc3RhdFN5bmMpXG4gIGZzLmZzdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLmZzdGF0U3luYylcbiAgZnMubHN0YXRTeW5jID0gc3RhdEZpeFN5bmMoZnMubHN0YXRTeW5jKVxuXG4gIC8vIGlmIGxjaG1vZC9sY2hvd24gZG8gbm90IGV4aXN0LCB0aGVuIG1ha2UgdGhlbSBuby1vcHNcbiAgaWYgKGZzLmNobW9kICYmICFmcy5sY2htb2QpIHtcbiAgICBmcy5sY2htb2QgPSBmdW5jdGlvbiAocGF0aCwgbW9kZSwgY2IpIHtcbiAgICAgIGlmIChjYikgcHJvY2Vzcy5uZXh0VGljayhjYilcbiAgICB9XG4gICAgZnMubGNobW9kU3luYyA9IGZ1bmN0aW9uICgpIHt9XG4gIH1cbiAgaWYgKGZzLmNob3duICYmICFmcy5sY2hvd24pIHtcbiAgICBmcy5sY2hvd24gPSBmdW5jdGlvbiAocGF0aCwgdWlkLCBnaWQsIGNiKSB7XG4gICAgICBpZiAoY2IpIHByb2Nlc3MubmV4dFRpY2soY2IpXG4gICAgfVxuICAgIGZzLmxjaG93blN5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICB9XG5cbiAgLy8gb24gV2luZG93cywgQS9WIHNvZnR3YXJlIGNhbiBsb2NrIHRoZSBkaXJlY3RvcnksIGNhdXNpbmcgdGhpc1xuICAvLyB0byBmYWlsIHdpdGggYW4gRUFDQ0VTIG9yIEVQRVJNIGlmIHRoZSBkaXJlY3RvcnkgY29udGFpbnMgbmV3bHlcbiAgLy8gY3JlYXRlZCBmaWxlcy4gIFRyeSBhZ2FpbiBvbiBmYWlsdXJlLCBmb3IgdXAgdG8gNjAgc2Vjb25kcy5cblxuICAvLyBTZXQgdGhlIHRpbWVvdXQgdGhpcyBsb25nIGJlY2F1c2Ugc29tZSBXaW5kb3dzIEFudGktVmlydXMsIHN1Y2ggYXMgUGFyaXR5XG4gIC8vIGJpdDksIG1heSBsb2NrIGZpbGVzIGZvciB1cCB0byBhIG1pbnV0ZSwgY2F1c2luZyBucG0gcGFja2FnZSBpbnN0YWxsXG4gIC8vIGZhaWx1cmVzLiBBbHNvLCB0YWtlIGNhcmUgdG8geWllbGQgdGhlIHNjaGVkdWxlci4gV2luZG93cyBzY2hlZHVsaW5nIGdpdmVzXG4gIC8vIENQVSB0byBhIGJ1c3kgbG9vcGluZyBwcm9jZXNzLCB3aGljaCBjYW4gY2F1c2UgdGhlIHByb2dyYW0gY2F1c2luZyB0aGUgbG9ja1xuICAvLyBjb250ZW50aW9uIHRvIGJlIHN0YXJ2ZWQgb2YgQ1BVIGJ5IG5vZGUsIHNvIHRoZSBjb250ZW50aW9uIGRvZXNuJ3QgcmVzb2x2ZS5cbiAgaWYgKHBsYXRmb3JtID09PSBcIndpbjMyXCIpIHtcbiAgICBmcy5yZW5hbWUgPSB0eXBlb2YgZnMucmVuYW1lICE9PSAnZnVuY3Rpb24nID8gZnMucmVuYW1lXG4gICAgOiAoZnVuY3Rpb24gKGZzJHJlbmFtZSkge1xuICAgICAgZnVuY3Rpb24gcmVuYW1lIChmcm9tLCB0bywgY2IpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICB2YXIgYmFja29mZiA9IDA7XG4gICAgICAgIGZzJHJlbmFtZShmcm9tLCB0bywgZnVuY3Rpb24gQ0IgKGVyKSB7XG4gICAgICAgICAgaWYgKGVyXG4gICAgICAgICAgICAgICYmIChlci5jb2RlID09PSBcIkVBQ0NFU1wiIHx8IGVyLmNvZGUgPT09IFwiRVBFUk1cIiB8fCBlci5jb2RlID09PSBcIkVCVVNZXCIpXG4gICAgICAgICAgICAgICYmIERhdGUubm93KCkgLSBzdGFydCA8IDYwMDAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBmcy5zdGF0KHRvLCBmdW5jdGlvbiAoc3RhdGVyLCBzdCkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZXIgJiYgc3RhdGVyLmNvZGUgPT09IFwiRU5PRU5UXCIpXG4gICAgICAgICAgICAgICAgICBmcyRyZW5hbWUoZnJvbSwgdG8sIENCKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICBjYihlcilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGJhY2tvZmYpXG4gICAgICAgICAgICBpZiAoYmFja29mZiA8IDEwMClcbiAgICAgICAgICAgICAgYmFja29mZiArPSAxMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNiKSBjYihlcilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIE9iamVjdC5zZXRQcm90b3R5cGVPZihyZW5hbWUsIGZzJHJlbmFtZSlcbiAgICAgIHJldHVybiByZW5hbWVcbiAgICB9KShmcy5yZW5hbWUpXG4gIH1cblxuICAvLyBpZiByZWFkKCkgcmV0dXJucyBFQUdBSU4sIHRoZW4ganVzdCB0cnkgaXQgYWdhaW4uXG4gIGZzLnJlYWQgPSB0eXBlb2YgZnMucmVhZCAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlYWRcbiAgOiAoZnVuY3Rpb24gKGZzJHJlYWQpIHtcbiAgICBmdW5jdGlvbiByZWFkIChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrXykge1xuICAgICAgdmFyIGNhbGxiYWNrXG4gICAgICBpZiAoY2FsbGJhY2tfICYmIHR5cGVvZiBjYWxsYmFja18gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIGVhZ0NvdW50ZXIgPSAwXG4gICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGVyLCBfLCBfXykge1xuICAgICAgICAgIGlmIChlciAmJiBlci5jb2RlID09PSAnRUFHQUlOJyAmJiBlYWdDb3VudGVyIDwgMTApIHtcbiAgICAgICAgICAgIGVhZ0NvdW50ZXIgKytcbiAgICAgICAgICAgIHJldHVybiBmcyRyZWFkLmNhbGwoZnMsIGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhbGxiYWNrXy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmcyRyZWFkLmNhbGwoZnMsIGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgLy8gVGhpcyBlbnN1cmVzIGB1dGlsLnByb21pc2lmeWAgd29ya3MgYXMgaXQgZG9lcyBmb3IgbmF0aXZlIGBmcy5yZWFkYC5cbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVhZCwgZnMkcmVhZClcbiAgICByZXR1cm4gcmVhZFxuICB9KShmcy5yZWFkKVxuXG4gIGZzLnJlYWRTeW5jID0gdHlwZW9mIGZzLnJlYWRTeW5jICE9PSAnZnVuY3Rpb24nID8gZnMucmVhZFN5bmNcbiAgOiAoZnVuY3Rpb24gKGZzJHJlYWRTeW5jKSB7IHJldHVybiBmdW5jdGlvbiAoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKSB7XG4gICAgdmFyIGVhZ0NvdW50ZXIgPSAwXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmcyRyZWFkU3luYy5jYWxsKGZzLCBmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoZXIuY29kZSA9PT0gJ0VBR0FJTicgJiYgZWFnQ291bnRlciA8IDEwKSB7XG4gICAgICAgICAgZWFnQ291bnRlciArK1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gIH19KShmcy5yZWFkU3luYylcblxuICBmdW5jdGlvbiBwYXRjaExjaG1vZCAoZnMpIHtcbiAgICBmcy5sY2htb2QgPSBmdW5jdGlvbiAocGF0aCwgbW9kZSwgY2FsbGJhY2spIHtcbiAgICAgIGZzLm9wZW4oIHBhdGhcbiAgICAgICAgICAgICAsIGNvbnN0YW50cy5PX1dST05MWSB8IGNvbnN0YW50cy5PX1NZTUxJTktcbiAgICAgICAgICAgICAsIG1vZGVcbiAgICAgICAgICAgICAsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVycilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyBwcmVmZXIgdG8gcmV0dXJuIHRoZSBjaG1vZCBlcnJvciwgaWYgb25lIG9jY3VycyxcbiAgICAgICAgLy8gYnV0IHN0aWxsIHRyeSB0byBjbG9zZSwgYW5kIHJlcG9ydCBjbG9zaW5nIGVycm9ycyBpZiB0aGV5IG9jY3VyLlxuICAgICAgICBmcy5mY2htb2QoZmQsIG1vZGUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBmcy5jbG9zZShmZCwgZnVuY3Rpb24oZXJyMikge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIgfHwgZXJyMilcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmcy5sY2htb2RTeW5jID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUpIHtcbiAgICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1dST05MWSB8IGNvbnN0YW50cy5PX1NZTUxJTkssIG1vZGUpXG5cbiAgICAgIC8vIHByZWZlciB0byByZXR1cm4gdGhlIGNobW9kIGVycm9yLCBpZiBvbmUgb2NjdXJzLFxuICAgICAgLy8gYnV0IHN0aWxsIHRyeSB0byBjbG9zZSwgYW5kIHJlcG9ydCBjbG9zaW5nIGVycm9ycyBpZiB0aGV5IG9jY3VyLlxuICAgICAgdmFyIHRocmV3ID0gdHJ1ZVxuICAgICAgdmFyIHJldFxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0ID0gZnMuZmNobW9kU3luYyhmZCwgbW9kZSlcbiAgICAgICAgdGhyZXcgPSBmYWxzZVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHRocmV3KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICB9IGNhdGNoIChlcikge31cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXRjaEx1dGltZXMgKGZzKSB7XG4gICAgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eShcIk9fU1lNTElOS1wiKSAmJiBmcy5mdXRpbWVzKSB7XG4gICAgICBmcy5sdXRpbWVzID0gZnVuY3Rpb24gKHBhdGgsIGF0LCBtdCwgY2IpIHtcbiAgICAgICAgZnMub3BlbihwYXRoLCBjb25zdGFudHMuT19TWU1MSU5LLCBmdW5jdGlvbiAoZXIsIGZkKSB7XG4gICAgICAgICAgaWYgKGVyKSB7XG4gICAgICAgICAgICBpZiAoY2IpIGNiKGVyKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGZzLmZ1dGltZXMoZmQsIGF0LCBtdCwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgICAgICBmcy5jbG9zZShmZCwgZnVuY3Rpb24gKGVyMikge1xuICAgICAgICAgICAgICBpZiAoY2IpIGNiKGVyIHx8IGVyMilcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZnMubHV0aW1lc1N5bmMgPSBmdW5jdGlvbiAocGF0aCwgYXQsIG10KSB7XG4gICAgICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1NZTUxJTkspXG4gICAgICAgIHZhciByZXRcbiAgICAgICAgdmFyIHRocmV3ID0gdHJ1ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldCA9IGZzLmZ1dGltZXNTeW5jKGZkLCBhdCwgbXQpXG4gICAgICAgICAgdGhyZXcgPSBmYWxzZVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmICh0aHJldykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXIpIHt9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChmcy5mdXRpbWVzKSB7XG4gICAgICBmcy5sdXRpbWVzID0gZnVuY3Rpb24gKF9hLCBfYiwgX2MsIGNiKSB7IGlmIChjYikgcHJvY2Vzcy5uZXh0VGljayhjYikgfVxuICAgICAgZnMubHV0aW1lc1N5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNobW9kRml4IChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBtb2RlLCBjYikge1xuICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCBtb2RlLCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgICAgaWYgKGNob3duRXJPayhlcikpIGVyID0gbnVsbFxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2htb2RGaXhTeW5jIChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBtb2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG1vZGUpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoIWNob3duRXJPayhlcikpIHRocm93IGVyXG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBjaG93bkZpeCAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdWlkLCBnaWQsIGNiKSB7XG4gICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIHVpZCwgZ2lkLCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgICAgaWYgKGNob3duRXJPayhlcikpIGVyID0gbnVsbFxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hvd25GaXhTeW5jIChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB1aWQsIGdpZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCB1aWQsIGdpZClcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIGlmICghY2hvd25Fck9rKGVyKSkgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0Rml4IChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIE5vZGUgZXJyb25lb3VzbHkgcmV0dXJuZWQgc2lnbmVkIGludGVnZXJzIGZvclxuICAgIC8vIHVpZCArIGdpZC5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgb3B0aW9ucywgY2IpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IG9wdGlvbnNcbiAgICAgICAgb3B0aW9ucyA9IG51bGxcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrIChlciwgc3RhdHMpIHtcbiAgICAgICAgaWYgKHN0YXRzKSB7XG4gICAgICAgICAgaWYgKHN0YXRzLnVpZCA8IDApIHN0YXRzLnVpZCArPSAweDEwMDAwMDAwMFxuICAgICAgICAgIGlmIChzdGF0cy5naWQgPCAwKSBzdGF0cy5naWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zID8gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgICAgICA6IG9yaWcuY2FsbChmcywgdGFyZ2V0LCBjYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0Rml4U3luYyAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiBOb2RlIGVycm9uZW91c2x5IHJldHVybmVkIHNpZ25lZCBpbnRlZ2VycyBmb3JcbiAgICAvLyB1aWQgKyBnaWQuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBzdGF0cyA9IG9wdGlvbnMgPyBvcmlnLmNhbGwoZnMsIHRhcmdldCwgb3B0aW9ucylcbiAgICAgICAgOiBvcmlnLmNhbGwoZnMsIHRhcmdldClcbiAgICAgIGlmIChzdGF0cykge1xuICAgICAgICBpZiAoc3RhdHMudWlkIDwgMCkgc3RhdHMudWlkICs9IDB4MTAwMDAwMDAwXG4gICAgICAgIGlmIChzdGF0cy5naWQgPCAwKSBzdGF0cy5naWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG4gIH1cblxuICAvLyBFTk9TWVMgbWVhbnMgdGhhdCB0aGUgZnMgZG9lc24ndCBzdXBwb3J0IHRoZSBvcC4gSnVzdCBpZ25vcmVcbiAgLy8gdGhhdCwgYmVjYXVzZSBpdCBkb2Vzbid0IG1hdHRlci5cbiAgLy9cbiAgLy8gaWYgdGhlcmUncyBubyBnZXR1aWQsIG9yIGlmIGdldHVpZCgpIGlzIHNvbWV0aGluZyBvdGhlclxuICAvLyB0aGFuIDAsIGFuZCB0aGUgZXJyb3IgaXMgRUlOVkFMIG9yIEVQRVJNLCB0aGVuIGp1c3QgaWdub3JlXG4gIC8vIGl0LlxuICAvL1xuICAvLyBUaGlzIHNwZWNpZmljIGNhc2UgaXMgYSBzaWxlbnQgZmFpbHVyZSBpbiBjcCwgaW5zdGFsbCwgdGFyLFxuICAvLyBhbmQgbW9zdCBvdGhlciB1bml4IHRvb2xzIHRoYXQgbWFuYWdlIHBlcm1pc3Npb25zLlxuICAvL1xuICAvLyBXaGVuIHJ1bm5pbmcgYXMgcm9vdCwgb3IgaWYgb3RoZXIgdHlwZXMgb2YgZXJyb3JzIGFyZVxuICAvLyBlbmNvdW50ZXJlZCwgdGhlbiBpdCdzIHN0cmljdC5cbiAgZnVuY3Rpb24gY2hvd25Fck9rIChlcikge1xuICAgIGlmICghZXIpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKGVyLmNvZGUgPT09IFwiRU5PU1lTXCIpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgdmFyIG5vbnJvb3QgPSAhcHJvY2Vzcy5nZXR1aWQgfHwgcHJvY2Vzcy5nZXR1aWQoKSAhPT0gMFxuICAgIGlmIChub25yb290KSB7XG4gICAgICBpZiAoZXIuY29kZSA9PT0gXCJFSU5WQUxcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiIsCiAgICAidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxlZ2FjeVxuXG5mdW5jdGlvbiBsZWdhY3kgKGZzKSB7XG4gIHJldHVybiB7XG4gICAgUmVhZFN0cmVhbTogUmVhZFN0cmVhbSxcbiAgICBXcml0ZVN0cmVhbTogV3JpdGVTdHJlYW1cbiAgfVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZFN0cmVhbSkpIHJldHVybiBuZXcgUmVhZFN0cmVhbShwYXRoLCBvcHRpb25zKTtcblxuICAgIFN0cmVhbS5jYWxsKHRoaXMpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLmZkID0gbnVsbDtcbiAgICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5mbGFncyA9ICdyJztcbiAgICB0aGlzLm1vZGUgPSA0Mzg7IC8qPTA2NjYqL1xuICAgIHRoaXMuYnVmZmVyU2l6ZSA9IDY0ICogMTAyNDtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWl4aW4gb3B0aW9ucyBpbnRvIHRoaXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZW5jb2RpbmcpIHRoaXMuc2V0RW5jb2RpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICBpZiAodGhpcy5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLnN0YXJ0KSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignc3RhcnQgbXVzdCBiZSBhIE51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5lbmQgPSBJbmZpbml0eTtcbiAgICAgIH0gZWxzZSBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLmVuZCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ2VuZCBtdXN0IGJlIGEgTnVtYmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXJ0ID4gdGhpcy5lbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydCBtdXN0IGJlIDw9IGVuZCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmQgIT09IG51bGwpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuX3JlYWQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZzLm9wZW4odGhpcy5wYXRoLCB0aGlzLmZsYWdzLCB0aGlzLm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICBzZWxmLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VsZi5mZCA9IGZkO1xuICAgICAgc2VsZi5lbWl0KCdvcGVuJywgZmQpO1xuICAgICAgc2VsZi5fcmVhZCgpO1xuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0ZVN0cmVhbSkpIHJldHVybiBuZXcgV3JpdGVTdHJlYW0ocGF0aCwgb3B0aW9ucyk7XG5cbiAgICBTdHJlYW0uY2FsbCh0aGlzKTtcblxuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5mZCA9IG51bGw7XG4gICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgICB0aGlzLmZsYWdzID0gJ3cnO1xuICAgIHRoaXMuZW5jb2RpbmcgPSAnYmluYXJ5JztcbiAgICB0aGlzLm1vZGUgPSA0Mzg7IC8qPTA2NjYqL1xuICAgIHRoaXMuYnl0ZXNXcml0dGVuID0gMDtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWl4aW4gb3B0aW9ucyBpbnRvIHRoaXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdGhpcy5zdGFydCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ3N0YXJ0IG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXJ0IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IG11c3QgYmUgPj0gemVybycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcblxuICAgIGlmICh0aGlzLmZkID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9vcGVuID0gZnMub3BlbjtcbiAgICAgIHRoaXMuX3F1ZXVlLnB1c2goW3RoaXMuX29wZW4sIHRoaXMucGF0aCwgdGhpcy5mbGFncywgdGhpcy5tb2RlLCB1bmRlZmluZWRdKTtcbiAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVcblxudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iai5fX3Byb3RvX19cbn1cblxuZnVuY3Rpb24gY2xvbmUgKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKVxuICAgIHJldHVybiBvYmpcblxuICBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgIHZhciBjb3B5ID0geyBfX3Byb3RvX186IGdldFByb3RvdHlwZU9mKG9iaikgfVxuICBlbHNlXG4gICAgdmFyIGNvcHkgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29weSwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSlcbiAgfSlcblxuICByZXR1cm4gY29weVxufVxuIiwKICAgICJ2YXIgZnMgPSByZXF1aXJlKCdmcycpXG52YXIgcG9seWZpbGxzID0gcmVxdWlyZSgnLi9wb2x5ZmlsbHMuanMnKVxudmFyIGxlZ2FjeSA9IHJlcXVpcmUoJy4vbGVnYWN5LXN0cmVhbXMuanMnKVxudmFyIGNsb25lID0gcmVxdWlyZSgnLi9jbG9uZS5qcycpXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gbm9kZSAwLnggcG9seWZpbGwgKi9cbnZhciBncmFjZWZ1bFF1ZXVlXG52YXIgcHJldmlvdXNTeW1ib2xcblxuLyogaXN0YW5idWwgaWdub3JlIGVsc2UgLSBub2RlIDAueCBwb2x5ZmlsbCAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgZ3JhY2VmdWxRdWV1ZSA9IFN5bWJvbC5mb3IoJ2dyYWNlZnVsLWZzLnF1ZXVlJylcbiAgLy8gVGhpcyBpcyB1c2VkIGluIHRlc3RpbmcgYnkgZnV0dXJlIHZlcnNpb25zXG4gIHByZXZpb3VzU3ltYm9sID0gU3ltYm9sLmZvcignZ3JhY2VmdWwtZnMucHJldmlvdXMnKVxufSBlbHNlIHtcbiAgZ3JhY2VmdWxRdWV1ZSA9ICdfX19ncmFjZWZ1bC1mcy5xdWV1ZSdcbiAgcHJldmlvdXNTeW1ib2wgPSAnX19fZ3JhY2VmdWwtZnMucHJldmlvdXMnXG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gcHVibGlzaFF1ZXVlKGNvbnRleHQsIHF1ZXVlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0LCBncmFjZWZ1bFF1ZXVlLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBxdWV1ZVxuICAgIH1cbiAgfSlcbn1cblxudmFyIGRlYnVnID0gbm9vcFxuaWYgKHV0aWwuZGVidWdsb2cpXG4gIGRlYnVnID0gdXRpbC5kZWJ1Z2xvZygnZ2ZzNCcpXG5lbHNlIGlmICgvXFxiZ2ZzNFxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJykpXG4gIGRlYnVnID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG0gPSB1dGlsLmZvcm1hdC5hcHBseSh1dGlsLCBhcmd1bWVudHMpXG4gICAgbSA9ICdHRlM0OiAnICsgbS5zcGxpdCgvXFxuLykuam9pbignXFxuR0ZTNDogJylcbiAgICBjb25zb2xlLmVycm9yKG0pXG4gIH1cblxuLy8gT25jZSB0aW1lIGluaXRpYWxpemF0aW9uXG5pZiAoIWZzW2dyYWNlZnVsUXVldWVdKSB7XG4gIC8vIFRoaXMgcXVldWUgY2FuIGJlIHNoYXJlZCBieSBtdWx0aXBsZSBsb2FkZWQgaW5zdGFuY2VzXG4gIHZhciBxdWV1ZSA9IGdsb2JhbFtncmFjZWZ1bFF1ZXVlXSB8fCBbXVxuICBwdWJsaXNoUXVldWUoZnMsIHF1ZXVlKVxuXG4gIC8vIFBhdGNoIGZzLmNsb3NlL2Nsb3NlU3luYyB0byBzaGFyZWQgcXVldWUgdmVyc2lvbiwgYmVjYXVzZSB3ZSBuZWVkXG4gIC8vIHRvIHJldHJ5KCkgd2hlbmV2ZXIgYSBjbG9zZSBoYXBwZW5zICphbnl3aGVyZSogaW4gdGhlIHByb2dyYW0uXG4gIC8vIFRoaXMgaXMgZXNzZW50aWFsIHdoZW4gbXVsdGlwbGUgZ3JhY2VmdWwtZnMgaW5zdGFuY2VzIGFyZVxuICAvLyBpbiBwbGF5IGF0IHRoZSBzYW1lIHRpbWUuXG4gIGZzLmNsb3NlID0gKGZ1bmN0aW9uIChmcyRjbG9zZSkge1xuICAgIGZ1bmN0aW9uIGNsb3NlIChmZCwgY2IpIHtcbiAgICAgIHJldHVybiBmcyRjbG9zZS5jYWxsKGZzLCBmZCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGdyYWNlZnVsLWZzIHNoYXJlZCBxdWV1ZVxuICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgIHJlc2V0UXVldWUoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9KVxuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9zZSwgcHJldmlvdXNTeW1ib2wsIHtcbiAgICAgIHZhbHVlOiBmcyRjbG9zZVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb3NlXG4gIH0pKGZzLmNsb3NlKVxuXG4gIGZzLmNsb3NlU3luYyA9IChmdW5jdGlvbiAoZnMkY2xvc2VTeW5jKSB7XG4gICAgZnVuY3Rpb24gY2xvc2VTeW5jIChmZCkge1xuICAgICAgLy8gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBncmFjZWZ1bC1mcyBzaGFyZWQgcXVldWVcbiAgICAgIGZzJGNsb3NlU3luYy5hcHBseShmcywgYXJndW1lbnRzKVxuICAgICAgcmVzZXRRdWV1ZSgpXG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb3NlU3luYywgcHJldmlvdXNTeW1ib2wsIHtcbiAgICAgIHZhbHVlOiBmcyRjbG9zZVN5bmNcbiAgICB9KVxuICAgIHJldHVybiBjbG9zZVN5bmNcbiAgfSkoZnMuY2xvc2VTeW5jKVxuXG4gIGlmICgvXFxiZ2ZzNFxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJykpIHtcbiAgICBwcm9jZXNzLm9uKCdleGl0JywgZnVuY3Rpb24oKSB7XG4gICAgICBkZWJ1Zyhmc1tncmFjZWZ1bFF1ZXVlXSlcbiAgICAgIHJlcXVpcmUoJ2Fzc2VydCcpLmVxdWFsKGZzW2dyYWNlZnVsUXVldWVdLmxlbmd0aCwgMClcbiAgICB9KVxuICB9XG59XG5cbmlmICghZ2xvYmFsW2dyYWNlZnVsUXVldWVdKSB7XG4gIHB1Ymxpc2hRdWV1ZShnbG9iYWwsIGZzW2dyYWNlZnVsUXVldWVdKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaChjbG9uZShmcykpXG5pZiAocHJvY2Vzcy5lbnYuVEVTVF9HUkFDRUZVTF9GU19HTE9CQUxfUEFUQ0ggJiYgIWZzLl9fcGF0Y2hlZCkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gcGF0Y2goZnMpXG4gICAgZnMuX19wYXRjaGVkID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcGF0Y2ggKGZzKSB7XG4gIC8vIEV2ZXJ5dGhpbmcgdGhhdCByZWZlcmVuY2VzIHRoZSBvcGVuKCkgZnVuY3Rpb24gbmVlZHMgdG8gYmUgaW4gaGVyZVxuICBwb2x5ZmlsbHMoZnMpXG4gIGZzLmdyYWNlZnVsaWZ5ID0gcGF0Y2hcblxuICBmcy5jcmVhdGVSZWFkU3RyZWFtID0gY3JlYXRlUmVhZFN0cmVhbVxuICBmcy5jcmVhdGVXcml0ZVN0cmVhbSA9IGNyZWF0ZVdyaXRlU3RyZWFtXG4gIHZhciBmcyRyZWFkRmlsZSA9IGZzLnJlYWRGaWxlXG4gIGZzLnJlYWRGaWxlID0gcmVhZEZpbGVcbiAgZnVuY3Rpb24gcmVhZEZpbGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJHJlYWRGaWxlKHBhdGgsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kcmVhZEZpbGUgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRyZWFkRmlsZShwYXRoLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJHJlYWRGaWxlLCBbcGF0aCwgb3B0aW9ucywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkd3JpdGVGaWxlID0gZnMud3JpdGVGaWxlXG4gIGZzLndyaXRlRmlsZSA9IHdyaXRlRmlsZVxuICBmdW5jdGlvbiB3cml0ZUZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJHdyaXRlRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJHdyaXRlRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJHdyaXRlRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJHdyaXRlRmlsZSwgW3BhdGgsIGRhdGEsIG9wdGlvbnMsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJGFwcGVuZEZpbGUgPSBmcy5hcHBlbmRGaWxlXG4gIGlmIChmcyRhcHBlbmRGaWxlKVxuICAgIGZzLmFwcGVuZEZpbGUgPSBhcHBlbmRGaWxlXG4gIGZ1bmN0aW9uIGFwcGVuZEZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJGFwcGVuZEZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRhcHBlbmRGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkYXBwZW5kRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJGFwcGVuZEZpbGUsIFtwYXRoLCBkYXRhLCBvcHRpb25zLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyRjb3B5RmlsZSA9IGZzLmNvcHlGaWxlXG4gIGlmIChmcyRjb3B5RmlsZSlcbiAgICBmcy5jb3B5RmlsZSA9IGNvcHlGaWxlXG4gIGZ1bmN0aW9uIGNvcHlGaWxlIChzcmMsIGRlc3QsIGZsYWdzLCBjYikge1xuICAgIGlmICh0eXBlb2YgZmxhZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiID0gZmxhZ3NcbiAgICAgIGZsYWdzID0gMFxuICAgIH1cbiAgICByZXR1cm4gZ28kY29weUZpbGUoc3JjLCBkZXN0LCBmbGFncywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRjb3B5RmlsZSAoc3JjLCBkZXN0LCBmbGFncywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJGNvcHlGaWxlKHNyYywgZGVzdCwgZmxhZ3MsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kY29weUZpbGUsIFtzcmMsIGRlc3QsIGZsYWdzLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyRyZWFkZGlyID0gZnMucmVhZGRpclxuICBmcy5yZWFkZGlyID0gcmVhZGRpclxuICB2YXIgbm9SZWFkZGlyT3B0aW9uVmVyc2lvbnMgPSAvXnZbMC01XVxcLi9cbiAgZnVuY3Rpb24gcmVhZGRpciAocGF0aCwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICB2YXIgZ28kcmVhZGRpciA9IG5vUmVhZGRpck9wdGlvblZlcnNpb25zLnRlc3QocHJvY2Vzcy52ZXJzaW9uKVxuICAgICAgPyBmdW5jdGlvbiBnbyRyZWFkZGlyIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICAgIHJldHVybiBmcyRyZWFkZGlyKHBhdGgsIGZzJHJlYWRkaXJDYWxsYmFjayhcbiAgICAgICAgICBwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lXG4gICAgICAgICkpXG4gICAgICB9XG4gICAgICA6IGZ1bmN0aW9uIGdvJHJlYWRkaXIgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZzJHJlYWRkaXIocGF0aCwgb3B0aW9ucywgZnMkcmVhZGRpckNhbGxiYWNrKFxuICAgICAgICAgIHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWVcbiAgICAgICAgKSlcbiAgICAgIH1cblxuICAgIHJldHVybiBnbyRyZWFkZGlyKHBhdGgsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZnMkcmVhZGRpckNhbGxiYWNrIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGVyciwgZmlsZXMpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbXG4gICAgICAgICAgICBnbyRyZWFkZGlyLFxuICAgICAgICAgICAgW3BhdGgsIG9wdGlvbnMsIGNiXSxcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLFxuICAgICAgICAgICAgRGF0ZS5ub3coKVxuICAgICAgICAgIF0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChmaWxlcyAmJiBmaWxlcy5zb3J0KVxuICAgICAgICAgICAgZmlsZXMuc29ydCgpXG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuY2FsbCh0aGlzLCBlcnIsIGZpbGVzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MudmVyc2lvbi5zdWJzdHIoMCwgNCkgPT09ICd2MC44Jykge1xuICAgIHZhciBsZWdTdHJlYW1zID0gbGVnYWN5KGZzKVxuICAgIFJlYWRTdHJlYW0gPSBsZWdTdHJlYW1zLlJlYWRTdHJlYW1cbiAgICBXcml0ZVN0cmVhbSA9IGxlZ1N0cmVhbXMuV3JpdGVTdHJlYW1cbiAgfVxuXG4gIHZhciBmcyRSZWFkU3RyZWFtID0gZnMuUmVhZFN0cmVhbVxuICBpZiAoZnMkUmVhZFN0cmVhbSkge1xuICAgIFJlYWRTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShmcyRSZWFkU3RyZWFtLnByb3RvdHlwZSlcbiAgICBSZWFkU3RyZWFtLnByb3RvdHlwZS5vcGVuID0gUmVhZFN0cmVhbSRvcGVuXG4gIH1cblxuICB2YXIgZnMkV3JpdGVTdHJlYW0gPSBmcy5Xcml0ZVN0cmVhbVxuICBpZiAoZnMkV3JpdGVTdHJlYW0pIHtcbiAgICBXcml0ZVN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGZzJFdyaXRlU3RyZWFtLnByb3RvdHlwZSlcbiAgICBXcml0ZVN0cmVhbS5wcm90b3R5cGUub3BlbiA9IFdyaXRlU3RyZWFtJG9wZW5cbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ1JlYWRTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gUmVhZFN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBSZWFkU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdXcml0ZVN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBXcml0ZVN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBXcml0ZVN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcblxuICAvLyBsZWdhY3kgbmFtZXNcbiAgdmFyIEZpbGVSZWFkU3RyZWFtID0gUmVhZFN0cmVhbVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdGaWxlUmVhZFN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBGaWxlUmVhZFN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBGaWxlUmVhZFN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbiAgdmFyIEZpbGVXcml0ZVN0cmVhbSA9IFdyaXRlU3RyZWFtXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ0ZpbGVXcml0ZVN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBGaWxlV3JpdGVTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgRmlsZVdyaXRlU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFJlYWRTdHJlYW0pXG4gICAgICByZXR1cm4gZnMkUmVhZFN0cmVhbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0aGlzXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIFJlYWRTdHJlYW0uYXBwbHkoT2JqZWN0LmNyZWF0ZShSZWFkU3RyZWFtLnByb3RvdHlwZSksIGFyZ3VtZW50cylcbiAgfVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0kb3BlbiAoKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgb3Blbih0aGF0LnBhdGgsIHRoYXQuZmxhZ3MsIHRoYXQubW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgaWYgKHRoYXQuYXV0b0Nsb3NlKVxuICAgICAgICAgIHRoYXQuZGVzdHJveSgpXG5cbiAgICAgICAgdGhhdC5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoYXQuZmQgPSBmZFxuICAgICAgICB0aGF0LmVtaXQoJ29wZW4nLCBmZClcbiAgICAgICAgdGhhdC5yZWFkKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gV3JpdGVTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFdyaXRlU3RyZWFtKVxuICAgICAgcmV0dXJuIGZzJFdyaXRlU3RyZWFtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXNcbiAgICBlbHNlXG4gICAgICByZXR1cm4gV3JpdGVTdHJlYW0uYXBwbHkoT2JqZWN0LmNyZWF0ZShXcml0ZVN0cmVhbS5wcm90b3R5cGUpLCBhcmd1bWVudHMpXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSRvcGVuICgpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICBvcGVuKHRoYXQucGF0aCwgdGhhdC5mbGFncywgdGhhdC5tb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICB0aGF0LmRlc3Ryb3koKVxuICAgICAgICB0aGF0LmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhhdC5mZCA9IGZkXG4gICAgICAgIHRoYXQuZW1pdCgnb3BlbicsIGZkKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVSZWFkU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBmcy5SZWFkU3RyZWFtKHBhdGgsIG9wdGlvbnMpXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgZnMuV3JpdGVTdHJlYW0ocGF0aCwgb3B0aW9ucylcbiAgfVxuXG4gIHZhciBmcyRvcGVuID0gZnMub3BlblxuICBmcy5vcGVuID0gb3BlblxuICBmdW5jdGlvbiBvcGVuIChwYXRoLCBmbGFncywgbW9kZSwgY2IpIHtcbiAgICBpZiAodHlwZW9mIG1vZGUgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG1vZGUsIG1vZGUgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kb3BlbihwYXRoLCBmbGFncywgbW9kZSwgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRvcGVuIChwYXRoLCBmbGFncywgbW9kZSwgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJG9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJG9wZW4sIFtwYXRoLCBmbGFncywgbW9kZSwgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnNcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZSAoZWxlbSkge1xuICBkZWJ1ZygnRU5RVUVVRScsIGVsZW1bMF0ubmFtZSwgZWxlbVsxXSlcbiAgZnNbZ3JhY2VmdWxRdWV1ZV0ucHVzaChlbGVtKVxuICByZXRyeSgpXG59XG5cbi8vIGtlZXAgdHJhY2sgb2YgdGhlIHRpbWVvdXQgYmV0d2VlbiByZXRyeSgpIGNhbGxzXG52YXIgcmV0cnlUaW1lclxuXG4vLyByZXNldCB0aGUgc3RhcnRUaW1lIGFuZCBsYXN0VGltZSB0byBub3dcbi8vIHRoaXMgcmVzZXRzIHRoZSBzdGFydCBvZiB0aGUgNjAgc2Vjb25kIG92ZXJhbGwgdGltZW91dCBhcyB3ZWxsIGFzIHRoZVxuLy8gZGVsYXkgYmV0d2VlbiBhdHRlbXB0cyBzbyB0aGF0IHdlJ2xsIHJldHJ5IHRoZXNlIGpvYnMgc29vbmVyXG5mdW5jdGlvbiByZXNldFF1ZXVlICgpIHtcbiAgdmFyIG5vdyA9IERhdGUubm93KClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmc1tncmFjZWZ1bFF1ZXVlXS5sZW5ndGg7ICsraSkge1xuICAgIC8vIGVudHJpZXMgdGhhdCBhcmUgb25seSBhIGxlbmd0aCBvZiAyIGFyZSBmcm9tIGFuIG9sZGVyIHZlcnNpb24sIGRvbid0XG4gICAgLy8gYm90aGVyIG1vZGlmeWluZyB0aG9zZSBzaW5jZSB0aGV5J2xsIGJlIHJldHJpZWQgYW55d2F5LlxuICAgIGlmIChmc1tncmFjZWZ1bFF1ZXVlXVtpXS5sZW5ndGggPiAyKSB7XG4gICAgICBmc1tncmFjZWZ1bFF1ZXVlXVtpXVszXSA9IG5vdyAvLyBzdGFydFRpbWVcbiAgICAgIGZzW2dyYWNlZnVsUXVldWVdW2ldWzRdID0gbm93IC8vIGxhc3RUaW1lXG4gICAgfVxuICB9XG4gIC8vIGNhbGwgcmV0cnkgdG8gbWFrZSBzdXJlIHdlJ3JlIGFjdGl2ZWx5IHByb2Nlc3NpbmcgdGhlIHF1ZXVlXG4gIHJldHJ5KClcbn1cblxuZnVuY3Rpb24gcmV0cnkgKCkge1xuICAvLyBjbGVhciB0aGUgdGltZXIgYW5kIHJlbW92ZSBpdCB0byBoZWxwIHByZXZlbnQgdW5pbnRlbmRlZCBjb25jdXJyZW5jeVxuICBjbGVhclRpbWVvdXQocmV0cnlUaW1lcilcbiAgcmV0cnlUaW1lciA9IHVuZGVmaW5lZFxuXG4gIGlmIChmc1tncmFjZWZ1bFF1ZXVlXS5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuXG5cbiAgdmFyIGVsZW0gPSBmc1tncmFjZWZ1bFF1ZXVlXS5zaGlmdCgpXG4gIHZhciBmbiA9IGVsZW1bMF1cbiAgdmFyIGFyZ3MgPSBlbGVtWzFdXG4gIC8vIHRoZXNlIGl0ZW1zIG1heSBiZSB1bnNldCBpZiB0aGV5IHdlcmUgYWRkZWQgYnkgYW4gb2xkZXIgZ3JhY2VmdWwtZnNcbiAgdmFyIGVyciA9IGVsZW1bMl1cbiAgdmFyIHN0YXJ0VGltZSA9IGVsZW1bM11cbiAgdmFyIGxhc3RUaW1lID0gZWxlbVs0XVxuXG4gIC8vIGlmIHdlIGRvbid0IGhhdmUgYSBzdGFydFRpbWUgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyBpZiB3ZSd2ZSB3YWl0ZWRcbiAgLy8gbG9uZyBlbm91Z2gsIHNvIGdvIGFoZWFkIGFuZCByZXRyeSB0aGlzIGl0ZW0gbm93XG4gIGlmIChzdGFydFRpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGRlYnVnKCdSRVRSWScsIGZuLm5hbWUsIGFyZ3MpXG4gICAgZm4uYXBwbHkobnVsbCwgYXJncylcbiAgfSBlbHNlIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IDYwMDAwKSB7XG4gICAgLy8gaXQncyBiZWVuIG1vcmUgdGhhbiA2MCBzZWNvbmRzIHRvdGFsLCBiYWlsIG5vd1xuICAgIGRlYnVnKCdUSU1FT1VUJywgZm4ubmFtZSwgYXJncylcbiAgICB2YXIgY2IgPSBhcmdzLnBvcCgpXG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiLmNhbGwobnVsbCwgZXJyKVxuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGF0dGVtcHQgYW5kIHJpZ2h0IG5vd1xuICAgIHZhciBzaW5jZUF0dGVtcHQgPSBEYXRlLm5vdygpIC0gbGFzdFRpbWVcbiAgICAvLyB0aGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiB3aGVuIHdlIGZpcnN0IHRyaWVkLCBhbmQgd2hlbiB3ZSBsYXN0IHRyaWVkXG4gICAgLy8gcm91bmRlZCB1cCB0byBhdCBsZWFzdCAxXG4gICAgdmFyIHNpbmNlU3RhcnQgPSBNYXRoLm1heChsYXN0VGltZSAtIHN0YXJ0VGltZSwgMSlcbiAgICAvLyBiYWNrb2ZmLiB3YWl0IGxvbmdlciB0aGFuIHRoZSB0b3RhbCB0aW1lIHdlJ3ZlIGJlZW4gcmV0cnlpbmcsIGJ1dCBvbmx5XG4gICAgLy8gdXAgdG8gYSBtYXhpbXVtIG9mIDEwMG1zXG4gICAgdmFyIGRlc2lyZWREZWxheSA9IE1hdGgubWluKHNpbmNlU3RhcnQgKiAxLjIsIDEwMClcbiAgICAvLyBpdCdzIGJlZW4gbG9uZyBlbm91Z2ggc2luY2UgdGhlIGxhc3QgcmV0cnksIGRvIGl0IGFnYWluXG4gICAgaWYgKHNpbmNlQXR0ZW1wdCA+PSBkZXNpcmVkRGVsYXkpIHtcbiAgICAgIGRlYnVnKCdSRVRSWScsIGZuLm5hbWUsIGFyZ3MpXG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbc3RhcnRUaW1lXSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHdlIGNhbid0IGRvIHRoaXMgam9iIHlldCwgcHVzaCBpdCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxuICAgICAgLy8gYW5kIGxldCB0aGUgbmV4dCBpdGVyYXRpb24gY2hlY2sgYWdhaW5cbiAgICAgIGZzW2dyYWNlZnVsUXVldWVdLnB1c2goZWxlbSlcbiAgICB9XG4gIH1cblxuICAvLyBzY2hlZHVsZSBvdXIgbmV4dCBydW4gaWYgb25lIGlzbid0IGFscmVhZHkgc2NoZWR1bGVkXG4gIGlmIChyZXRyeVRpbWVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXRyeVRpbWVyID0gc2V0VGltZW91dChyZXRyeSwgMClcbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcbi8vIFRoaXMgaXMgYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3JtYWxpemUvbXpcbi8vIENvcHlyaWdodCAoYykgMjAxNC0yMDE2IEpvbmF0aGFuIE9uZyBtZUBqb25nbGViZXJyeS5jb20gYW5kIENvbnRyaWJ1dG9yc1xuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21DYWxsYmFja1xuY29uc3QgZnMgPSByZXF1aXJlKCdncmFjZWZ1bC1mcycpXG5cbmNvbnN0IGFwaSA9IFtcbiAgJ2FjY2VzcycsXG4gICdhcHBlbmRGaWxlJyxcbiAgJ2NobW9kJyxcbiAgJ2Nob3duJyxcbiAgJ2Nsb3NlJyxcbiAgJ2NvcHlGaWxlJyxcbiAgJ2NwJyxcbiAgJ2ZjaG1vZCcsXG4gICdmY2hvd24nLFxuICAnZmRhdGFzeW5jJyxcbiAgJ2ZzdGF0JyxcbiAgJ2ZzeW5jJyxcbiAgJ2Z0cnVuY2F0ZScsXG4gICdmdXRpbWVzJyxcbiAgJ2dsb2InLFxuICAnbGNobW9kJyxcbiAgJ2xjaG93bicsXG4gICdsdXRpbWVzJyxcbiAgJ2xpbmsnLFxuICAnbHN0YXQnLFxuICAnbWtkaXInLFxuICAnbWtkdGVtcCcsXG4gICdvcGVuJyxcbiAgJ29wZW5kaXInLFxuICAncmVhZGRpcicsXG4gICdyZWFkRmlsZScsXG4gICdyZWFkbGluaycsXG4gICdyZWFscGF0aCcsXG4gICdyZW5hbWUnLFxuICAncm0nLFxuICAncm1kaXInLFxuICAnc3RhdCcsXG4gICdzdGF0ZnMnLFxuICAnc3ltbGluaycsXG4gICd0cnVuY2F0ZScsXG4gICd1bmxpbmsnLFxuICAndXRpbWVzJyxcbiAgJ3dyaXRlRmlsZSdcbl0uZmlsdGVyKGtleSA9PiB7XG4gIC8vIFNvbWUgY29tbWFuZHMgYXJlIG5vdCBhdmFpbGFibGUgb24gc29tZSBzeXN0ZW1zLiBFeDpcbiAgLy8gZnMuY3Agd2FzIGFkZGVkIGluIE5vZGUuanMgdjE2LjcuMFxuICAvLyBmcy5zdGF0ZnMgd2FzIGFkZGVkIGluIE5vZGUgdjE5LjYuMCwgdjE4LjE1LjBcbiAgLy8gZnMuZ2xvYiB3YXMgYWRkZWQgaW4gTm9kZS5qcyB2MjIuMC4wXG4gIC8vIGZzLmxjaG93biBpcyBub3QgYXZhaWxhYmxlIG9uIGF0IGxlYXN0IHNvbWUgTGludXhcbiAgcmV0dXJuIHR5cGVvZiBmc1trZXldID09PSAnZnVuY3Rpb24nXG59KVxuXG4vLyBFeHBvcnQgY2xvbmVkIGZzOlxuT2JqZWN0LmFzc2lnbihleHBvcnRzLCBmcylcblxuLy8gVW5pdmVyc2FsaWZ5IGFzeW5jIG1ldGhvZHM6XG5hcGkuZm9yRWFjaChtZXRob2QgPT4ge1xuICBleHBvcnRzW21ldGhvZF0gPSB1KGZzW21ldGhvZF0pXG59KVxuXG4vLyBXZSBkaWZmZXIgZnJvbSBtei9mcyBpbiB0aGF0IHdlIHN0aWxsIHNoaXAgdGhlIG9sZCwgYnJva2VuLCBmcy5leGlzdHMoKVxuLy8gc2luY2Ugd2UgYXJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIG5hdGl2ZSBtb2R1bGVcbmV4cG9ydHMuZXhpc3RzID0gZnVuY3Rpb24gKGZpbGVuYW1lLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0cyhmaWxlbmFtZSwgY2FsbGJhY2spXG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHJldHVybiBmcy5leGlzdHMoZmlsZW5hbWUsIHJlc29sdmUpXG4gIH0pXG59XG5cbi8vIGZzLnJlYWQoKSwgZnMud3JpdGUoKSwgZnMucmVhZHYoKSwgJiBmcy53cml0ZXYoKSBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IGR1ZSB0byBtdWx0aXBsZSBjYWxsYmFjayBhcmdzXG5cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKVxuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIChlcnIsIGJ5dGVzUmVhZCwgYnVmZmVyKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1JlYWQsIGJ1ZmZlciB9KVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBjYW4gYmVcbi8vIGZzLndyaXRlKGZkLCBidWZmZXJbLCBvZmZzZXRbLCBsZW5ndGhbLCBwb3NpdGlvbl1dXSwgY2FsbGJhY2spXG4vLyBPUlxuLy8gZnMud3JpdGUoZmQsIHN0cmluZ1ssIHBvc2l0aW9uWywgZW5jb2RpbmddXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSBib3RoIGNhc2VzLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChmZCwgYnVmZmVyLCAuLi5hcmdzKSB7XG4gIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZzLndyaXRlKGZkLCBidWZmZXIsIC4uLmFyZ3MpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGZzLndyaXRlKGZkLCBidWZmZXIsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzV3JpdHRlbiwgYnVmZmVyKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1dyaXR0ZW4sIGJ1ZmZlciB9KVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBpc1xuLy8gcy5yZWFkdihmZCwgYnVmZmVyc1ssIHBvc2l0aW9uXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgb3B0aW9uYWwgYXJnLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy5yZWFkdiA9IGZ1bmN0aW9uIChmZCwgYnVmZmVycywgLi4uYXJncykge1xuICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmcy5yZWFkdihmZCwgYnVmZmVycywgLi4uYXJncylcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMucmVhZHYoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzUmVhZCwgYnVmZmVycykgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICByZXNvbHZlKHsgYnl0ZXNSZWFkLCBidWZmZXJzIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gRnVuY3Rpb24gc2lnbmF0dXJlIGlzXG4vLyBzLndyaXRldihmZCwgYnVmZmVyc1ssIHBvc2l0aW9uXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgb3B0aW9uYWwgYXJnLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy53cml0ZXYgPSBmdW5jdGlvbiAoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMud3JpdGV2KGZkLCBidWZmZXJzLCAuLi5hcmdzKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy53cml0ZXYoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzV3JpdHRlbiwgYnVmZmVycykgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICByZXNvbHZlKHsgYnl0ZXNXcml0dGVuLCBidWZmZXJzIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gZnMucmVhbHBhdGgubmF0aXZlIHNvbWV0aW1lcyBub3QgYXZhaWxhYmxlIGlmIGZzIGlzIG1vbmtleS1wYXRjaGVkXG5pZiAodHlwZW9mIGZzLnJlYWxwYXRoLm5hdGl2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICBleHBvcnRzLnJlYWxwYXRoLm5hdGl2ZSA9IHUoZnMucmVhbHBhdGgubmF0aXZlKVxufSBlbHNlIHtcbiAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAnZnMucmVhbHBhdGgubmF0aXZlIGlzIG5vdCBhIGZ1bmN0aW9uLiBJcyBmcyBiZWluZyBtb25rZXktcGF0Y2hlZD8nLFxuICAgICdXYXJuaW5nJywgJ2ZzLWV4dHJhLVdBUk4wMDAzJ1xuICApXG59XG4iLAogICAgIi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL21ha2UtZGlyXG4vLyBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChzaW5kcmVzb3JodXMuY29tKVxuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4ndXNlIHN0cmljdCdcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy84OTg3XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbGlidXYvbGlidXYvcHVsbC8xMDg4XG5tb2R1bGUuZXhwb3J0cy5jaGVja1BhdGggPSBmdW5jdGlvbiBjaGVja1BhdGggKHB0aCkge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IHBhdGhIYXNJbnZhbGlkV2luQ2hhcmFjdGVycyA9IC9bPD46XCJ8PypdLy50ZXN0KHB0aC5yZXBsYWNlKHBhdGgucGFyc2UocHRoKS5yb290LCAnJykpXG5cbiAgICBpZiAocGF0aEhhc0ludmFsaWRXaW5DaGFyYWN0ZXJzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUGF0aCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnM6ICR7cHRofWApXG4gICAgICBlcnJvci5jb2RlID0gJ0VJTlZBTCdcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB7IGNoZWNrUGF0aCB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmNvbnN0IGdldE1vZGUgPSBvcHRpb25zID0+IHtcbiAgY29uc3QgZGVmYXVsdHMgPSB7IG1vZGU6IDBvNzc3IH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykgcmV0dXJuIG9wdGlvbnNcbiAgcmV0dXJuICh7IC4uLmRlZmF1bHRzLCAuLi5vcHRpb25zIH0pLm1vZGVcbn1cblxubW9kdWxlLmV4cG9ydHMubWFrZURpciA9IGFzeW5jIChkaXIsIG9wdGlvbnMpID0+IHtcbiAgY2hlY2tQYXRoKGRpcilcblxuICByZXR1cm4gZnMubWtkaXIoZGlyLCB7XG4gICAgbW9kZTogZ2V0TW9kZShvcHRpb25zKSxcbiAgICByZWN1cnNpdmU6IHRydWVcbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMubWFrZURpclN5bmMgPSAoZGlyLCBvcHRpb25zKSA9PiB7XG4gIGNoZWNrUGF0aChkaXIpXG5cbiAgcmV0dXJuIGZzLm1rZGlyU3luYyhkaXIsIHtcbiAgICBtb2RlOiBnZXRNb2RlKG9wdGlvbnMpLFxuICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICB9KVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgeyBtYWtlRGlyOiBfbWFrZURpciwgbWFrZURpclN5bmMgfSA9IHJlcXVpcmUoJy4vbWFrZS1kaXInKVxuY29uc3QgbWFrZURpciA9IHUoX21ha2VEaXIpXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBta2RpcnM6IG1ha2VEaXIsXG4gIG1rZGlyc1N5bmM6IG1ha2VEaXJTeW5jLFxuICAvLyBhbGlhc1xuICBta2RpcnA6IG1ha2VEaXIsXG4gIG1rZGlycFN5bmM6IG1ha2VEaXJTeW5jLFxuICBlbnN1cmVEaXI6IG1ha2VEaXIsXG4gIGVuc3VyZURpclN5bmM6IG1ha2VEaXJTeW5jXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcblxuZnVuY3Rpb24gcGF0aEV4aXN0cyAocGF0aCkge1xuICByZXR1cm4gZnMuYWNjZXNzKHBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwYXRoRXhpc3RzOiB1KHBhdGhFeGlzdHMpLFxuICBwYXRoRXhpc3RzU3luYzogZnMuZXhpc3RzU3luY1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcblxuYXN5bmMgZnVuY3Rpb24gdXRpbWVzTWlsbGlzIChwYXRoLCBhdGltZSwgbXRpbWUpIHtcbiAgLy8gaWYgKCFIQVNfTUlMTElTX1JFUykgcmV0dXJuIGZzLnV0aW1lcyhwYXRoLCBhdGltZSwgbXRpbWUsIGNhbGxiYWNrKVxuICBjb25zdCBmZCA9IGF3YWl0IGZzLm9wZW4ocGF0aCwgJ3IrJylcblxuICBsZXQgY2xvc2VFcnIgPSBudWxsXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5mdXRpbWVzKGZkLCBhdGltZSwgbXRpbWUpXG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmNsb3NlKGZkKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNsb3NlRXJyID0gZVxuICAgIH1cbiAgfVxuXG4gIGlmIChjbG9zZUVycikge1xuICAgIHRocm93IGNsb3NlRXJyXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRpbWVzTWlsbGlzU3luYyAocGF0aCwgYXRpbWUsIG10aW1lKSB7XG4gIGNvbnN0IGZkID0gZnMub3BlblN5bmMocGF0aCwgJ3IrJylcbiAgZnMuZnV0aW1lc1N5bmMoZmQsIGF0aW1lLCBtdGltZSlcbiAgcmV0dXJuIGZzLmNsb3NlU3luYyhmZClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHV0aW1lc01pbGxpczogdSh1dGltZXNNaWxsaXMpLFxuICB1dGltZXNNaWxsaXNTeW5jXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuXG5mdW5jdGlvbiBnZXRTdGF0cyAoc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGNvbnN0IHN0YXRGdW5jID0gb3B0cy5kZXJlZmVyZW5jZVxuICAgID8gKGZpbGUpID0+IGZzLnN0YXQoZmlsZSwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgICA6IChmaWxlKSA9PiBmcy5sc3RhdChmaWxlLCB7IGJpZ2ludDogdHJ1ZSB9KVxuICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgIHN0YXRGdW5jKHNyYyksXG4gICAgc3RhdEZ1bmMoZGVzdCkuY2F0Y2goZXJyID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBudWxsXG4gICAgICB0aHJvdyBlcnJcbiAgICB9KVxuICBdKS50aGVuKChbc3JjU3RhdCwgZGVzdFN0YXRdKSA9PiAoeyBzcmNTdGF0LCBkZXN0U3RhdCB9KSlcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdHNTeW5jIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgbGV0IGRlc3RTdGF0XG4gIGNvbnN0IHN0YXRGdW5jID0gb3B0cy5kZXJlZmVyZW5jZVxuICAgID8gKGZpbGUpID0+IGZzLnN0YXRTeW5jKGZpbGUsIHsgYmlnaW50OiB0cnVlIH0pXG4gICAgOiAoZmlsZSkgPT4gZnMubHN0YXRTeW5jKGZpbGUsIHsgYmlnaW50OiB0cnVlIH0pXG4gIGNvbnN0IHNyY1N0YXQgPSBzdGF0RnVuYyhzcmMpXG4gIHRyeSB7XG4gICAgZGVzdFN0YXQgPSBzdGF0RnVuYyhkZXN0KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdDogbnVsbCB9XG4gICAgdGhyb3cgZXJyXG4gIH1cbiAgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja1BhdGhzIChzcmMsIGRlc3QsIGZ1bmNOYW1lLCBvcHRzKSB7XG4gIGNvbnN0IHsgc3JjU3RhdCwgZGVzdFN0YXQgfSA9IGF3YWl0IGdldFN0YXRzKHNyYywgZGVzdCwgb3B0cylcbiAgaWYgKGRlc3RTdGF0KSB7XG4gICAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkZXN0U3RhdCkpIHtcbiAgICAgIGNvbnN0IHNyY0Jhc2VOYW1lID0gcGF0aC5iYXNlbmFtZShzcmMpXG4gICAgICBjb25zdCBkZXN0QmFzZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGRlc3QpXG4gICAgICBpZiAoZnVuY05hbWUgPT09ICdtb3ZlJyAmJlxuICAgICAgICBzcmNCYXNlTmFtZSAhPT0gZGVzdEJhc2VOYW1lICYmXG4gICAgICAgIHNyY0Jhc2VOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGRlc3RCYXNlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0LCBpc0NoYW5naW5nQ2FzZTogdHJ1ZSB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSBhbmQgZGVzdGluYXRpb24gbXVzdCBub3QgYmUgdGhlIHNhbWUuJylcbiAgICB9XG4gICAgaWYgKHNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiAhZGVzdFN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlIG5vbi1kaXJlY3RvcnkgJyR7ZGVzdH0nIHdpdGggZGlyZWN0b3J5ICcke3NyY30nLmApXG4gICAgfVxuICAgIGlmICghc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmIGRlc3RTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG92ZXJ3cml0ZSBkaXJlY3RvcnkgJyR7ZGVzdH0nIHdpdGggbm9uLWRpcmVjdG9yeSAnJHtzcmN9Jy5gKVxuICAgIH1cbiAgfVxuXG4gIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgaXNTcmNTdWJkaXIoc3JjLCBkZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2coc3JjLCBkZXN0LCBmdW5jTmFtZSkpXG4gIH1cblxuICByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdCB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUGF0aHNTeW5jIChzcmMsIGRlc3QsIGZ1bmNOYW1lLCBvcHRzKSB7XG4gIGNvbnN0IHsgc3JjU3RhdCwgZGVzdFN0YXQgfSA9IGdldFN0YXRzU3luYyhzcmMsIGRlc3QsIG9wdHMpXG5cbiAgaWYgKGRlc3RTdGF0KSB7XG4gICAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkZXN0U3RhdCkpIHtcbiAgICAgIGNvbnN0IHNyY0Jhc2VOYW1lID0gcGF0aC5iYXNlbmFtZShzcmMpXG4gICAgICBjb25zdCBkZXN0QmFzZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGRlc3QpXG4gICAgICBpZiAoZnVuY05hbWUgPT09ICdtb3ZlJyAmJlxuICAgICAgICBzcmNCYXNlTmFtZSAhPT0gZGVzdEJhc2VOYW1lICYmXG4gICAgICAgIHNyY0Jhc2VOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGRlc3RCYXNlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0LCBpc0NoYW5naW5nQ2FzZTogdHJ1ZSB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSBhbmQgZGVzdGluYXRpb24gbXVzdCBub3QgYmUgdGhlIHNhbWUuJylcbiAgICB9XG4gICAgaWYgKHNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiAhZGVzdFN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlIG5vbi1kaXJlY3RvcnkgJyR7ZGVzdH0nIHdpdGggZGlyZWN0b3J5ICcke3NyY30nLmApXG4gICAgfVxuICAgIGlmICghc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmIGRlc3RTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG92ZXJ3cml0ZSBkaXJlY3RvcnkgJyR7ZGVzdH0nIHdpdGggbm9uLWRpcmVjdG9yeSAnJHtzcmN9Jy5gKVxuICAgIH1cbiAgfVxuXG4gIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgaXNTcmNTdWJkaXIoc3JjLCBkZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2coc3JjLCBkZXN0LCBmdW5jTmFtZSkpXG4gIH1cbiAgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQgfVxufVxuXG4vLyByZWN1cnNpdmVseSBjaGVjayBpZiBkZXN0IHBhcmVudCBpcyBhIHN1YmRpcmVjdG9yeSBvZiBzcmMuXG4vLyBJdCB3b3JrcyBmb3IgYWxsIGZpbGUgdHlwZXMgaW5jbHVkaW5nIHN5bWxpbmtzIHNpbmNlIGl0XG4vLyBjaGVja3MgdGhlIHNyYyBhbmQgZGVzdCBpbm9kZXMuIEl0IHN0YXJ0cyBmcm9tIHRoZSBkZWVwZXN0XG4vLyBwYXJlbnQgYW5kIHN0b3BzIG9uY2UgaXQgcmVhY2hlcyB0aGUgc3JjIHBhcmVudCBvciB0aGUgcm9vdCBwYXRoLlxuYXN5bmMgZnVuY3Rpb24gY2hlY2tQYXJlbnRQYXRocyAoc3JjLCBzcmNTdGF0LCBkZXN0LCBmdW5jTmFtZSkge1xuICBjb25zdCBzcmNQYXJlbnQgPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKHNyYykpXG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGRlc3QpKVxuICBpZiAoZGVzdFBhcmVudCA9PT0gc3JjUGFyZW50IHx8IGRlc3RQYXJlbnQgPT09IHBhdGgucGFyc2UoZGVzdFBhcmVudCkucm9vdCkgcmV0dXJuXG5cbiAgbGV0IGRlc3RTdGF0XG4gIHRyeSB7XG4gICAgZGVzdFN0YXQgPSBhd2FpdCBmcy5zdGF0KGRlc3RQYXJlbnQsIHsgYmlnaW50OiB0cnVlIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVyblxuICAgIHRocm93IGVyclxuICB9XG5cbiAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkZXN0U3RhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKHNyYywgZGVzdCwgZnVuY05hbWUpKVxuICB9XG5cbiAgcmV0dXJuIGNoZWNrUGFyZW50UGF0aHMoc3JjLCBzcmNTdGF0LCBkZXN0UGFyZW50LCBmdW5jTmFtZSlcbn1cblxuZnVuY3Rpb24gY2hlY2tQYXJlbnRQYXRoc1N5bmMgKHNyYywgc3JjU3RhdCwgZGVzdCwgZnVuY05hbWUpIHtcbiAgY29uc3Qgc3JjUGFyZW50ID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShzcmMpKVxuICBjb25zdCBkZXN0UGFyZW50ID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShkZXN0KSlcbiAgaWYgKGRlc3RQYXJlbnQgPT09IHNyY1BhcmVudCB8fCBkZXN0UGFyZW50ID09PSBwYXRoLnBhcnNlKGRlc3RQYXJlbnQpLnJvb3QpIHJldHVyblxuICBsZXQgZGVzdFN0YXRcbiAgdHJ5IHtcbiAgICBkZXN0U3RhdCA9IGZzLnN0YXRTeW5jKGRlc3RQYXJlbnQsIHsgYmlnaW50OiB0cnVlIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVyblxuICAgIHRocm93IGVyclxuICB9XG4gIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZGVzdFN0YXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyhzcmMsIGRlc3QsIGZ1bmNOYW1lKSlcbiAgfVxuICByZXR1cm4gY2hlY2tQYXJlbnRQYXRoc1N5bmMoc3JjLCBzcmNTdGF0LCBkZXN0UGFyZW50LCBmdW5jTmFtZSlcbn1cblxuZnVuY3Rpb24gYXJlSWRlbnRpY2FsIChzcmNTdGF0LCBkZXN0U3RhdCkge1xuICByZXR1cm4gZGVzdFN0YXQuaW5vICYmIGRlc3RTdGF0LmRldiAmJiBkZXN0U3RhdC5pbm8gPT09IHNyY1N0YXQuaW5vICYmIGRlc3RTdGF0LmRldiA9PT0gc3JjU3RhdC5kZXZcbn1cblxuLy8gcmV0dXJuIHRydWUgaWYgZGVzdCBpcyBhIHN1YmRpciBvZiBzcmMsIG90aGVyd2lzZSBmYWxzZS5cbi8vIEl0IG9ubHkgY2hlY2tzIHRoZSBwYXRoIHN0cmluZ3MuXG5mdW5jdGlvbiBpc1NyY1N1YmRpciAoc3JjLCBkZXN0KSB7XG4gIGNvbnN0IHNyY0FyciA9IHBhdGgucmVzb2x2ZShzcmMpLnNwbGl0KHBhdGguc2VwKS5maWx0ZXIoaSA9PiBpKVxuICBjb25zdCBkZXN0QXJyID0gcGF0aC5yZXNvbHZlKGRlc3QpLnNwbGl0KHBhdGguc2VwKS5maWx0ZXIoaSA9PiBpKVxuICByZXR1cm4gc3JjQXJyLmV2ZXJ5KChjdXIsIGkpID0+IGRlc3RBcnJbaV0gPT09IGN1cilcbn1cblxuZnVuY3Rpb24gZXJyTXNnIChzcmMsIGRlc3QsIGZ1bmNOYW1lKSB7XG4gIHJldHVybiBgQ2Fubm90ICR7ZnVuY05hbWV9ICcke3NyY30nIHRvIGEgc3ViZGlyZWN0b3J5IG9mIGl0c2VsZiwgJyR7ZGVzdH0nLmBcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGNoZWNrUGF0aHNcbiAgY2hlY2tQYXRoczogdShjaGVja1BhdGhzKSxcbiAgY2hlY2tQYXRoc1N5bmMsXG4gIC8vIGNoZWNrUGFyZW50XG4gIGNoZWNrUGFyZW50UGF0aHM6IHUoY2hlY2tQYXJlbnRQYXRocyksXG4gIGNoZWNrUGFyZW50UGF0aHNTeW5jLFxuICAvLyBNaXNjXG4gIGlzU3JjU3ViZGlyLFxuICBhcmVJZGVudGljYWxcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgeyBta2RpcnMgfSA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcbmNvbnN0IHsgdXRpbWVzTWlsbGlzIH0gPSByZXF1aXJlKCcuLi91dGlsL3V0aW1lcycpXG5jb25zdCBzdGF0ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuYXN5bmMgZnVuY3Rpb24gY29weSAoc3JjLCBkZXN0LCBvcHRzID0ge30pIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb3B0cyA9IHsgZmlsdGVyOiBvcHRzIH1cbiAgfVxuXG4gIG9wdHMuY2xvYmJlciA9ICdjbG9iYmVyJyBpbiBvcHRzID8gISFvcHRzLmNsb2JiZXIgOiB0cnVlIC8vIGRlZmF1bHQgdG8gdHJ1ZSBmb3Igbm93XG4gIG9wdHMub3ZlcndyaXRlID0gJ292ZXJ3cml0ZScgaW4gb3B0cyA/ICEhb3B0cy5vdmVyd3JpdGUgOiBvcHRzLmNsb2JiZXIgLy8gb3ZlcndyaXRlIGZhbGxzIGJhY2sgdG8gY2xvYmJlclxuXG4gIC8vIFdhcm4gYWJvdXQgdXNpbmcgcHJlc2VydmVUaW1lc3RhbXBzIG9uIDMyLWJpdCBub2RlXG4gIGlmIChvcHRzLnByZXNlcnZlVGltZXN0YW1wcyAmJiBwcm9jZXNzLmFyY2ggPT09ICdpYTMyJykge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoXG4gICAgICAnVXNpbmcgdGhlIHByZXNlcnZlVGltZXN0YW1wcyBvcHRpb24gaW4gMzItYml0IG5vZGUgaXMgbm90IHJlY29tbWVuZGVkO1xcblxcbicgK1xuICAgICAgJ1xcdHNlZSBodHRwczovL2dpdGh1Yi5jb20vanByaWNoYXJkc29uL25vZGUtZnMtZXh0cmEvaXNzdWVzLzI2OScsXG4gICAgICAnV2FybmluZycsICdmcy1leHRyYS1XQVJOMDAwMSdcbiAgICApXG4gIH1cblxuICBjb25zdCB7IHNyY1N0YXQsIGRlc3RTdGF0IH0gPSBhd2FpdCBzdGF0LmNoZWNrUGF0aHMoc3JjLCBkZXN0LCAnY29weScsIG9wdHMpXG5cbiAgYXdhaXQgc3RhdC5jaGVja1BhcmVudFBhdGhzKHNyYywgc3JjU3RhdCwgZGVzdCwgJ2NvcHknKVxuXG4gIGNvbnN0IGluY2x1ZGUgPSBhd2FpdCBydW5GaWx0ZXIoc3JjLCBkZXN0LCBvcHRzKVxuXG4gIGlmICghaW5jbHVkZSkgcmV0dXJuXG5cbiAgLy8gY2hlY2sgaWYgdGhlIHBhcmVudCBvZiBkZXN0IGV4aXN0cywgYW5kIGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgY29uc3QgZGlyRXhpc3RzID0gYXdhaXQgcGF0aEV4aXN0cyhkZXN0UGFyZW50KVxuICBpZiAoIWRpckV4aXN0cykge1xuICAgIGF3YWl0IG1rZGlycyhkZXN0UGFyZW50KVxuICB9XG5cbiAgYXdhaXQgZ2V0U3RhdHNBbmRQZXJmb3JtQ29weShkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxufVxuXG5hc3luYyBmdW5jdGlvbiBydW5GaWx0ZXIgKHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAoIW9wdHMuZmlsdGVyKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gb3B0cy5maWx0ZXIoc3JjLCBkZXN0KVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5IChkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGNvbnN0IHN0YXRGbiA9IG9wdHMuZGVyZWZlcmVuY2UgPyBmcy5zdGF0IDogZnMubHN0YXRcbiAgY29uc3Qgc3JjU3RhdCA9IGF3YWl0IHN0YXRGbihzcmMpXG5cbiAgaWYgKHNyY1N0YXQuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIG9uRGlyKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG5cbiAgaWYgKFxuICAgIHNyY1N0YXQuaXNGaWxlKCkgfHxcbiAgICBzcmNTdGF0LmlzQ2hhcmFjdGVyRGV2aWNlKCkgfHxcbiAgICBzcmNTdGF0LmlzQmxvY2tEZXZpY2UoKVxuICApIHJldHVybiBvbkZpbGUoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcblxuICBpZiAoc3JjU3RhdC5pc1N5bWJvbGljTGluaygpKSByZXR1cm4gb25MaW5rKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG4gIGlmIChzcmNTdGF0LmlzU29ja2V0KCkpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgYSBzb2NrZXQgZmlsZTogJHtzcmN9YClcbiAgaWYgKHNyY1N0YXQuaXNGSUZPKCkpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgYSBGSUZPIHBpcGU6ICR7c3JjfWApXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWxlOiAke3NyY31gKVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbkZpbGUgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFkZXN0U3RhdCkgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcblxuICBpZiAob3B0cy5vdmVyd3JpdGUpIHtcbiAgICBhd2FpdCBmcy51bmxpbmsoZGVzdClcbiAgICByZXR1cm4gY29weUZpbGUoc3JjU3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICB9XG4gIGlmIChvcHRzLmVycm9yT25FeGlzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7ZGVzdH0nIGFscmVhZHkgZXhpc3RzYClcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5RmlsZSAoc3JjU3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGF3YWl0IGZzLmNvcHlGaWxlKHNyYywgZGVzdClcbiAgaWYgKG9wdHMucHJlc2VydmVUaW1lc3RhbXBzKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBmaWxlIGlzIHdyaXRhYmxlIGJlZm9yZSBzZXR0aW5nIHRoZSB0aW1lc3RhbXBcbiAgICAvLyBvdGhlcndpc2Ugb3BlbiBmYWlscyB3aXRoIEVQRVJNIHdoZW4gaW52b2tlZCB3aXRoICdyKydcbiAgICAvLyAodGhyb3VnaCB1dGltZXMgY2FsbClcbiAgICBpZiAoZmlsZUlzTm90V3JpdGFibGUoc3JjU3RhdC5tb2RlKSkge1xuICAgICAgYXdhaXQgbWFrZUZpbGVXcml0YWJsZShkZXN0LCBzcmNTdGF0Lm1vZGUpXG4gICAgfVxuXG4gICAgLy8gU2V0IHRpbWVzdGFtcHMgYW5kIG1vZGUgY29ycmVzcG9uZGluZ2x5XG5cbiAgICAvLyBOb3RlIHRoYXQgVGhlIGluaXRpYWwgc3JjU3RhdC5hdGltZSBjYW5ub3QgYmUgdHJ1c3RlZFxuICAgIC8vIGJlY2F1c2UgaXQgaXMgbW9kaWZpZWQgYnkgdGhlIHJlYWQoMikgc3lzdGVtIGNhbGxcbiAgICAvLyAoU2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZnMuaHRtbCNmc19zdGF0X3RpbWVfdmFsdWVzKVxuICAgIGNvbnN0IHVwZGF0ZWRTcmNTdGF0ID0gYXdhaXQgZnMuc3RhdChzcmMpXG4gICAgYXdhaXQgdXRpbWVzTWlsbGlzKGRlc3QsIHVwZGF0ZWRTcmNTdGF0LmF0aW1lLCB1cGRhdGVkU3JjU3RhdC5tdGltZSlcbiAgfVxuXG4gIHJldHVybiBmcy5jaG1vZChkZXN0LCBzcmNTdGF0Lm1vZGUpXG59XG5cbmZ1bmN0aW9uIGZpbGVJc05vdFdyaXRhYmxlIChzcmNNb2RlKSB7XG4gIHJldHVybiAoc3JjTW9kZSAmIDBvMjAwKSA9PT0gMFxufVxuXG5mdW5jdGlvbiBtYWtlRmlsZVdyaXRhYmxlIChkZXN0LCBzcmNNb2RlKSB7XG4gIHJldHVybiBmcy5jaG1vZChkZXN0LCBzcmNNb2RlIHwgMG8yMDApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9uRGlyIChzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIC8vIHRoZSBkZXN0IGRpcmVjdG9yeSBtaWdodCBub3QgZXhpc3QsIGNyZWF0ZSBpdFxuICBpZiAoIWRlc3RTdGF0KSB7XG4gICAgYXdhaXQgZnMubWtkaXIoZGVzdClcbiAgfVxuXG4gIGNvbnN0IHByb21pc2VzID0gW11cblxuICAvLyBsb29wIHRocm91Z2ggdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0byBjb3B5IGV2ZXJ5dGhpbmdcbiAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGF3YWl0IGZzLm9wZW5kaXIoc3JjKSkge1xuICAgIGNvbnN0IHNyY0l0ZW0gPSBwYXRoLmpvaW4oc3JjLCBpdGVtLm5hbWUpXG4gICAgY29uc3QgZGVzdEl0ZW0gPSBwYXRoLmpvaW4oZGVzdCwgaXRlbS5uYW1lKVxuXG4gICAgcHJvbWlzZXMucHVzaChcbiAgICAgIHJ1bkZpbHRlcihzcmNJdGVtLCBkZXN0SXRlbSwgb3B0cykudGhlbihpbmNsdWRlID0+IHtcbiAgICAgICAgaWYgKGluY2x1ZGUpIHtcbiAgICAgICAgICAvLyBvbmx5IGNvcHkgdGhlIGl0ZW0gaWYgaXQgbWF0Y2hlcyB0aGUgZmlsdGVyIGZ1bmN0aW9uXG4gICAgICAgICAgcmV0dXJuIHN0YXQuY2hlY2tQYXRocyhzcmNJdGVtLCBkZXN0SXRlbSwgJ2NvcHknLCBvcHRzKS50aGVuKCh7IGRlc3RTdGF0IH0pID0+IHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpdGVtIGlzIGEgY29weWFibGUgZmlsZSwgYGdldFN0YXRzQW5kUGVyZm9ybUNvcHlgIHdpbGwgY29weSBpdFxuICAgICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgYSBkaXJlY3RvcnksIGBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5YCB3aWxsIGNhbGwgYG9uRGlyYCByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmV0dXJuIGdldFN0YXRzQW5kUGVyZm9ybUNvcHkoZGVzdFN0YXQsIHNyY0l0ZW0sIGRlc3RJdGVtLCBvcHRzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG5cbiAgaWYgKCFkZXN0U3RhdCkge1xuICAgIGF3YWl0IGZzLmNobW9kKGRlc3QsIHNyY1N0YXQubW9kZSlcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbkxpbmsgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgbGV0IHJlc29sdmVkU3JjID0gYXdhaXQgZnMucmVhZGxpbmsoc3JjKVxuICBpZiAob3B0cy5kZXJlZmVyZW5jZSkge1xuICAgIHJlc29sdmVkU3JjID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkU3JjKVxuICB9XG4gIGlmICghZGVzdFN0YXQpIHtcbiAgICByZXR1cm4gZnMuc3ltbGluayhyZXNvbHZlZFNyYywgZGVzdClcbiAgfVxuXG4gIGxldCByZXNvbHZlZERlc3QgPSBudWxsXG4gIHRyeSB7XG4gICAgcmVzb2x2ZWREZXN0ID0gYXdhaXQgZnMucmVhZGxpbmsoZGVzdClcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGRlc3QgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnksXG4gICAgLy8gV2luZG93cyBtYXkgdGhyb3cgVU5LTk9XTiBlcnJvci4gSWYgZGVzdCBhbHJlYWR5IGV4aXN0cyxcbiAgICAvLyBmcyB0aHJvd3MgZXJyb3IgYW55d2F5LCBzbyBubyBuZWVkIHRvIGd1YXJkIGFnYWluc3QgaXQgaGVyZS5cbiAgICBpZiAoZS5jb2RlID09PSAnRUlOVkFMJyB8fCBlLmNvZGUgPT09ICdVTktOT1dOJykgcmV0dXJuIGZzLnN5bWxpbmsocmVzb2x2ZWRTcmMsIGRlc3QpXG4gICAgdGhyb3cgZVxuICB9XG4gIGlmIChvcHRzLmRlcmVmZXJlbmNlKSB7XG4gICAgcmVzb2x2ZWREZXN0ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkRGVzdClcbiAgfVxuICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZFNyYywgcmVzb2x2ZWREZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgJyR7cmVzb2x2ZWRTcmN9JyB0byBhIHN1YmRpcmVjdG9yeSBvZiBpdHNlbGYsICcke3Jlc29sdmVkRGVzdH0nLmApXG4gIH1cblxuICAvLyBkbyBub3QgY29weSBpZiBzcmMgaXMgYSBzdWJkaXIgb2YgZGVzdCBzaW5jZSB1bmxpbmtpbmdcbiAgLy8gZGVzdCBpbiB0aGlzIGNhc2Ugd291bGQgcmVzdWx0IGluIHJlbW92aW5nIHNyYyBjb250ZW50c1xuICAvLyBhbmQgdGhlcmVmb3JlIGEgYnJva2VuIHN5bWxpbmsgd291bGQgYmUgY3JlYXRlZC5cbiAgaWYgKHN0YXQuaXNTcmNTdWJkaXIocmVzb2x2ZWREZXN0LCByZXNvbHZlZFNyYykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgJyR7cmVzb2x2ZWREZXN0fScgd2l0aCAnJHtyZXNvbHZlZFNyY30nLmApXG4gIH1cblxuICAvLyBjb3B5IHRoZSBsaW5rXG4gIGF3YWl0IGZzLnVubGluayhkZXN0KVxuICByZXR1cm4gZnMuc3ltbGluayhyZXNvbHZlZFNyYywgZGVzdClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG1rZGlyc1N5bmMgPSByZXF1aXJlKCcuLi9ta2RpcnMnKS5ta2RpcnNTeW5jXG5jb25zdCB1dGltZXNNaWxsaXNTeW5jID0gcmVxdWlyZSgnLi4vdXRpbC91dGltZXMnKS51dGltZXNNaWxsaXNTeW5jXG5jb25zdCBzdGF0ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuZnVuY3Rpb24gY29weVN5bmMgKHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRzID0geyBmaWx0ZXI6IG9wdHMgfVxuICB9XG5cbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgb3B0cy5jbG9iYmVyID0gJ2Nsb2JiZXInIGluIG9wdHMgPyAhIW9wdHMuY2xvYmJlciA6IHRydWUgLy8gZGVmYXVsdCB0byB0cnVlIGZvciBub3dcbiAgb3B0cy5vdmVyd3JpdGUgPSAnb3ZlcndyaXRlJyBpbiBvcHRzID8gISFvcHRzLm92ZXJ3cml0ZSA6IG9wdHMuY2xvYmJlciAvLyBvdmVyd3JpdGUgZmFsbHMgYmFjayB0byBjbG9iYmVyXG5cbiAgLy8gV2FybiBhYm91dCB1c2luZyBwcmVzZXJ2ZVRpbWVzdGFtcHMgb24gMzItYml0IG5vZGVcbiAgaWYgKG9wdHMucHJlc2VydmVUaW1lc3RhbXBzICYmIHByb2Nlc3MuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAgICdVc2luZyB0aGUgcHJlc2VydmVUaW1lc3RhbXBzIG9wdGlvbiBpbiAzMi1iaXQgbm9kZSBpcyBub3QgcmVjb21tZW5kZWQ7XFxuXFxuJyArXG4gICAgICAnXFx0c2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcHJpY2hhcmRzb24vbm9kZS1mcy1leHRyYS9pc3N1ZXMvMjY5JyxcbiAgICAgICdXYXJuaW5nJywgJ2ZzLWV4dHJhLVdBUk4wMDAyJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHsgc3JjU3RhdCwgZGVzdFN0YXQgfSA9IHN0YXQuY2hlY2tQYXRoc1N5bmMoc3JjLCBkZXN0LCAnY29weScsIG9wdHMpXG4gIHN0YXQuY2hlY2tQYXJlbnRQYXRoc1N5bmMoc3JjLCBzcmNTdGF0LCBkZXN0LCAnY29weScpXG4gIGlmIChvcHRzLmZpbHRlciAmJiAhb3B0cy5maWx0ZXIoc3JjLCBkZXN0KSkgcmV0dXJuXG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRlc3RQYXJlbnQpKSBta2RpcnNTeW5jKGRlc3RQYXJlbnQpXG4gIHJldHVybiBnZXRTdGF0cyhkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxufVxuXG5mdW5jdGlvbiBnZXRTdGF0cyAoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBjb25zdCBzdGF0U3luYyA9IG9wdHMuZGVyZWZlcmVuY2UgPyBmcy5zdGF0U3luYyA6IGZzLmxzdGF0U3luY1xuICBjb25zdCBzcmNTdGF0ID0gc3RhdFN5bmMoc3JjKVxuXG4gIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkpIHJldHVybiBvbkRpcihzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICBlbHNlIGlmIChzcmNTdGF0LmlzRmlsZSgpIHx8XG4gICAgICAgICAgIHNyY1N0YXQuaXNDaGFyYWN0ZXJEZXZpY2UoKSB8fFxuICAgICAgICAgICBzcmNTdGF0LmlzQmxvY2tEZXZpY2UoKSkgcmV0dXJuIG9uRmlsZShzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICBlbHNlIGlmIChzcmNTdGF0LmlzU3ltYm9saWNMaW5rKCkpIHJldHVybiBvbkxpbmsoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgZWxzZSBpZiAoc3JjU3RhdC5pc1NvY2tldCgpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3B5IGEgc29ja2V0IGZpbGU6ICR7c3JjfWApXG4gIGVsc2UgaWYgKHNyY1N0YXQuaXNGSUZPKCkpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgYSBGSUZPIHBpcGU6ICR7c3JjfWApXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWxlOiAke3NyY31gKVxufVxuXG5mdW5jdGlvbiBvbkZpbGUgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFkZXN0U3RhdCkgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIG1heUNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbn1cblxuZnVuY3Rpb24gbWF5Q29weUZpbGUgKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAob3B0cy5vdmVyd3JpdGUpIHtcbiAgICBmcy51bmxpbmtTeW5jKGRlc3QpXG4gICAgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgfSBlbHNlIGlmIChvcHRzLmVycm9yT25FeGlzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7ZGVzdH0nIGFscmVhZHkgZXhpc3RzYClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5RmlsZSAoc3JjU3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGZzLmNvcHlGaWxlU3luYyhzcmMsIGRlc3QpXG4gIGlmIChvcHRzLnByZXNlcnZlVGltZXN0YW1wcykgaGFuZGxlVGltZXN0YW1wcyhzcmNTdGF0Lm1vZGUsIHNyYywgZGVzdClcbiAgcmV0dXJuIHNldERlc3RNb2RlKGRlc3QsIHNyY1N0YXQubW9kZSlcbn1cblxuZnVuY3Rpb24gaGFuZGxlVGltZXN0YW1wcyAoc3JjTW9kZSwgc3JjLCBkZXN0KSB7XG4gIC8vIE1ha2Ugc3VyZSB0aGUgZmlsZSBpcyB3cml0YWJsZSBiZWZvcmUgc2V0dGluZyB0aGUgdGltZXN0YW1wXG4gIC8vIG90aGVyd2lzZSBvcGVuIGZhaWxzIHdpdGggRVBFUk0gd2hlbiBpbnZva2VkIHdpdGggJ3IrJ1xuICAvLyAodGhyb3VnaCB1dGltZXMgY2FsbClcbiAgaWYgKGZpbGVJc05vdFdyaXRhYmxlKHNyY01vZGUpKSBtYWtlRmlsZVdyaXRhYmxlKGRlc3QsIHNyY01vZGUpXG4gIHJldHVybiBzZXREZXN0VGltZXN0YW1wcyhzcmMsIGRlc3QpXG59XG5cbmZ1bmN0aW9uIGZpbGVJc05vdFdyaXRhYmxlIChzcmNNb2RlKSB7XG4gIHJldHVybiAoc3JjTW9kZSAmIDBvMjAwKSA9PT0gMFxufVxuXG5mdW5jdGlvbiBtYWtlRmlsZVdyaXRhYmxlIChkZXN0LCBzcmNNb2RlKSB7XG4gIHJldHVybiBzZXREZXN0TW9kZShkZXN0LCBzcmNNb2RlIHwgMG8yMDApXG59XG5cbmZ1bmN0aW9uIHNldERlc3RNb2RlIChkZXN0LCBzcmNNb2RlKSB7XG4gIHJldHVybiBmcy5jaG1vZFN5bmMoZGVzdCwgc3JjTW9kZSlcbn1cblxuZnVuY3Rpb24gc2V0RGVzdFRpbWVzdGFtcHMgKHNyYywgZGVzdCkge1xuICAvLyBUaGUgaW5pdGlhbCBzcmNTdGF0LmF0aW1lIGNhbm5vdCBiZSB0cnVzdGVkXG4gIC8vIGJlY2F1c2UgaXQgaXMgbW9kaWZpZWQgYnkgdGhlIHJlYWQoMikgc3lzdGVtIGNhbGxcbiAgLy8gKFNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfc3RhdF90aW1lX3ZhbHVlcylcbiAgY29uc3QgdXBkYXRlZFNyY1N0YXQgPSBmcy5zdGF0U3luYyhzcmMpXG4gIHJldHVybiB1dGltZXNNaWxsaXNTeW5jKGRlc3QsIHVwZGF0ZWRTcmNTdGF0LmF0aW1lLCB1cGRhdGVkU3JjU3RhdC5tdGltZSlcbn1cblxuZnVuY3Rpb24gb25EaXIgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFkZXN0U3RhdCkgcmV0dXJuIG1rRGlyQW5kQ29weShzcmNTdGF0Lm1vZGUsIHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIGNvcHlEaXIoc3JjLCBkZXN0LCBvcHRzKVxufVxuXG5mdW5jdGlvbiBta0RpckFuZENvcHkgKHNyY01vZGUsIHNyYywgZGVzdCwgb3B0cykge1xuICBmcy5ta2RpclN5bmMoZGVzdClcbiAgY29weURpcihzcmMsIGRlc3QsIG9wdHMpXG4gIHJldHVybiBzZXREZXN0TW9kZShkZXN0LCBzcmNNb2RlKVxufVxuXG5mdW5jdGlvbiBjb3B5RGlyIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3QgZGlyID0gZnMub3BlbmRpclN5bmMoc3JjKVxuXG4gIHRyeSB7XG4gICAgbGV0IGRpcmVudFxuXG4gICAgd2hpbGUgKChkaXJlbnQgPSBkaXIucmVhZFN5bmMoKSkgIT09IG51bGwpIHtcbiAgICAgIGNvcHlEaXJJdGVtKGRpcmVudC5uYW1lLCBzcmMsIGRlc3QsIG9wdHMpXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGRpci5jbG9zZVN5bmMoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvcHlEaXJJdGVtIChpdGVtLCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3Qgc3JjSXRlbSA9IHBhdGguam9pbihzcmMsIGl0ZW0pXG4gIGNvbnN0IGRlc3RJdGVtID0gcGF0aC5qb2luKGRlc3QsIGl0ZW0pXG4gIGlmIChvcHRzLmZpbHRlciAmJiAhb3B0cy5maWx0ZXIoc3JjSXRlbSwgZGVzdEl0ZW0pKSByZXR1cm5cbiAgY29uc3QgeyBkZXN0U3RhdCB9ID0gc3RhdC5jaGVja1BhdGhzU3luYyhzcmNJdGVtLCBkZXN0SXRlbSwgJ2NvcHknLCBvcHRzKVxuICByZXR1cm4gZ2V0U3RhdHMoZGVzdFN0YXQsIHNyY0l0ZW0sIGRlc3RJdGVtLCBvcHRzKVxufVxuXG5mdW5jdGlvbiBvbkxpbmsgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgbGV0IHJlc29sdmVkU3JjID0gZnMucmVhZGxpbmtTeW5jKHNyYylcbiAgaWYgKG9wdHMuZGVyZWZlcmVuY2UpIHtcbiAgICByZXNvbHZlZFNyYyA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlZFNyYylcbiAgfVxuXG4gIGlmICghZGVzdFN0YXQpIHtcbiAgICByZXR1cm4gZnMuc3ltbGlua1N5bmMocmVzb2x2ZWRTcmMsIGRlc3QpXG4gIH0gZWxzZSB7XG4gICAgbGV0IHJlc29sdmVkRGVzdFxuICAgIHRyeSB7XG4gICAgICByZXNvbHZlZERlc3QgPSBmcy5yZWFkbGlua1N5bmMoZGVzdClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGRlc3QgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnksXG4gICAgICAvLyBXaW5kb3dzIG1heSB0aHJvdyBVTktOT1dOIGVycm9yLiBJZiBkZXN0IGFscmVhZHkgZXhpc3RzLFxuICAgICAgLy8gZnMgdGhyb3dzIGVycm9yIGFueXdheSwgc28gbm8gbmVlZCB0byBndWFyZCBhZ2FpbnN0IGl0IGhlcmUuXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFSU5WQUwnIHx8IGVyci5jb2RlID09PSAnVU5LTk9XTicpIHJldHVybiBmcy5zeW1saW5rU3luYyhyZXNvbHZlZFNyYywgZGVzdClcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBpZiAob3B0cy5kZXJlZmVyZW5jZSkge1xuICAgICAgcmVzb2x2ZWREZXN0ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkRGVzdClcbiAgICB9XG4gICAgaWYgKHN0YXQuaXNTcmNTdWJkaXIocmVzb2x2ZWRTcmMsIHJlc29sdmVkRGVzdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgJyR7cmVzb2x2ZWRTcmN9JyB0byBhIHN1YmRpcmVjdG9yeSBvZiBpdHNlbGYsICcke3Jlc29sdmVkRGVzdH0nLmApXG4gICAgfVxuXG4gICAgLy8gcHJldmVudCBjb3B5IGlmIHNyYyBpcyBhIHN1YmRpciBvZiBkZXN0IHNpbmNlIHVubGlua2luZ1xuICAgIC8vIGRlc3QgaW4gdGhpcyBjYXNlIHdvdWxkIHJlc3VsdCBpbiByZW1vdmluZyBzcmMgY29udGVudHNcbiAgICAvLyBhbmQgdGhlcmVmb3JlIGEgYnJva2VuIHN5bWxpbmsgd291bGQgYmUgY3JlYXRlZC5cbiAgICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZERlc3QsIHJlc29sdmVkU3JjKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlICcke3Jlc29sdmVkRGVzdH0nIHdpdGggJyR7cmVzb2x2ZWRTcmN9Jy5gKVxuICAgIH1cbiAgICByZXR1cm4gY29weUxpbmsocmVzb2x2ZWRTcmMsIGRlc3QpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29weUxpbmsgKHJlc29sdmVkU3JjLCBkZXN0KSB7XG4gIGZzLnVubGlua1N5bmMoZGVzdClcbiAgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHJlc29sdmVkU3JjLCBkZXN0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW5jXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2Vcbm1vZHVsZS5leHBvcnRzID0ge1xuICBjb3B5OiB1KHJlcXVpcmUoJy4vY29weScpKSxcbiAgY29weVN5bmM6IHJlcXVpcmUoJy4vY29weS1zeW5jJylcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21DYWxsYmFja1xuXG5mdW5jdGlvbiByZW1vdmUgKHBhdGgsIGNhbGxiYWNrKSB7XG4gIGZzLnJtKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9LCBjYWxsYmFjaylcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3luYyAocGF0aCkge1xuICBmcy5ybVN5bmMocGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICByZW1vdmU6IHUocmVtb3ZlKSxcbiAgcmVtb3ZlU3luY1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG1rZGlyID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcbmNvbnN0IHJlbW92ZSA9IHJlcXVpcmUoJy4uL3JlbW92ZScpXG5cbmNvbnN0IGVtcHR5RGlyID0gdShhc3luYyBmdW5jdGlvbiBlbXB0eURpciAoZGlyKSB7XG4gIGxldCBpdGVtc1xuICB0cnkge1xuICAgIGl0ZW1zID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBta2Rpci5ta2RpcnMoZGlyKVxuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zLm1hcChpdGVtID0+IHJlbW92ZS5yZW1vdmUocGF0aC5qb2luKGRpciwgaXRlbSkpKSlcbn0pXG5cbmZ1bmN0aW9uIGVtcHR5RGlyU3luYyAoZGlyKSB7XG4gIGxldCBpdGVtc1xuICB0cnkge1xuICAgIGl0ZW1zID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbWtkaXIubWtkaXJzU3luYyhkaXIpXG4gIH1cblxuICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGl0ZW0gPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIHJlbW92ZS5yZW1vdmVTeW5jKGl0ZW0pXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBlbXB0eURpclN5bmMsXG4gIGVtcHR5ZGlyU3luYzogZW1wdHlEaXJTeW5jLFxuICBlbXB0eURpcixcbiAgZW1wdHlkaXI6IGVtcHR5RGlyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgbWtkaXIgPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVGaWxlIChmaWxlKSB7XG4gIGxldCBzdGF0c1xuICB0cnkge1xuICAgIHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlKVxuICB9IGNhdGNoIHsgfVxuICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHJldHVyblxuXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuXG4gIGxldCBkaXJTdGF0cyA9IG51bGxcbiAgdHJ5IHtcbiAgICBkaXJTdGF0cyA9IGF3YWl0IGZzLnN0YXQoZGlyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIG1ha2UgaXRcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICBhd2FpdCBta2Rpci5ta2RpcnMoZGlyKVxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGUsICcnKVxuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJTdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGUsICcnKVxuICB9IGVsc2Uge1xuICAgIC8vIHBhcmVudCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICAvLyBUaGlzIGlzIGp1c3QgdG8gY2F1c2UgYW4gaW50ZXJuYWwgRU5PVERJUiBlcnJvciB0byBiZSB0aHJvd25cbiAgICBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWxlU3luYyAoZmlsZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGUpXG4gIH0gY2F0Y2ggeyB9XG4gIGlmIChzdGF0cyAmJiBzdGF0cy5pc0ZpbGUoKSkgcmV0dXJuXG5cbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpXG4gIHRyeSB7XG4gICAgaWYgKCFmcy5zdGF0U3luYyhkaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIC8vIHBhcmVudCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICAgIC8vIFRoaXMgaXMganVzdCB0byBjYXVzZSBhbiBpbnRlcm5hbCBFTk9URElSIGVycm9yIHRvIGJlIHRocm93blxuICAgICAgZnMucmVhZGRpclN5bmMoZGlyKVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSWYgdGhlIHN0YXQgY2FsbCBhYm92ZSBmYWlsZWQgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdFxuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdFTk9FTlQnKSBta2Rpci5ta2RpcnNTeW5jKGRpcilcbiAgICBlbHNlIHRocm93IGVyclxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCAnJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZUZpbGU6IHUoY3JlYXRlRmlsZSksXG4gIGNyZWF0ZUZpbGVTeW5jXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgbWtkaXIgPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuY29uc3QgeyBwYXRoRXhpc3RzIH0gPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpXG5jb25zdCB7IGFyZUlkZW50aWNhbCB9ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlTGluayAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBsZXQgZHN0U3RhdFxuICB0cnkge1xuICAgIGRzdFN0YXQgPSBhd2FpdCBmcy5sc3RhdChkc3RwYXRoKVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgZXJyb3JcbiAgfVxuXG4gIGxldCBzcmNTdGF0XG4gIHRyeSB7XG4gICAgc3JjU3RhdCA9IGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UucmVwbGFjZSgnbHN0YXQnLCAnZW5zdXJlTGluaycpXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICBpZiAoZHN0U3RhdCAmJiBhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RwYXRoKVxuXG4gIGNvbnN0IGRpckV4aXN0cyA9IGF3YWl0IHBhdGhFeGlzdHMoZGlyKVxuXG4gIGlmICghZGlyRXhpc3RzKSB7XG4gICAgYXdhaXQgbWtkaXIubWtkaXJzKGRpcilcbiAgfVxuXG4gIGF3YWl0IGZzLmxpbmsoc3JjcGF0aCwgZHN0cGF0aClcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGlua1N5bmMgKHNyY3BhdGgsIGRzdHBhdGgpIHtcbiAgbGV0IGRzdFN0YXRcbiAgdHJ5IHtcbiAgICBkc3RTdGF0ID0gZnMubHN0YXRTeW5jKGRzdHBhdGgpXG4gIH0gY2F0Y2gge31cblxuICB0cnkge1xuICAgIGNvbnN0IHNyY1N0YXQgPSBmcy5sc3RhdFN5bmMoc3JjcGF0aClcbiAgICBpZiAoZHN0U3RhdCAmJiBhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ2xzdGF0JywgJ2Vuc3VyZUxpbmsnKVxuICAgIHRocm93IGVyclxuICB9XG5cbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG4gIGNvbnN0IGRpckV4aXN0cyA9IGZzLmV4aXN0c1N5bmMoZGlyKVxuICBpZiAoZGlyRXhpc3RzKSByZXR1cm4gZnMubGlua1N5bmMoc3JjcGF0aCwgZHN0cGF0aClcbiAgbWtkaXIubWtkaXJzU3luYyhkaXIpXG5cbiAgcmV0dXJuIGZzLmxpbmtTeW5jKHNyY3BhdGgsIGRzdHBhdGgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVMaW5rOiB1KGNyZWF0ZUxpbmspLFxuICBjcmVhdGVMaW5rU3luY1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCByZXR1cm5zIHR3byB0eXBlcyBvZiBwYXRocywgb25lIHJlbGF0aXZlIHRvIHN5bWxpbmssIGFuZCBvbmVcbiAqIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBDaGVja3MgaWYgcGF0aCBpcyBhYnNvbHV0ZSBvclxuICogcmVsYXRpdmUuIElmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLCB0aGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgcGF0aCBpc1xuICogcmVsYXRpdmUgdG8gc3ltbGluayBvciByZWxhdGl2ZSB0byBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIGlzIGFuXG4gKiBpbml0aWF0aXZlIHRvIGZpbmQgYSBzbWFydGVyIGBzcmNwYXRoYCB0byBzdXBwbHkgd2hlbiBidWlsZGluZyBzeW1saW5rcy5cbiAqIFRoaXMgYWxsb3dzIHlvdSB0byBkZXRlcm1pbmUgd2hpY2ggcGF0aCB0byB1c2Ugb3V0IG9mIG9uZSBvZiB0aHJlZSBwb3NzaWJsZVxuICogdHlwZXMgb2Ygc291cmNlIHBhdGhzLiBUaGUgZmlyc3QgaXMgYW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBpcyBkZXRlY3RlZCBieVxuICogYHBhdGguaXNBYnNvbHV0ZSgpYC4gV2hlbiBhbiBhYnNvbHV0ZSBwYXRoIGlzIHByb3ZpZGVkLCBpdCBpcyBjaGVja2VkIHRvXG4gKiBzZWUgaWYgaXQgZXhpc3RzLiBJZiBpdCBkb2VzIGl0J3MgdXNlZCwgaWYgbm90IGFuIGVycm9yIGlzIHJldHVybmVkXG4gKiAoY2FsbGJhY2spLyB0aHJvd24gKHN5bmMpLiBUaGUgb3RoZXIgdHdvIG9wdGlvbnMgZm9yIGBzcmNwYXRoYCBhcmUgYVxuICogcmVsYXRpdmUgdXJsLiBCeSBkZWZhdWx0IE5vZGUncyBgZnMuc3ltbGlua2Agd29ya3MgYnkgY3JlYXRpbmcgYSBzeW1saW5rXG4gKiB1c2luZyBgZHN0cGF0aGAgYW5kIGV4cGVjdHMgdGhlIGBzcmNwYXRoYCB0byBiZSByZWxhdGl2ZSB0byB0aGUgbmV3bHlcbiAqIGNyZWF0ZWQgc3ltbGluay4gSWYgeW91IHByb3ZpZGUgYSBgc3JjcGF0aGAgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZmlsZVxuICogc3lzdGVtIGl0IHJlc3VsdHMgaW4gYSBicm9rZW4gc3ltbGluay4gVG8gbWluaW1pemUgdGhpcywgdGhlIGZ1bmN0aW9uXG4gKiBjaGVja3MgdG8gc2VlIGlmIHRoZSAncmVsYXRpdmUgdG8gc3ltbGluaycgc291cmNlIGZpbGUgZXhpc3RzLCBhbmQgaWYgaXRcbiAqIGRvZXMgaXQgd2lsbCB1c2UgaXQuIElmIGl0IGRvZXMgbm90LCBpdCBjaGVja3MgaWYgdGhlcmUncyBhIGZpbGUgdGhhdFxuICogZXhpc3RzIHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGlmIGRvZXMgaXRzIHVzZWQuXG4gKiBUaGlzIHByZXNlcnZlcyB0aGUgZXhwZWN0YXRpb25zIG9mIHRoZSBvcmlnaW5hbCBmcy5zeW1saW5rIHNwZWMgYW5kIGFkZHNcbiAqIHRoZSBhYmlsaXR5IHRvIHBhc3MgaW4gYHJlbGF0aXZlIHRvIGN1cnJlbnQgd29ya2luZyBkaXJlY290cnlgIHBhdGhzLlxuICovXG5cbmFzeW5jIGZ1bmN0aW9uIHN5bWxpbmtQYXRocyAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBpZiAocGF0aC5pc0Fic29sdXRlKHNyY3BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ2xzdGF0JywgJ2Vuc3VyZVN5bWxpbmsnKVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBkc3RkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgcmVsYXRpdmVUb0RzdCA9IHBhdGguam9pbihkc3RkaXIsIHNyY3BhdGgpXG5cbiAgY29uc3QgZXhpc3RzID0gYXdhaXQgcGF0aEV4aXN0cyhyZWxhdGl2ZVRvRHN0KVxuICBpZiAoZXhpc3RzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiByZWxhdGl2ZVRvRHN0LFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UucmVwbGFjZSgnbHN0YXQnLCAnZW5zdXJlU3ltbGluaycpXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgIHRvRHN0OiBwYXRoLnJlbGF0aXZlKGRzdGRpciwgc3JjcGF0aClcbiAgfVxufVxuXG5mdW5jdGlvbiBzeW1saW5rUGF0aHNTeW5jIChzcmNwYXRoLCBkc3RwYXRoKSB7XG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoc3JjcGF0aCkpIHtcbiAgICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKHNyY3BhdGgpXG4gICAgaWYgKCFleGlzdHMpIHRocm93IG5ldyBFcnJvcignYWJzb2x1dGUgc3JjcGF0aCBkb2VzIG5vdCBleGlzdCcpXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBkc3RkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgcmVsYXRpdmVUb0RzdCA9IHBhdGguam9pbihkc3RkaXIsIHNyY3BhdGgpXG4gIGNvbnN0IGV4aXN0cyA9IGZzLmV4aXN0c1N5bmMocmVsYXRpdmVUb0RzdClcbiAgaWYgKGV4aXN0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0b0N3ZDogcmVsYXRpdmVUb0RzdCxcbiAgICAgIHRvRHN0OiBzcmNwYXRoXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3JjRXhpc3RzID0gZnMuZXhpc3RzU3luYyhzcmNwYXRoKVxuICBpZiAoIXNyY0V4aXN0cykgdGhyb3cgbmV3IEVycm9yKCdyZWxhdGl2ZSBzcmNwYXRoIGRvZXMgbm90IGV4aXN0JylcbiAgcmV0dXJuIHtcbiAgICB0b0N3ZDogc3JjcGF0aCxcbiAgICB0b0RzdDogcGF0aC5yZWxhdGl2ZShkc3RkaXIsIHNyY3BhdGgpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN5bWxpbmtQYXRoczogdShzeW1saW5rUGF0aHMpLFxuICBzeW1saW5rUGF0aHNTeW5jXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuXG5hc3luYyBmdW5jdGlvbiBzeW1saW5rVHlwZSAoc3JjcGF0aCwgdHlwZSkge1xuICBpZiAodHlwZSkgcmV0dXJuIHR5cGVcblxuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnZmlsZSdcbiAgfVxuXG4gIHJldHVybiAoc3RhdHMgJiYgc3RhdHMuaXNEaXJlY3RvcnkoKSkgPyAnZGlyJyA6ICdmaWxlJ1xufVxuXG5mdW5jdGlvbiBzeW1saW5rVHlwZVN5bmMgKHNyY3BhdGgsIHR5cGUpIHtcbiAgaWYgKHR5cGUpIHJldHVybiB0eXBlXG5cbiAgbGV0IHN0YXRzXG4gIHRyeSB7XG4gICAgc3RhdHMgPSBmcy5sc3RhdFN5bmMoc3JjcGF0aClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICdmaWxlJ1xuICB9XG4gIHJldHVybiAoc3RhdHMgJiYgc3RhdHMuaXNEaXJlY3RvcnkoKSkgPyAnZGlyJyA6ICdmaWxlJ1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc3ltbGlua1R5cGU6IHUoc3ltbGlua1R5cGUpLFxuICBzeW1saW5rVHlwZVN5bmNcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5cbmNvbnN0IHsgbWtkaXJzLCBta2RpcnNTeW5jIH0gPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuXG5jb25zdCB7IHN5bWxpbmtQYXRocywgc3ltbGlua1BhdGhzU3luYyB9ID0gcmVxdWlyZSgnLi9zeW1saW5rLXBhdGhzJylcbmNvbnN0IHsgc3ltbGlua1R5cGUsIHN5bWxpbmtUeXBlU3luYyB9ID0gcmVxdWlyZSgnLi9zeW1saW5rLXR5cGUnKVxuXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcblxuY29uc3QgeyBhcmVJZGVudGljYWwgfSA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN5bWxpbmsgKHNyY3BhdGgsIGRzdHBhdGgsIHR5cGUpIHtcbiAgbGV0IHN0YXRzXG4gIHRyeSB7XG4gICAgc3RhdHMgPSBhd2FpdCBmcy5sc3RhdChkc3RwYXRoKVxuICB9IGNhdGNoIHsgfVxuXG4gIGlmIChzdGF0cyAmJiBzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc3QgW3NyY1N0YXQsIGRzdFN0YXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMuc3RhdChzcmNwYXRoKSxcbiAgICAgIGZzLnN0YXQoZHN0cGF0aClcbiAgICBdKVxuXG4gICAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkc3RTdGF0KSkgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZWxhdGl2ZSA9IGF3YWl0IHN5bWxpbmtQYXRocyhzcmNwYXRoLCBkc3RwYXRoKVxuICBzcmNwYXRoID0gcmVsYXRpdmUudG9Ec3RcbiAgY29uc3QgdG9UeXBlID0gYXdhaXQgc3ltbGlua1R5cGUocmVsYXRpdmUudG9Dd2QsIHR5cGUpXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RwYXRoKVxuXG4gIGlmICghKGF3YWl0IHBhdGhFeGlzdHMoZGlyKSkpIHtcbiAgICBhd2FpdCBta2RpcnMoZGlyKVxuICB9XG5cbiAgcmV0dXJuIGZzLnN5bWxpbmsoc3JjcGF0aCwgZHN0cGF0aCwgdG9UeXBlKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTeW1saW5rU3luYyAoc3JjcGF0aCwgZHN0cGF0aCwgdHlwZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGZzLmxzdGF0U3luYyhkc3RwYXRoKVxuICB9IGNhdGNoIHsgfVxuICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGNvbnN0IHNyY1N0YXQgPSBmcy5zdGF0U3luYyhzcmNwYXRoKVxuICAgIGNvbnN0IGRzdFN0YXQgPSBmcy5zdGF0U3luYyhkc3RwYXRoKVxuICAgIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVsYXRpdmUgPSBzeW1saW5rUGF0aHNTeW5jKHNyY3BhdGgsIGRzdHBhdGgpXG4gIHNyY3BhdGggPSByZWxhdGl2ZS50b0RzdFxuICB0eXBlID0gc3ltbGlua1R5cGVTeW5jKHJlbGF0aXZlLnRvQ3dkLCB0eXBlKVxuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhkaXIpXG4gIGlmIChleGlzdHMpIHJldHVybiBmcy5zeW1saW5rU3luYyhzcmNwYXRoLCBkc3RwYXRoLCB0eXBlKVxuICBta2RpcnNTeW5jKGRpcilcbiAgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHNyY3BhdGgsIGRzdHBhdGgsIHR5cGUpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVTeW1saW5rOiB1KGNyZWF0ZVN5bWxpbmspLFxuICBjcmVhdGVTeW1saW5rU3luY1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBjcmVhdGVGaWxlLCBjcmVhdGVGaWxlU3luYyB9ID0gcmVxdWlyZSgnLi9maWxlJylcbmNvbnN0IHsgY3JlYXRlTGluaywgY3JlYXRlTGlua1N5bmMgfSA9IHJlcXVpcmUoJy4vbGluaycpXG5jb25zdCB7IGNyZWF0ZVN5bWxpbmssIGNyZWF0ZVN5bWxpbmtTeW5jIH0gPSByZXF1aXJlKCcuL3N5bWxpbmsnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gZmlsZVxuICBjcmVhdGVGaWxlLFxuICBjcmVhdGVGaWxlU3luYyxcbiAgZW5zdXJlRmlsZTogY3JlYXRlRmlsZSxcbiAgZW5zdXJlRmlsZVN5bmM6IGNyZWF0ZUZpbGVTeW5jLFxuICAvLyBsaW5rXG4gIGNyZWF0ZUxpbmssXG4gIGNyZWF0ZUxpbmtTeW5jLFxuICBlbnN1cmVMaW5rOiBjcmVhdGVMaW5rLFxuICBlbnN1cmVMaW5rU3luYzogY3JlYXRlTGlua1N5bmMsXG4gIC8vIHN5bWxpbmtcbiAgY3JlYXRlU3ltbGluayxcbiAgY3JlYXRlU3ltbGlua1N5bmMsXG4gIGVuc3VyZVN5bWxpbms6IGNyZWF0ZVN5bWxpbmssXG4gIGVuc3VyZVN5bWxpbmtTeW5jOiBjcmVhdGVTeW1saW5rU3luY1xufVxuIiwKICAgICJmdW5jdGlvbiBzdHJpbmdpZnkgKG9iaiwgeyBFT0wgPSAnXFxuJywgZmluYWxFT0wgPSB0cnVlLCByZXBsYWNlciA9IG51bGwsIHNwYWNlcyB9ID0ge30pIHtcbiAgY29uc3QgRU9GID0gZmluYWxFT0wgPyBFT0wgOiAnJ1xuICBjb25zdCBzdHIgPSBKU09OLnN0cmluZ2lmeShvYmosIHJlcGxhY2VyLCBzcGFjZXMpXG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXG4vZywgRU9MKSArIEVPRlxufVxuXG5mdW5jdGlvbiBzdHJpcEJvbSAoY29udGVudCkge1xuICAvLyB3ZSBkbyB0aGlzIGJlY2F1c2UgSlNPTi5wYXJzZSB3b3VsZCBjb252ZXJ0IGl0IHRvIGEgdXRmOCBzdHJpbmcgaWYgZW5jb2Rpbmcgd2Fzbid0IHNwZWNpZmllZFxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnQpKSBjb250ZW50ID0gY29udGVudC50b1N0cmluZygndXRmOCcpXG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpXG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBzdHJpbmdpZnksIHN0cmlwQm9tIH1cbiIsCiAgICAibGV0IF9mc1xudHJ5IHtcbiAgX2ZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxufSBjYXRjaCAoXykge1xuICBfZnMgPSByZXF1aXJlKCdmcycpXG59XG5jb25zdCB1bml2ZXJzYWxpZnkgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKVxuY29uc3QgeyBzdHJpbmdpZnksIHN0cmlwQm9tIH0gPSByZXF1aXJlKCcuL3V0aWxzJylcblxuYXN5bmMgZnVuY3Rpb24gX3JlYWRGaWxlIChmaWxlLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMgPSB7IGVuY29kaW5nOiBvcHRpb25zIH1cbiAgfVxuXG4gIGNvbnN0IGZzID0gb3B0aW9ucy5mcyB8fCBfZnNcblxuICBjb25zdCBzaG91bGRUaHJvdyA9ICd0aHJvd3MnIGluIG9wdGlvbnMgPyBvcHRpb25zLnRocm93cyA6IHRydWVcblxuICBsZXQgZGF0YSA9IGF3YWl0IHVuaXZlcnNhbGlmeS5mcm9tQ2FsbGJhY2soZnMucmVhZEZpbGUpKGZpbGUsIG9wdGlvbnMpXG5cbiAgZGF0YSA9IHN0cmlwQm9tKGRhdGEpXG5cbiAgbGV0IG9ialxuICB0cnkge1xuICAgIG9iaiA9IEpTT04ucGFyc2UoZGF0YSwgb3B0aW9ucyA/IG9wdGlvbnMucmV2aXZlciA6IG51bGwpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgJHtmaWxlfTogJHtlcnIubWVzc2FnZX1gXG4gICAgICB0aHJvdyBlcnJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmNvbnN0IHJlYWRGaWxlID0gdW5pdmVyc2FsaWZ5LmZyb21Qcm9taXNlKF9yZWFkRmlsZSlcblxuZnVuY3Rpb24gcmVhZEZpbGVTeW5jIChmaWxlLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMgPSB7IGVuY29kaW5nOiBvcHRpb25zIH1cbiAgfVxuXG4gIGNvbnN0IGZzID0gb3B0aW9ucy5mcyB8fCBfZnNcblxuICBjb25zdCBzaG91bGRUaHJvdyA9ICd0aHJvd3MnIGluIG9wdGlvbnMgPyBvcHRpb25zLnRocm93cyA6IHRydWVcblxuICB0cnkge1xuICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsIG9wdGlvbnMpXG4gICAgY29udGVudCA9IHN0cmlwQm9tKGNvbnRlbnQpXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCwgb3B0aW9ucy5yZXZpdmVyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gYCR7ZmlsZX06ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgdGhyb3cgZXJyXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF93cml0ZUZpbGUgKGZpbGUsIG9iaiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGZzID0gb3B0aW9ucy5mcyB8fCBfZnNcblxuICBjb25zdCBzdHIgPSBzdHJpbmdpZnkob2JqLCBvcHRpb25zKVxuXG4gIGF3YWl0IHVuaXZlcnNhbGlmeS5mcm9tQ2FsbGJhY2soZnMud3JpdGVGaWxlKShmaWxlLCBzdHIsIG9wdGlvbnMpXG59XG5cbmNvbnN0IHdyaXRlRmlsZSA9IHVuaXZlcnNhbGlmeS5mcm9tUHJvbWlzZShfd3JpdGVGaWxlKVxuXG5mdW5jdGlvbiB3cml0ZUZpbGVTeW5jIChmaWxlLCBvYmosIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBmcyA9IG9wdGlvbnMuZnMgfHwgX2ZzXG5cbiAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KG9iaiwgb3B0aW9ucylcbiAgLy8gbm90IHN1cmUgaWYgZnMud3JpdGVGaWxlU3luYyByZXR1cm5zIGFueXRoaW5nLCBidXQganVzdCBpbiBjYXNlXG4gIHJldHVybiBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIHN0ciwgb3B0aW9ucylcbn1cblxuY29uc3QganNvbmZpbGUgPSB7XG4gIHJlYWRGaWxlLFxuICByZWFkRmlsZVN5bmMsXG4gIHdyaXRlRmlsZSxcbiAgd3JpdGVGaWxlU3luY1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGpzb25maWxlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBqc29uRmlsZSA9IHJlcXVpcmUoJ2pzb25maWxlJylcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGpzb25maWxlIGV4cG9ydHNcbiAgcmVhZEpzb246IGpzb25GaWxlLnJlYWRGaWxlLFxuICByZWFkSnNvblN5bmM6IGpzb25GaWxlLnJlYWRGaWxlU3luYyxcbiAgd3JpdGVKc29uOiBqc29uRmlsZS53cml0ZUZpbGUsXG4gIHdyaXRlSnNvblN5bmM6IGpzb25GaWxlLndyaXRlRmlsZVN5bmNcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBta2RpciA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5jb25zdCBwYXRoRXhpc3RzID0gcmVxdWlyZSgnLi4vcGF0aC1leGlzdHMnKS5wYXRoRXhpc3RzXG5cbmFzeW5jIGZ1bmN0aW9uIG91dHB1dEZpbGUgKGZpbGUsIGRhdGEsIGVuY29kaW5nID0gJ3V0Zi04Jykge1xuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSlcblxuICBpZiAoIShhd2FpdCBwYXRoRXhpc3RzKGRpcikpKSB7XG4gICAgYXdhaXQgbWtkaXIubWtkaXJzKGRpcilcbiAgfVxuXG4gIHJldHVybiBmcy53cml0ZUZpbGUoZmlsZSwgZGF0YSwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIG91dHB1dEZpbGVTeW5jIChmaWxlLCAuLi5hcmdzKSB7XG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgIG1rZGlyLm1rZGlyc1N5bmMoZGlyKVxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCAuLi5hcmdzKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgb3V0cHV0RmlsZTogdShvdXRwdXRGaWxlKSxcbiAgb3V0cHV0RmlsZVN5bmNcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgc3RyaW5naWZ5IH0gPSByZXF1aXJlKCdqc29uZmlsZS91dGlscycpXG5jb25zdCB7IG91dHB1dEZpbGUgfSA9IHJlcXVpcmUoJy4uL291dHB1dC1maWxlJylcblxuYXN5bmMgZnVuY3Rpb24gb3V0cHV0SnNvbiAoZmlsZSwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShkYXRhLCBvcHRpb25zKVxuXG4gIGF3YWl0IG91dHB1dEZpbGUoZmlsZSwgc3RyLCBvcHRpb25zKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG91dHB1dEpzb25cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgc3RyaW5naWZ5IH0gPSByZXF1aXJlKCdqc29uZmlsZS91dGlscycpXG5jb25zdCB7IG91dHB1dEZpbGVTeW5jIH0gPSByZXF1aXJlKCcuLi9vdXRwdXQtZmlsZScpXG5cbmZ1bmN0aW9uIG91dHB1dEpzb25TeW5jIChmaWxlLCBkYXRhLCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShkYXRhLCBvcHRpb25zKVxuXG4gIG91dHB1dEZpbGVTeW5jKGZpbGUsIHN0ciwgb3B0aW9ucylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdXRwdXRKc29uU3luY1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBqc29uRmlsZSA9IHJlcXVpcmUoJy4vanNvbmZpbGUnKVxuXG5qc29uRmlsZS5vdXRwdXRKc29uID0gdShyZXF1aXJlKCcuL291dHB1dC1qc29uJykpXG5qc29uRmlsZS5vdXRwdXRKc29uU3luYyA9IHJlcXVpcmUoJy4vb3V0cHV0LWpzb24tc3luYycpXG4vLyBhbGlhc2VzXG5qc29uRmlsZS5vdXRwdXRKU09OID0ganNvbkZpbGUub3V0cHV0SnNvblxuanNvbkZpbGUub3V0cHV0SlNPTlN5bmMgPSBqc29uRmlsZS5vdXRwdXRKc29uU3luY1xuanNvbkZpbGUud3JpdGVKU09OID0ganNvbkZpbGUud3JpdGVKc29uXG5qc29uRmlsZS53cml0ZUpTT05TeW5jID0ganNvbkZpbGUud3JpdGVKc29uU3luY1xuanNvbkZpbGUucmVhZEpTT04gPSBqc29uRmlsZS5yZWFkSnNvblxuanNvbkZpbGUucmVhZEpTT05TeW5jID0ganNvbkZpbGUucmVhZEpzb25TeW5jXG5cbm1vZHVsZS5leHBvcnRzID0ganNvbkZpbGVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgeyBjb3B5IH0gPSByZXF1aXJlKCcuLi9jb3B5JylcbmNvbnN0IHsgcmVtb3ZlIH0gPSByZXF1aXJlKCcuLi9yZW1vdmUnKVxuY29uc3QgeyBta2RpcnAgfSA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcbmNvbnN0IHN0YXQgPSByZXF1aXJlKCcuLi91dGlsL3N0YXQnKVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlIChzcmMsIGRlc3QsIG9wdHMgPSB7fSkge1xuICBjb25zdCBvdmVyd3JpdGUgPSBvcHRzLm92ZXJ3cml0ZSB8fCBvcHRzLmNsb2JiZXIgfHwgZmFsc2VcblxuICBjb25zdCB7IHNyY1N0YXQsIGlzQ2hhbmdpbmdDYXNlID0gZmFsc2UgfSA9IGF3YWl0IHN0YXQuY2hlY2tQYXRocyhzcmMsIGRlc3QsICdtb3ZlJywgb3B0cylcblxuICBhd2FpdCBzdGF0LmNoZWNrUGFyZW50UGF0aHMoc3JjLCBzcmNTdGF0LCBkZXN0LCAnbW92ZScpXG5cbiAgLy8gSWYgdGhlIHBhcmVudCBvZiBkZXN0IGlzIG5vdCByb290LCBtYWtlIHN1cmUgaXQgZXhpc3RzIGJlZm9yZSBwcm9jZWVkaW5nXG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgY29uc3QgcGFyc2VkUGFyZW50UGF0aCA9IHBhdGgucGFyc2UoZGVzdFBhcmVudClcbiAgaWYgKHBhcnNlZFBhcmVudFBhdGgucm9vdCAhPT0gZGVzdFBhcmVudCkge1xuICAgIGF3YWl0IG1rZGlycChkZXN0UGFyZW50KVxuICB9XG5cbiAgcmV0dXJuIGRvUmVuYW1lKHNyYywgZGVzdCwgb3ZlcndyaXRlLCBpc0NoYW5naW5nQ2FzZSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9SZW5hbWUgKHNyYywgZGVzdCwgb3ZlcndyaXRlLCBpc0NoYW5naW5nQ2FzZSkge1xuICBpZiAoIWlzQ2hhbmdpbmdDYXNlKSB7XG4gICAgaWYgKG92ZXJ3cml0ZSkge1xuICAgICAgYXdhaXQgcmVtb3ZlKGRlc3QpXG4gICAgfSBlbHNlIGlmIChhd2FpdCBwYXRoRXhpc3RzKGRlc3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlc3QgYWxyZWFkeSBleGlzdHMuJylcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRyeSB3LyByZW5hbWUgZmlyc3QsIGFuZCB0cnkgY29weSArIHJlbW92ZSBpZiBFWERFVlxuICAgIGF3YWl0IGZzLnJlbmFtZShzcmMsIGRlc3QpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSAhPT0gJ0VYREVWJykge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICAgIGF3YWl0IG1vdmVBY3Jvc3NEZXZpY2Uoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbW92ZUFjcm9zc0RldmljZSAoc3JjLCBkZXN0LCBvdmVyd3JpdGUpIHtcbiAgY29uc3Qgb3B0cyA9IHtcbiAgICBvdmVyd3JpdGUsXG4gICAgZXJyb3JPbkV4aXN0OiB0cnVlLFxuICAgIHByZXNlcnZlVGltZXN0YW1wczogdHJ1ZVxuICB9XG5cbiAgYXdhaXQgY29weShzcmMsIGRlc3QsIG9wdHMpXG4gIHJldHVybiByZW1vdmUoc3JjKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1vdmVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgY29weVN5bmMgPSByZXF1aXJlKCcuLi9jb3B5JykuY29weVN5bmNcbmNvbnN0IHJlbW92ZVN5bmMgPSByZXF1aXJlKCcuLi9yZW1vdmUnKS5yZW1vdmVTeW5jXG5jb25zdCBta2RpcnBTeW5jID0gcmVxdWlyZSgnLi4vbWtkaXJzJykubWtkaXJwU3luY1xuY29uc3Qgc3RhdCA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmZ1bmN0aW9uIG1vdmVTeW5jIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgY29uc3Qgb3ZlcndyaXRlID0gb3B0cy5vdmVyd3JpdGUgfHwgb3B0cy5jbG9iYmVyIHx8IGZhbHNlXG5cbiAgY29uc3QgeyBzcmNTdGF0LCBpc0NoYW5naW5nQ2FzZSA9IGZhbHNlIH0gPSBzdGF0LmNoZWNrUGF0aHNTeW5jKHNyYywgZGVzdCwgJ21vdmUnLCBvcHRzKVxuICBzdGF0LmNoZWNrUGFyZW50UGF0aHNTeW5jKHNyYywgc3JjU3RhdCwgZGVzdCwgJ21vdmUnKVxuICBpZiAoIWlzUGFyZW50Um9vdChkZXN0KSkgbWtkaXJwU3luYyhwYXRoLmRpcm5hbWUoZGVzdCkpXG4gIHJldHVybiBkb1JlbmFtZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSwgaXNDaGFuZ2luZ0Nhc2UpXG59XG5cbmZ1bmN0aW9uIGlzUGFyZW50Um9vdCAoZGVzdCkge1xuICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgY29uc3QgcGFyc2VkUGF0aCA9IHBhdGgucGFyc2UocGFyZW50KVxuICByZXR1cm4gcGFyc2VkUGF0aC5yb290ID09PSBwYXJlbnRcbn1cblxuZnVuY3Rpb24gZG9SZW5hbWUgKHNyYywgZGVzdCwgb3ZlcndyaXRlLCBpc0NoYW5naW5nQ2FzZSkge1xuICBpZiAoaXNDaGFuZ2luZ0Nhc2UpIHJldHVybiByZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG4gIGlmIChvdmVyd3JpdGUpIHtcbiAgICByZW1vdmVTeW5jKGRlc3QpXG4gICAgcmV0dXJuIHJlbmFtZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSlcbiAgfVxuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0KSkgdGhyb3cgbmV3IEVycm9yKCdkZXN0IGFscmVhZHkgZXhpc3RzLicpXG4gIHJldHVybiByZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG59XG5cbmZ1bmN0aW9uIHJlbmFtZSAoc3JjLCBkZXN0LCBvdmVyd3JpdGUpIHtcbiAgdHJ5IHtcbiAgICBmcy5yZW5hbWVTeW5jKHNyYywgZGVzdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICE9PSAnRVhERVYnKSB0aHJvdyBlcnJcbiAgICByZXR1cm4gbW92ZUFjcm9zc0RldmljZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQWNyb3NzRGV2aWNlIChzcmMsIGRlc3QsIG92ZXJ3cml0ZSkge1xuICBjb25zdCBvcHRzID0ge1xuICAgIG92ZXJ3cml0ZSxcbiAgICBlcnJvck9uRXhpc3Q6IHRydWUsXG4gICAgcHJlc2VydmVUaW1lc3RhbXBzOiB0cnVlXG4gIH1cbiAgY29weVN5bmMoc3JjLCBkZXN0LCBvcHRzKVxuICByZXR1cm4gcmVtb3ZlU3luYyhzcmMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbW92ZVN5bmNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1vdmU6IHUocmVxdWlyZSgnLi9tb3ZlJykpLFxuICBtb3ZlU3luYzogcmVxdWlyZSgnLi9tb3ZlLXN5bmMnKVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIEV4cG9ydCBwcm9taXNlaWZpZWQgZ3JhY2VmdWwtZnM6XG4gIC4uLnJlcXVpcmUoJy4vZnMnKSxcbiAgLy8gRXhwb3J0IGV4dHJhIG1ldGhvZHM6XG4gIC4uLnJlcXVpcmUoJy4vY29weScpLFxuICAuLi5yZXF1aXJlKCcuL2VtcHR5JyksXG4gIC4uLnJlcXVpcmUoJy4vZW5zdXJlJyksXG4gIC4uLnJlcXVpcmUoJy4vanNvbicpLFxuICAuLi5yZXF1aXJlKCcuL21rZGlycycpLFxuICAuLi5yZXF1aXJlKCcuL21vdmUnKSxcbiAgLi4ucmVxdWlyZSgnLi9vdXRwdXQtZmlsZScpLFxuICAuLi5yZXF1aXJlKCcuL3BhdGgtZXhpc3RzJyksXG4gIC4uLnJlcXVpcmUoJy4vcmVtb3ZlJylcbn1cbiIsCiAgICAiaW1wb3J0IFRPTUwgZnJvbSBcIkBpYXJuYS90b21sXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgY3dkLCBlbnYgfSBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkZGlyU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1ZXN0TGlzdGVuZXIgfSBmcm9tIFwiQG1qYWNrc29uL25vZGUtZmV0Y2gtc2VydmVyXCI7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbk9wdGlvbiB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGFkYXB0ZXJzIH0gZnJvbSBcIi4vYWRhcHRlcnMvaW5kZXgudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVZpdGVQbHVnaW5NaWxraW8ob3B0aW9ucz86IHtcbiAgb3V0cHV0Rm9ybWF0PzogXCJlc21cIiB8IFwiY2pzXCI7XG59KSB7XG4gIGxldCBvdXREaXIgPSBcImRpc3RcIjtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwidml0ZS1wbHVnaW4tbWlsa2lvXCIsXG4gICAgYXN5bmMgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgc2VydmVyLm1pZGRsZXdhcmVzLnVzZShhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgICAgY29uc3QgYXBwID0gYXdhaXQgc2VydmVyLnNzckxvYWRNb2R1bGUoXCJpbmRleC50c1wiLCB7IGZpeFN0YWNrdHJhY2U6IGZhbHNlIH0pO1xuICAgICAgICBjb25zdCBtaWxraW8gPSBhd2FpdCBhcHAuY3JlYXRlKHtcbiAgICAgICAgICBkZXZlbG9wOiBlbnYuTUlMS0lPX0RFVkVMT1AgPT09IFwiRU5BQkxFXCIsXG4gICAgICAgICAgYXJndjogcHJvY2Vzcy5hcmd2LFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgY3JlYXRlUmVxdWVzdExpc3RlbmVyKGFzeW5jIChyZXF1ZXN0OiBSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgbWlsa2lvLmxpc3RlbmVyLmZldGNoKHtcbiAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgZW52OiBlbnYsXG4gICAgICAgICAgICAgIGVudk1vZGU6IGVudi5NSUxLSU9fREVWRUxPUCA9PT0gXCJFTkFCTEVcIiA/IFwiZGV2ZWxvcG1lbnRcIiA6IFwicHJvZHVjdGlvblwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkocmVxLCByZXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikgc2VydmVyLnNzckZpeFN0YWNrdHJhY2UoZSk7XG4gICAgICAgICAgcmV0dXJuIG5leHQoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjb25maWcoY29uZmlnLCB7IGNvbW1hbmQgfSkge1xuICAgICAgaWYgKGNvbW1hbmQgIT09IFwiYnVpbGRcIikgcmV0dXJuO1xuICAgICAgY29uc3QgcHJvamVjdCA9IGF3YWl0IGdldENvb2tib29rVG9tbFByb2plY3QoKTtcblxuICAgICAgLy8gY29uZmlnLmJ1aWxkXG4gICAgICBpZiAoIWNvbmZpZy5idWlsZCkgY29uZmlnLmJ1aWxkID0ge307XG4gICAgICBjb25maWcuYnVpbGQuc3NyID0gdHJ1ZTtcbiAgICAgIGNvbmZpZy5idWlsZC50YXJnZXQgPSBcImVzMjAyNFwiO1xuICAgICAgLy8gY29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnNcbiAgICAgIGlmICghY29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnMpIGNvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zID0ge307XG4gICAgICAvLyBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucy5vdXRwdXRcbiAgICAgIGlmICghY29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnMub3V0cHV0KSBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucy5vdXRwdXQgPSB7fTtcbiAgICAgIC8vIGNvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zLmlucHV0XG4gICAgICBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucy5pbnB1dCA9IHtcbiAgICAgICAgaW5kZXg6IFwiLm1pbGtpby9ydW4udHNcIixcbiAgICAgIH07XG5cbiAgICAgIGlmICghcHJvamVjdC5hZGFwdGVyKSB7XG4gICAgICAgIGxldCBmb3JtYXQ6IFwiZXNtXCIgfCBcImNqc1wiID0gXCJlc21cIjtcbiAgICAgICAgbGV0IG1vZGU6IFwiY2h1bmtcIiB8IFwiYnVuZGxlXCIgPSBcImJ1bmRsZVwiO1xuICAgICAgICBpZiAocHJvamVjdC5ydW50aW1lID09PSBcIm5vZGVcIikge1xuICAgICAgICAgIGZvcm1hdCA9IG9wdGlvbnM/Lm91dHB1dEZvcm1hdCA/PyBcImNqc1wiO1xuICAgICAgICAgIG1vZGUgPSBcImNodW5rXCI7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvamVjdC5ydW50aW1lID09PSBcImJ1blwiKSB7XG4gICAgICAgICAgZm9ybWF0ID0gb3B0aW9ucz8ub3V0cHV0Rm9ybWF0ID8/IFwiZXNtXCI7XG4gICAgICAgICAgbW9kZSA9IFwiY2h1bmtcIjtcbiAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihcInJ1bnRpbWUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgZm9yIChjb25zdCBvdXRwdXQgb2YgQXJyYXkuaXNBcnJheShjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucy5vdXRwdXQpID8gY29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnMub3V0cHV0IDogW2NvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zLm91dHB1dF0pIHtcbiAgICAgICAgICBvdXRwdXQuZm9ybWF0ID0gZm9ybWF0O1xuICAgICAgICAgIG91dHB1dC5zb3VyY2VtYXAgPSBcImlubGluZVwiO1xuICAgICAgICAgIG91dHB1dC5wcmVzZXJ2ZU1vZHVsZXMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGZpbmQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIGFkYXB0ZXJzKSB7XG4gICAgICAgICAgaWYgKGFkYXB0ZXIubmFtZSA9PT0gcHJvamVjdC5hZGFwdGVyKSB7XG4gICAgICAgICAgICBmaW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIuYWRhcHRlcih7XG4gICAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnMuaW5wdXQgPSByZXN1bHQuaW5wdXQ7XG4gICAgICAgICAgICBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucy5vdXRwdXQgPSByZXN1bHQub3V0cHV0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZmluZCkgdGhyb3cgbmV3IEVycm9yKGBhZGFwdGVyIFwiJHtwcm9qZWN0LmFkYXB0ZXJ9XCIgbm90IGZvdW5kYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbmZpZy5zZXJ2ZXJcbiAgICAgIGlmICghY29uZmlnLnNlcnZlcikgY29uZmlnLnNlcnZlciA9IHt9O1xuICAgICAgLy8gY29uZmlnLnNlcnZlci5taWRkbGV3YXJlTW9kZVxuICAgICAgY29uZmlnLnNlcnZlci5obXIgPSBmYWxzZTtcblxuICAgICAgLy8gY29uZmlnLm9wdGltaXplRGVwc1xuICAgICAgaWYgKCFjb25maWcub3B0aW1pemVEZXBzKSBjb25maWcub3B0aW1pemVEZXBzID0ge307XG4gICAgICBjb25maWcub3B0aW1pemVEZXBzLm5vRGlzY292ZXJ5ID0gdHJ1ZTtcblxuICAgICAgLy8gY29uZmlnLnJlc29sdmVcbiAgICAgIGlmICghY29uZmlnLnJlc29sdmUpIGNvbmZpZy5yZXNvbHZlID0ge307XG4gICAgICAvLyBjb25maWcucmVzb2x2ZS5hbGlhc1xuICAgICAgY29uZmlnLnJlc29sdmUuYWxpYXMgPSB7XG4gICAgICAgIC4uLihjb25maWcucmVzb2x2ZS5hbGlhcyA/PyB7fSksXG4gICAgICB9O1xuXG4gICAgICAvLyBjb25maWcuc3NyXG4gICAgICBjb25maWcuc3NyID0ge1xuICAgICAgICBub0V4dGVybmFsOiBnZXROb0V4dGVybmFsKCksXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb25maWdSZXNvbHZlZChyZXNvbHZlZENvbmZpZykge1xuICAgICAgb3V0RGlyID0gcmVzb2x2ZWRDb25maWcuYnVpbGQub3V0RGlyIHx8IFwiZGlzdFwiO1xuICAgIH0sXG5cbiAgICBhc3luYyB3cml0ZUJ1bmRsZSgpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihjd2QoKSwgb3V0RGlyLCBcIi5naXRrZWVwXCIpO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBcIlwiLCBcInV0Zi04XCIpO1xuICAgIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk9wdGlvbjtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9FeHRlcm5hbCgpIHtcbiAgLy8gYnVuXG4gIGNvbnN0IGJ1biA9IFtcImJ1blwiLCAvXmJ1bjovXTtcblxuICAvLyBub2RlX21vZHVsZXNcbiAgbGV0IG5vZGVNb2R1bGVzID0gWy4uLihleGlzdHNTeW5jKGpvaW4oY3dkKCksIFwibm9kZV9tb2R1bGVzXCIpKSA/IHJlYWRkaXJTeW5jKGpvaW4oY3dkKCksIFwibm9kZV9tb2R1bGVzXCIpKSA6IFtdKSwgLi4uKGV4aXN0c1N5bmMoam9pbihjd2QoKSwgXCIuLlwiLCBcIi4uXCIsIFwibm9kZV9tb2R1bGVzXCIpKSA/IHJlYWRkaXJTeW5jKGpvaW4oY3dkKCksIFwiLi5cIiwgXCIuLlwiLCBcIm5vZGVfbW9kdWxlc1wiKSkgOiBbXSldLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gIWRlcGVuZGVuY3kuc3RhcnRzV2l0aChcIi5cIikpO1xuICAvLyBlbGVjdHJvbiBleGNsdWRlXG4gIG5vZGVNb2R1bGVzID0gbm9kZU1vZHVsZXMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5ICE9PSBcImVsZWN0cm9uXCIpO1xuICAvLyBzdGFydHNXaXRoIEBcbiAgY29uc3Qgbm9kZU1vZHVsZXNSZWdFeHAgPSBub2RlTW9kdWxlcy5tYXAoKGRlcGVuZGVuY3kpID0+IChkZXBlbmRlbmN5LnN0YXJ0c1dpdGgoXCJAXCIpID8gbmV3IFJlZ0V4cChgXiR7ZGVwZW5kZW5jeX0vYCkgOiBkZXBlbmRlbmN5KSk7XG5cbiAgcmV0dXJuIFsuLi5idW4sIC4uLm5vZGVNb2R1bGVzUmVnRXhwXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29va2Jvb2tUb21sUHJvamVjdCgpOiBQcm9taXNlPGFueT4ge1xuICBjb25zdCBjb29rYm9va1RvbWxSYXcgPSBhd2FpdCByZWFkRmlsZShqb2luKGN3ZCgpLCBcIi4uXCIsIFwiLi5cIiwgXCJjb29rYm9vay50b21sXCIpLCBcInV0Zi04XCIpO1xuICBjb25zdCBjb29rYm9va1RvbWwgPSBUT01MLnBhcnNlKGNvb2tib29rVG9tbFJhdyk7XG4gIGxldCBwcm9qZWN0OiBhbnk7XG4gIGZvciAoY29uc3QgcHJvamVjdE5hbWUgaW4gY29va2Jvb2tUb21sLnByb2plY3RzIGFzIGFueSkge1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9TZWxmQ29tcGFyZTogPGV4cGxhbmF0aW9uPlxuICAgIGlmIChqb2luKGN3ZCgpKSAhPT0gam9pbihjd2QoKSwgXCIuLlwiLCBwcm9qZWN0TmFtZSkpIGNvbnRpbnVlO1xuICAgIHByb2plY3QgPSAoY29va2Jvb2tUb21sLnByb2plY3RzIGFzIGFueSlbcHJvamVjdE5hbWVdO1xuICAgIGJyZWFrO1xuICB9XG4gIGlmICghcHJvamVjdCkgdGhyb3cgbmV3IEVycm9yKFwiUHJvamVjdCBub3QgZm91bmQgaW4gY29va2Jvb2sudG9tbFwiKTtcbiAgcmV0dXJuIHByb2plY3Q7XG59XG4iLAogICAgImltcG9ydCBleHBhbmQgZnJvbSAnYnJhY2UtZXhwYW5zaW9uJztcbmltcG9ydCB7IGFzc2VydFZhbGlkUGF0dGVybiB9IGZyb20gJy4vYXNzZXJ0LXZhbGlkLXBhdHRlcm4uanMnO1xuaW1wb3J0IHsgQVNUIH0gZnJvbSAnLi9hc3QuanMnO1xuaW1wb3J0IHsgZXNjYXBlIH0gZnJvbSAnLi9lc2NhcGUuanMnO1xuaW1wb3J0IHsgdW5lc2NhcGUgfSBmcm9tICcuL3VuZXNjYXBlLmpzJztcbmV4cG9ydCBjb25zdCBtaW5pbWF0Y2ggPSAocCwgcGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgYXNzZXJ0VmFsaWRQYXR0ZXJuKHBhdHRlcm4pO1xuICAgIC8vIHNob3J0Y3V0OiBjb21tZW50cyBtYXRjaCBub3RoaW5nLlxuICAgIGlmICghb3B0aW9ucy5ub2NvbW1lbnQgJiYgcGF0dGVybi5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTWluaW1hdGNoKHBhdHRlcm4sIG9wdGlvbnMpLm1hdGNoKHApO1xufTtcbi8vIE9wdGltaXplZCBjaGVja2luZyBmb3IgdGhlIG1vc3QgY29tbW9uIGdsb2IgcGF0dGVybnMuXG5jb25zdCBzdGFyRG90RXh0UkUgPSAvXlxcKisoW14rQCE/XFwqXFxbXFwoXSopJC87XG5jb25zdCBzdGFyRG90RXh0VGVzdCA9IChleHQpID0+IChmKSA9PiAhZi5zdGFydHNXaXRoKCcuJykgJiYgZi5lbmRzV2l0aChleHQpO1xuY29uc3Qgc3RhckRvdEV4dFRlc3REb3QgPSAoZXh0KSA9PiAoZikgPT4gZi5lbmRzV2l0aChleHQpO1xuY29uc3Qgc3RhckRvdEV4dFRlc3ROb2Nhc2UgPSAoZXh0KSA9PiB7XG4gICAgZXh0ID0gZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChmKSA9PiAhZi5zdGFydHNXaXRoKCcuJykgJiYgZi50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGV4dCk7XG59O1xuY29uc3Qgc3RhckRvdEV4dFRlc3ROb2Nhc2VEb3QgPSAoZXh0KSA9PiB7XG4gICAgZXh0ID0gZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChmKSA9PiBmLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZXh0KTtcbn07XG5jb25zdCBzdGFyRG90U3RhclJFID0gL15cXCorXFwuXFwqKyQvO1xuY29uc3Qgc3RhckRvdFN0YXJUZXN0ID0gKGYpID0+ICFmLnN0YXJ0c1dpdGgoJy4nKSAmJiBmLmluY2x1ZGVzKCcuJyk7XG5jb25zdCBzdGFyRG90U3RhclRlc3REb3QgPSAoZikgPT4gZiAhPT0gJy4nICYmIGYgIT09ICcuLicgJiYgZi5pbmNsdWRlcygnLicpO1xuY29uc3QgZG90U3RhclJFID0gL15cXC5cXCorJC87XG5jb25zdCBkb3RTdGFyVGVzdCA9IChmKSA9PiBmICE9PSAnLicgJiYgZiAhPT0gJy4uJyAmJiBmLnN0YXJ0c1dpdGgoJy4nKTtcbmNvbnN0IHN0YXJSRSA9IC9eXFwqKyQvO1xuY29uc3Qgc3RhclRlc3QgPSAoZikgPT4gZi5sZW5ndGggIT09IDAgJiYgIWYuc3RhcnRzV2l0aCgnLicpO1xuY29uc3Qgc3RhclRlc3REb3QgPSAoZikgPT4gZi5sZW5ndGggIT09IDAgJiYgZiAhPT0gJy4nICYmIGYgIT09ICcuLic7XG5jb25zdCBxbWFya3NSRSA9IC9eXFw/KyhbXitAIT9cXCpcXFtcXChdKik/JC87XG5jb25zdCBxbWFya3NUZXN0Tm9jYXNlID0gKFskMCwgZXh0ID0gJyddKSA9PiB7XG4gICAgY29uc3Qgbm9leHQgPSBxbWFya3NUZXN0Tm9FeHQoWyQwXSk7XG4gICAgaWYgKCFleHQpXG4gICAgICAgIHJldHVybiBub2V4dDtcbiAgICBleHQgPSBleHQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKGYpID0+IG5vZXh0KGYpICYmIGYudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChleHQpO1xufTtcbmNvbnN0IHFtYXJrc1Rlc3ROb2Nhc2VEb3QgPSAoWyQwLCBleHQgPSAnJ10pID0+IHtcbiAgICBjb25zdCBub2V4dCA9IHFtYXJrc1Rlc3ROb0V4dERvdChbJDBdKTtcbiAgICBpZiAoIWV4dClcbiAgICAgICAgcmV0dXJuIG5vZXh0O1xuICAgIGV4dCA9IGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoZikgPT4gbm9leHQoZikgJiYgZi50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGV4dCk7XG59O1xuY29uc3QgcW1hcmtzVGVzdERvdCA9IChbJDAsIGV4dCA9ICcnXSkgPT4ge1xuICAgIGNvbnN0IG5vZXh0ID0gcW1hcmtzVGVzdE5vRXh0RG90KFskMF0pO1xuICAgIHJldHVybiAhZXh0ID8gbm9leHQgOiAoZikgPT4gbm9leHQoZikgJiYgZi5lbmRzV2l0aChleHQpO1xufTtcbmNvbnN0IHFtYXJrc1Rlc3QgPSAoWyQwLCBleHQgPSAnJ10pID0+IHtcbiAgICBjb25zdCBub2V4dCA9IHFtYXJrc1Rlc3ROb0V4dChbJDBdKTtcbiAgICByZXR1cm4gIWV4dCA/IG5vZXh0IDogKGYpID0+IG5vZXh0KGYpICYmIGYuZW5kc1dpdGgoZXh0KTtcbn07XG5jb25zdCBxbWFya3NUZXN0Tm9FeHQgPSAoWyQwXSkgPT4ge1xuICAgIGNvbnN0IGxlbiA9ICQwLmxlbmd0aDtcbiAgICByZXR1cm4gKGYpID0+IGYubGVuZ3RoID09PSBsZW4gJiYgIWYuc3RhcnRzV2l0aCgnLicpO1xufTtcbmNvbnN0IHFtYXJrc1Rlc3ROb0V4dERvdCA9IChbJDBdKSA9PiB7XG4gICAgY29uc3QgbGVuID0gJDAubGVuZ3RoO1xuICAgIHJldHVybiAoZikgPT4gZi5sZW5ndGggPT09IGxlbiAmJiBmICE9PSAnLicgJiYgZiAhPT0gJy4uJztcbn07XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmNvbnN0IGRlZmF1bHRQbGF0Zm9ybSA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzc1xuICAgID8gKHR5cGVvZiBwcm9jZXNzLmVudiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgcHJvY2Vzcy5lbnYgJiZcbiAgICAgICAgcHJvY2Vzcy5lbnYuX19NSU5JTUFUQ0hfVEVTVElOR19QTEFURk9STV9fKSB8fFxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtXG4gICAgOiAncG9zaXgnKTtcbmNvbnN0IHBhdGggPSB7XG4gICAgd2luMzI6IHsgc2VwOiAnXFxcXCcgfSxcbiAgICBwb3NpeDogeyBzZXA6ICcvJyB9LFxufTtcbi8qIGM4IGlnbm9yZSBzdG9wICovXG5leHBvcnQgY29uc3Qgc2VwID0gZGVmYXVsdFBsYXRmb3JtID09PSAnd2luMzInID8gcGF0aC53aW4zMi5zZXAgOiBwYXRoLnBvc2l4LnNlcDtcbm1pbmltYXRjaC5zZXAgPSBzZXA7XG5leHBvcnQgY29uc3QgR0xPQlNUQVIgPSBTeW1ib2woJ2dsb2JzdGFyICoqJyk7XG5taW5pbWF0Y2guR0xPQlNUQVIgPSBHTE9CU1RBUjtcbi8vIGFueSBzaW5nbGUgdGhpbmcgb3RoZXIgdGhhbiAvXG4vLyBkb24ndCBuZWVkIHRvIGVzY2FwZSAvIHdoZW4gdXNpbmcgbmV3IFJlZ0V4cCgpXG5jb25zdCBxbWFyayA9ICdbXi9dJztcbi8vICogPT4gYW55IG51bWJlciBvZiBjaGFyYWN0ZXJzXG5jb25zdCBzdGFyID0gcW1hcmsgKyAnKj8nO1xuLy8gKiogd2hlbiBkb3RzIGFyZSBhbGxvd2VkLiAgQW55dGhpbmcgZ29lcywgZXhjZXB0IC4uIGFuZCAuXG4vLyBub3QgKF4gb3IgLyBmb2xsb3dlZCBieSBvbmUgb3IgdHdvIGRvdHMgZm9sbG93ZWQgYnkgJCBvciAvKSxcbi8vIGZvbGxvd2VkIGJ5IGFueXRoaW5nLCBhbnkgbnVtYmVyIG9mIHRpbWVzLlxuY29uc3QgdHdvU3RhckRvdCA9ICcoPzooPyEoPzpcXFxcL3xeKSg/OlxcXFwuezEsMn0pKCR8XFxcXC8pKS4pKj8nO1xuLy8gbm90IGEgXiBvciAvIGZvbGxvd2VkIGJ5IGEgZG90LFxuLy8gZm9sbG93ZWQgYnkgYW55dGhpbmcsIGFueSBudW1iZXIgb2YgdGltZXMuXG5jb25zdCB0d29TdGFyTm9Eb3QgPSAnKD86KD8hKD86XFxcXC98XilcXFxcLikuKSo/JztcbmV4cG9ydCBjb25zdCBmaWx0ZXIgPSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiAocCkgPT4gbWluaW1hdGNoKHAsIHBhdHRlcm4sIG9wdGlvbnMpO1xubWluaW1hdGNoLmZpbHRlciA9IGZpbHRlcjtcbmNvbnN0IGV4dCA9IChhLCBiID0ge30pID0+IE9iamVjdC5hc3NpZ24oe30sIGEsIGIpO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRzID0gKGRlZikgPT4ge1xuICAgIGlmICghZGVmIHx8IHR5cGVvZiBkZWYgIT09ICdvYmplY3QnIHx8ICFPYmplY3Qua2V5cyhkZWYpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbWluaW1hdGNoO1xuICAgIH1cbiAgICBjb25zdCBvcmlnID0gbWluaW1hdGNoO1xuICAgIGNvbnN0IG0gPSAocCwgcGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiBvcmlnKHAsIHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihtLCB7XG4gICAgICAgIE1pbmltYXRjaDogY2xhc3MgTWluaW1hdGNoIGV4dGVuZHMgb3JpZy5NaW5pbWF0Y2gge1xuICAgICAgICAgICAgY29uc3RydWN0b3IocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICAgICAgc3VwZXIocGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGljIGRlZmF1bHRzKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZy5kZWZhdWx0cyhleHQoZGVmLCBvcHRpb25zKSkuTWluaW1hdGNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBBU1Q6IGNsYXNzIEFTVCBleHRlbmRzIG9yaWcuQVNUIHtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgY29uc3RydWN0b3IodHlwZSwgcGFyZW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgICAgICBzdXBlcih0eXBlLCBwYXJlbnQsIGV4dChkZWYsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICBzdGF0aWMgZnJvbUdsb2IocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWcuQVNULmZyb21HbG9iKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdW5lc2NhcGU6IChzLCBvcHRpb25zID0ge30pID0+IG9yaWcudW5lc2NhcGUocywgZXh0KGRlZiwgb3B0aW9ucykpLFxuICAgICAgICBlc2NhcGU6IChzLCBvcHRpb25zID0ge30pID0+IG9yaWcuZXNjYXBlKHMsIGV4dChkZWYsIG9wdGlvbnMpKSxcbiAgICAgICAgZmlsdGVyOiAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiBvcmlnLmZpbHRlcihwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSksXG4gICAgICAgIGRlZmF1bHRzOiAob3B0aW9ucykgPT4gb3JpZy5kZWZhdWx0cyhleHQoZGVmLCBvcHRpb25zKSksXG4gICAgICAgIG1ha2VSZTogKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4gb3JpZy5tYWtlUmUocGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpLFxuICAgICAgICBicmFjZUV4cGFuZDogKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4gb3JpZy5icmFjZUV4cGFuZChwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSksXG4gICAgICAgIG1hdGNoOiAobGlzdCwgcGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiBvcmlnLm1hdGNoKGxpc3QsIHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKSxcbiAgICAgICAgc2VwOiBvcmlnLnNlcCxcbiAgICAgICAgR0xPQlNUQVI6IEdMT0JTVEFSLFxuICAgIH0pO1xufTtcbm1pbmltYXRjaC5kZWZhdWx0cyA9IGRlZmF1bHRzO1xuLy8gQnJhY2UgZXhwYW5zaW9uOlxuLy8gYXtiLGN9ZCAtPiBhYmQgYWNkXG4vLyBhe2IsfWMgLT4gYWJjIGFjXG4vLyBhezAuLjN9ZCAtPiBhMGQgYTFkIGEyZCBhM2Rcbi8vIGF7Yixje2QsZX1mfWcgLT4gYWJnIGFjZGZnIGFjZWZnXG4vLyBhe2IsY31ke2UsZn1nIC0+IGFiZGVnIGFjZGVnIGFiZGVnIGFiZGZnXG4vL1xuLy8gSW52YWxpZCBzZXRzIGFyZSBub3QgZXhwYW5kZWQuXG4vLyBhezIuLn1iIC0+IGF7Mi4ufWJcbi8vIGF7Yn1jIC0+IGF7Yn1jXG5leHBvcnQgY29uc3QgYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgYXNzZXJ0VmFsaWRQYXR0ZXJuKHBhdHRlcm4pO1xuICAgIC8vIFRoYW5rcyB0byBZZXRpbmcgTGkgPGh0dHBzOi8vZ2l0aHViLmNvbS95ZXRpbmdsaT4gZm9yXG4gICAgLy8gaW1wcm92aW5nIHRoaXMgcmVnZXhwIHRvIGF2b2lkIGEgUmVET1MgdnVsbmVyYWJpbGl0eS5cbiAgICBpZiAob3B0aW9ucy5ub2JyYWNlIHx8ICEvXFx7KD86KD8hXFx7KS4pKlxcfS8udGVzdChwYXR0ZXJuKSkge1xuICAgICAgICAvLyBzaG9ydGN1dC4gbm8gbmVlZCB0byBleHBhbmQuXG4gICAgICAgIHJldHVybiBbcGF0dGVybl07XG4gICAgfVxuICAgIHJldHVybiBleHBhbmQocGF0dGVybik7XG59O1xubWluaW1hdGNoLmJyYWNlRXhwYW5kID0gYnJhY2VFeHBhbmQ7XG4vLyBwYXJzZSBhIGNvbXBvbmVudCBvZiB0aGUgZXhwYW5kZWQgc2V0LlxuLy8gQXQgdGhpcyBwb2ludCwgbm8gcGF0dGVybiBtYXkgY29udGFpbiBcIi9cIiBpbiBpdFxuLy8gc28gd2UncmUgZ29pbmcgdG8gcmV0dXJuIGEgMmQgYXJyYXksIHdoZXJlIGVhY2ggZW50cnkgaXMgdGhlIGZ1bGxcbi8vIHBhdHRlcm4sIHNwbGl0IG9uICcvJywgYW5kIHRoZW4gdHVybmVkIGludG8gYSByZWd1bGFyIGV4cHJlc3Npb24uXG4vLyBBIHJlZ2V4cCBpcyBtYWRlIGF0IHRoZSBlbmQgd2hpY2ggam9pbnMgZWFjaCBhcnJheSB3aXRoIGFuXG4vLyBlc2NhcGVkIC8sIGFuZCBhbm90aGVyIGZ1bGwgb25lIHdoaWNoIGpvaW5zIGVhY2ggcmVnZXhwIHdpdGggfC5cbi8vXG4vLyBGb2xsb3dpbmcgdGhlIGxlYWQgb2YgQmFzaCA0LjEsIG5vdGUgdGhhdCBcIioqXCIgb25seSBoYXMgc3BlY2lhbCBtZWFuaW5nXG4vLyB3aGVuIGl0IGlzIHRoZSAqb25seSogdGhpbmcgaW4gYSBwYXRoIHBvcnRpb24uICBPdGhlcndpc2UsIGFueSBzZXJpZXNcbi8vIG9mICogaXMgZXF1aXZhbGVudCB0byBhIHNpbmdsZSAqLiAgR2xvYnN0YXIgYmVoYXZpb3IgaXMgZW5hYmxlZCBieVxuLy8gZGVmYXVsdCwgYW5kIGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIG9wdGlvbnMubm9nbG9ic3Rhci5cbmV4cG9ydCBjb25zdCBtYWtlUmUgPSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiBuZXcgTWluaW1hdGNoKHBhdHRlcm4sIG9wdGlvbnMpLm1ha2VSZSgpO1xubWluaW1hdGNoLm1ha2VSZSA9IG1ha2VSZTtcbmV4cG9ydCBjb25zdCBtYXRjaCA9IChsaXN0LCBwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCBtbSA9IG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucyk7XG4gICAgbGlzdCA9IGxpc3QuZmlsdGVyKGYgPT4gbW0ubWF0Y2goZikpO1xuICAgIGlmIChtbS5vcHRpb25zLm5vbnVsbCAmJiAhbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgbGlzdC5wdXNoKHBhdHRlcm4pO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbn07XG5taW5pbWF0Y2gubWF0Y2ggPSBtYXRjaDtcbi8vIHJlcGxhY2Ugc3R1ZmYgbGlrZSBcXCogd2l0aCAqXG5jb25zdCBnbG9iTWFnaWMgPSAvWz8qXXxbK0AhXVxcKC4qP1xcKXxcXFt8XFxdLztcbmNvbnN0IHJlZ0V4cEVzY2FwZSA9IChzKSA9PiBzLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJyk7XG5leHBvcnQgY2xhc3MgTWluaW1hdGNoIHtcbiAgICBvcHRpb25zO1xuICAgIHNldDtcbiAgICBwYXR0ZXJuO1xuICAgIHdpbmRvd3NQYXRoc05vRXNjYXBlO1xuICAgIG5vbmVnYXRlO1xuICAgIG5lZ2F0ZTtcbiAgICBjb21tZW50O1xuICAgIGVtcHR5O1xuICAgIHByZXNlcnZlTXVsdGlwbGVTbGFzaGVzO1xuICAgIHBhcnRpYWw7XG4gICAgZ2xvYlNldDtcbiAgICBnbG9iUGFydHM7XG4gICAgbm9jYXNlO1xuICAgIGlzV2luZG93cztcbiAgICBwbGF0Zm9ybTtcbiAgICB3aW5kb3dzTm9NYWdpY1Jvb3Q7XG4gICAgcmVnZXhwO1xuICAgIGNvbnN0cnVjdG9yKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybik7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICAgICAgICB0aGlzLnBsYXRmb3JtID0gb3B0aW9ucy5wbGF0Zm9ybSB8fCBkZWZhdWx0UGxhdGZvcm07XG4gICAgICAgIHRoaXMuaXNXaW5kb3dzID0gdGhpcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbiAgICAgICAgdGhpcy53aW5kb3dzUGF0aHNOb0VzY2FwZSA9XG4gICAgICAgICAgICAhIW9wdGlvbnMud2luZG93c1BhdGhzTm9Fc2NhcGUgfHwgb3B0aW9ucy5hbGxvd1dpbmRvd3NFc2NhcGUgPT09IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy53aW5kb3dzUGF0aHNOb0VzY2FwZSkge1xuICAgICAgICAgICAgdGhpcy5wYXR0ZXJuID0gdGhpcy5wYXR0ZXJuLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXNlcnZlTXVsdGlwbGVTbGFzaGVzID0gISFvcHRpb25zLnByZXNlcnZlTXVsdGlwbGVTbGFzaGVzO1xuICAgICAgICB0aGlzLnJlZ2V4cCA9IG51bGw7XG4gICAgICAgIHRoaXMubmVnYXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm9uZWdhdGUgPSAhIW9wdGlvbnMubm9uZWdhdGU7XG4gICAgICAgIHRoaXMuY29tbWVudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtcHR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFydGlhbCA9ICEhb3B0aW9ucy5wYXJ0aWFsO1xuICAgICAgICB0aGlzLm5vY2FzZSA9ICEhdGhpcy5vcHRpb25zLm5vY2FzZTtcbiAgICAgICAgdGhpcy53aW5kb3dzTm9NYWdpY1Jvb3QgPVxuICAgICAgICAgICAgb3B0aW9ucy53aW5kb3dzTm9NYWdpY1Jvb3QgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gb3B0aW9ucy53aW5kb3dzTm9NYWdpY1Jvb3RcbiAgICAgICAgICAgICAgICA6ICEhKHRoaXMuaXNXaW5kb3dzICYmIHRoaXMubm9jYXNlKTtcbiAgICAgICAgdGhpcy5nbG9iU2V0ID0gW107XG4gICAgICAgIHRoaXMuZ2xvYlBhcnRzID0gW107XG4gICAgICAgIHRoaXMuc2V0ID0gW107XG4gICAgICAgIC8vIG1ha2UgdGhlIHNldCBvZiByZWdleHBzIGV0Yy5cbiAgICAgICAgdGhpcy5tYWtlKCk7XG4gICAgfVxuICAgIGhhc01hZ2ljKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1hZ2ljYWxCcmFjZXMgJiYgdGhpcy5zZXQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuc2V0KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0dGVybikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFydCAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZGVidWcoLi4uXykgeyB9XG4gICAgbWFrZSgpIHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMucGF0dGVybjtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgLy8gZW1wdHkgcGF0dGVybnMgYW5kIGNvbW1lbnRzIG1hdGNoIG5vdGhpbmcuXG4gICAgICAgIGlmICghb3B0aW9ucy5ub2NvbW1lbnQgJiYgcGF0dGVybi5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgICAgICAgICAgdGhpcy5jb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhdHRlcm4pIHtcbiAgICAgICAgICAgIHRoaXMuZW1wdHkgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHN0ZXAgMTogZmlndXJlIG91dCBuZWdhdGlvbiwgZXRjLlxuICAgICAgICB0aGlzLnBhcnNlTmVnYXRlKCk7XG4gICAgICAgIC8vIHN0ZXAgMjogZXhwYW5kIGJyYWNlc1xuICAgICAgICB0aGlzLmdsb2JTZXQgPSBbLi4ubmV3IFNldCh0aGlzLmJyYWNlRXhwYW5kKCkpXTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcgPSAoLi4uYXJncykgPT4gY29uc29sZS5lcnJvciguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgdGhpcy5nbG9iU2V0KTtcbiAgICAgICAgLy8gc3RlcCAzOiBub3cgd2UgaGF2ZSBhIHNldCwgc28gdHVybiBlYWNoIG9uZSBpbnRvIGEgc2VyaWVzIG9mXG4gICAgICAgIC8vIHBhdGgtcG9ydGlvbiBtYXRjaGluZyBwYXR0ZXJucy5cbiAgICAgICAgLy8gVGhlc2Ugd2lsbCBiZSByZWdleHBzLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgXCIqKlwiLCB3aGljaCBpc1xuICAgICAgICAvLyBzZXQgdG8gdGhlIEdMT0JTVEFSIG9iamVjdCBmb3IgZ2xvYnN0YXIgYmVoYXZpb3IsXG4gICAgICAgIC8vIGFuZCB3aWxsIG5vdCBjb250YWluIGFueSAvIGNoYXJhY3RlcnNcbiAgICAgICAgLy9cbiAgICAgICAgLy8gRmlyc3QsIHdlIHByZXByb2Nlc3MgdG8gbWFrZSB0aGUgZ2xvYiBwYXR0ZXJuIHNldHMgYSBiaXQgc2ltcGxlclxuICAgICAgICAvLyBhbmQgZGVkdXBlZC4gIFRoZXJlIGFyZSBzb21lIHBlcmYta2lsbGluZyBwYXR0ZXJucyB0aGF0IGNhbiBjYXVzZVxuICAgICAgICAvLyBwcm9ibGVtcyB3aXRoIGEgZ2xvYiB3YWxrLCBidXQgd2UgY2FuIHNpbXBsaWZ5IHRoZW0gZG93biBhIGJpdC5cbiAgICAgICAgY29uc3QgcmF3R2xvYlBhcnRzID0gdGhpcy5nbG9iU2V0Lm1hcChzID0+IHRoaXMuc2xhc2hTcGxpdChzKSk7XG4gICAgICAgIHRoaXMuZ2xvYlBhcnRzID0gdGhpcy5wcmVwcm9jZXNzKHJhd0dsb2JQYXJ0cyk7XG4gICAgICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCB0aGlzLmdsb2JQYXJ0cyk7XG4gICAgICAgIC8vIGdsb2IgLS0+IHJlZ2V4cHNcbiAgICAgICAgbGV0IHNldCA9IHRoaXMuZ2xvYlBhcnRzLm1hcCgocywgXywgX18pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzV2luZG93cyAmJiB0aGlzLndpbmRvd3NOb01hZ2ljUm9vdCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkcml2ZSBvciB1bmMgcGF0aC5cbiAgICAgICAgICAgICAgICBjb25zdCBpc1VOQyA9IHNbMF0gPT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgIHNbMV0gPT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgIChzWzJdID09PSAnPycgfHwgIWdsb2JNYWdpYy50ZXN0KHNbMl0pKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZ2xvYk1hZ2ljLnRlc3Qoc1szXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNEcml2ZSA9IC9eW2Etel06L2kudGVzdChzWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNVTkMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5zLnNsaWNlKDAsIDQpLCAuLi5zLnNsaWNlKDQpLm1hcChzcyA9PiB0aGlzLnBhcnNlKHNzKSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0RyaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbc1swXSwgLi4ucy5zbGljZSgxKS5tYXAoc3MgPT4gdGhpcy5wYXJzZShzcykpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcy5tYXAoc3MgPT4gdGhpcy5wYXJzZShzcykpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHNldCk7XG4gICAgICAgIC8vIGZpbHRlciBvdXQgZXZlcnl0aGluZyB0aGF0IGRpZG4ndCBjb21waWxlIHByb3Blcmx5LlxuICAgICAgICB0aGlzLnNldCA9IHNldC5maWx0ZXIocyA9PiBzLmluZGV4T2YoZmFsc2UpID09PSAtMSk7XG4gICAgICAgIC8vIGRvIG5vdCB0cmVhdCB0aGUgPyBpbiBVTkMgcGF0aHMgYXMgbWFnaWNcbiAgICAgICAgaWYgKHRoaXMuaXNXaW5kb3dzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMuc2V0W2ldO1xuICAgICAgICAgICAgICAgIGlmIChwWzBdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICBwWzFdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsb2JQYXJ0c1tpXVsyXSA9PT0gJz8nICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwWzNdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAvXlthLXpdOiQvaS50ZXN0KHBbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgIHBbMl0gPSAnPyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCB0aGlzLnNldCk7XG4gICAgfVxuICAgIC8vIHZhcmlvdXMgdHJhbnNmb3JtcyB0byBlcXVpdmFsZW50IHBhdHRlcm4gc2V0cyB0aGF0IGFyZVxuICAgIC8vIGZhc3RlciB0byBwcm9jZXNzIGluIGEgZmlsZXN5c3RlbSB3YWxrLiAgVGhlIGdvYWwgaXMgdG9cbiAgICAvLyBlbGltaW5hdGUgd2hhdCB3ZSBjYW4sIGFuZCBwdXNoIGFsbCAqKiBwYXR0ZXJucyBhcyBmYXJcbiAgICAvLyB0byB0aGUgcmlnaHQgYXMgcG9zc2libGUsIGV2ZW4gaWYgaXQgaW5jcmVhc2VzIHRoZSBudW1iZXJcbiAgICAvLyBvZiBwYXR0ZXJucyB0aGF0IHdlIGhhdmUgdG8gcHJvY2Vzcy5cbiAgICBwcmVwcm9jZXNzKGdsb2JQYXJ0cykge1xuICAgICAgICAvLyBpZiB3ZSdyZSBub3QgaW4gZ2xvYnN0YXIgbW9kZSwgdGhlbiB0dXJuIGFsbCAqKiBpbnRvICpcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub2dsb2JzdGFyKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdsb2JQYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ2xvYlBhcnRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnbG9iUGFydHNbaV1bal0gPT09ICcqKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JQYXJ0c1tpXVtqXSA9ICcqJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG9wdGltaXphdGlvbkxldmVsID0gMSB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBpZiAob3B0aW1pemF0aW9uTGV2ZWwgPj0gMikge1xuICAgICAgICAgICAgLy8gYWdncmVzc2l2ZSBvcHRpbWl6YXRpb24gZm9yIHRoZSBwdXJwb3NlIG9mIGZzIHdhbGtpbmdcbiAgICAgICAgICAgIGdsb2JQYXJ0cyA9IHRoaXMuZmlyc3RQaGFzZVByZVByb2Nlc3MoZ2xvYlBhcnRzKTtcbiAgICAgICAgICAgIGdsb2JQYXJ0cyA9IHRoaXMuc2Vjb25kUGhhc2VQcmVQcm9jZXNzKGdsb2JQYXJ0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW1pemF0aW9uTGV2ZWwgPj0gMSkge1xuICAgICAgICAgICAgLy8ganVzdCBiYXNpYyBvcHRpbWl6YXRpb25zIHRvIHJlbW92ZSBzb21lIC4uIHBhcnRzXG4gICAgICAgICAgICBnbG9iUGFydHMgPSB0aGlzLmxldmVsT25lT3B0aW1pemUoZ2xvYlBhcnRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGp1c3QgY29sbGFwc2UgbXVsdGlwbGUgKiogcG9ydGlvbnMgaW50byBvbmVcbiAgICAgICAgICAgIGdsb2JQYXJ0cyA9IHRoaXMuYWRqYXNjZW50R2xvYnN0YXJPcHRpbWl6ZShnbG9iUGFydHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnbG9iUGFydHM7XG4gICAgfVxuICAgIC8vIGp1c3QgZ2V0IHJpZCBvZiBhZGphc2NlbnQgKiogcG9ydGlvbnNcbiAgICBhZGphc2NlbnRHbG9ic3Rhck9wdGltaXplKGdsb2JQYXJ0cykge1xuICAgICAgICByZXR1cm4gZ2xvYlBhcnRzLm1hcChwYXJ0cyA9PiB7XG4gICAgICAgICAgICBsZXQgZ3MgPSAtMTtcbiAgICAgICAgICAgIHdoaWxlICgtMSAhPT0gKGdzID0gcGFydHMuaW5kZXhPZignKionLCBncyArIDEpKSkge1xuICAgICAgICAgICAgICAgIGxldCBpID0gZ3M7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcnRzW2kgKyAxXSA9PT0gJyoqJykge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpICE9PSBncykge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5zcGxpY2UoZ3MsIGkgLSBncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcnRzO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gZ2V0IHJpZCBvZiBhZGphc2NlbnQgKiogYW5kIHJlc29sdmUgLi4gcG9ydGlvbnNcbiAgICBsZXZlbE9uZU9wdGltaXplKGdsb2JQYXJ0cykge1xuICAgICAgICByZXR1cm4gZ2xvYlBhcnRzLm1hcChwYXJ0cyA9PiB7XG4gICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLnJlZHVjZSgoc2V0LCBwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IHNldFtzZXQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQgPT09ICcqKicgJiYgcHJldiA9PT0gJyoqJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2ICE9PSAnLi4nICYmIHByZXYgIT09ICcuJyAmJiBwcmV2ICE9PSAnKionKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldC5wdXNoKHBhcnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgICAgICB9LCBbXSk7XG4gICAgICAgICAgICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAwID8gWycnXSA6IHBhcnRzO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGV2ZWxUd29GaWxlT3B0aW1pemUocGFydHMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnRzKSkge1xuICAgICAgICAgICAgcGFydHMgPSB0aGlzLnNsYXNoU3BsaXQocGFydHMpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkaWRTb21ldGhpbmcgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgZGlkU29tZXRoaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAvLyA8cHJlPi88ZT4vPHJlc3Q+IC0+IDxwcmU+LzxyZXN0PlxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZXNlcnZlTXVsdGlwbGVTbGFzaGVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IHBhcnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzcXVlZXplIG91dCBVTkMgcGF0dGVybnNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDEgJiYgcCA9PT0gJycgJiYgcGFydHNbMF0gPT09ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwID09PSAnLicgfHwgcCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNvbWV0aGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzWzBdID09PSAnLicgJiZcbiAgICAgICAgICAgICAgICAgICAgcGFydHMubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgICAgICAgICAgIChwYXJ0c1sxXSA9PT0gJy4nIHx8IHBhcnRzWzFdID09PSAnJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlkU29tZXRoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gPHByZT4vPHA+Ly4uLzxyZXN0PiAtPiA8cHJlPi88cmVzdD5cbiAgICAgICAgICAgIGxldCBkZCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoLTEgIT09IChkZCA9IHBhcnRzLmluZGV4T2YoJy4uJywgZGQgKyAxKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gcGFydHNbZGQgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAocCAmJiBwICE9PSAnLicgJiYgcCAhPT0gJy4uJyAmJiBwICE9PSAnKionKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpZFNvbWV0aGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnNwbGljZShkZCAtIDEsIDIpO1xuICAgICAgICAgICAgICAgICAgICBkZCAtPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoZGlkU29tZXRoaW5nKTtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMCA/IFsnJ10gOiBwYXJ0cztcbiAgICB9XG4gICAgLy8gRmlyc3QgcGhhc2U6IHNpbmdsZS1wYXR0ZXJuIHByb2Nlc3NpbmdcbiAgICAvLyA8cHJlPiBpcyAxIG9yIG1vcmUgcG9ydGlvbnNcbiAgICAvLyA8cmVzdD4gaXMgMSBvciBtb3JlIHBvcnRpb25zXG4gICAgLy8gPHA+IGlzIGFueSBwb3J0aW9uIG90aGVyIHRoYW4gLiwgLi4sICcnLCBvciAqKlxuICAgIC8vIDxlPiBpcyAuIG9yICcnXG4gICAgLy9cbiAgICAvLyAqKi8uLiBpcyAqYnJ1dGFsKiBmb3IgZmlsZXN5c3RlbSB3YWxraW5nIHBlcmZvcm1hbmNlLCBiZWNhdXNlXG4gICAgLy8gaXQgZWZmZWN0aXZlbHkgcmVzZXRzIHRoZSByZWN1cnNpdmUgd2FsayBlYWNoIHRpbWUgaXQgb2NjdXJzLFxuICAgIC8vIGFuZCAqKiBjYW5ub3QgYmUgcmVkdWNlZCBvdXQgYnkgYSAuLiBwYXR0ZXJuIHBhcnQgbGlrZSBhIHJlZ2V4cFxuICAgIC8vIG9yIG1vc3Qgc3RyaW5ncyAob3RoZXIgdGhhbiAuLiwgLiwgYW5kICcnKSBjYW4gYmUuXG4gICAgLy9cbiAgICAvLyA8cHJlPi8qKi8uLi88cD4vPHA+LzxyZXN0PiAtPiB7PHByZT4vLi4vPHA+LzxwPi88cmVzdD4sPHByZT4vKiovPHA+LzxwPi88cmVzdD59XG4gICAgLy8gPHByZT4vPGU+LzxyZXN0PiAtPiA8cHJlPi88cmVzdD5cbiAgICAvLyA8cHJlPi88cD4vLi4vPHJlc3Q+IC0+IDxwcmU+LzxyZXN0PlxuICAgIC8vICoqLyoqLzxyZXN0PiAtPiAqKi88cmVzdD5cbiAgICAvL1xuICAgIC8vICoqLyovPHJlc3Q+IC0+ICovKiovPHJlc3Q+IDw9PSBub3QgdmFsaWQgYmVjYXVzZSAqKiBkb2Vzbid0IGZvbGxvd1xuICAgIC8vIHRoaXMgV09VTEQgYmUgYWxsb3dlZCBpZiAqKiBkaWQgZm9sbG93IHN5bWxpbmtzLCBvciAqIGRpZG4ndFxuICAgIGZpcnN0UGhhc2VQcmVQcm9jZXNzKGdsb2JQYXJ0cykge1xuICAgICAgICBsZXQgZGlkU29tZXRoaW5nID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGRpZFNvbWV0aGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gPHByZT4vKiovLi4vPHA+LzxwPi88cmVzdD4gLT4gezxwcmU+Ly4uLzxwPi88cD4vPHJlc3Q+LDxwcmU+LyoqLzxwPi88cD4vPHJlc3Q+fVxuICAgICAgICAgICAgZm9yIChsZXQgcGFydHMgb2YgZ2xvYlBhcnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGdzID0gLTE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKC0xICE9PSAoZ3MgPSBwYXJ0cy5pbmRleE9mKCcqKicsIGdzICsgMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBnc3MgPSBncztcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcnRzW2dzcyArIDFdID09PSAnKionKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyA8cHJlPi8qKi8qKi88cmVzdD4gLT4gPHByZT4vKiovPHJlc3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICBnc3MrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBlZywgaWYgZ3MgaXMgMiBhbmQgZ3NzIGlzIDQsIHRoYXQgbWVhbnMgd2UgaGF2ZSAzICoqXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhcnRzLCBhbmQgY2FuIHJlbW92ZSAyIG9mIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgIGlmIChnc3MgPiBncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuc3BsaWNlKGdzICsgMSwgZ3NzIC0gZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcGFydHNbZ3MgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IHBhcnRzW2dzICsgMl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAyID0gcGFydHNbZ3MgKyAzXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09ICcuLicpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBwID09PSAnLicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHAgPT09ICcuLicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFwMiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcDIgPT09ICcuJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcDIgPT09ICcuLicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRpZFNvbWV0aGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVkaXQgcGFydHMgaW4gcGxhY2UsIGFuZCBwdXNoIHRoZSBuZXcgb25lXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnNwbGljZShncywgMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyID0gcGFydHMuc2xpY2UoMCk7XG4gICAgICAgICAgICAgICAgICAgIG90aGVyW2dzXSA9ICcqKic7XG4gICAgICAgICAgICAgICAgICAgIGdsb2JQYXJ0cy5wdXNoKG90aGVyKTtcbiAgICAgICAgICAgICAgICAgICAgZ3MtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gPHByZT4vPGU+LzxyZXN0PiAtPiA8cHJlPi88cmVzdD5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucHJlc2VydmVNdWx0aXBsZVNsYXNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHNxdWVlemUgb3V0IFVOQyBwYXR0ZXJuc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDEgJiYgcCA9PT0gJycgJiYgcGFydHNbMF0gPT09ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09ICcuJyB8fCBwID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNvbWV0aGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFydHNbMF0gPT09ICcuJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAocGFydHNbMV0gPT09ICcuJyB8fCBwYXJ0c1sxXSA9PT0gJycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gPHByZT4vPHA+Ly4uLzxyZXN0PiAtPiA8cHJlPi88cmVzdD5cbiAgICAgICAgICAgICAgICBsZXQgZGQgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICgtMSAhPT0gKGRkID0gcGFydHMuaW5kZXhPZignLi4nLCBkZCArIDEpKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gcGFydHNbZGQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgJiYgcCAhPT0gJy4nICYmIHAgIT09ICcuLicgJiYgcCAhPT0gJyoqJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlkU29tZXRoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZWREb3QgPSBkZCA9PT0gMSAmJiBwYXJ0c1tkZCArIDFdID09PSAnKionO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BsaW4gPSBuZWVkRG90ID8gWycuJ10gOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnNwbGljZShkZCAtIDEsIDIsIC4uLnNwbGluKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZCAtPSAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChkaWRTb21ldGhpbmcpO1xuICAgICAgICByZXR1cm4gZ2xvYlBhcnRzO1xuICAgIH1cbiAgICAvLyBzZWNvbmQgcGhhc2U6IG11bHRpLXBhdHRlcm4gZGVkdXBlc1xuICAgIC8vIHs8cHJlPi8qLzxyZXN0Piw8cHJlPi88cD4vPHJlc3Q+fSAtPiA8cHJlPi8qLzxyZXN0PlxuICAgIC8vIHs8cHJlPi88cmVzdD4sPHByZT4vPHJlc3Q+fSAtPiA8cHJlPi88cmVzdD5cbiAgICAvLyB7PHByZT4vKiovPHJlc3Q+LDxwcmU+LzxyZXN0Pn0gLT4gPHByZT4vKiovPHJlc3Q+XG4gICAgLy9cbiAgICAvLyB7PHByZT4vKiovPHJlc3Q+LDxwcmU+LyoqLzxwPi88cmVzdD59IC0+IDxwcmU+LyoqLzxyZXN0PlxuICAgIC8vIF4tLSBub3QgdmFsaWQgYmVjYXVzZSAqKiBkb2Vucyd0IGZvbGxvdyBzeW1saW5rc1xuICAgIHNlY29uZFBoYXNlUHJlUHJvY2VzcyhnbG9iUGFydHMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnbG9iUGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBnbG9iUGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gdGhpcy5wYXJ0c01hdGNoKGdsb2JQYXJ0c1tpXSwgZ2xvYlBhcnRzW2pdLCAhdGhpcy5wcmVzZXJ2ZU11bHRpcGxlU2xhc2hlcyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYlBhcnRzW2ldID0gW107XG4gICAgICAgICAgICAgICAgICAgIGdsb2JQYXJ0c1tqXSA9IG1hdGNoZWQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2xvYlBhcnRzLmZpbHRlcihncyA9PiBncy5sZW5ndGgpO1xuICAgIH1cbiAgICBwYXJ0c01hdGNoKGEsIGIsIGVtcHR5R1NNYXRjaCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBhaSA9IDA7XG4gICAgICAgIGxldCBiaSA9IDA7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IHdoaWNoID0gJyc7XG4gICAgICAgIHdoaWxlIChhaSA8IGEubGVuZ3RoICYmIGJpIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChhW2FpXSA9PT0gYltiaV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3aGljaCA9PT0gJ2InID8gYltiaV0gOiBhW2FpXSk7XG4gICAgICAgICAgICAgICAgYWkrKztcbiAgICAgICAgICAgICAgICBiaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZW1wdHlHU01hdGNoICYmIGFbYWldID09PSAnKionICYmIGJbYmldID09PSBhW2FpICsgMV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhW2FpXSk7XG4gICAgICAgICAgICAgICAgYWkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVtcHR5R1NNYXRjaCAmJiBiW2JpXSA9PT0gJyoqJyAmJiBhW2FpXSA9PT0gYltiaSArIDFdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYltiaV0pO1xuICAgICAgICAgICAgICAgIGJpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhW2FpXSA9PT0gJyonICYmXG4gICAgICAgICAgICAgICAgYltiaV0gJiZcbiAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmRvdCB8fCAhYltiaV0uc3RhcnRzV2l0aCgnLicpKSAmJlxuICAgICAgICAgICAgICAgIGJbYmldICE9PSAnKionKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdoaWNoID09PSAnYicpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB3aGljaCA9ICdhJztcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhW2FpXSk7XG4gICAgICAgICAgICAgICAgYWkrKztcbiAgICAgICAgICAgICAgICBiaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYltiaV0gPT09ICcqJyAmJlxuICAgICAgICAgICAgICAgIGFbYWldICYmXG4gICAgICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5kb3QgfHwgIWFbYWldLnN0YXJ0c1dpdGgoJy4nKSkgJiZcbiAgICAgICAgICAgICAgICBhW2FpXSAhPT0gJyoqJykge1xuICAgICAgICAgICAgICAgIGlmICh3aGljaCA9PT0gJ2EnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgd2hpY2ggPSAnYic7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYltiaV0pO1xuICAgICAgICAgICAgICAgIGFpKys7XG4gICAgICAgICAgICAgICAgYmkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSBmYWxsIG91dCBvZiB0aGUgbG9vcCwgaXQgbWVhbnMgdGhleSB0d28gYXJlIGlkZW50aWNhbFxuICAgICAgICAvLyBhcyBsb25nIGFzIHRoZWlyIGxlbmd0aHMgbWF0Y2hcbiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiByZXN1bHQ7XG4gICAgfVxuICAgIHBhcnNlTmVnYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5ub25lZ2F0ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMucGF0dGVybjtcbiAgICAgICAgbGV0IG5lZ2F0ZSA9IGZhbHNlO1xuICAgICAgICBsZXQgbmVnYXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuLmxlbmd0aCAmJiBwYXR0ZXJuLmNoYXJBdChpKSA9PT0gJyEnOyBpKyspIHtcbiAgICAgICAgICAgIG5lZ2F0ZSA9ICFuZWdhdGU7XG4gICAgICAgICAgICBuZWdhdGVPZmZzZXQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAobmVnYXRlT2Zmc2V0KVxuICAgICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybi5zbGljZShuZWdhdGVPZmZzZXQpO1xuICAgICAgICB0aGlzLm5lZ2F0ZSA9IG5lZ2F0ZTtcbiAgICB9XG4gICAgLy8gc2V0IHBhcnRpYWwgdG8gdHJ1ZSB0byB0ZXN0IGlmLCBmb3IgZXhhbXBsZSxcbiAgICAvLyBcIi9hL2JcIiBtYXRjaGVzIHRoZSBzdGFydCBvZiBcIi8qL2IvKi9kXCJcbiAgICAvLyBQYXJ0aWFsIG1lYW5zLCBpZiB5b3UgcnVuIG91dCBvZiBmaWxlIGJlZm9yZSB5b3UgcnVuXG4gICAgLy8gb3V0IG9mIHBhdHRlcm4sIHRoZW4gdGhhdCdzIGZpbmUsIGFzIGxvbmcgYXMgYWxsXG4gICAgLy8gdGhlIHBhcnRzIG1hdGNoLlxuICAgIG1hdGNoT25lKGZpbGUsIHBhdHRlcm4sIHBhcnRpYWwgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICAvLyBVTkMgcGF0aHMgbGlrZSAvLz8vWDovLi4uIGNhbiBtYXRjaCBYOi8uLi4gYW5kIHZpY2UgdmVyc2FcbiAgICAgICAgLy8gRHJpdmUgbGV0dGVycyBpbiBhYnNvbHV0ZSBkcml2ZSBvciB1bmMgcGF0aHMgYXJlIGFsd2F5cyBjb21wYXJlZFxuICAgICAgICAvLyBjYXNlLWluc2Vuc2l0aXZlbHkuXG4gICAgICAgIGlmICh0aGlzLmlzV2luZG93cykge1xuICAgICAgICAgICAgY29uc3QgZmlsZURyaXZlID0gdHlwZW9mIGZpbGVbMF0gPT09ICdzdHJpbmcnICYmIC9eW2Etel06JC9pLnRlc3QoZmlsZVswXSk7XG4gICAgICAgICAgICBjb25zdCBmaWxlVU5DID0gIWZpbGVEcml2ZSAmJlxuICAgICAgICAgICAgICAgIGZpbGVbMF0gPT09ICcnICYmXG4gICAgICAgICAgICAgICAgZmlsZVsxXSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICBmaWxlWzJdID09PSAnPycgJiZcbiAgICAgICAgICAgICAgICAvXlthLXpdOiQvaS50ZXN0KGZpbGVbM10pO1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybkRyaXZlID0gdHlwZW9mIHBhdHRlcm5bMF0gPT09ICdzdHJpbmcnICYmIC9eW2Etel06JC9pLnRlc3QocGF0dGVyblswXSk7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuVU5DID0gIXBhdHRlcm5Ecml2ZSAmJlxuICAgICAgICAgICAgICAgIHBhdHRlcm5bMF0gPT09ICcnICYmXG4gICAgICAgICAgICAgICAgcGF0dGVyblsxXSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJuWzJdID09PSAnPycgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgcGF0dGVyblszXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAvXlthLXpdOiQvaS50ZXN0KHBhdHRlcm5bM10pO1xuICAgICAgICAgICAgY29uc3QgZmRpID0gZmlsZVVOQyA/IDMgOiBmaWxlRHJpdmUgPyAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgcGRpID0gcGF0dGVyblVOQyA/IDMgOiBwYXR0ZXJuRHJpdmUgPyAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmZGkgPT09ICdudW1iZXInICYmIHR5cGVvZiBwZGkgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2ZkLCBwZF0gPSBbZmlsZVtmZGldLCBwYXR0ZXJuW3BkaV1dO1xuICAgICAgICAgICAgICAgIGlmIChmZC50b0xvd2VyQ2FzZSgpID09PSBwZC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5bcGRpXSA9IGZkO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGRpID4gZmRpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZShwZGkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZkaSA+IHBkaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZpbGUuc2xpY2UoZmRpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyByZXNvbHZlIGFuZCByZWR1Y2UgLiBhbmQgLi4gcG9ydGlvbnMgaW4gdGhlIGZpbGUgYXMgd2VsbC5cbiAgICAgICAgLy8gZG9udCcgbmVlZCB0byBkbyB0aGUgc2Vjb25kIHBoYXNlLCBiZWNhdXNlIGl0J3Mgb25seSBvbmUgc3RyaW5nW11cbiAgICAgICAgY29uc3QgeyBvcHRpbWl6YXRpb25MZXZlbCA9IDEgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgaWYgKG9wdGltaXphdGlvbkxldmVsID49IDIpIHtcbiAgICAgICAgICAgIGZpbGUgPSB0aGlzLmxldmVsVHdvRmlsZU9wdGltaXplKGZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVidWcoJ21hdGNoT25lJywgdGhpcywgeyBmaWxlLCBwYXR0ZXJuIH0pO1xuICAgICAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZScsIGZpbGUubGVuZ3RoLCBwYXR0ZXJuLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGZpID0gMCwgcGkgPSAwLCBmbCA9IGZpbGUubGVuZ3RoLCBwbCA9IHBhdHRlcm4ubGVuZ3RoOyBmaSA8IGZsICYmIHBpIDwgcGw7IGZpKyssIHBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ21hdGNoT25lIGxvb3AnKTtcbiAgICAgICAgICAgIHZhciBwID0gcGF0dGVybltwaV07XG4gICAgICAgICAgICB2YXIgZiA9IGZpbGVbZmldO1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhwYXR0ZXJuLCBwLCBmKTtcbiAgICAgICAgICAgIC8vIHNob3VsZCBiZSBpbXBvc3NpYmxlLlxuICAgICAgICAgICAgLy8gc29tZSBpbnZhbGlkIHJlZ2V4cCBzdHVmZiBpbiB0aGUgc2V0LlxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICBpZiAocCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgaWYgKHAgPT09IEdMT0JTVEFSKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnR0xPQlNUQVInLCBbcGF0dGVybiwgcCwgZl0pO1xuICAgICAgICAgICAgICAgIC8vIFwiKipcIlxuICAgICAgICAgICAgICAgIC8vIGEvKiovYi8qKi9jIHdvdWxkIG1hdGNoIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAgICAgICAgLy8gYS9iL3gveS96L2NcbiAgICAgICAgICAgICAgICAvLyBhL3gveS96L2IvY1xuICAgICAgICAgICAgICAgIC8vIGEvYi94L2IveC9jXG4gICAgICAgICAgICAgICAgLy8gYS9iL2NcbiAgICAgICAgICAgICAgICAvLyBUbyBkbyB0aGlzLCB0YWtlIHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuIGFmdGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlICoqLCBhbmQgc2VlIGlmIGl0IHdvdWxkIG1hdGNoIHRoZSBmaWxlIHJlbWFpbmRlci5cbiAgICAgICAgICAgICAgICAvLyBJZiBzbywgcmV0dXJuIHN1Y2Nlc3MuXG4gICAgICAgICAgICAgICAgLy8gSWYgbm90LCB0aGUgKiogXCJzd2FsbG93c1wiIGEgc2VnbWVudCwgYW5kIHRyeSBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHJlY3Vyc2l2ZWx5IGF3ZnVsLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gYS8qKi9iLyoqL2MgbWF0Y2hpbmcgYS9iL3gveS96L2NcbiAgICAgICAgICAgICAgICAvLyAtIGEgbWF0Y2hlcyBhXG4gICAgICAgICAgICAgICAgLy8gLSBkb3VibGVzdGFyXG4gICAgICAgICAgICAgICAgLy8gICAtIG1hdGNoT25lKGIveC95L3ovYywgYi8qKi9jKVxuICAgICAgICAgICAgICAgIC8vICAgICAtIGIgbWF0Y2hlcyBiXG4gICAgICAgICAgICAgICAgLy8gICAgIC0gZG91Ymxlc3RhclxuICAgICAgICAgICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoeC95L3ovYywgYykgLT4gbm9cbiAgICAgICAgICAgICAgICAvLyAgICAgICAtIG1hdGNoT25lKHkvei9jLCBjKSAtPiBub1xuICAgICAgICAgICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoei9jLCBjKSAtPiBub1xuICAgICAgICAgICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoYywgYykgeWVzLCBoaXRcbiAgICAgICAgICAgICAgICB2YXIgZnIgPSBmaTtcbiAgICAgICAgICAgICAgICB2YXIgcHIgPSBwaSArIDE7XG4gICAgICAgICAgICAgICAgaWYgKHByID09PSBwbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCcqKiBhdCB0aGUgZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGEgKiogYXQgdGhlIGVuZCB3aWxsIGp1c3Qgc3dhbGxvdyB0aGUgcmVzdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhIG1hdGNoLlxuICAgICAgICAgICAgICAgICAgICAvLyBob3dldmVyLCBpdCB3aWxsIG5vdCBzd2FsbG93IC8ueCwgdW5sZXNzXG4gICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMuZG90IGlzIHNldC5cbiAgICAgICAgICAgICAgICAgICAgLy8gLiBhbmQgLi4gYXJlICpuZXZlciogbWF0Y2hlZCBieSAqKiwgZm9yIGV4cGxvc2l2ZWx5XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cG9uZW50aWFsIHJlYXNvbnMuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyBmaSA8IGZsOyBmaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVtmaV0gPT09ICcuJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVbZmldID09PSAnLi4nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFvcHRpb25zLmRvdCAmJiBmaWxlW2ZpXS5jaGFyQXQoMCkgPT09ICcuJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBvaywgbGV0J3Mgc2VlIGlmIHdlIGNhbiBzd2FsbG93IHdoYXRldmVyIHdlIGNhbi5cbiAgICAgICAgICAgICAgICB3aGlsZSAoZnIgPCBmbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3dhbGxvd2VlID0gZmlsZVtmcl07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ1xcbmdsb2JzdGFyIHdoaWxlJywgZmlsZSwgZnIsIHBhdHRlcm4sIHByLCBzd2FsbG93ZWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBYWFggcmVtb3ZlIHRoaXMgc2xpY2UuICBKdXN0IHBhc3MgdGhlIHN0YXJ0IGluZGV4LlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaE9uZShmaWxlLnNsaWNlKGZyKSwgcGF0dGVybi5zbGljZShwciksIHBhcnRpYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdnbG9ic3RhciBmb3VuZCBtYXRjaCEnLCBmciwgZmwsIHN3YWxsb3dlZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIG1hdGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBzd2FsbG93IFwiLlwiIG9yIFwiLi5cIiBldmVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIG9ubHkgc3dhbGxvdyBcIi5mb29cIiB3aGVuIGV4cGxpY2l0bHkgYXNrZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3dhbGxvd2VlID09PSAnLicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FsbG93ZWUgPT09ICcuLicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW9wdGlvbnMuZG90ICYmIHN3YWxsb3dlZS5jaGFyQXQoMCkgPT09ICcuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdkb3QgZGV0ZWN0ZWQhJywgZmlsZSwgZnIsIHBhdHRlcm4sIHByKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICoqIHN3YWxsb3dzIGEgc2VnbWVudCwgYW5kIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnZ2xvYnN0YXIgc3dhbGxvdyBhIHNlZ21lbnQsIGFuZCBjb250aW51ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnIrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBubyBtYXRjaCB3YXMgZm91bmQuXG4gICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgaW4gcGFydGlhbCBtb2RlLCB3ZSBjYW4ndCBzYXkgdGhpcyBpcyBuZWNlc3NhcmlseSBvdmVyLlxuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0aWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJhbiBvdXQgb2YgZmlsZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdcXG4+Pj4gbm8gbWF0Y2gsIHBhcnRpYWw/JywgZmlsZSwgZnIsIHBhdHRlcm4sIHByKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyID09PSBmbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiAqKlxuICAgICAgICAgICAgLy8gbm9uLW1hZ2ljIHBhdHRlcm5zIGp1c3QgaGF2ZSB0byBtYXRjaCBleGFjdGx5XG4gICAgICAgICAgICAvLyBwYXR0ZXJucyB3aXRoIG1hZ2ljIGhhdmUgYmVlbiB0dXJuZWQgaW50byByZWdleHBzLlxuICAgICAgICAgICAgbGV0IGhpdDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBoaXQgPSBmID09PSBwO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ3N0cmluZyBtYXRjaCcsIHAsIGYsIGhpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBoaXQgPSBwLnRlc3QoZik7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygncGF0dGVybiBtYXRjaCcsIHAsIGYsIGhpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhpdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogZW5kaW5nIGluIC8gbWVhbnMgdGhhdCB3ZSdsbCBnZXQgYSBmaW5hbCBcIlwiXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4uICBUaGlzIGNhbiBvbmx5IG1hdGNoIGFcbiAgICAgICAgLy8gY29ycmVzcG9uZGluZyBcIlwiIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gICAgICAgIC8vIElmIHRoZSBmaWxlIGVuZHMgaW4gLywgdGhlbiBpdCBjYW4gb25seSBtYXRjaCBhXG4gICAgICAgIC8vIGEgcGF0dGVybiB0aGF0IGVuZHMgaW4gLywgdW5sZXNzIHRoZSBwYXR0ZXJuIGp1c3RcbiAgICAgICAgLy8gZG9lc24ndCBoYXZlIGFueSBtb3JlIGZvciBpdC4gQnV0LCBhL2IvIHNob3VsZCAqbm90KlxuICAgICAgICAvLyBtYXRjaCBcImEvYi8qXCIsIGV2ZW4gdGhvdWdoIFwiXCIgbWF0Y2hlcyBhZ2FpbnN0IHRoZVxuICAgICAgICAvLyBbXi9dKj8gcGF0dGVybiwgZXhjZXB0IGluIHBhcnRpYWwgbW9kZSwgd2hlcmUgaXQgbWlnaHRcbiAgICAgICAgLy8gc2ltcGx5IG5vdCBiZSByZWFjaGVkIHlldC5cbiAgICAgICAgLy8gSG93ZXZlciwgYS9iLyBzaG91bGQgc3RpbGwgc2F0aXNmeSBhLypcbiAgICAgICAgLy8gbm93IGVpdGhlciB3ZSBmZWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLCBvciB3ZSdyZSBkb25lLlxuICAgICAgICBpZiAoZmkgPT09IGZsICYmIHBpID09PSBwbCkge1xuICAgICAgICAgICAgLy8gcmFuIG91dCBvZiBwYXR0ZXJuIGFuZCBmaWxlbmFtZSBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAgICAgICAgLy8gYW4gZXhhY3QgaGl0IVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZmkgPT09IGZsKSB7XG4gICAgICAgICAgICAvLyByYW4gb3V0IG9mIGZpbGUsIGJ1dCBzdGlsbCBoYWQgcGF0dGVybiBsZWZ0LlxuICAgICAgICAgICAgLy8gdGhpcyBpcyBvayBpZiB3ZSdyZSBkb2luZyB0aGUgbWF0Y2ggYXMgcGFydCBvZlxuICAgICAgICAgICAgLy8gYSBnbG9iIGZzIHRyYXZlcnNhbC5cbiAgICAgICAgICAgIHJldHVybiBwYXJ0aWFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBpID09PSBwbCkge1xuICAgICAgICAgICAgLy8gcmFuIG91dCBvZiBwYXR0ZXJuLCBzdGlsbCBoYXZlIGZpbGUgbGVmdC5cbiAgICAgICAgICAgIC8vIHRoaXMgaXMgb25seSBhY2NlcHRhYmxlIGlmIHdlJ3JlIG9uIHRoZSB2ZXJ5IGxhc3RcbiAgICAgICAgICAgIC8vIGVtcHR5IHNlZ21lbnQgb2YgYSBmaWxlIHdpdGggYSB0cmFpbGluZyBzbGFzaC5cbiAgICAgICAgICAgIC8vIGEvKiBzaG91bGQgbWF0Y2ggYS9iL1xuICAgICAgICAgICAgcmV0dXJuIGZpID09PSBmbCAtIDEgJiYgZmlsZVtmaV0gPT09ICcnO1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgYmUgdW5yZWFjaGFibGUuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3d0Zj8nKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgICBicmFjZUV4cGFuZCgpIHtcbiAgICAgICAgcmV0dXJuIGJyYWNlRXhwYW5kKHRoaXMucGF0dGVybiwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG4gICAgcGFyc2UocGF0dGVybikge1xuICAgICAgICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybik7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIC8vIHNob3J0Y3V0c1xuICAgICAgICBpZiAocGF0dGVybiA9PT0gJyoqJylcbiAgICAgICAgICAgIHJldHVybiBHTE9CU1RBUjtcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAvLyBmYXIgYW5kIGF3YXksIHRoZSBtb3N0IGNvbW1vbiBnbG9iIHBhdHRlcm4gcGFydHMgYXJlXG4gICAgICAgIC8vICosICouKiwgYW5kICouPGV4dD4gIEFkZCBhIGZhc3QgY2hlY2sgbWV0aG9kIGZvciB0aG9zZS5cbiAgICAgICAgbGV0IG07XG4gICAgICAgIGxldCBmYXN0VGVzdCA9IG51bGw7XG4gICAgICAgIGlmICgobSA9IHBhdHRlcm4ubWF0Y2goc3RhclJFKSkpIHtcbiAgICAgICAgICAgIGZhc3RUZXN0ID0gb3B0aW9ucy5kb3QgPyBzdGFyVGVzdERvdCA6IHN0YXJUZXN0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChtID0gcGF0dGVybi5tYXRjaChzdGFyRG90RXh0UkUpKSkge1xuICAgICAgICAgICAgZmFzdFRlc3QgPSAob3B0aW9ucy5ub2Nhc2VcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnMuZG90XG4gICAgICAgICAgICAgICAgICAgID8gc3RhckRvdEV4dFRlc3ROb2Nhc2VEb3RcbiAgICAgICAgICAgICAgICAgICAgOiBzdGFyRG90RXh0VGVzdE5vY2FzZVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5kb3RcbiAgICAgICAgICAgICAgICAgICAgPyBzdGFyRG90RXh0VGVzdERvdFxuICAgICAgICAgICAgICAgICAgICA6IHN0YXJEb3RFeHRUZXN0KShtWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobSA9IHBhdHRlcm4ubWF0Y2gocW1hcmtzUkUpKSkge1xuICAgICAgICAgICAgZmFzdFRlc3QgPSAob3B0aW9ucy5ub2Nhc2VcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnMuZG90XG4gICAgICAgICAgICAgICAgICAgID8gcW1hcmtzVGVzdE5vY2FzZURvdFxuICAgICAgICAgICAgICAgICAgICA6IHFtYXJrc1Rlc3ROb2Nhc2VcbiAgICAgICAgICAgICAgICA6IG9wdGlvbnMuZG90XG4gICAgICAgICAgICAgICAgICAgID8gcW1hcmtzVGVzdERvdFxuICAgICAgICAgICAgICAgICAgICA6IHFtYXJrc1Rlc3QpKG0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChtID0gcGF0dGVybi5tYXRjaChzdGFyRG90U3RhclJFKSkpIHtcbiAgICAgICAgICAgIGZhc3RUZXN0ID0gb3B0aW9ucy5kb3QgPyBzdGFyRG90U3RhclRlc3REb3QgOiBzdGFyRG90U3RhclRlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKG0gPSBwYXR0ZXJuLm1hdGNoKGRvdFN0YXJSRSkpKSB7XG4gICAgICAgICAgICBmYXN0VGVzdCA9IGRvdFN0YXJUZXN0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlID0gQVNULmZyb21HbG9iKHBhdHRlcm4sIHRoaXMub3B0aW9ucykudG9NTVBhdHRlcm4oKTtcbiAgICAgICAgaWYgKGZhc3RUZXN0ICYmIHR5cGVvZiByZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkcyBvdmVycmlkaW5nIGluIGZyb3plbiBlbnZpcm9ubWVudHNcbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkocmUsICd0ZXN0JywgeyB2YWx1ZTogZmFzdFRlc3QgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlO1xuICAgIH1cbiAgICBtYWtlUmUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlZ2V4cCB8fCB0aGlzLnJlZ2V4cCA9PT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWdleHA7XG4gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIHRoaXMuc2V0IGlzIGEgMmQgYXJyYXkgb2YgcGFydGlhbFxuICAgICAgICAvLyBwYXR0ZXJuIHN0cmluZ3MsIG9yIFwiKipcIi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSXQncyBiZXR0ZXIgdG8gdXNlIC5tYXRjaCgpLiAgVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3RcbiAgICAgICAgLy8gYmUgdXNlZCwgcmVhbGx5LCBidXQgaXQncyBwcmV0dHkgY29udmVuaWVudCBzb21ldGltZXMsXG4gICAgICAgIC8vIHdoZW4geW91IGp1c3Qgd2FudCB0byB3b3JrIHdpdGggYSByZWdleC5cbiAgICAgICAgY29uc3Qgc2V0ID0gdGhpcy5zZXQ7XG4gICAgICAgIGlmICghc2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5yZWdleHAgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZ2V4cDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCB0d29TdGFyID0gb3B0aW9ucy5ub2dsb2JzdGFyXG4gICAgICAgICAgICA/IHN0YXJcbiAgICAgICAgICAgIDogb3B0aW9ucy5kb3RcbiAgICAgICAgICAgICAgICA/IHR3b1N0YXJEb3RcbiAgICAgICAgICAgICAgICA6IHR3b1N0YXJOb0RvdDtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSBuZXcgU2V0KG9wdGlvbnMubm9jYXNlID8gWydpJ10gOiBbXSk7XG4gICAgICAgIC8vIHJlZ2V4cGlmeSBub24tZ2xvYnN0YXIgcGF0dGVybnNcbiAgICAgICAgLy8gaWYgKiogaXMgb25seSBpdGVtLCB0aGVuIHdlIGp1c3QgZG8gb25lIHR3b1N0YXJcbiAgICAgICAgLy8gaWYgKiogaXMgZmlyc3QsIGFuZCB0aGVyZSBhcmUgbW9yZSwgcHJlcGVuZCAoXFwvfHR3b1N0YXJcXC8pPyB0byBuZXh0XG4gICAgICAgIC8vIGlmICoqIGlzIGxhc3QsIGFwcGVuZCAoXFwvdHdvU3RhcnwpIHRvIHByZXZpb3VzXG4gICAgICAgIC8vIGlmICoqIGlzIGluIHRoZSBtaWRkbGUsIGFwcGVuZCAoXFwvfFxcL3R3b1N0YXJcXC8pIHRvIHByZXZpb3VzXG4gICAgICAgIC8vIHRoZW4gZmlsdGVyIG91dCBHTE9CU1RBUiBzeW1ib2xzXG4gICAgICAgIGxldCByZSA9IHNldFxuICAgICAgICAgICAgLm1hcChwYXR0ZXJuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBwID0gcGF0dGVybi5tYXAocCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmIG9mIHAuZmxhZ3Muc3BsaXQoJycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWRkKGYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHAgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gcmVnRXhwRXNjYXBlKHApXG4gICAgICAgICAgICAgICAgICAgIDogcCA9PT0gR0xPQlNUQVJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gR0xPQlNUQVJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcC5fc3JjO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcC5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHBwW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gcHBbaSAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChwICE9PSBHTE9CU1RBUiB8fCBwcmV2ID09PSBHTE9CU1RBUikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcmV2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCAmJiBuZXh0ICE9PSBHTE9CU1RBUikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHBbaSArIDFdID0gJyg/OlxcXFwvfCcgKyB0d29TdGFyICsgJ1xcXFwvKT8nICsgbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBwW2ldID0gdHdvU3RhcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHBbaSAtIDFdID0gcHJldiArICcoPzpcXFxcL3wnICsgdHdvU3RhciArICcpPyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgIT09IEdMT0JTVEFSKSB7XG4gICAgICAgICAgICAgICAgICAgIHBwW2kgLSAxXSA9IHByZXYgKyAnKD86XFxcXC98XFxcXC8nICsgdHdvU3RhciArICdcXFxcLyknICsgbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcHBbaSArIDFdID0gR0xPQlNUQVI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcHAuZmlsdGVyKHAgPT4gcCAhPT0gR0xPQlNUQVIpLmpvaW4oJy8nKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCd8Jyk7XG4gICAgICAgIC8vIG5lZWQgdG8gd3JhcCBpbiBwYXJlbnMgaWYgd2UgaGFkIG1vcmUgdGhhbiBvbmUgdGhpbmcgd2l0aCB8LFxuICAgICAgICAvLyBvdGhlcndpc2Ugb25seSB0aGUgZmlyc3Qgd2lsbCBiZSBhbmNob3JlZCB0byBeIGFuZCB0aGUgbGFzdCB0byAkXG4gICAgICAgIGNvbnN0IFtvcGVuLCBjbG9zZV0gPSBzZXQubGVuZ3RoID4gMSA/IFsnKD86JywgJyknXSA6IFsnJywgJyddO1xuICAgICAgICAvLyBtdXN0IG1hdGNoIGVudGlyZSBwYXR0ZXJuXG4gICAgICAgIC8vIGVuZGluZyBpbiBhICogb3IgKiogd2lsbCBtYWtlIGl0IGxlc3Mgc3RyaWN0LlxuICAgICAgICByZSA9ICdeJyArIG9wZW4gKyByZSArIGNsb3NlICsgJyQnO1xuICAgICAgICAvLyBjYW4gbWF0Y2ggYW55dGhpbmcsIGFzIGxvbmcgYXMgaXQncyBub3QgdGhpcy5cbiAgICAgICAgaWYgKHRoaXMubmVnYXRlKVxuICAgICAgICAgICAgcmUgPSAnXig/IScgKyByZSArICcpLiskJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVnZXhwID0gbmV3IFJlZ0V4cChyZSwgWy4uLmZsYWdzXS5qb2luKCcnKSk7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIC8vIHNob3VsZCBiZSBpbXBvc3NpYmxlXG4gICAgICAgICAgICB0aGlzLnJlZ2V4cCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2V4cDtcbiAgICB9XG4gICAgc2xhc2hTcGxpdChwKSB7XG4gICAgICAgIC8vIGlmIHAgc3RhcnRzIHdpdGggLy8gb24gd2luZG93cywgd2UgcHJlc2VydmUgdGhhdFxuICAgICAgICAvLyBzbyB0aGF0IFVOQyBwYXRocyBhcmVuJ3QgYnJva2VuLiAgT3RoZXJ3aXNlLCBhbnkgbnVtYmVyIG9mXG4gICAgICAgIC8vIC8gY2hhcmFjdGVycyBhcmUgY29hbGVzY2VkIGludG8gb25lLCB1bmxlc3NcbiAgICAgICAgLy8gcHJlc2VydmVNdWx0aXBsZVNsYXNoZXMgaXMgc2V0IHRvIHRydWUuXG4gICAgICAgIGlmICh0aGlzLnByZXNlcnZlTXVsdGlwbGVTbGFzaGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gcC5zcGxpdCgnLycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNXaW5kb3dzICYmIC9eXFwvXFwvW15cXC9dKy8udGVzdChwKSkge1xuICAgICAgICAgICAgLy8gYWRkIGFuIGV4dHJhICcnIGZvciB0aGUgb25lIHdlIGxvc2VcbiAgICAgICAgICAgIHJldHVybiBbJycsIC4uLnAuc3BsaXQoL1xcLysvKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcC5zcGxpdCgvXFwvKy8pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1hdGNoKGYsIHBhcnRpYWwgPSB0aGlzLnBhcnRpYWwpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZygnbWF0Y2gnLCBmLCB0aGlzLnBhdHRlcm4pO1xuICAgICAgICAvLyBzaG9ydC1jaXJjdWl0IGluIHRoZSBjYXNlIG9mIGJ1c3RlZCB0aGluZ3MuXG4gICAgICAgIC8vIGNvbW1lbnRzLCBldGMuXG4gICAgICAgIGlmICh0aGlzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbXB0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGYgPT09ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmID09PSAnLycgJiYgcGFydGlhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgLy8gd2luZG93czogbmVlZCB0byB1c2UgLywgbm90IFxcXG4gICAgICAgIGlmICh0aGlzLmlzV2luZG93cykge1xuICAgICAgICAgICAgZiA9IGYuc3BsaXQoJ1xcXFwnKS5qb2luKCcvJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHJlYXQgdGhlIHRlc3QgcGF0aCBhcyBhIHNldCBvZiBwYXRocGFydHMuXG4gICAgICAgIGNvbnN0IGZmID0gdGhpcy5zbGFzaFNwbGl0KGYpO1xuICAgICAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgJ3NwbGl0JywgZmYpO1xuICAgICAgICAvLyBqdXN0IE9ORSBvZiB0aGUgcGF0dGVybiBzZXRzIGluIHRoaXMuc2V0IG5lZWRzIHRvIG1hdGNoXG4gICAgICAgIC8vIGluIG9yZGVyIGZvciBpdCB0byBiZSB2YWxpZC4gIElmIG5lZ2F0aW5nLCB0aGVuIGp1c3Qgb25lXG4gICAgICAgIC8vIG1hdGNoIG1lYW5zIHRoYXQgd2UgaGF2ZSBmYWlsZWQuXG4gICAgICAgIC8vIEVpdGhlciB3YXksIHJldHVybiBvbiB0aGUgZmlyc3QgaGl0LlxuICAgICAgICBjb25zdCBzZXQgPSB0aGlzLnNldDtcbiAgICAgICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sICdzZXQnLCBzZXQpO1xuICAgICAgICAvLyBGaW5kIHRoZSBiYXNlbmFtZSBvZiB0aGUgcGF0aCBieSBsb29raW5nIGZvciB0aGUgbGFzdCBub24tZW1wdHkgc2VnbWVudFxuICAgICAgICBsZXQgZmlsZW5hbWUgPSBmZltmZi5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKCFmaWxlbmFtZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZmLmxlbmd0aCAtIDI7ICFmaWxlbmFtZSAmJiBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmZbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSBzZXRbaV07XG4gICAgICAgICAgICBsZXQgZmlsZSA9IGZmO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubWF0Y2hCYXNlICYmIHBhdHRlcm4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgZmlsZSA9IFtmaWxlbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoaXQgPSB0aGlzLm1hdGNoT25lKGZpbGUsIHBhdHRlcm4sIHBhcnRpYWwpO1xuICAgICAgICAgICAgaWYgKGhpdCkge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZsaXBOZWdhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5uZWdhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlkbid0IGdldCBhbnkgaGl0cy4gIHRoaXMgaXMgc3VjY2VzcyBpZiBpdCdzIGEgbmVnYXRpdmVcbiAgICAgICAgLy8gcGF0dGVybiwgZmFpbHVyZSBvdGhlcndpc2UuXG4gICAgICAgIGlmIChvcHRpb25zLmZsaXBOZWdhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGU7XG4gICAgfVxuICAgIHN0YXRpYyBkZWZhdWx0cyhkZWYpIHtcbiAgICAgICAgcmV0dXJuIG1pbmltYXRjaC5kZWZhdWx0cyhkZWYpLk1pbmltYXRjaDtcbiAgICB9XG59XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmV4cG9ydCB7IEFTVCB9IGZyb20gJy4vYXN0LmpzJztcbmV4cG9ydCB7IGVzY2FwZSB9IGZyb20gJy4vZXNjYXBlLmpzJztcbmV4cG9ydCB7IHVuZXNjYXBlIH0gZnJvbSAnLi91bmVzY2FwZS5qcyc7XG4vKiBjOCBpZ25vcmUgc3RvcCAqL1xubWluaW1hdGNoLkFTVCA9IEFTVDtcbm1pbmltYXRjaC5NaW5pbWF0Y2ggPSBNaW5pbWF0Y2g7XG5taW5pbWF0Y2guZXNjYXBlID0gZXNjYXBlO1xubWluaW1hdGNoLnVuZXNjYXBlID0gdW5lc2NhcGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgImNvbnN0IE1BWF9QQVRURVJOX0xFTkdUSCA9IDEwMjQgKiA2NDtcbmV4cG9ydCBjb25zdCBhc3NlcnRWYWxpZFBhdHRlcm4gPSAocGF0dGVybikgPT4ge1xuICAgIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXR0ZXJuJyk7XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuLmxlbmd0aCA+IE1BWF9QQVRURVJOX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXR0ZXJuIGlzIHRvbyBsb25nJyk7XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzc2VydC12YWxpZC1wYXR0ZXJuLmpzLm1hcCIsCiAgICAiLy8gdHJhbnNsYXRlIHRoZSB2YXJpb3VzIHBvc2l4IGNoYXJhY3RlciBjbGFzc2VzIGludG8gdW5pY29kZSBwcm9wZXJ0aWVzXG4vLyB0aGlzIHdvcmtzIGFjcm9zcyBhbGwgdW5pY29kZSBsb2NhbGVzXG4vLyB7IDxwb3NpeCBjbGFzcz46IFs8dHJhbnNsYXRpb24+LCAvdSBmbGFnIHJlcXVpcmVkLCBuZWdhdGVkXVxuY29uc3QgcG9zaXhDbGFzc2VzID0ge1xuICAgICdbOmFsbnVtOl0nOiBbJ1xcXFxwe0x9XFxcXHB7Tmx9XFxcXHB7TmR9JywgdHJ1ZV0sXG4gICAgJ1s6YWxwaGE6XSc6IFsnXFxcXHB7TH1cXFxccHtObH0nLCB0cnVlXSxcbiAgICAnWzphc2NpaTpdJzogWydcXFxceCcgKyAnMDAtXFxcXHgnICsgJzdmJywgZmFsc2VdLFxuICAgICdbOmJsYW5rOl0nOiBbJ1xcXFxwe1pzfVxcXFx0JywgdHJ1ZV0sXG4gICAgJ1s6Y250cmw6XSc6IFsnXFxcXHB7Q2N9JywgdHJ1ZV0sXG4gICAgJ1s6ZGlnaXQ6XSc6IFsnXFxcXHB7TmR9JywgdHJ1ZV0sXG4gICAgJ1s6Z3JhcGg6XSc6IFsnXFxcXHB7Wn1cXFxccHtDfScsIHRydWUsIHRydWVdLFxuICAgICdbOmxvd2VyOl0nOiBbJ1xcXFxwe0xsfScsIHRydWVdLFxuICAgICdbOnByaW50Ol0nOiBbJ1xcXFxwe0N9JywgdHJ1ZV0sXG4gICAgJ1s6cHVuY3Q6XSc6IFsnXFxcXHB7UH0nLCB0cnVlXSxcbiAgICAnWzpzcGFjZTpdJzogWydcXFxccHtafVxcXFx0XFxcXHJcXFxcblxcXFx2XFxcXGYnLCB0cnVlXSxcbiAgICAnWzp1cHBlcjpdJzogWydcXFxccHtMdX0nLCB0cnVlXSxcbiAgICAnWzp3b3JkOl0nOiBbJ1xcXFxwe0x9XFxcXHB7Tmx9XFxcXHB7TmR9XFxcXHB7UGN9JywgdHJ1ZV0sXG4gICAgJ1s6eGRpZ2l0Ol0nOiBbJ0EtRmEtZjAtOScsIGZhbHNlXSxcbn07XG4vLyBvbmx5IG5lZWQgdG8gZXNjYXBlIGEgZmV3IHRoaW5ncyBpbnNpZGUgb2YgYnJhY2UgZXhwcmVzc2lvbnNcbi8vIGVzY2FwZXM6IFsgXFwgXSAtXG5jb25zdCBicmFjZUVzY2FwZSA9IChzKSA9PiBzLnJlcGxhY2UoL1tbXFxdXFxcXC1dL2csICdcXFxcJCYnKTtcbi8vIGVzY2FwZSBhbGwgcmVnZXhwIG1hZ2ljIGNoYXJhY3RlcnNcbmNvbnN0IHJlZ2V4cEVzY2FwZSA9IChzKSA9PiBzLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJyk7XG4vLyBldmVyeXRoaW5nIGhhcyBhbHJlYWR5IGJlZW4gZXNjYXBlZCwgd2UganVzdCBoYXZlIHRvIGpvaW5cbmNvbnN0IHJhbmdlc1RvU3RyaW5nID0gKHJhbmdlcykgPT4gcmFuZ2VzLmpvaW4oJycpO1xuLy8gdGFrZXMgYSBnbG9iIHN0cmluZyBhdCBhIHBvc2l4IGJyYWNlIGV4cHJlc3Npb24sIGFuZCByZXR1cm5zXG4vLyBhbiBlcXVpdmFsZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBzb3VyY2UsIGFuZCBib29sZWFuIGluZGljYXRpbmdcbi8vIHdoZXRoZXIgdGhlIC91IGZsYWcgbmVlZHMgdG8gYmUgYXBwbGllZCwgYW5kIHRoZSBudW1iZXIgb2YgY2hhcnNcbi8vIGNvbnN1bWVkIHRvIHBhcnNlIHRoZSBjaGFyYWN0ZXIgY2xhc3MuXG4vLyBUaGlzIGFsc28gcmVtb3ZlcyBvdXQgb2Ygb3JkZXIgcmFuZ2VzLCBhbmQgcmV0dXJucyAoJC4pIGlmIHRoZVxuLy8gZW50aXJlIGNsYXNzIGp1c3Qgbm8gZ29vZC5cbmV4cG9ydCBjb25zdCBwYXJzZUNsYXNzID0gKGdsb2IsIHBvc2l0aW9uKSA9PiB7XG4gICAgY29uc3QgcG9zID0gcG9zaXRpb247XG4gICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgaWYgKGdsb2IuY2hhckF0KHBvcykgIT09ICdbJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbiBhIGJyYWNlIGV4cHJlc3Npb24nKTtcbiAgICB9XG4gICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICBjb25zdCByYW5nZXMgPSBbXTtcbiAgICBjb25zdCBuZWdzID0gW107XG4gICAgbGV0IGkgPSBwb3MgKyAxO1xuICAgIGxldCBzYXdTdGFydCA9IGZhbHNlO1xuICAgIGxldCB1ZmxhZyA9IGZhbHNlO1xuICAgIGxldCBlc2NhcGluZyA9IGZhbHNlO1xuICAgIGxldCBuZWdhdGUgPSBmYWxzZTtcbiAgICBsZXQgZW5kUG9zID0gcG9zO1xuICAgIGxldCByYW5nZVN0YXJ0ID0gJyc7XG4gICAgV0hJTEU6IHdoaWxlIChpIDwgZ2xvYi5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYyA9IGdsb2IuY2hhckF0KGkpO1xuICAgICAgICBpZiAoKGMgPT09ICchJyB8fCBjID09PSAnXicpICYmIGkgPT09IHBvcyArIDEpIHtcbiAgICAgICAgICAgIG5lZ2F0ZSA9IHRydWU7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA9PT0gJ10nICYmIHNhd1N0YXJ0ICYmICFlc2NhcGluZykge1xuICAgICAgICAgICAgZW5kUG9zID0gaSArIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzYXdTdGFydCA9IHRydWU7XG4gICAgICAgIGlmIChjID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGlmICghZXNjYXBpbmcpIHtcbiAgICAgICAgICAgICAgICBlc2NhcGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNjYXBlZCBcXCBjaGFyLCBmYWxsIHRocm91Z2ggYW5kIHRyZWF0IGxpa2Ugbm9ybWFsIGNoYXJcbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA9PT0gJ1snICYmICFlc2NhcGluZykge1xuICAgICAgICAgICAgLy8gZWl0aGVyIGEgcG9zaXggY2xhc3MsIGEgY29sbGF0aW9uIGVxdWl2YWxlbnQsIG9yIGp1c3QgYSBbXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtjbHMsIFt1bmlwLCB1LCBuZWddXSBvZiBPYmplY3QuZW50cmllcyhwb3NpeENsYXNzZXMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdsb2Iuc3RhcnRzV2l0aChjbHMsIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWQsIFthLVtdIGlzIGZpbmUsIGJ1dCBub3QgW2EtWzphbHBoYV1dXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyckLicsIGZhbHNlLCBnbG9iLmxlbmd0aCAtIHBvcywgdHJ1ZV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSArPSBjbHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVnKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmVncy5wdXNoKHVuaXApO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMucHVzaCh1bmlwKTtcbiAgICAgICAgICAgICAgICAgICAgdWZsYWcgPSB1ZmxhZyB8fCB1O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBXSElMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm93IGl0J3MganVzdCBhIG5vcm1hbCBjaGFyYWN0ZXIsIGVmZmVjdGl2ZWx5XG4gICAgICAgIGVzY2FwaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChyYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgICAvLyB0aHJvdyB0aGlzIHJhbmdlIGF3YXkgaWYgaXQncyBub3QgdmFsaWQsIGJ1dCBvdGhlcnNcbiAgICAgICAgICAgIC8vIGNhbiBzdGlsbCBtYXRjaC5cbiAgICAgICAgICAgIGlmIChjID4gcmFuZ2VTdGFydCkge1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKGJyYWNlRXNjYXBlKHJhbmdlU3RhcnQpICsgJy0nICsgYnJhY2VFc2NhcGUoYykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PT0gcmFuZ2VTdGFydCkge1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKGJyYWNlRXNjYXBlKGMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJhbmdlU3RhcnQgPSAnJztcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyBtaWdodCBiZSB0aGUgc3RhcnQgb2YgYSByYW5nZS5cbiAgICAgICAgLy8gY2FuIGJlIGVpdGhlciBjLWQgb3IgYy1dIG9yIGM8bW9yZS4uLj5dIG9yIGNdIGF0IHRoaXMgcG9pbnRcbiAgICAgICAgaWYgKGdsb2Iuc3RhcnRzV2l0aCgnLV0nLCBpICsgMSkpIHtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKGJyYWNlRXNjYXBlKGMgKyAnLScpKTtcbiAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnbG9iLnN0YXJ0c1dpdGgoJy0nLCBpICsgMSkpIHtcbiAgICAgICAgICAgIHJhbmdlU3RhcnQgPSBjO1xuICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm90IHRoZSBzdGFydCBvZiBhIHJhbmdlLCBqdXN0IGEgc2luZ2xlIGNoYXJhY3RlclxuICAgICAgICByYW5nZXMucHVzaChicmFjZUVzY2FwZShjKSk7XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgaWYgKGVuZFBvcyA8IGkpIHtcbiAgICAgICAgLy8gZGlkbid0IHNlZSB0aGUgZW5kIG9mIHRoZSBjbGFzcywgbm90IGEgdmFsaWQgY2xhc3MsXG4gICAgICAgIC8vIGJ1dCBtaWdodCBzdGlsbCBiZSB2YWxpZCBhcyBhIGxpdGVyYWwgbWF0Y2guXG4gICAgICAgIHJldHVybiBbJycsIGZhbHNlLCAwLCBmYWxzZV07XG4gICAgfVxuICAgIC8vIGlmIHdlIGdvdCBubyByYW5nZXMgYW5kIG5vIG5lZ2F0ZXMsIHRoZW4gd2UgaGF2ZSBhIHJhbmdlIHRoYXRcbiAgICAvLyBjYW5ub3QgcG9zc2libHkgbWF0Y2ggYW55dGhpbmcsIGFuZCB0aGF0IHBvaXNvbnMgdGhlIHdob2xlIGdsb2JcbiAgICBpZiAoIXJhbmdlcy5sZW5ndGggJiYgIW5lZ3MubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbJyQuJywgZmFsc2UsIGdsb2IubGVuZ3RoIC0gcG9zLCB0cnVlXTtcbiAgICB9XG4gICAgLy8gaWYgd2UgZ290IG9uZSBwb3NpdGl2ZSByYW5nZSwgYW5kIGl0J3MgYSBzaW5nbGUgY2hhcmFjdGVyLCB0aGVuIHRoYXQnc1xuICAgIC8vIG5vdCBhY3R1YWxseSBhIG1hZ2ljIHBhdHRlcm4sIGl0J3MganVzdCB0aGF0IG9uZSBsaXRlcmFsIGNoYXJhY3Rlci5cbiAgICAvLyB3ZSBzaG91bGQgbm90IHRyZWF0IHRoYXQgYXMgXCJtYWdpY1wiLCB3ZSBzaG91bGQganVzdCByZXR1cm4gdGhlIGxpdGVyYWxcbiAgICAvLyBjaGFyYWN0ZXIuIFtfXSBpcyBhIHBlcmZlY3RseSB2YWxpZCB3YXkgdG8gZXNjYXBlIGdsb2IgbWFnaWMgY2hhcnMuXG4gICAgaWYgKG5lZ3MubGVuZ3RoID09PSAwICYmXG4gICAgICAgIHJhbmdlcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgL15cXFxcPy4kLy50ZXN0KHJhbmdlc1swXSkgJiZcbiAgICAgICAgIW5lZ2F0ZSkge1xuICAgICAgICBjb25zdCByID0gcmFuZ2VzWzBdLmxlbmd0aCA9PT0gMiA/IHJhbmdlc1swXS5zbGljZSgtMSkgOiByYW5nZXNbMF07XG4gICAgICAgIHJldHVybiBbcmVnZXhwRXNjYXBlKHIpLCBmYWxzZSwgZW5kUG9zIC0gcG9zLCBmYWxzZV07XG4gICAgfVxuICAgIGNvbnN0IHNyYW5nZXMgPSAnWycgKyAobmVnYXRlID8gJ14nIDogJycpICsgcmFuZ2VzVG9TdHJpbmcocmFuZ2VzKSArICddJztcbiAgICBjb25zdCBzbmVncyA9ICdbJyArIChuZWdhdGUgPyAnJyA6ICdeJykgKyByYW5nZXNUb1N0cmluZyhuZWdzKSArICddJztcbiAgICBjb25zdCBjb21iID0gcmFuZ2VzLmxlbmd0aCAmJiBuZWdzLmxlbmd0aFxuICAgICAgICA/ICcoJyArIHNyYW5nZXMgKyAnfCcgKyBzbmVncyArICcpJ1xuICAgICAgICA6IHJhbmdlcy5sZW5ndGhcbiAgICAgICAgICAgID8gc3Jhbmdlc1xuICAgICAgICAgICAgOiBzbmVncztcbiAgICByZXR1cm4gW2NvbWIsIHVmbGFnLCBlbmRQb3MgLSBwb3MsIHRydWVdO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJyYWNlLWV4cHJlc3Npb25zLmpzLm1hcCIsCiAgICAiLyoqXG4gKiBVbi1lc2NhcGUgYSBzdHJpbmcgdGhhdCBoYXMgYmVlbiBlc2NhcGVkIHdpdGgge0BsaW5rIGVzY2FwZX0uXG4gKlxuICogSWYgdGhlIHtAbGluayB3aW5kb3dzUGF0aHNOb0VzY2FwZX0gb3B0aW9uIGlzIHVzZWQsIHRoZW4gc3F1YXJlLWJyYWNlXG4gKiBlc2NhcGVzIGFyZSByZW1vdmVkLCBidXQgbm90IGJhY2tzbGFzaCBlc2NhcGVzLiAgRm9yIGV4YW1wbGUsIGl0IHdpbGwgdHVyblxuICogdGhlIHN0cmluZyBgJ1sqXSdgIGludG8gYCpgLCBidXQgaXQgd2lsbCBub3QgdHVybiBgJ1xcXFwqJ2AgaW50byBgJyonYCxcbiAqIGJlY3Vhc2UgYFxcYCBpcyBhIHBhdGggc2VwYXJhdG9yIGluIGB3aW5kb3dzUGF0aHNOb0VzY2FwZWAgbW9kZS5cbiAqXG4gKiBXaGVuIGB3aW5kb3dzUGF0aHNOb0VzY2FwZWAgaXMgbm90IHNldCwgdGhlbiBib3RoIGJyYWNlIGVzY2FwZXMgYW5kXG4gKiBiYWNrc2xhc2ggZXNjYXBlcyBhcmUgcmVtb3ZlZC5cbiAqXG4gKiBTbGFzaGVzIChhbmQgYmFja3NsYXNoZXMgaW4gYHdpbmRvd3NQYXRoc05vRXNjYXBlYCBtb2RlKSBjYW5ub3QgYmUgZXNjYXBlZFxuICogb3IgdW5lc2NhcGVkLlxuICovXG5leHBvcnQgY29uc3QgdW5lc2NhcGUgPSAocywgeyB3aW5kb3dzUGF0aHNOb0VzY2FwZSA9IGZhbHNlLCB9ID0ge30pID0+IHtcbiAgICByZXR1cm4gd2luZG93c1BhdGhzTm9Fc2NhcGVcbiAgICAgICAgPyBzLnJlcGxhY2UoL1xcWyhbXlxcL1xcXFxdKVxcXS9nLCAnJDEnKVxuICAgICAgICA6IHMucmVwbGFjZSgvKCg/IVxcXFwpLnxeKVxcWyhbXlxcL1xcXFxdKVxcXS9nLCAnJDEkMicpLnJlcGxhY2UoL1xcXFwoW15cXC9dKS9nLCAnJDEnKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmVzY2FwZS5qcy5tYXAiLAogICAgIi8vIHBhcnNlIGEgc2luZ2xlIHBhdGggcG9ydGlvblxuaW1wb3J0IHsgcGFyc2VDbGFzcyB9IGZyb20gJy4vYnJhY2UtZXhwcmVzc2lvbnMuanMnO1xuaW1wb3J0IHsgdW5lc2NhcGUgfSBmcm9tICcuL3VuZXNjYXBlLmpzJztcbmNvbnN0IHR5cGVzID0gbmV3IFNldChbJyEnLCAnPycsICcrJywgJyonLCAnQCddKTtcbmNvbnN0IGlzRXh0Z2xvYlR5cGUgPSAoYykgPT4gdHlwZXMuaGFzKGMpO1xuLy8gUGF0dGVybnMgdGhhdCBnZXQgcHJlcGVuZGVkIHRvIGJpbmQgdG8gdGhlIHN0YXJ0IG9mIGVpdGhlciB0aGVcbi8vIGVudGlyZSBzdHJpbmcsIG9yIGp1c3QgYSBzaW5nbGUgcGF0aCBwb3J0aW9uLCB0byBwcmV2ZW50IGRvdHNcbi8vIGFuZC9vciB0cmF2ZXJzYWwgcGF0dGVybnMsIHdoZW4gbmVlZGVkLlxuLy8gRXh0cyBkb24ndCBuZWVkIHRoZSBeIG9yIC8gYml0LCBiZWNhdXNlIHRoZSByb290IGJpbmRzIHRoYXQgYWxyZWFkeS5cbmNvbnN0IHN0YXJ0Tm9UcmF2ZXJzYWwgPSAnKD8hKD86XnwvKVxcXFwuXFxcXC4/KD86JHwvKSknO1xuY29uc3Qgc3RhcnROb0RvdCA9ICcoPyFcXFxcLiknO1xuLy8gY2hhcmFjdGVycyB0aGF0IGluZGljYXRlIGEgc3RhcnQgb2YgcGF0dGVybiBuZWVkcyB0aGUgXCJubyBkb3RzXCIgYml0LFxuLy8gYmVjYXVzZSBhIGRvdCAqbWlnaHQqIGJlIG1hdGNoZWQuICggaXMgbm90IGluIHRoZSBsaXN0LCBiZWNhdXNlIGluXG4vLyB0aGUgY2FzZSBvZiBhIGNoaWxkIGV4dGdsb2IsIGl0IHdpbGwgaGFuZGxlIHRoZSBwcmV2ZW50aW9uIGl0c2VsZi5cbmNvbnN0IGFkZFBhdHRlcm5TdGFydCA9IG5ldyBTZXQoWydbJywgJy4nXSk7XG4vLyBjYXNlcyB3aGVyZSB0cmF2ZXJzYWwgaXMgQS1PSywgbm8gZG90IHByZXZlbnRpb24gbmVlZGVkXG5jb25zdCBqdXN0RG90cyA9IG5ldyBTZXQoWycuLicsICcuJ10pO1xuY29uc3QgcmVTcGVjaWFscyA9IG5ldyBTZXQoJygpLip7fSs/W11eJFxcXFwhJyk7XG5jb25zdCByZWdFeHBFc2NhcGUgPSAocykgPT4gcy5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZywgJ1xcXFwkJicpO1xuLy8gYW55IHNpbmdsZSB0aGluZyBvdGhlciB0aGFuIC9cbmNvbnN0IHFtYXJrID0gJ1teL10nO1xuLy8gKiA9PiBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnNcbmNvbnN0IHN0YXIgPSBxbWFyayArICcqPyc7XG4vLyB1c2UgKyB3aGVuIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgKnNvbWV0aGluZyogbWF0Y2hlcywgYmVjYXVzZSB0aGUgKiBpc1xuLy8gdGhlIG9ubHkgdGhpbmcgaW4gdGhlIHBhdGggcG9ydGlvbi5cbmNvbnN0IHN0YXJOb0VtcHR5ID0gcW1hcmsgKyAnKz8nO1xuLy8gcmVtb3ZlIHRoZSBcXCBjaGFycyB0aGF0IHdlIGFkZGVkIGlmIHdlIGVuZCB1cCBkb2luZyBhIG5vbm1hZ2ljIGNvbXBhcmVcbi8vIGNvbnN0IGRlc2xhc2ggPSAoczogc3RyaW5nKSA9PiBzLnJlcGxhY2UoL1xcXFwoLikvZywgJyQxJylcbmV4cG9ydCBjbGFzcyBBU1Qge1xuICAgIHR5cGU7XG4gICAgI3Jvb3Q7XG4gICAgI2hhc01hZ2ljO1xuICAgICN1ZmxhZyA9IGZhbHNlO1xuICAgICNwYXJ0cyA9IFtdO1xuICAgICNwYXJlbnQ7XG4gICAgI3BhcmVudEluZGV4O1xuICAgICNuZWdzO1xuICAgICNmaWxsZWROZWdzID0gZmFsc2U7XG4gICAgI29wdGlvbnM7XG4gICAgI3RvU3RyaW5nO1xuICAgIC8vIHNldCB0byB0cnVlIGlmIGl0J3MgYW4gZXh0Z2xvYiB3aXRoIG5vIGNoaWxkcmVuXG4gICAgLy8gKHdoaWNoIHJlYWxseSBtZWFucyBvbmUgY2hpbGQgb2YgJycpXG4gICAgI2VtcHR5RXh0ID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3IodHlwZSwgcGFyZW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgLy8gZXh0Z2xvYnMgYXJlIGluaGVyZW50bHkgbWFnaWNhbFxuICAgICAgICBpZiAodHlwZSlcbiAgICAgICAgICAgIHRoaXMuI2hhc01hZ2ljID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jcGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLiNyb290ID0gdGhpcy4jcGFyZW50ID8gdGhpcy4jcGFyZW50LiNyb290IDogdGhpcztcbiAgICAgICAgdGhpcy4jb3B0aW9ucyA9IHRoaXMuI3Jvb3QgPT09IHRoaXMgPyBvcHRpb25zIDogdGhpcy4jcm9vdC4jb3B0aW9ucztcbiAgICAgICAgdGhpcy4jbmVncyA9IHRoaXMuI3Jvb3QgPT09IHRoaXMgPyBbXSA6IHRoaXMuI3Jvb3QuI25lZ3M7XG4gICAgICAgIGlmICh0eXBlID09PSAnIScgJiYgIXRoaXMuI3Jvb3QuI2ZpbGxlZE5lZ3MpXG4gICAgICAgICAgICB0aGlzLiNuZWdzLnB1c2godGhpcyk7XG4gICAgICAgIHRoaXMuI3BhcmVudEluZGV4ID0gdGhpcy4jcGFyZW50ID8gdGhpcy4jcGFyZW50LiNwYXJ0cy5sZW5ndGggOiAwO1xuICAgIH1cbiAgICBnZXQgaGFzTWFnaWMoKSB7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAodGhpcy4jaGFzTWFnaWMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNoYXNNYWdpYztcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuI3BhcnRzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHAgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHAudHlwZSB8fCBwLmhhc01hZ2ljKVxuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy4jaGFzTWFnaWMgPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3RlOiB3aWxsIGJlIHVuZGVmaW5lZCB1bnRpbCB3ZSBnZW5lcmF0ZSB0aGUgcmVnZXhwIHNyYyBhbmQgZmluZCBvdXRcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hhc01hZ2ljO1xuICAgIH1cbiAgICAvLyByZWNvbnN0cnVjdHMgdGhlIHBhdHRlcm5cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMuI3RvU3RyaW5nICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jdG9TdHJpbmc7XG4gICAgICAgIGlmICghdGhpcy50eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI3RvU3RyaW5nID0gdGhpcy4jcGFydHMubWFwKHAgPT4gU3RyaW5nKHApKS5qb2luKCcnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI3RvU3RyaW5nID1cbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgKyAnKCcgKyB0aGlzLiNwYXJ0cy5tYXAocCA9PiBTdHJpbmcocCkpLmpvaW4oJ3wnKSArICcpJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2ZpbGxOZWdzKCkge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKHRoaXMgIT09IHRoaXMuI3Jvb3QpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBvbmx5IGNhbGwgb24gcm9vdCcpO1xuICAgICAgICBpZiAodGhpcy4jZmlsbGVkTmVncylcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAvLyBjYWxsIHRvU3RyaW5nKCkgb25jZSB0byBmaWxsIHRoaXMgb3V0XG4gICAgICAgIHRoaXMudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy4jZmlsbGVkTmVncyA9IHRydWU7XG4gICAgICAgIGxldCBuO1xuICAgICAgICB3aGlsZSAoKG4gPSB0aGlzLiNuZWdzLnBvcCgpKSkge1xuICAgICAgICAgICAgaWYgKG4udHlwZSAhPT0gJyEnKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gd2FsayB1cCB0aGUgdHJlZSwgYXBwZW5kaW5nIGV2ZXJ0aGluZyB0aGF0IGNvbWVzIEFGVEVSIHBhcmVudEluZGV4XG4gICAgICAgICAgICBsZXQgcCA9IG47XG4gICAgICAgICAgICBsZXQgcHAgPSBwLiNwYXJlbnQ7XG4gICAgICAgICAgICB3aGlsZSAocHApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcC4jcGFyZW50SW5kZXggKyAxOyAhcHAudHlwZSAmJiBpIDwgcHAuI3BhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBuLiNwYXJ0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgcGFydCBpbiBleHRnbG9iIEFTVD8/Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5jb3B5SW4ocHAuI3BhcnRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwID0gcHA7XG4gICAgICAgICAgICAgICAgcHAgPSBwLiNwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHB1c2goLi4ucGFydHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocCA9PT0gJycpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycgJiYgIShwIGluc3RhbmNlb2YgQVNUICYmIHAuI3BhcmVudCA9PT0gdGhpcykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGFydDogJyArIHApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIHRoaXMuI3BhcnRzLnB1c2gocCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCByZXQgPSB0aGlzLnR5cGUgPT09IG51bGxcbiAgICAgICAgICAgID8gdGhpcy4jcGFydHMuc2xpY2UoKS5tYXAocCA9PiAodHlwZW9mIHAgPT09ICdzdHJpbmcnID8gcCA6IHAudG9KU09OKCkpKVxuICAgICAgICAgICAgOiBbdGhpcy50eXBlLCAuLi50aGlzLiNwYXJ0cy5tYXAocCA9PiBwLnRvSlNPTigpKV07XG4gICAgICAgIGlmICh0aGlzLmlzU3RhcnQoKSAmJiAhdGhpcy50eXBlKVxuICAgICAgICAgICAgcmV0LnVuc2hpZnQoW10pO1xuICAgICAgICBpZiAodGhpcy5pc0VuZCgpICYmXG4gICAgICAgICAgICAodGhpcyA9PT0gdGhpcy4jcm9vdCB8fFxuICAgICAgICAgICAgICAgICh0aGlzLiNyb290LiNmaWxsZWROZWdzICYmIHRoaXMuI3BhcmVudD8udHlwZSA9PT0gJyEnKSkpIHtcbiAgICAgICAgICAgIHJldC5wdXNoKHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBpc1N0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy4jcm9vdCA9PT0gdGhpcylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBpZiAodGhpcy50eXBlKSByZXR1cm4gISF0aGlzLiNwYXJlbnQ/LmlzU3RhcnQoKVxuICAgICAgICBpZiAoIXRoaXMuI3BhcmVudD8uaXNTdGFydCgpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy4jcGFyZW50SW5kZXggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gaWYgZXZlcnl0aGluZyBBSEVBRCBvZiB0aGlzIGlzIGEgbmVnYXRpb24sIHRoZW4gaXQncyBzdGlsbCB0aGUgXCJzdGFydFwiXG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLiNwYXJlbnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy4jcGFyZW50SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcHAgPSBwLiNwYXJ0c1tpXTtcbiAgICAgICAgICAgIGlmICghKHBwIGluc3RhbmNlb2YgQVNUICYmIHBwLnR5cGUgPT09ICchJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlzRW5kKCkge1xuICAgICAgICBpZiAodGhpcy4jcm9vdCA9PT0gdGhpcylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy4jcGFyZW50Py50eXBlID09PSAnIScpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLiNwYXJlbnQ/LmlzRW5kKCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy50eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3BhcmVudD8uaXNFbmQoKTtcbiAgICAgICAgLy8gaWYgbm90IHJvb3QsIGl0J2xsIGFsd2F5cyBoYXZlIGEgcGFyZW50XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBjb25zdCBwbCA9IHRoaXMuI3BhcmVudCA/IHRoaXMuI3BhcmVudC4jcGFydHMubGVuZ3RoIDogMDtcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhcmVudEluZGV4ID09PSBwbCAtIDE7XG4gICAgfVxuICAgIGNvcHlJbihwYXJ0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICB0aGlzLnB1c2gocGFydCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucHVzaChwYXJ0LmNsb25lKHRoaXMpKTtcbiAgICB9XG4gICAgY2xvbmUocGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGMgPSBuZXcgQVNUKHRoaXMudHlwZSwgcGFyZW50KTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuI3BhcnRzKSB7XG4gICAgICAgICAgICBjLmNvcHlJbihwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgc3RhdGljICNwYXJzZUFTVChzdHIsIGFzdCwgcG9zLCBvcHQpIHtcbiAgICAgICAgbGV0IGVzY2FwaW5nID0gZmFsc2U7XG4gICAgICAgIGxldCBpbkJyYWNlID0gZmFsc2U7XG4gICAgICAgIGxldCBicmFjZVN0YXJ0ID0gLTE7XG4gICAgICAgIGxldCBicmFjZU5lZyA9IGZhbHNlO1xuICAgICAgICBpZiAoYXN0LnR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG91dHNpZGUgb2YgYSBleHRnbG9iLCBhcHBlbmQgdW50aWwgd2UgZmluZCBhIHN0YXJ0XG4gICAgICAgICAgICBsZXQgaSA9IHBvcztcbiAgICAgICAgICAgIGxldCBhY2MgPSAnJztcbiAgICAgICAgICAgIHdoaWxlIChpIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBzdHIuY2hhckF0KGkrKyk7XG4gICAgICAgICAgICAgICAgLy8gc3RpbGwgYWNjdW11bGF0ZSBlc2NhcGVzIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBkbyBpZ25vcmVcbiAgICAgICAgICAgICAgICAvLyBzdGFydHMgdGhhdCBhcmUgZXNjYXBlZFxuICAgICAgICAgICAgICAgIGlmIChlc2NhcGluZyB8fCBjID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBpbmcgPSAhZXNjYXBpbmc7XG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGluQnJhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGJyYWNlU3RhcnQgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ14nIHx8IGMgPT09ICchJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNlTmVnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09PSAnXScgJiYgIShpID09PSBicmFjZVN0YXJ0ICsgMiAmJiBicmFjZU5lZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluQnJhY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY2MgKz0gYztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICBpbkJyYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJhY2VTdGFydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyYWNlTmVnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFvcHQubm9leHQgJiYgaXNFeHRnbG9iVHlwZShjKSAmJiBzdHIuY2hhckF0KGkpID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYXN0LnB1c2goYWNjKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IG5ldyBBU1QoYywgYXN0KTtcbiAgICAgICAgICAgICAgICAgICAgaSA9IEFTVC4jcGFyc2VBU1Qoc3RyLCBleHQsIGksIG9wdCk7XG4gICAgICAgICAgICAgICAgICAgIGFzdC5wdXNoKGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhY2MgKz0gYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzdC5wdXNoKGFjYyk7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzb21lIGtpbmQgb2YgZXh0Z2xvYiwgcG9zIGlzIGF0IHRoZSAoXG4gICAgICAgIC8vIGZpbmQgdGhlIG5leHQgfCBvciApXG4gICAgICAgIGxldCBpID0gcG9zICsgMTtcbiAgICAgICAgbGV0IHBhcnQgPSBuZXcgQVNUKG51bGwsIGFzdCk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICAgIGxldCBhY2MgPSAnJztcbiAgICAgICAgd2hpbGUgKGkgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gc3RyLmNoYXJBdChpKyspO1xuICAgICAgICAgICAgLy8gc3RpbGwgYWNjdW11bGF0ZSBlc2NhcGVzIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBkbyBpZ25vcmVcbiAgICAgICAgICAgIC8vIHN0YXJ0cyB0aGF0IGFyZSBlc2NhcGVkXG4gICAgICAgICAgICBpZiAoZXNjYXBpbmcgfHwgYyA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgZXNjYXBpbmcgPSAhZXNjYXBpbmc7XG4gICAgICAgICAgICAgICAgYWNjICs9IGM7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5CcmFjZSkge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSBicmFjZVN0YXJ0ICsgMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ14nIHx8IGMgPT09ICchJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2VOZWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09ICddJyAmJiAhKGkgPT09IGJyYWNlU3RhcnQgKyAyICYmIGJyYWNlTmVnKSkge1xuICAgICAgICAgICAgICAgICAgICBpbkJyYWNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFjYyArPSBjO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgaW5CcmFjZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJhY2VTdGFydCA9IGk7XG4gICAgICAgICAgICAgICAgYnJhY2VOZWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhY2MgKz0gYztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0V4dGdsb2JUeXBlKGMpICYmIHN0ci5jaGFyQXQoaSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgIHBhcnQucHVzaChhY2MpO1xuICAgICAgICAgICAgICAgIGFjYyA9ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IG5ldyBBU1QoYywgcGFydCk7XG4gICAgICAgICAgICAgICAgcGFydC5wdXNoKGV4dCk7XG4gICAgICAgICAgICAgICAgaSA9IEFTVC4jcGFyc2VBU1Qoc3RyLCBleHQsIGksIG9wdCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PT0gJ3wnKSB7XG4gICAgICAgICAgICAgICAgcGFydC5wdXNoKGFjYyk7XG4gICAgICAgICAgICAgICAgYWNjID0gJyc7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgICAgICAgICBwYXJ0ID0gbmV3IEFTVChudWxsLCBhc3QpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09ICcpJykge1xuICAgICAgICAgICAgICAgIGlmIChhY2MgPT09ICcnICYmIGFzdC4jcGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzdC4jZW1wdHlFeHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJ0LnB1c2goYWNjKTtcbiAgICAgICAgICAgICAgICBhY2MgPSAnJztcbiAgICAgICAgICAgICAgICBhc3QucHVzaCguLi5wYXJ0cywgcGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2MgKz0gYztcbiAgICAgICAgfVxuICAgICAgICAvLyB1bmZpbmlzaGVkIGV4dGdsb2JcbiAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIGl0IHdhcyBhIG1hbGZvcm1lZCBleHRnbG9iISBub3QgYW4gZXh0Z2xvYiwgYnV0XG4gICAgICAgIC8vIG1heWJlIHNvbWV0aGluZyBlbHNlIGluIHRoZXJlLlxuICAgICAgICBhc3QudHlwZSA9IG51bGw7XG4gICAgICAgIGFzdC4jaGFzTWFnaWMgPSB1bmRlZmluZWQ7XG4gICAgICAgIGFzdC4jcGFydHMgPSBbc3RyLnN1YnN0cmluZyhwb3MgLSAxKV07XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUdsb2IocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGFzdCA9IG5ldyBBU1QobnVsbCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgICAgICAgQVNULiNwYXJzZUFTVChwYXR0ZXJuLCBhc3QsIDAsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gYXN0O1xuICAgIH1cbiAgICAvLyByZXR1cm5zIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaWYgdGhlcmUncyBtYWdpYywgb3IgdGhlIHVuZXNjYXBlZFxuICAgIC8vIHN0cmluZyBpZiBub3QuXG4gICAgdG9NTVBhdHRlcm4oKSB7XG4gICAgICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiByb290XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAodGhpcyAhPT0gdGhpcy4jcm9vdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNyb290LnRvTU1QYXR0ZXJuKCk7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIGNvbnN0IGdsb2IgPSB0aGlzLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IFtyZSwgYm9keSwgaGFzTWFnaWMsIHVmbGFnXSA9IHRoaXMudG9SZWdFeHBTb3VyY2UoKTtcbiAgICAgICAgLy8gaWYgd2UncmUgaW4gbm9jYXNlIG1vZGUsIGFuZCBub3Qgbm9jYXNlTWFnaWNPbmx5LCB0aGVuIHdlIGRvXG4gICAgICAgIC8vIHN0aWxsIG5lZWQgYSByZWd1bGFyIGV4cHJlc3Npb24gaWYgd2UgaGF2ZSB0byBjYXNlLWluc2Vuc2l0aXZlbHlcbiAgICAgICAgLy8gbWF0Y2ggY2FwaXRhbC9sb3dlcmNhc2UgY2hhcmFjdGVycy5cbiAgICAgICAgY29uc3QgYW55TWFnaWMgPSBoYXNNYWdpYyB8fFxuICAgICAgICAgICAgdGhpcy4jaGFzTWFnaWMgfHxcbiAgICAgICAgICAgICh0aGlzLiNvcHRpb25zLm5vY2FzZSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNvcHRpb25zLm5vY2FzZU1hZ2ljT25seSAmJlxuICAgICAgICAgICAgICAgIGdsb2IudG9VcHBlckNhc2UoKSAhPT0gZ2xvYi50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFhbnlNYWdpYykge1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmxhZ3MgPSAodGhpcy4jb3B0aW9ucy5ub2Nhc2UgPyAnaScgOiAnJykgKyAodWZsYWcgPyAndScgOiAnJyk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBSZWdFeHAoYF4ke3JlfSRgLCBmbGFncyksIHtcbiAgICAgICAgICAgIF9zcmM6IHJlLFxuICAgICAgICAgICAgX2dsb2I6IGdsb2IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI29wdGlvbnM7XG4gICAgfVxuICAgIC8vIHJldHVybnMgdGhlIHN0cmluZyBtYXRjaCwgdGhlIHJlZ2V4cCBzb3VyY2UsIHdoZXRoZXIgdGhlcmUncyBtYWdpY1xuICAgIC8vIGluIHRoZSByZWdleHAgKHNvIGEgcmVndWxhciBleHByZXNzaW9uIGlzIHJlcXVpcmVkKSBhbmQgd2hldGhlciBvclxuICAgIC8vIG5vdCB0aGUgdWZsYWcgaXMgbmVlZGVkIGZvciB0aGUgcmVndWxhciBleHByZXNzaW9uIChmb3IgcG9zaXggY2xhc3NlcylcbiAgICAvLyBUT0RPOiBpbnN0ZWFkIG9mIGluamVjdGluZyB0aGUgc3RhcnQvZW5kIGF0IHRoaXMgcG9pbnQsIGp1c3QgcmV0dXJuXG4gICAgLy8gdGhlIEJPRFkgb2YgdGhlIHJlZ2V4cCwgYWxvbmcgd2l0aCB0aGUgc3RhcnQvZW5kIHBvcnRpb25zIHN1aXRhYmxlXG4gICAgLy8gZm9yIGJpbmRpbmcgdGhlIHN0YXJ0L2VuZCBpbiBlaXRoZXIgYSBqb2luZWQgZnVsbC1wYXRoIG1ha2VSZSBjb250ZXh0XG4gICAgLy8gKHdoZXJlIHdlIGJpbmQgdG8gKF58LyksIG9yIGEgc3RhbmRhbG9uZSBtYXRjaFBhcnQgY29udGV4dCAod2hlcmVcbiAgICAvLyB3ZSBiaW5kIHRvIF4sIGFuZCBub3QgLykuICBPdGhlcndpc2Ugc2xhc2hlcyBnZXQgZHVwZWQhXG4gICAgLy9cbiAgICAvLyBJbiBwYXJ0LW1hdGNoaW5nIG1vZGUsIHRoZSBzdGFydCBpczpcbiAgICAvLyAtIGlmIG5vdCBpc1N0YXJ0OiBub3RoaW5nXG4gICAgLy8gLSBpZiB0cmF2ZXJzYWwgcG9zc2libGUsIGJ1dCBub3QgYWxsb3dlZDogXig/IVxcLlxcLj8kKVxuICAgIC8vIC0gaWYgZG90cyBhbGxvd2VkIG9yIG5vdCBwb3NzaWJsZTogXlxuICAgIC8vIC0gaWYgZG90cyBwb3NzaWJsZSBhbmQgbm90IGFsbG93ZWQ6IF4oPyFcXC4pXG4gICAgLy8gZW5kIGlzOlxuICAgIC8vIC0gaWYgbm90IGlzRW5kKCk6IG5vdGhpbmdcbiAgICAvLyAtIGVsc2U6ICRcbiAgICAvL1xuICAgIC8vIEluIGZ1bGwtcGF0aCBtYXRjaGluZyBtb2RlLCB3ZSBwdXQgdGhlIHNsYXNoIGF0IHRoZSBTVEFSVCBvZiB0aGVcbiAgICAvLyBwYXR0ZXJuLCBzbyBzdGFydCBpczpcbiAgICAvLyAtIGlmIGZpcnN0IHBhdHRlcm46IHNhbWUgYXMgcGFydC1tYXRjaGluZyBtb2RlXG4gICAgLy8gLSBpZiBub3QgaXNTdGFydCgpOiBub3RoaW5nXG4gICAgLy8gLSBpZiB0cmF2ZXJzYWwgcG9zc2libGUsIGJ1dCBub3QgYWxsb3dlZDogLyg/IVxcLlxcLj8oPzokfC8pKVxuICAgIC8vIC0gaWYgZG90cyBhbGxvd2VkIG9yIG5vdCBwb3NzaWJsZTogL1xuICAgIC8vIC0gaWYgZG90cyBwb3NzaWJsZSBhbmQgbm90IGFsbG93ZWQ6IC8oPyFcXC4pXG4gICAgLy8gZW5kIGlzOlxuICAgIC8vIC0gaWYgbGFzdCBwYXR0ZXJuLCBzYW1lIGFzIHBhcnQtbWF0Y2hpbmcgbW9kZVxuICAgIC8vIC0gZWxzZSBub3RoaW5nXG4gICAgLy9cbiAgICAvLyBBbHdheXMgcHV0IHRoZSAoPzokfC8pIG9uIG5lZ2F0ZWQgdGFpbHMsIHRob3VnaCwgYmVjYXVzZSB0aGF0IGhhcyB0byBiZVxuICAgIC8vIHRoZXJlIHRvIGJpbmQgdGhlIGVuZCBvZiB0aGUgbmVnYXRlZCBwYXR0ZXJuIHBvcnRpb24sIGFuZCBpdCdzIGVhc2llciB0b1xuICAgIC8vIGp1c3Qgc3RpY2sgaXQgaW4gbm93IHJhdGhlciB0aGFuIHRyeSB0byBpbmplY3QgaXQgbGF0ZXIgaW4gdGhlIG1pZGRsZSBvZlxuICAgIC8vIHRoZSBwYXR0ZXJuLlxuICAgIC8vXG4gICAgLy8gV2UgY2FuIGp1c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBlbmQsIGFuZCBsZWF2ZSBpdCB1cCB0byB0aGUgY2FsbGVyXG4gICAgLy8gdG8ga25vdyB3aGV0aGVyIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCBqb2luZWQgb3IgaW4gcGFydHMuXG4gICAgLy8gQW5kLCBpZiB0aGUgc3RhcnQgaXMgYWRqdXN0ZWQgc2xpZ2h0bHksIGNhbiBkbyB0aGUgc2FtZSB0aGVyZTpcbiAgICAvLyAtIGlmIG5vdCBpc1N0YXJ0OiBub3RoaW5nXG4gICAgLy8gLSBpZiB0cmF2ZXJzYWwgcG9zc2libGUsIGJ1dCBub3QgYWxsb3dlZDogKD86L3xeKSg/IVxcLlxcLj8kKVxuICAgIC8vIC0gaWYgZG90cyBhbGxvd2VkIG9yIG5vdCBwb3NzaWJsZTogKD86L3xeKVxuICAgIC8vIC0gaWYgZG90cyBwb3NzaWJsZSBhbmQgbm90IGFsbG93ZWQ6ICg/Oi98XikoPyFcXC4pXG4gICAgLy9cbiAgICAvLyBCdXQgaXQncyBiZXR0ZXIgdG8gaGF2ZSBhIHNpbXBsZXIgYmluZGluZyB3aXRob3V0IGEgY29uZGl0aW9uYWwsIGZvclxuICAgIC8vIHBlcmZvcm1hbmNlLCBzbyBwcm9iYWJseSBiZXR0ZXIgdG8gcmV0dXJuIGJvdGggc3RhcnQgb3B0aW9ucy5cbiAgICAvL1xuICAgIC8vIFRoZW4gdGhlIGNhbGxlciBqdXN0IGlnbm9yZXMgdGhlIGVuZCBpZiBpdCdzIG5vdCB0aGUgZmlyc3QgcGF0dGVybixcbiAgICAvLyBhbmQgdGhlIHN0YXJ0IGFsd2F5cyBnZXRzIGFwcGxpZWQuXG4gICAgLy9cbiAgICAvLyBCdXQgdGhhdCdzIGFsd2F5cyBnb2luZyB0byBiZSAkIGlmIGl0J3MgdGhlIGVuZGluZyBwYXR0ZXJuLCBvciBub3RoaW5nLFxuICAgIC8vIHNvIHRoZSBjYWxsZXIgY2FuIGp1c3QgYXR0YWNoICQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiB3aGVuIGJ1aWxkaW5nLlxuICAgIC8vXG4gICAgLy8gU28gdGhlIHRvZG8gaXM6XG4gICAgLy8gLSBiZXR0ZXIgZGV0ZWN0IHdoYXQga2luZCBvZiBzdGFydCBpcyBuZWVkZWRcbiAgICAvLyAtIHJldHVybiBib3RoIGZsYXZvcnMgb2Ygc3RhcnRpbmcgcGF0dGVyblxuICAgIC8vIC0gYXR0YWNoICQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiB3aGVuIGNyZWF0aW5nIHRoZSBhY3R1YWwgUmVnRXhwXG4gICAgLy9cbiAgICAvLyBBaCwgYnV0IHdhaXQsIG5vLCB0aGF0IGFsbCBvbmx5IGFwcGxpZXMgdG8gdGhlIHJvb3Qgd2hlbiB0aGUgZmlyc3QgcGF0dGVyblxuICAgIC8vIGlzIG5vdCBhbiBleHRnbG9iLiBJZiB0aGUgZmlyc3QgcGF0dGVybiBJUyBhbiBleHRnbG9iLCB0aGVuIHdlIG5lZWQgYWxsXG4gICAgLy8gdGhhdCBkb3QgcHJldmVudGlvbiBiaXogdG8gbGl2ZSBpbiB0aGUgZXh0Z2xvYiBwb3J0aW9ucywgYmVjYXVzZSBlZ1xuICAgIC8vICsoKnwueCopIGNhbiBtYXRjaCAueHkgYnV0IG5vdCAueXguXG4gICAgLy9cbiAgICAvLyBTbywgcmV0dXJuIHRoZSB0d28gZmxhdm9ycyBpZiBpdCdzICNyb290IGFuZCB0aGUgZmlyc3QgY2hpbGQgaXMgbm90IGFuXG4gICAgLy8gQVNULCBvdGhlcndpc2UgbGVhdmUgaXQgdG8gdGhlIGNoaWxkIEFTVCB0byBoYW5kbGUgaXQsIGFuZCB0aGVyZSxcbiAgICAvLyB1c2UgdGhlICg/Ol58Lykgc3R5bGUgb2Ygc3RhcnQgYmluZGluZy5cbiAgICAvL1xuICAgIC8vIEV2ZW4gc2ltcGxpZmllZCBmdXJ0aGVyOlxuICAgIC8vIC0gU2luY2UgdGhlIHN0YXJ0IGZvciBhIGpvaW4gaXMgZWcgLyg/IVxcLikgYW5kIHRoZSBzdGFydCBmb3IgYSBwYXJ0XG4gICAgLy8gaXMgXig/IVxcLiksIHdlIGNhbiBqdXN0IHByZXBlbmQgKD8hXFwuKSB0byB0aGUgcGF0dGVybiAoZWl0aGVyIHJvb3RcbiAgICAvLyBvciBzdGFydCBvciB3aGF0ZXZlcikgYW5kIHByZXBlbmQgXiBvciAvIGF0IHRoZSBSZWdleHAgY29uc3RydWN0aW9uLlxuICAgIHRvUmVnRXhwU291cmNlKGFsbG93RG90KSB7XG4gICAgICAgIGNvbnN0IGRvdCA9IGFsbG93RG90ID8/ICEhdGhpcy4jb3B0aW9ucy5kb3Q7XG4gICAgICAgIGlmICh0aGlzLiNyb290ID09PSB0aGlzKVxuICAgICAgICAgICAgdGhpcy4jZmlsbE5lZ3MoKTtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vRW1wdHkgPSB0aGlzLmlzU3RhcnQoKSAmJiB0aGlzLmlzRW5kKCk7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSB0aGlzLiNwYXJ0c1xuICAgICAgICAgICAgICAgIC5tYXAocCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3JlLCBfLCBoYXNNYWdpYywgdWZsYWddID0gdHlwZW9mIHAgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gQVNULiNwYXJzZUdsb2IocCwgdGhpcy4jaGFzTWFnaWMsIG5vRW1wdHkpXG4gICAgICAgICAgICAgICAgICAgIDogcC50b1JlZ0V4cFNvdXJjZShhbGxvd0RvdCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jaGFzTWFnaWMgPSB0aGlzLiNoYXNNYWdpYyB8fCBoYXNNYWdpYztcbiAgICAgICAgICAgICAgICB0aGlzLiN1ZmxhZyA9IHRoaXMuI3VmbGFnIHx8IHVmbGFnO1xuICAgICAgICAgICAgICAgIHJldHVybiByZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1N0YXJ0KCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuI3BhcnRzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBzdHJpbmcgdGhhdCB3aWxsIG1hdGNoIHRoZSBzdGFydCBvZiB0aGUgcGF0dGVybixcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgZG90cyBhbmQgc3VjaC5cbiAgICAgICAgICAgICAgICAgICAgLy8gJy4nIGFuZCAnLi4nIGNhbm5vdCBtYXRjaCB1bmxlc3MgdGhlIHBhdHRlcm4gaXMgdGhhdCBleGFjdGx5LFxuICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIGl0IHN0YXJ0cyB3aXRoIC4gb3IgZG90OnRydWUgaXMgc2V0LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3RUcmF2QWxsb3dlZCA9IHRoaXMuI3BhcnRzLmxlbmd0aCA9PT0gMSAmJiBqdXN0RG90cy5oYXModGhpcy4jcGFydHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRvdFRyYXZBbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHMgPSBhZGRQYXR0ZXJuU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIGEgcG9zc2liaWxpdHkgb2YgbWF0Y2hpbmcgLiBvciAuLixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50IHRoYXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZWVkTm9UcmF2ID0gXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3RzIGFyZSBhbGxvd2VkLCBhbmQgdGhlIHBhdHRlcm4gc3RhcnRzIHdpdGggWyBvciAuXG4gICAgICAgICAgICAgICAgICAgICAgICAoZG90ICYmIGFwcy5oYXMoc3JjLmNoYXJBdCgwKSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBhdHRlcm4gc3RhcnRzIHdpdGggXFwuLCBhbmQgdGhlbiBbIG9yIC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjLnN0YXJ0c1dpdGgoJ1xcXFwuJykgJiYgYXBzLmhhcyhzcmMuY2hhckF0KDIpKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGF0dGVybiBzdGFydHMgd2l0aCBcXC5cXC4sIGFuZCB0aGVuIFsgb3IgLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmMuc3RhcnRzV2l0aCgnXFxcXC5cXFxcLicpICYmIGFwcy5oYXMoc3JjLmNoYXJBdCg0KSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBwcmV2ZW50IGRvdHMgaWYgaXQgY2FuJ3QgbWF0Y2ggYSBkb3QsIG9yIGlmIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Yi1wYXR0ZXJuIHdpbGwgYmUgcHJldmVudGluZyBpdCBhbnl3YXkuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZWVkTm9Eb3QgPSAhZG90ICYmICFhbGxvd0RvdCAmJiBhcHMuaGFzKHNyYy5jaGFyQXQoMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBuZWVkTm9UcmF2ID8gc3RhcnROb1RyYXZlcnNhbCA6IG5lZWROb0RvdCA/IHN0YXJ0Tm9Eb3QgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFwcGVuZCB0aGUgXCJlbmQgb2YgcGF0aCBwb3J0aW9uXCIgcGF0dGVybiB0byBuZWdhdGlvbiB0YWlsc1xuICAgICAgICAgICAgbGV0IGVuZCA9ICcnO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQoKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuI3Jvb3QuI2ZpbGxlZE5lZ3MgJiZcbiAgICAgICAgICAgICAgICB0aGlzLiNwYXJlbnQ/LnR5cGUgPT09ICchJykge1xuICAgICAgICAgICAgICAgIGVuZCA9ICcoPzokfFxcXFwvKSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaW5hbCA9IHN0YXJ0ICsgc3JjICsgZW5kO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBmaW5hbCxcbiAgICAgICAgICAgICAgICB1bmVzY2FwZShzcmMpLFxuICAgICAgICAgICAgICAgICh0aGlzLiNoYXNNYWdpYyA9ICEhdGhpcy4jaGFzTWFnaWMpLFxuICAgICAgICAgICAgICAgIHRoaXMuI3VmbGFnLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgYm9keSAqdHdpY2UqIGlmIGl0J3MgYSByZXBlYXQgcGF0dGVyblxuICAgICAgICAvLyBhdCB0aGUgc3RhcnQsIG9uY2UgaW4gbm9kb3QgbW9kZSwgdGhlbiBhZ2FpbiBpbiBkb3QgbW9kZSwgc28gYVxuICAgICAgICAvLyBwYXR0ZXJuIGxpa2UgKig/KSBjYW4gbWF0Y2ggJ3gueSdcbiAgICAgICAgY29uc3QgcmVwZWF0ZWQgPSB0aGlzLnR5cGUgPT09ICcqJyB8fCB0aGlzLnR5cGUgPT09ICcrJztcbiAgICAgICAgLy8gc29tZSBraW5kIG9mIGV4dGdsb2JcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnR5cGUgPT09ICchJyA/ICcoPzooPyEoPzonIDogJyg/Oic7XG4gICAgICAgIGxldCBib2R5ID0gdGhpcy4jcGFydHNUb1JlZ0V4cChkb3QpO1xuICAgICAgICBpZiAodGhpcy5pc1N0YXJ0KCkgJiYgdGhpcy5pc0VuZCgpICYmICFib2R5ICYmIHRoaXMudHlwZSAhPT0gJyEnKSB7XG4gICAgICAgICAgICAvLyBpbnZhbGlkIGV4dGdsb2IsIGhhcyB0byBhdCBsZWFzdCBiZSAqc29tZXRoaW5nKiBwcmVzZW50LCBpZiBpdCdzXG4gICAgICAgICAgICAvLyB0aGUgZW50aXJlIHBhdGggcG9ydGlvbi5cbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLiNwYXJ0cyA9IFtzXTtcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLiNoYXNNYWdpYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBbcywgdW5lc2NhcGUodGhpcy50b1N0cmluZygpKSwgZmFsc2UsIGZhbHNlXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBYWFggYWJzdHJhY3Qgb3V0IHRoaXMgbWFwIG1ldGhvZFxuICAgICAgICBsZXQgYm9keURvdEFsbG93ZWQgPSAhcmVwZWF0ZWQgfHwgYWxsb3dEb3QgfHwgZG90IHx8ICFzdGFydE5vRG90XG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IHRoaXMuI3BhcnRzVG9SZWdFeHAodHJ1ZSk7XG4gICAgICAgIGlmIChib2R5RG90QWxsb3dlZCA9PT0gYm9keSkge1xuICAgICAgICAgICAgYm9keURvdEFsbG93ZWQgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYm9keURvdEFsbG93ZWQpIHtcbiAgICAgICAgICAgIGJvZHkgPSBgKD86JHtib2R5fSkoPzoke2JvZHlEb3RBbGxvd2VkfSkqP2A7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYW4gZW1wdHkgISgpIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byBhIHN0YXJOb0VtcHR5XG4gICAgICAgIGxldCBmaW5hbCA9ICcnO1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnIScgJiYgdGhpcy4jZW1wdHlFeHQpIHtcbiAgICAgICAgICAgIGZpbmFsID0gKHRoaXMuaXNTdGFydCgpICYmICFkb3QgPyBzdGFydE5vRG90IDogJycpICsgc3Rhck5vRW1wdHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjbG9zZSA9IHRoaXMudHlwZSA9PT0gJyEnXG4gICAgICAgICAgICAgICAgPyAvLyAhKCkgbXVzdCBtYXRjaCBzb21ldGhpbmcsYnV0ICEoeCkgY2FuIG1hdGNoICcnXG4gICAgICAgICAgICAgICAgICAgICcpKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuaXNTdGFydCgpICYmICFkb3QgJiYgIWFsbG93RG90ID8gc3RhcnROb0RvdCA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcpJ1xuICAgICAgICAgICAgICAgIDogdGhpcy50eXBlID09PSAnQCdcbiAgICAgICAgICAgICAgICAgICAgPyAnKSdcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnR5cGUgPT09ICc/J1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnKT8nXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMudHlwZSA9PT0gJysnICYmIGJvZHlEb3RBbGxvd2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnKSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMudHlwZSA9PT0gJyonICYmIGJvZHlEb3RBbGxvd2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYCk/YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGApJHt0aGlzLnR5cGV9YDtcbiAgICAgICAgICAgIGZpbmFsID0gc3RhcnQgKyBib2R5ICsgY2xvc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGZpbmFsLFxuICAgICAgICAgICAgdW5lc2NhcGUoYm9keSksXG4gICAgICAgICAgICAodGhpcy4jaGFzTWFnaWMgPSAhIXRoaXMuI2hhc01hZ2ljKSxcbiAgICAgICAgICAgIHRoaXMuI3VmbGFnLFxuICAgICAgICBdO1xuICAgIH1cbiAgICAjcGFydHNUb1JlZ0V4cChkb3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhcnRzXG4gICAgICAgICAgICAubWFwKHAgPT4ge1xuICAgICAgICAgICAgLy8gZXh0Z2xvYiBBU1RzIHNob3VsZCBvbmx5IGNvbnRhaW4gcGFyZW50IEFTVHNcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIHR5cGUgaW4gZXh0Z2xvYiBhc3Q/PycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIC8vIGNhbiBpZ25vcmUgaGFzTWFnaWMsIGJlY2F1c2UgZXh0Z2xvYnMgYXJlIGFscmVhZHkgYWx3YXlzIG1hZ2ljXG4gICAgICAgICAgICBjb25zdCBbcmUsIF8sIF9oYXNNYWdpYywgdWZsYWddID0gcC50b1JlZ0V4cFNvdXJjZShkb3QpO1xuICAgICAgICAgICAgdGhpcy4jdWZsYWcgPSB0aGlzLiN1ZmxhZyB8fCB1ZmxhZztcbiAgICAgICAgICAgIHJldHVybiByZTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIocCA9PiAhKHRoaXMuaXNTdGFydCgpICYmIHRoaXMuaXNFbmQoKSkgfHwgISFwKVxuICAgICAgICAgICAgLmpvaW4oJ3wnKTtcbiAgICB9XG4gICAgc3RhdGljICNwYXJzZUdsb2IoZ2xvYiwgaGFzTWFnaWMsIG5vRW1wdHkgPSBmYWxzZSkge1xuICAgICAgICBsZXQgZXNjYXBpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJlID0gJyc7XG4gICAgICAgIGxldCB1ZmxhZyA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdsb2IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBnbG9iLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGlmIChlc2NhcGluZykge1xuICAgICAgICAgICAgICAgIGVzY2FwaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmUgKz0gKHJlU3BlY2lhbHMuaGFzKGMpID8gJ1xcXFwnIDogJycpICsgYztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gZ2xvYi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlICs9ICdcXFxcXFxcXCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlc2NhcGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09ICdbJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzcmMsIG5lZWRVZmxhZywgY29uc3VtZWQsIG1hZ2ljXSA9IHBhcnNlQ2xhc3MoZ2xvYiwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlICs9IHNyYztcbiAgICAgICAgICAgICAgICAgICAgdWZsYWcgPSB1ZmxhZyB8fCBuZWVkVWZsYWc7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gY29uc3VtZWQgLSAxO1xuICAgICAgICAgICAgICAgICAgICBoYXNNYWdpYyA9IGhhc01hZ2ljIHx8IG1hZ2ljO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vRW1wdHkgJiYgZ2xvYiA9PT0gJyonKVxuICAgICAgICAgICAgICAgICAgICByZSArPSBzdGFyTm9FbXB0eTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlICs9IHN0YXI7XG4gICAgICAgICAgICAgICAgaGFzTWFnaWMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09ICc/Jykge1xuICAgICAgICAgICAgICAgIHJlICs9IHFtYXJrO1xuICAgICAgICAgICAgICAgIGhhc01hZ2ljID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlICs9IHJlZ0V4cEVzY2FwZShjKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3JlLCB1bmVzY2FwZShnbG9iKSwgISFoYXNNYWdpYywgdWZsYWddO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzdC5qcy5tYXAiLAogICAgIi8qKlxuICogRXNjYXBlIGFsbCBtYWdpYyBjaGFyYWN0ZXJzIGluIGEgZ2xvYiBwYXR0ZXJuLlxuICpcbiAqIElmIHRoZSB7QGxpbmsgd2luZG93c1BhdGhzTm9Fc2NhcGUgfCBHbG9iT3B0aW9ucy53aW5kb3dzUGF0aHNOb0VzY2FwZX1cbiAqIG9wdGlvbiBpcyB1c2VkLCB0aGVuIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgYnkgd3JhcHBpbmcgaW4gYFtdYCwgYmVjYXVzZVxuICogYSBtYWdpYyBjaGFyYWN0ZXIgd3JhcHBlZCBpbiBhIGNoYXJhY3RlciBjbGFzcyBjYW4gb25seSBiZSBzYXRpc2ZpZWQgYnlcbiAqIHRoYXQgZXhhY3QgY2hhcmFjdGVyLiAgSW4gdGhpcyBtb2RlLCBgXFxgIGlzIF9ub3RfIGVzY2FwZWQsIGJlY2F1c2UgaXQgaXNcbiAqIG5vdCBpbnRlcnByZXRlZCBhcyBhIG1hZ2ljIGNoYXJhY3RlciwgYnV0IGluc3RlYWQgYXMgYSBwYXRoIHNlcGFyYXRvci5cbiAqL1xuZXhwb3J0IGNvbnN0IGVzY2FwZSA9IChzLCB7IHdpbmRvd3NQYXRoc05vRXNjYXBlID0gZmFsc2UsIH0gPSB7fSkgPT4ge1xuICAgIC8vIGRvbid0IG5lZWQgdG8gZXNjYXBlICtAISBiZWNhdXNlIHdlIGVzY2FwZSB0aGUgcGFyZW5zXG4gICAgLy8gdGhhdCBtYWtlIHRob3NlIG1hZ2ljLCBhbmQgZXNjYXBpbmcgISBhcyBbIV0gaXNuJ3QgdmFsaWQsXG4gICAgLy8gYmVjYXVzZSBbIV1dIGlzIGEgdmFsaWQgZ2xvYiBjbGFzcyBtZWFuaW5nIG5vdCAnXScuXG4gICAgcmV0dXJuIHdpbmRvd3NQYXRoc05vRXNjYXBlXG4gICAgICAgID8gcy5yZXBsYWNlKC9bPyooKVtcXF1dL2csICdbJCZdJylcbiAgICAgICAgOiBzLnJlcGxhY2UoL1s/KigpW1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lc2NhcGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBNaW5pbWF0Y2ggfSBmcm9tICdtaW5pbWF0Y2gnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IFBhdGhTY3VycnksIFBhdGhTY3VycnlEYXJ3aW4sIFBhdGhTY3VycnlQb3NpeCwgUGF0aFNjdXJyeVdpbjMyLCB9IGZyb20gJ3BhdGgtc2N1cnJ5JztcbmltcG9ydCB7IFBhdHRlcm4gfSBmcm9tICcuL3BhdHRlcm4uanMnO1xuaW1wb3J0IHsgR2xvYlN0cmVhbSwgR2xvYldhbGtlciB9IGZyb20gJy4vd2Fsa2VyLmpzJztcbi8vIGlmIG5vIHByb2Nlc3MgZ2xvYmFsLCBqdXN0IGNhbGwgaXQgbGludXguXG4vLyBzbyB3ZSBkZWZhdWx0IHRvIGNhc2Utc2Vuc2l0aXZlLCAvIHNlcGFyYXRvcnNcbmNvbnN0IGRlZmF1bHRQbGF0Zm9ybSA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgICBwcm9jZXNzICYmXG4gICAgdHlwZW9mIHByb2Nlc3MucGxhdGZvcm0gPT09ICdzdHJpbmcnKSA/XG4gICAgcHJvY2Vzcy5wbGF0Zm9ybVxuICAgIDogJ2xpbnV4Jztcbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY2FuIHBlcmZvcm0gZ2xvYiBwYXR0ZXJuIHRyYXZlcnNhbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHbG9iIHtcbiAgICBhYnNvbHV0ZTtcbiAgICBjd2Q7XG4gICAgcm9vdDtcbiAgICBkb3Q7XG4gICAgZG90UmVsYXRpdmU7XG4gICAgZm9sbG93O1xuICAgIGlnbm9yZTtcbiAgICBtYWdpY2FsQnJhY2VzO1xuICAgIG1hcms7XG4gICAgbWF0Y2hCYXNlO1xuICAgIG1heERlcHRoO1xuICAgIG5vYnJhY2U7XG4gICAgbm9jYXNlO1xuICAgIG5vZGlyO1xuICAgIG5vZXh0O1xuICAgIG5vZ2xvYnN0YXI7XG4gICAgcGF0dGVybjtcbiAgICBwbGF0Zm9ybTtcbiAgICByZWFscGF0aDtcbiAgICBzY3Vycnk7XG4gICAgc3RhdDtcbiAgICBzaWduYWw7XG4gICAgd2luZG93c1BhdGhzTm9Fc2NhcGU7XG4gICAgd2l0aEZpbGVUeXBlcztcbiAgICBpbmNsdWRlQ2hpbGRNYXRjaGVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcHRpb25zIHByb3ZpZGVkIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBvcHRzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBhcnNlZCBpbW11dGFibGUge0BsaW5rIFBhdHRlcm59IG9iamVjdHMuXG4gICAgICovXG4gICAgcGF0dGVybnM7XG4gICAgLyoqXG4gICAgICogQWxsIG9wdGlvbnMgYXJlIHN0b3JlZCBhcyBwcm9wZXJ0aWVzIG9uIHRoZSBgR2xvYmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBHbG9iT3B0aW9uc30gZm9yIGZ1bGwgb3B0aW9ucyBkZXNjcmlwdGlvbnMuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgYSBwcmV2aW91cyBgR2xvYmAgb2JqZWN0IGNhbiBiZSBwYXNzZWQgYXMgdGhlXG4gICAgICogYEdsb2JPcHRpb25zYCB0byBhbm90aGVyIGBHbG9iYCBpbnN0YW50aWF0aW9uIHRvIHJlLXVzZSBzZXR0aW5nc1xuICAgICAqIGFuZCBjYWNoZXMgd2l0aCBhIG5ldyBwYXR0ZXJuLlxuICAgICAqXG4gICAgICogVHJhdmVyc2FsIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHJ1biB0aGUgd2Fsa1xuICAgICAqIGFnYWluLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhdHRlcm4sIG9wdHMpIHtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICghb3B0cylcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2dsb2Igb3B0aW9ucyByZXF1aXJlZCcpO1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB0aGlzLndpdGhGaWxlVHlwZXMgPSAhIW9wdHMud2l0aEZpbGVUeXBlcztcbiAgICAgICAgdGhpcy5zaWduYWwgPSBvcHRzLnNpZ25hbDtcbiAgICAgICAgdGhpcy5mb2xsb3cgPSAhIW9wdHMuZm9sbG93O1xuICAgICAgICB0aGlzLmRvdCA9ICEhb3B0cy5kb3Q7XG4gICAgICAgIHRoaXMuZG90UmVsYXRpdmUgPSAhIW9wdHMuZG90UmVsYXRpdmU7XG4gICAgICAgIHRoaXMubm9kaXIgPSAhIW9wdHMubm9kaXI7XG4gICAgICAgIHRoaXMubWFyayA9ICEhb3B0cy5tYXJrO1xuICAgICAgICBpZiAoIW9wdHMuY3dkKSB7XG4gICAgICAgICAgICB0aGlzLmN3ZCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdHMuY3dkIGluc3RhbmNlb2YgVVJMIHx8IG9wdHMuY3dkLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSkge1xuICAgICAgICAgICAgb3B0cy5jd2QgPSBmaWxlVVJMVG9QYXRoKG9wdHMuY3dkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN3ZCA9IG9wdHMuY3dkIHx8ICcnO1xuICAgICAgICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG4gICAgICAgIHRoaXMubWFnaWNhbEJyYWNlcyA9ICEhb3B0cy5tYWdpY2FsQnJhY2VzO1xuICAgICAgICB0aGlzLm5vYnJhY2UgPSAhIW9wdHMubm9icmFjZTtcbiAgICAgICAgdGhpcy5ub2V4dCA9ICEhb3B0cy5ub2V4dDtcbiAgICAgICAgdGhpcy5yZWFscGF0aCA9ICEhb3B0cy5yZWFscGF0aDtcbiAgICAgICAgdGhpcy5hYnNvbHV0ZSA9IG9wdHMuYWJzb2x1dGU7XG4gICAgICAgIHRoaXMuaW5jbHVkZUNoaWxkTWF0Y2hlcyA9IG9wdHMuaW5jbHVkZUNoaWxkTWF0Y2hlcyAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMubm9nbG9ic3RhciA9ICEhb3B0cy5ub2dsb2JzdGFyO1xuICAgICAgICB0aGlzLm1hdGNoQmFzZSA9ICEhb3B0cy5tYXRjaEJhc2U7XG4gICAgICAgIHRoaXMubWF4RGVwdGggPVxuICAgICAgICAgICAgdHlwZW9mIG9wdHMubWF4RGVwdGggPT09ICdudW1iZXInID8gb3B0cy5tYXhEZXB0aCA6IEluZmluaXR5O1xuICAgICAgICB0aGlzLnN0YXQgPSAhIW9wdHMuc3RhdDtcbiAgICAgICAgdGhpcy5pZ25vcmUgPSBvcHRzLmlnbm9yZTtcbiAgICAgICAgaWYgKHRoaXMud2l0aEZpbGVUeXBlcyAmJiB0aGlzLmFic29sdXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNldCBhYnNvbHV0ZSBhbmQgd2l0aEZpbGVUeXBlczp0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGF0dGVybiA9IFtwYXR0ZXJuXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpbmRvd3NQYXRoc05vRXNjYXBlID1cbiAgICAgICAgICAgICEhb3B0cy53aW5kb3dzUGF0aHNOb0VzY2FwZSB8fFxuICAgICAgICAgICAgICAgIG9wdHMuYWxsb3dXaW5kb3dzRXNjYXBlID09PVxuICAgICAgICAgICAgICAgICAgICBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMud2luZG93c1BhdGhzTm9Fc2NhcGUpIHtcbiAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLm1hcChwID0+IHAucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXRjaEJhc2UpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLm5vZ2xvYnN0YXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdiYXNlIG1hdGNoaW5nIHJlcXVpcmVzIGdsb2JzdGFyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5tYXAocCA9PiAocC5pbmNsdWRlcygnLycpID8gcCA6IGAuLyoqLyR7cH1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IG9wdHMucGxhdGZvcm0gfHwgZGVmYXVsdFBsYXRmb3JtO1xuICAgICAgICB0aGlzLm9wdHMgPSB7IC4uLm9wdHMsIHBsYXRmb3JtOiB0aGlzLnBsYXRmb3JtIH07XG4gICAgICAgIGlmIChvcHRzLnNjdXJyeSkge1xuICAgICAgICAgICAgdGhpcy5zY3VycnkgPSBvcHRzLnNjdXJyeTtcbiAgICAgICAgICAgIGlmIChvcHRzLm5vY2FzZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgb3B0cy5ub2Nhc2UgIT09IG9wdHMuc2N1cnJ5Lm5vY2FzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9jYXNlIG9wdGlvbiBjb250cmFkaWN0cyBwcm92aWRlZCBzY3Vycnkgb3B0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBTY3VycnkgPSBvcHRzLnBsYXRmb3JtID09PSAnd2luMzInID8gUGF0aFNjdXJyeVdpbjMyXG4gICAgICAgICAgICAgICAgOiBvcHRzLnBsYXRmb3JtID09PSAnZGFyd2luJyA/IFBhdGhTY3VycnlEYXJ3aW5cbiAgICAgICAgICAgICAgICAgICAgOiBvcHRzLnBsYXRmb3JtID8gUGF0aFNjdXJyeVBvc2l4XG4gICAgICAgICAgICAgICAgICAgICAgICA6IFBhdGhTY3Vycnk7XG4gICAgICAgICAgICB0aGlzLnNjdXJyeSA9IG5ldyBTY3VycnkodGhpcy5jd2QsIHtcbiAgICAgICAgICAgICAgICBub2Nhc2U6IG9wdHMubm9jYXNlLFxuICAgICAgICAgICAgICAgIGZzOiBvcHRzLmZzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2Nhc2UgPSB0aGlzLnNjdXJyeS5ub2Nhc2U7XG4gICAgICAgIC8vIElmIHlvdSBkbyBub2Nhc2U6dHJ1ZSBvbiBhIGNhc2Utc2Vuc2l0aXZlIGZpbGUgc3lzdGVtLCB0aGVuXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gdXNlIHJlZ2V4cHMgaW5zdGVhZCBvZiBzdHJpbmdzIGZvciBub24tbWFnaWNcbiAgICAgICAgLy8gcGF0aCBwb3J0aW9ucywgYmVjYXVzZSBzdGF0dGluZyBgYUJjYCB3b24ndCByZXR1cm4gcmVzdWx0c1xuICAgICAgICAvLyBmb3IgdGhlIGZpbGUgYEFiQ2AgZm9yIGV4YW1wbGUuXG4gICAgICAgIGNvbnN0IG5vY2FzZU1hZ2ljT25seSA9IHRoaXMucGxhdGZvcm0gPT09ICdkYXJ3aW4nIHx8IHRoaXMucGxhdGZvcm0gPT09ICd3aW4zMic7XG4gICAgICAgIGNvbnN0IG1tbyA9IHtcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgbm9jYXNlIGJhc2VkIG9uIHBsYXRmb3JtXG4gICAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgICAgZG90OiB0aGlzLmRvdCxcbiAgICAgICAgICAgIG1hdGNoQmFzZTogdGhpcy5tYXRjaEJhc2UsXG4gICAgICAgICAgICBub2JyYWNlOiB0aGlzLm5vYnJhY2UsXG4gICAgICAgICAgICBub2Nhc2U6IHRoaXMubm9jYXNlLFxuICAgICAgICAgICAgbm9jYXNlTWFnaWNPbmx5LFxuICAgICAgICAgICAgbm9jb21tZW50OiB0cnVlLFxuICAgICAgICAgICAgbm9leHQ6IHRoaXMubm9leHQsXG4gICAgICAgICAgICBub25lZ2F0ZTogdHJ1ZSxcbiAgICAgICAgICAgIG9wdGltaXphdGlvbkxldmVsOiAyLFxuICAgICAgICAgICAgcGxhdGZvcm06IHRoaXMucGxhdGZvcm0sXG4gICAgICAgICAgICB3aW5kb3dzUGF0aHNOb0VzY2FwZTogdGhpcy53aW5kb3dzUGF0aHNOb0VzY2FwZSxcbiAgICAgICAgICAgIGRlYnVnOiAhIXRoaXMub3B0cy5kZWJ1ZyxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbW1zID0gdGhpcy5wYXR0ZXJuLm1hcChwID0+IG5ldyBNaW5pbWF0Y2gocCwgbW1vKSk7XG4gICAgICAgIGNvbnN0IFttYXRjaFNldCwgZ2xvYlBhcnRzXSA9IG1tcy5yZWR1Y2UoKHNldCwgbSkgPT4ge1xuICAgICAgICAgICAgc2V0WzBdLnB1c2goLi4ubS5zZXQpO1xuICAgICAgICAgICAgc2V0WzFdLnB1c2goLi4ubS5nbG9iUGFydHMpO1xuICAgICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgfSwgW1tdLCBbXV0pO1xuICAgICAgICB0aGlzLnBhdHRlcm5zID0gbWF0Y2hTZXQubWFwKChzZXQsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGcgPSBnbG9iUGFydHNbaV07XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgIGlmICghZylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGF0dGVybiBvYmplY3QnKTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhdHRlcm4oc2V0LCBnLCAwLCB0aGlzLnBsYXRmb3JtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHdhbGsoKSB7XG4gICAgICAgIC8vIFdhbGtlcnMgYWx3YXlzIHJldHVybiBhcnJheSBvZiBQYXRoIG9iamVjdHMsIHNvIHdlIGp1c3QgaGF2ZSB0b1xuICAgICAgICAvLyBjb2VyY2UgdGhlbSBpbnRvIHRoZSByaWdodCBzaGFwZS4gIEl0IHdpbGwgaGF2ZSBhbHJlYWR5IGNhbGxlZFxuICAgICAgICAvLyByZWFscGF0aCgpIGlmIHRoZSBvcHRpb24gd2FzIHNldCB0byBkbyBzbywgc28gd2Uga25vdyB0aGF0J3MgY2FjaGVkLlxuICAgICAgICAvLyBzdGFydCBvdXQga25vd2luZyB0aGUgY3dkLCBhdCBsZWFzdFxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4uKGF3YWl0IG5ldyBHbG9iV2Fsa2VyKHRoaXMucGF0dGVybnMsIHRoaXMuc2N1cnJ5LmN3ZCwge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMub3B0cyxcbiAgICAgICAgICAgICAgICBtYXhEZXB0aDogdGhpcy5tYXhEZXB0aCAhPT0gSW5maW5pdHkgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heERlcHRoICsgdGhpcy5zY3VycnkuY3dkLmRlcHRoKClcbiAgICAgICAgICAgICAgICAgICAgOiBJbmZpbml0eSxcbiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICBub2Nhc2U6IHRoaXMubm9jYXNlLFxuICAgICAgICAgICAgICAgIGluY2x1ZGVDaGlsZE1hdGNoZXM6IHRoaXMuaW5jbHVkZUNoaWxkTWF0Y2hlcyxcbiAgICAgICAgICAgIH0pLndhbGsoKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIHdhbGtTeW5jKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4ubmV3IEdsb2JXYWxrZXIodGhpcy5wYXR0ZXJucywgdGhpcy5zY3VycnkuY3dkLCB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgICAgICAgIG1heERlcHRoOiB0aGlzLm1heERlcHRoICE9PSBJbmZpbml0eSA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4RGVwdGggKyB0aGlzLnNjdXJyeS5jd2QuZGVwdGgoKVxuICAgICAgICAgICAgICAgICAgICA6IEluZmluaXR5LFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiB0aGlzLnBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIG5vY2FzZTogdGhpcy5ub2Nhc2UsXG4gICAgICAgICAgICAgICAgaW5jbHVkZUNoaWxkTWF0Y2hlczogdGhpcy5pbmNsdWRlQ2hpbGRNYXRjaGVzLFxuICAgICAgICAgICAgfSkud2Fsa1N5bmMoKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgc3RyZWFtKCkge1xuICAgICAgICByZXR1cm4gbmV3IEdsb2JTdHJlYW0odGhpcy5wYXR0ZXJucywgdGhpcy5zY3VycnkuY3dkLCB7XG4gICAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgICBtYXhEZXB0aDogdGhpcy5tYXhEZXB0aCAhPT0gSW5maW5pdHkgP1xuICAgICAgICAgICAgICAgIHRoaXMubWF4RGVwdGggKyB0aGlzLnNjdXJyeS5jd2QuZGVwdGgoKVxuICAgICAgICAgICAgICAgIDogSW5maW5pdHksXG4gICAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICAgIG5vY2FzZTogdGhpcy5ub2Nhc2UsXG4gICAgICAgICAgICBpbmNsdWRlQ2hpbGRNYXRjaGVzOiB0aGlzLmluY2x1ZGVDaGlsZE1hdGNoZXMsXG4gICAgICAgIH0pLnN0cmVhbSgpO1xuICAgIH1cbiAgICBzdHJlYW1TeW5jKCkge1xuICAgICAgICByZXR1cm4gbmV3IEdsb2JTdHJlYW0odGhpcy5wYXR0ZXJucywgdGhpcy5zY3VycnkuY3dkLCB7XG4gICAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgICBtYXhEZXB0aDogdGhpcy5tYXhEZXB0aCAhPT0gSW5maW5pdHkgP1xuICAgICAgICAgICAgICAgIHRoaXMubWF4RGVwdGggKyB0aGlzLnNjdXJyeS5jd2QuZGVwdGgoKVxuICAgICAgICAgICAgICAgIDogSW5maW5pdHksXG4gICAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICAgIG5vY2FzZTogdGhpcy5ub2Nhc2UsXG4gICAgICAgICAgICBpbmNsdWRlQ2hpbGRNYXRjaGVzOiB0aGlzLmluY2x1ZGVDaGlsZE1hdGNoZXMsXG4gICAgICAgIH0pLnN0cmVhbVN5bmMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBzeW5jIGl0ZXJhdGlvbiBmdW5jdGlvbi4gUmV0dXJucyBhIEdlbmVyYXRvciB0aGF0XG4gICAgICogaXRlcmF0ZXMgb3ZlciB0aGUgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBpdGVyYXRlU3luYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtU3luYygpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZXJhdGVTeW5jKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYXN5bmMgaXRlcmF0aW9uIGZ1bmN0aW9uLiBSZXR1cm5zIGFuIEFzeW5jR2VuZXJhdG9yIHRoYXRcbiAgICAgKiBpdGVyYXRlcyBvdmVyIHRoZSByZXN1bHRzLlxuICAgICAqL1xuICAgIGl0ZXJhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbSgpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgIH1cbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVyYXRlKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYi5qcy5tYXAiLAogICAgIi8qKlxuICogQG1vZHVsZSBMUlVDYWNoZVxuICovXG5jb25zdCBwZXJmID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSAnb2JqZWN0JyAmJlxuICAgIHBlcmZvcm1hbmNlICYmXG4gICAgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gcGVyZm9ybWFuY2VcbiAgICA6IERhdGU7XG5jb25zdCB3YXJuZWQgPSBuZXcgU2V0KCk7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmNvbnN0IFBST0NFU1MgPSAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmICEhcHJvY2VzcyA/IHByb2Nlc3MgOiB7fSk7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmNvbnN0IGVtaXRXYXJuaW5nID0gKG1zZywgdHlwZSwgY29kZSwgZm4pID0+IHtcbiAgICB0eXBlb2YgUFJPQ0VTUy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IFBST0NFU1MuZW1pdFdhcm5pbmcobXNnLCB0eXBlLCBjb2RlLCBmbilcbiAgICAgICAgOiBjb25zb2xlLmVycm9yKGBbJHtjb2RlfV0gJHt0eXBlfTogJHttc2d9YCk7XG59O1xubGV0IEFDID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXI7XG5sZXQgQVMgPSBnbG9iYWxUaGlzLkFib3J0U2lnbmFsO1xuLyogYzggaWdub3JlIHN0YXJ0ICovXG5pZiAodHlwZW9mIEFDID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIEFTID0gY2xhc3MgQWJvcnRTaWduYWwge1xuICAgICAgICBvbmFib3J0O1xuICAgICAgICBfb25hYm9ydCA9IFtdO1xuICAgICAgICByZWFzb247XG4gICAgICAgIGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihfLCBmbikge1xuICAgICAgICAgICAgdGhpcy5fb25hYm9ydC5wdXNoKGZuKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy9AdHMtaWdub3JlXG4gICAgQUMgPSBjbGFzcyBBYm9ydENvbnRyb2xsZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHdhcm5BQ1BvbHlmaWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsID0gbmV3IEFTKCk7XG4gICAgICAgIGFib3J0KHJlYXNvbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2lnbmFsLmFib3J0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gPSByZWFzb247XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMuc2lnbmFsLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIHRoaXMuc2lnbmFsLl9vbmFib3J0KSB7XG4gICAgICAgICAgICAgICAgZm4ocmVhc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2lnbmFsLm9uYWJvcnQ/LihyZWFzb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBsZXQgcHJpbnRBQ1BvbHlmaWxsV2FybmluZyA9IFBST0NFU1MuZW52Py5MUlVfQ0FDSEVfSUdOT1JFX0FDX1dBUk5JTkcgIT09ICcxJztcbiAgICBjb25zdCB3YXJuQUNQb2x5ZmlsbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFwcmludEFDUG9seWZpbGxXYXJuaW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBwcmludEFDUG9seWZpbGxXYXJuaW5nID0gZmFsc2U7XG4gICAgICAgIGVtaXRXYXJuaW5nKCdBYm9ydENvbnRyb2xsZXIgaXMgbm90IGRlZmluZWQuIElmIHVzaW5nIGxydS1jYWNoZSBpbiAnICtcbiAgICAgICAgICAgICdub2RlIDE0LCBsb2FkIGFuIEFib3J0Q29udHJvbGxlciBwb2x5ZmlsbCBmcm9tIHRoZSAnICtcbiAgICAgICAgICAgICdgbm9kZS1hYm9ydC1jb250cm9sbGVyYCBwYWNrYWdlLiBBIG1pbmltYWwgcG9seWZpbGwgaXMgJyArXG4gICAgICAgICAgICAncHJvdmlkZWQgZm9yIHVzZSBieSBMUlVDYWNoZS5mZXRjaCgpLCBidXQgaXQgc2hvdWxkIG5vdCBiZSAnICtcbiAgICAgICAgICAgICdyZWxpZWQgdXBvbiBpbiBvdGhlciBjb250ZXh0cyAoZWcsIHBhc3NpbmcgaXQgdG8gb3RoZXIgQVBJcyB0aGF0ICcgK1xuICAgICAgICAgICAgJ3VzZSBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgbWlnaHQgaGF2ZSB1bmRlc2lyYWJsZSBlZmZlY3RzKS4gJyArXG4gICAgICAgICAgICAnWW91IG1heSBkaXNhYmxlIHRoaXMgd2l0aCBMUlVfQ0FDSEVfSUdOT1JFX0FDX1dBUk5JTkc9MSBpbiB0aGUgZW52LicsICdOT19BQk9SVF9DT05UUk9MTEVSJywgJ0VOT1RTVVAnLCB3YXJuQUNQb2x5ZmlsbCk7XG4gICAgfTtcbn1cbi8qIGM4IGlnbm9yZSBzdG9wICovXG5jb25zdCBzaG91bGRXYXJuID0gKGNvZGUpID0+ICF3YXJuZWQuaGFzKGNvZGUpO1xuY29uc3QgVFlQRSA9IFN5bWJvbCgndHlwZScpO1xuY29uc3QgaXNQb3NJbnQgPSAobikgPT4gbiAmJiBuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPiAwICYmIGlzRmluaXRlKG4pO1xuLyogYzggaWdub3JlIHN0YXJ0ICovXG4vLyBUaGlzIGlzIGEgbGl0dGxlIGJpdCByaWRpY3Vsb3VzLCB0YmguXG4vLyBUaGUgbWF4aW11bSBhcnJheSBsZW5ndGggaXMgMl4zMi0xIG9yIHRoZXJlYWJvdXRzIG9uIG1vc3QgSlMgaW1wbHMuXG4vLyBBbmQgd2VsbCBiZWZvcmUgdGhhdCBwb2ludCwgeW91J3JlIGNhY2hpbmcgdGhlIGVudGlyZSB3b3JsZCwgSSBtZWFuLFxuLy8gdGhhdCdzIH4zMkdCIG9mIGp1c3QgaW50ZWdlcnMgZm9yIHRoZSBuZXh0L3ByZXYgbGlua3MsIHBsdXMgd2hhdGV2ZXJcbi8vIGVsc2UgdG8gaG9sZCB0aGF0IG1hbnkga2V5cyBhbmQgdmFsdWVzLiAgSnVzdCBmaWxsaW5nIHRoZSBtZW1vcnkgd2l0aFxuLy8gemVyb2VzIGF0IGluaXQgdGltZSBpcyBicnV0YWwgd2hlbiB5b3UgZ2V0IHRoYXQgYmlnLlxuLy8gQnV0IHdoeSBub3QgYmUgY29tcGxldGU/XG4vLyBNYXliZSBpbiB0aGUgZnV0dXJlLCB0aGVzZSBsaW1pdHMgd2lsbCBoYXZlIGV4cGFuZGVkLlxuY29uc3QgZ2V0VWludEFycmF5ID0gKG1heCkgPT4gIWlzUG9zSW50KG1heClcbiAgICA/IG51bGxcbiAgICA6IG1heCA8PSBNYXRoLnBvdygyLCA4KVxuICAgICAgICA/IFVpbnQ4QXJyYXlcbiAgICAgICAgOiBtYXggPD0gTWF0aC5wb3coMiwgMTYpXG4gICAgICAgICAgICA/IFVpbnQxNkFycmF5XG4gICAgICAgICAgICA6IG1heCA8PSBNYXRoLnBvdygyLCAzMilcbiAgICAgICAgICAgICAgICA/IFVpbnQzMkFycmF5XG4gICAgICAgICAgICAgICAgOiBtYXggPD0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICAgICAgICAgICAgICAgICAgPyBaZXJvQXJyYXlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuLyogYzggaWdub3JlIHN0b3AgKi9cbmNsYXNzIFplcm9BcnJheSBleHRlbmRzIEFycmF5IHtcbiAgICBjb25zdHJ1Y3RvcihzaXplKSB7XG4gICAgICAgIHN1cGVyKHNpemUpO1xuICAgICAgICB0aGlzLmZpbGwoMCk7XG4gICAgfVxufVxuY2xhc3MgU3RhY2sge1xuICAgIGhlYXA7XG4gICAgbGVuZ3RoO1xuICAgIC8vIHByaXZhdGUgY29uc3RydWN0b3JcbiAgICBzdGF0aWMgI2NvbnN0cnVjdGluZyA9IGZhbHNlO1xuICAgIHN0YXRpYyBjcmVhdGUobWF4KSB7XG4gICAgICAgIGNvbnN0IEhlYXBDbHMgPSBnZXRVaW50QXJyYXkobWF4KTtcbiAgICAgICAgaWYgKCFIZWFwQ2xzKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBTdGFjay4jY29uc3RydWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcyA9IG5ldyBTdGFjayhtYXgsIEhlYXBDbHMpO1xuICAgICAgICBTdGFjay4jY29uc3RydWN0aW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihtYXgsIEhlYXBDbHMpIHtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICghU3RhY2suI2NvbnN0cnVjdGluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5zdGFudGlhdGUgU3RhY2sgdXNpbmcgU3RhY2suY3JlYXRlKG4pJyk7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgdGhpcy5oZWFwID0gbmV3IEhlYXBDbHMobWF4KTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICBwdXNoKG4pIHtcbiAgICAgICAgdGhpcy5oZWFwW3RoaXMubGVuZ3RoKytdID0gbjtcbiAgICB9XG4gICAgcG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFwWy0tdGhpcy5sZW5ndGhdO1xuICAgIH1cbn1cbi8qKlxuICogRGVmYXVsdCBleHBvcnQsIHRoZSB0aGluZyB5b3UncmUgdXNpbmcgdGhpcyBtb2R1bGUgdG8gZ2V0LlxuICpcbiAqIFRoZSBgS2AgYW5kIGBWYCB0eXBlcyBkZWZpbmUgdGhlIGtleSBhbmQgdmFsdWUgdHlwZXMsIHJlc3BlY3RpdmVseS4gVGhlXG4gKiBvcHRpb25hbCBgRkNgIHR5cGUgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgYGNvbnRleHRgIG9iamVjdCBwYXNzZWQgdG9cbiAqIGBjYWNoZS5mZXRjaCgpYCBhbmQgYGNhY2hlLm1lbW8oKWAuXG4gKlxuICogS2V5cyBhbmQgdmFsdWVzICoqbXVzdCBub3QqKiBiZSBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgb3B0aW9ucyBvYmplY3QgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgbWF4YCxcbiAqIGBtYXhTaXplYCwgYGZldGNoTWV0aG9kYCwgYG1lbW9NZXRob2RgLCBgZGlzcG9zZWAgYW5kIGBkaXNwb3NlQWZ0ZXJgKSBhcmVcbiAqIGFkZGVkIGFzIG5vcm1hbCBwdWJsaWMgbWVtYmVycy4gKFRoZSBsaXN0ZWQgb3B0aW9ucyBhcmUgcmVhZC1vbmx5IGdldHRlcnMuKVxuICpcbiAqIENoYW5naW5nIGFueSBvZiB0aGVzZSB3aWxsIGFsdGVyIHRoZSBkZWZhdWx0cyBmb3Igc3Vic2VxdWVudCBtZXRob2QgY2FsbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZSB7XG4gICAgLy8gb3B0aW9ucyB0aGF0IGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgZGlzYXN0ZXJcbiAgICAjbWF4O1xuICAgICNtYXhTaXplO1xuICAgICNkaXNwb3NlO1xuICAgICNvbkluc2VydDtcbiAgICAjZGlzcG9zZUFmdGVyO1xuICAgICNmZXRjaE1ldGhvZDtcbiAgICAjbWVtb01ldGhvZDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudHRsfVxuICAgICAqL1xuICAgIHR0bDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudHRsUmVzb2x1dGlvbn1cbiAgICAgKi9cbiAgICB0dGxSZXNvbHV0aW9uO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS50dGxBdXRvcHVyZ2V9XG4gICAgICovXG4gICAgdHRsQXV0b3B1cmdlO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkdldH1cbiAgICAgKi9cbiAgICB1cGRhdGVBZ2VPbkdldDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25IYXN9XG4gICAgICovXG4gICAgdXBkYXRlQWdlT25IYXM7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGV9XG4gICAgICovXG4gICAgYWxsb3dTdGFsZTtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9EaXNwb3NlT25TZXR9XG4gICAgICovXG4gICAgbm9EaXNwb3NlT25TZXQ7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vVXBkYXRlVFRMfVxuICAgICAqL1xuICAgIG5vVXBkYXRlVFRMO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5tYXhFbnRyeVNpemV9XG4gICAgICovXG4gICAgbWF4RW50cnlTaXplO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5zaXplQ2FsY3VsYXRpb259XG4gICAgICovXG4gICAgc2l6ZUNhbGN1bGF0aW9uO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb259XG4gICAgICovXG4gICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5ub0RlbGV0ZU9uU3RhbGVHZXR9XG4gICAgICovXG4gICAgbm9EZWxldGVPblN0YWxlR2V0O1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlT25GZXRjaEFib3J0fVxuICAgICAqL1xuICAgIGFsbG93U3RhbGVPbkZldGNoQWJvcnQ7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9ufVxuICAgICAqL1xuICAgIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5pZ25vcmVGZXRjaEFib3J0fVxuICAgICAqL1xuICAgIGlnbm9yZUZldGNoQWJvcnQ7XG4gICAgLy8gY29tcHV0ZWQgcHJvcGVydGllc1xuICAgICNzaXplO1xuICAgICNjYWxjdWxhdGVkU2l6ZTtcbiAgICAja2V5TWFwO1xuICAgICNrZXlMaXN0O1xuICAgICN2YWxMaXN0O1xuICAgICNuZXh0O1xuICAgICNwcmV2O1xuICAgICNoZWFkO1xuICAgICN0YWlsO1xuICAgICNmcmVlO1xuICAgICNkaXNwb3NlZDtcbiAgICAjc2l6ZXM7XG4gICAgI3N0YXJ0cztcbiAgICAjdHRscztcbiAgICAjaGFzRGlzcG9zZTtcbiAgICAjaGFzRmV0Y2hNZXRob2Q7XG4gICAgI2hhc0Rpc3Bvc2VBZnRlcjtcbiAgICAjaGFzT25JbnNlcnQ7XG4gICAgLyoqXG4gICAgICogRG8gbm90IGNhbGwgdGhpcyBtZXRob2QgdW5sZXNzIHlvdSBuZWVkIHRvIGluc3BlY3QgdGhlXG4gICAgICogaW5uZXIgd29ya2luZ3Mgb2YgdGhlIGNhY2hlLiAgSWYgYW55dGhpbmcgcmV0dXJuZWQgYnkgdGhpc1xuICAgICAqIG9iamVjdCBpcyBtb2RpZmllZCBpbiBhbnkgd2F5LCBzdHJhbmdlIGJyZWFrYWdlIG1heSBvY2N1ci5cbiAgICAgKlxuICAgICAqIFRoZXNlIGZpZWxkcyBhcmUgcHJpdmF0ZSBmb3IgYSByZWFzb24hXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgdW5zYWZlRXhwb3NlSW50ZXJuYWxzKGMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vIHByb3BlcnRpZXNcbiAgICAgICAgICAgIHN0YXJ0czogYy4jc3RhcnRzLFxuICAgICAgICAgICAgdHRsczogYy4jdHRscyxcbiAgICAgICAgICAgIHNpemVzOiBjLiNzaXplcyxcbiAgICAgICAgICAgIGtleU1hcDogYy4ja2V5TWFwLFxuICAgICAgICAgICAga2V5TGlzdDogYy4ja2V5TGlzdCxcbiAgICAgICAgICAgIHZhbExpc3Q6IGMuI3ZhbExpc3QsXG4gICAgICAgICAgICBuZXh0OiBjLiNuZXh0LFxuICAgICAgICAgICAgcHJldjogYy4jcHJldixcbiAgICAgICAgICAgIGdldCBoZWFkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjLiNoZWFkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCB0YWlsKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjLiN0YWlsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZyZWU6IGMuI2ZyZWUsXG4gICAgICAgICAgICAvLyBtZXRob2RzXG4gICAgICAgICAgICBpc0JhY2tncm91bmRGZXRjaDogKHApID0+IGMuI2lzQmFja2dyb3VuZEZldGNoKHApLFxuICAgICAgICAgICAgYmFja2dyb3VuZEZldGNoOiAoaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpID0+IGMuI2JhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCksXG4gICAgICAgICAgICBtb3ZlVG9UYWlsOiAoaW5kZXgpID0+IGMuI21vdmVUb1RhaWwoaW5kZXgpLFxuICAgICAgICAgICAgaW5kZXhlczogKG9wdGlvbnMpID0+IGMuI2luZGV4ZXMob3B0aW9ucyksXG4gICAgICAgICAgICByaW5kZXhlczogKG9wdGlvbnMpID0+IGMuI3JpbmRleGVzKG9wdGlvbnMpLFxuICAgICAgICAgICAgaXNTdGFsZTogKGluZGV4KSA9PiBjLiNpc1N0YWxlKGluZGV4KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gUHJvdGVjdGVkIHJlYWQtb25seSBtZW1iZXJzXG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heH0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgbWF4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWF4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UubWF4U2l6ZX0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgbWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21heFNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjb21wdXRlZCBzaXplIG9mIGl0ZW1zIGluIHRoZSBjYWNoZSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBjYWxjdWxhdGVkU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NhbGN1bGF0ZWRTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHN0b3JlZCBpbiB0aGUgY2FjaGUgKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgZmV0Y2hNZXRob2QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZXRjaE1ldGhvZDtcbiAgICB9XG4gICAgZ2V0IG1lbW9NZXRob2QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtZW1vTWV0aG9kO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZGlzcG9zZX0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgZGlzcG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5vbkluc2VydH0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgb25JbnNlcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNvbkluc2VydDtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmRpc3Bvc2VBZnRlcn0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgZGlzcG9zZUFmdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGlzcG9zZUFmdGVyO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgbWF4ID0gMCwgdHRsLCB0dGxSZXNvbHV0aW9uID0gMSwgdHRsQXV0b3B1cmdlLCB1cGRhdGVBZ2VPbkdldCwgdXBkYXRlQWdlT25IYXMsIGFsbG93U3RhbGUsIGRpc3Bvc2UsIG9uSW5zZXJ0LCBkaXNwb3NlQWZ0ZXIsIG5vRGlzcG9zZU9uU2V0LCBub1VwZGF0ZVRUTCwgbWF4U2l6ZSA9IDAsIG1heEVudHJ5U2l6ZSA9IDAsIHNpemVDYWxjdWxhdGlvbiwgZmV0Y2hNZXRob2QsIG1lbW9NZXRob2QsIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiwgbm9EZWxldGVPblN0YWxlR2V0LCBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiwgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCwgaWdub3JlRmV0Y2hBYm9ydCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChtYXggIT09IDAgJiYgIWlzUG9zSW50KG1heCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBvcHRpb24gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBVaW50QXJyYXkgPSBtYXggPyBnZXRVaW50QXJyYXkobWF4KSA6IEFycmF5O1xuICAgICAgICBpZiAoIVVpbnRBcnJheSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCB2YWx1ZTogJyArIG1heCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jbWF4ID0gbWF4O1xuICAgICAgICB0aGlzLiNtYXhTaXplID0gbWF4U2l6ZTtcbiAgICAgICAgdGhpcy5tYXhFbnRyeVNpemUgPSBtYXhFbnRyeVNpemUgfHwgdGhpcy4jbWF4U2l6ZTtcbiAgICAgICAgdGhpcy5zaXplQ2FsY3VsYXRpb24gPSBzaXplQ2FsY3VsYXRpb247XG4gICAgICAgIGlmICh0aGlzLnNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLiNtYXhTaXplICYmICF0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCBzZXQgc2l6ZUNhbGN1bGF0aW9uIHdpdGhvdXQgc2V0dGluZyBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpemVDYWxjdWxhdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemVDYWxjdWxhdGlvbiBzZXQgdG8gbm9uLWZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lbW9NZXRob2QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIG1lbW9NZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21lbW9NZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIGlmIGRlZmluZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNtZW1vTWV0aG9kID0gbWVtb01ldGhvZDtcbiAgICAgICAgaWYgKGZldGNoTWV0aG9kICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBmZXRjaE1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmV0Y2hNZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIGlmIHNwZWNpZmllZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2ZldGNoTWV0aG9kID0gZmV0Y2hNZXRob2Q7XG4gICAgICAgIHRoaXMuI2hhc0ZldGNoTWV0aG9kID0gISFmZXRjaE1ldGhvZDtcbiAgICAgICAgdGhpcy4ja2V5TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLiNrZXlMaXN0ID0gbmV3IEFycmF5KG1heCkuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLiN2YWxMaXN0ID0gbmV3IEFycmF5KG1heCkuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLiNuZXh0ID0gbmV3IFVpbnRBcnJheShtYXgpO1xuICAgICAgICB0aGlzLiNwcmV2ID0gbmV3IFVpbnRBcnJheShtYXgpO1xuICAgICAgICB0aGlzLiNoZWFkID0gMDtcbiAgICAgICAgdGhpcy4jdGFpbCA9IDA7XG4gICAgICAgIHRoaXMuI2ZyZWUgPSBTdGFjay5jcmVhdGUobWF4KTtcbiAgICAgICAgdGhpcy4jc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplID0gMDtcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlID0gZGlzcG9zZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9uSW5zZXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLiNvbkluc2VydCA9IG9uSW5zZXJ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZUFmdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXIgPSBkaXNwb3NlQWZ0ZXI7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlZCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jaGFzRGlzcG9zZSA9ICEhdGhpcy4jZGlzcG9zZTtcbiAgICAgICAgdGhpcy4jaGFzT25JbnNlcnQgPSAhIXRoaXMuI29uSW5zZXJ0O1xuICAgICAgICB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgPSAhIXRoaXMuI2Rpc3Bvc2VBZnRlcjtcbiAgICAgICAgdGhpcy5ub0Rpc3Bvc2VPblNldCA9ICEhbm9EaXNwb3NlT25TZXQ7XG4gICAgICAgIHRoaXMubm9VcGRhdGVUVEwgPSAhIW5vVXBkYXRlVFRMO1xuICAgICAgICB0aGlzLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiA9ICEhbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uO1xuICAgICAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gISFhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbjtcbiAgICAgICAgdGhpcy5hbGxvd1N0YWxlT25GZXRjaEFib3J0ID0gISFhbGxvd1N0YWxlT25GZXRjaEFib3J0O1xuICAgICAgICB0aGlzLmlnbm9yZUZldGNoQWJvcnQgPSAhIWlnbm9yZUZldGNoQWJvcnQ7XG4gICAgICAgIC8vIE5COiBtYXhFbnRyeVNpemUgaXMgc2V0IHRvIG1heFNpemUgaWYgaXQncyBzZXRcbiAgICAgICAgaWYgKHRoaXMubWF4RW50cnlTaXplICE9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jbWF4U2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNQb3NJbnQodGhpcy4jbWF4U2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4U2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMubWF4RW50cnlTaXplKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heEVudHJ5U2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVTaXplVHJhY2tpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG93U3RhbGUgPSAhIWFsbG93U3RhbGU7XG4gICAgICAgIHRoaXMubm9EZWxldGVPblN0YWxlR2V0ID0gISFub0RlbGV0ZU9uU3RhbGVHZXQ7XG4gICAgICAgIHRoaXMudXBkYXRlQWdlT25HZXQgPSAhIXVwZGF0ZUFnZU9uR2V0O1xuICAgICAgICB0aGlzLnVwZGF0ZUFnZU9uSGFzID0gISF1cGRhdGVBZ2VPbkhhcztcbiAgICAgICAgdGhpcy50dGxSZXNvbHV0aW9uID1cbiAgICAgICAgICAgIGlzUG9zSW50KHR0bFJlc29sdXRpb24pIHx8IHR0bFJlc29sdXRpb24gPT09IDBcbiAgICAgICAgICAgICAgICA/IHR0bFJlc29sdXRpb25cbiAgICAgICAgICAgICAgICA6IDE7XG4gICAgICAgIHRoaXMudHRsQXV0b3B1cmdlID0gISF0dGxBdXRvcHVyZ2U7XG4gICAgICAgIHRoaXMudHRsID0gdHRsIHx8IDA7XG4gICAgICAgIGlmICh0aGlzLnR0bCkge1xuICAgICAgICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLnR0bCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0dGwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNpbml0aWFsaXplVFRMVHJhY2tpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkbyBub3QgYWxsb3cgY29tcGxldGVseSB1bmJvdW5kZWQgY2FjaGVzXG4gICAgICAgIGlmICh0aGlzLiNtYXggPT09IDAgJiYgdGhpcy50dGwgPT09IDAgJiYgdGhpcy4jbWF4U2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXQgbGVhc3Qgb25lIG9mIG1heCwgbWF4U2l6ZSwgb3IgdHRsIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnR0bEF1dG9wdXJnZSAmJiAhdGhpcy4jbWF4ICYmICF0aGlzLiNtYXhTaXplKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gJ0xSVV9DQUNIRV9VTkJPVU5ERUQnO1xuICAgICAgICAgICAgaWYgKHNob3VsZFdhcm4oY29kZSkpIHtcbiAgICAgICAgICAgICAgICB3YXJuZWQuYWRkKGNvZGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdUVEwgY2FjaGluZyB3aXRob3V0IHR0bEF1dG9wdXJnZSwgbWF4LCBvciBtYXhTaXplIGNhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCBpbiB1bmJvdW5kZWQgbWVtb3J5IGNvbnN1bXB0aW9uLic7XG4gICAgICAgICAgICAgICAgZW1pdFdhcm5pbmcobXNnLCAnVW5ib3VuZGVkQ2FjaGVXYXJuaW5nJywgY29kZSwgTFJVQ2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG1zIGxlZnQgaW4gdGhlIGl0ZW0ncyBUVEwuIElmIGl0ZW0gaXMgbm90IGluIGNhY2hlLFxuICAgICAqIHJldHVybnMgYDBgLiBSZXR1cm5zIGBJbmZpbml0eWAgaWYgaXRlbSBpcyBpbiBjYWNoZSB3aXRob3V0IGEgZGVmaW5lZCBUVEwuXG4gICAgICovXG4gICAgZ2V0UmVtYWluaW5nVFRMKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy4ja2V5TWFwLmhhcyhrZXkpID8gSW5maW5pdHkgOiAwO1xuICAgIH1cbiAgICAjaW5pdGlhbGl6ZVRUTFRyYWNraW5nKCkge1xuICAgICAgICBjb25zdCB0dGxzID0gbmV3IFplcm9BcnJheSh0aGlzLiNtYXgpO1xuICAgICAgICBjb25zdCBzdGFydHMgPSBuZXcgWmVyb0FycmF5KHRoaXMuI21heCk7XG4gICAgICAgIHRoaXMuI3R0bHMgPSB0dGxzO1xuICAgICAgICB0aGlzLiNzdGFydHMgPSBzdGFydHM7XG4gICAgICAgIHRoaXMuI3NldEl0ZW1UVEwgPSAoaW5kZXgsIHR0bCwgc3RhcnQgPSBwZXJmLm5vdygpKSA9PiB7XG4gICAgICAgICAgICBzdGFydHNbaW5kZXhdID0gdHRsICE9PSAwID8gc3RhcnQgOiAwO1xuICAgICAgICAgICAgdHRsc1tpbmRleF0gPSB0dGw7XG4gICAgICAgICAgICBpZiAodHRsICE9PSAwICYmIHRoaXMudHRsQXV0b3B1cmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZSh0aGlzLiNrZXlMaXN0W2luZGV4XSwgJ2V4cGlyZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgdHRsICsgMSk7XG4gICAgICAgICAgICAgICAgLy8gdW5yZWYoKSBub3Qgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXNcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICBpZiAodC51bnJlZikge1xuICAgICAgICAgICAgICAgICAgICB0LnVucmVmKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UgPSBpbmRleCA9PiB7XG4gICAgICAgICAgICBzdGFydHNbaW5kZXhdID0gdHRsc1tpbmRleF0gIT09IDAgPyBwZXJmLm5vdygpIDogMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3RhdHVzVFRMID0gKHN0YXR1cywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICh0dGxzW2luZGV4XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR0bCA9IHR0bHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgICAgIGlmICghdHRsIHx8ICFzdGFydClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHN0YXR1cy50dGwgPSB0dGw7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgc3RhdHVzLm5vdyA9IGNhY2hlZE5vdyB8fCBnZXROb3coKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZ2UgPSBzdGF0dXMubm93IC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnJlbWFpbmluZ1RUTCA9IHR0bCAtIGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVib3VuY2UgY2FsbHMgdG8gcGVyZi5ub3coKSB0byAxcyBzbyB3ZSdyZSBub3QgaGl0dGluZ1xuICAgICAgICAvLyB0aGF0IGNvc3RseSBjYWxsIHJlcGVhdGVkbHkuXG4gICAgICAgIGxldCBjYWNoZWROb3cgPSAwO1xuICAgICAgICBjb25zdCBnZXROb3cgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gcGVyZi5ub3coKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnR0bFJlc29sdXRpb24gPiAwKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVkTm93ID0gbjtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiAoY2FjaGVkTm93ID0gMCksIHRoaXMudHRsUmVzb2x1dGlvbik7XG4gICAgICAgICAgICAgICAgLy8gbm90IGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zXG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgaWYgKHQudW5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdC51bnJlZigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0UmVtYWluaW5nVFRMID0ga2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHR0bCA9IHR0bHNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKCF0dGwgfHwgIXN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWdlID0gKGNhY2hlZE5vdyB8fCBnZXROb3coKSkgLSBzdGFydDtcbiAgICAgICAgICAgIHJldHVybiB0dGwgLSBhZ2U7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI2lzU3RhbGUgPSBpbmRleCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gc3RhcnRzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0dGxzW2luZGV4XTtcbiAgICAgICAgICAgIHJldHVybiAhIXQgJiYgISFzICYmIChjYWNoZWROb3cgfHwgZ2V0Tm93KCkpIC0gcyA+IHQ7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIGNvbmRpdGlvbmFsbHkgc2V0IHByaXZhdGUgbWV0aG9kcyByZWxhdGVkIHRvIFRUTFxuICAgICN1cGRhdGVJdGVtQWdlID0gKCkgPT4geyB9O1xuICAgICNzdGF0dXNUVEwgPSAoKSA9PiB7IH07XG4gICAgI3NldEl0ZW1UVEwgPSAoKSA9PiB7IH07XG4gICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAjaXNTdGFsZSA9ICgpID0+IGZhbHNlO1xuICAgICNpbml0aWFsaXplU2l6ZVRyYWNraW5nKCkge1xuICAgICAgICBjb25zdCBzaXplcyA9IG5ldyBaZXJvQXJyYXkodGhpcy4jbWF4KTtcbiAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgPSAwO1xuICAgICAgICB0aGlzLiNzaXplcyA9IHNpemVzO1xuICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZSA9IGluZGV4ID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplIC09IHNpemVzW2luZGV4XTtcbiAgICAgICAgICAgIHNpemVzW2luZGV4XSA9IDA7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3JlcXVpcmVTaXplID0gKGssIHYsIHNpemUsIHNpemVDYWxjdWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgLy8gcHJvdmlzaW9uYWxseSBhY2NlcHQgYmFja2dyb3VuZCBmZXRjaGVzLlxuICAgICAgICAgICAgLy8gYWN0dWFsIHZhbHVlIHNpemUgd2lsbCBiZSBjaGVja2VkIHdoZW4gdGhleSByZXR1cm4uXG4gICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZUNhbGN1bGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemVDYWxjdWxhdGlvbih2LCBrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1Bvc0ludChzaXplKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIHJldHVybiBpbnZhbGlkIChleHBlY3QgcG9zaXRpdmUgaW50ZWdlciknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzaXplIHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIpLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdXaGVuIG1heFNpemUgb3IgbWF4RW50cnlTaXplIGlzIHVzZWQsIHNpemVDYWxjdWxhdGlvbiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdvciBzaXplIG11c3QgYmUgc2V0LicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNhZGRJdGVtU2l6ZSA9IChpbmRleCwgc2l6ZSwgc3RhdHVzKSA9PiB7XG4gICAgICAgICAgICBzaXplc1tpbmRleF0gPSBzaXplO1xuICAgICAgICAgICAgaWYgKHRoaXMuI21heFNpemUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhTaXplID0gdGhpcy4jbWF4U2l6ZSAtIHNpemVzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy4jY2FsY3VsYXRlZFNpemUgPiBtYXhTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2V2aWN0KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplICs9IHNpemVzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZW50cnlTaXplID0gc2l6ZTtcbiAgICAgICAgICAgICAgICBzdGF0dXMudG90YWxDYWxjdWxhdGVkU2l6ZSA9IHRoaXMuI2NhbGN1bGF0ZWRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAjcmVtb3ZlSXRlbVNpemUgPSBfaSA9PiB7IH07XG4gICAgI2FkZEl0ZW1TaXplID0gKF9pLCBfcywgX3N0KSA9PiB7IH07XG4gICAgI3JlcXVpcmVTaXplID0gKF9rLCBfdiwgc2l6ZSwgc2l6ZUNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgIGlmIChzaXplIHx8IHNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IHNldCBzaXplIHdpdGhvdXQgc2V0dGluZyBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSBvbiBjYWNoZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG4gICAgKiNpbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuI3NpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLiN0YWlsOyB0cnVlOykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy4jaXNWYWxpZEluZGV4KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dTdGFsZSB8fCAhdGhpcy4jaXNTdGFsZShpKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gdGhpcy4jaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNwcmV2W2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAqI3JpbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuI3NpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLiNoZWFkOyB0cnVlOykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy4jaXNWYWxpZEluZGV4KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dTdGFsZSB8fCAhdGhpcy4jaXNTdGFsZShpKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gdGhpcy4jdGFpbCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNuZXh0W2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjaXNWYWxpZEluZGV4KGluZGV4KSB7XG4gICAgICAgIHJldHVybiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdGhpcy4ja2V5TWFwLmdldCh0aGlzLiNrZXlMaXN0W2luZGV4XSkgPT09IGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIGBba2V5LCB2YWx1ZV1gIHBhaXJzLFxuICAgICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKmVudHJpZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiN2YWxMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBbdGhpcy4ja2V5TGlzdFtpXSwgdGhpcy4jdmFsTGlzdFtpXV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52ZXJzZSBvcmRlciB2ZXJzaW9uIG9mIHtAbGluayBMUlVDYWNoZS5lbnRyaWVzfVxuICAgICAqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIGBba2V5LCB2YWx1ZV1gIHBhaXJzLFxuICAgICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnJlbnRyaWVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIFt0aGlzLiNrZXlMaXN0W2ldLCB0aGlzLiN2YWxMaXN0W2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIGtleXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKmtleXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52ZXJzZSBvcmRlciB2ZXJzaW9uIG9mIHtAbGluayBMUlVDYWNoZS5rZXlzfVxuICAgICAqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSBrZXlzIGluIHRoZSBjYWNoZSxcbiAgICAgKiBpbiBvcmRlciBmcm9tIGxlYXN0IHJlY2VudGx5IHVzZWQgdG8gbW9zdCByZWNlbnRseSB1c2VkLlxuICAgICAqL1xuICAgICpya2V5cygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSB2YWx1ZXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnZhbHVlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZlcnNlIG9yZGVyIHZlcnNpb24gb2Yge0BsaW5rIExSVUNhY2hlLnZhbHVlc31cbiAgICAgKlxuICAgICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyB0aGUgdmFsdWVzIGluIHRoZSBjYWNoZSxcbiAgICAgKiBpbiBvcmRlciBmcm9tIGxlYXN0IHJlY2VudGx5IHVzZWQgdG8gbW9zdCByZWNlbnRseSB1c2VkLlxuICAgICAqL1xuICAgICpydmFsdWVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRpbmcgb3ZlciB0aGUgY2FjaGUgaXRzZWxmIHlpZWxkcyB0aGUgc2FtZSByZXN1bHRzIGFzXG4gICAgICoge0BsaW5rIExSVUNhY2hlLmVudHJpZXN9XG4gICAgICovXG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBTdHJpbmcgdmFsdWUgdGhhdCBpcyB1c2VkIGluIHRoZSBjcmVhdGlvbiBvZiB0aGUgZGVmYXVsdCBzdHJpbmdcbiAgICAgKiBkZXNjcmlwdGlvbiBvZiBhbiBvYmplY3QuIENhbGxlZCBieSB0aGUgYnVpbHQtaW4gbWV0aG9kXG4gICAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqL1xuICAgIFtTeW1ib2wudG9TdHJpbmdUYWddID0gJ0xSVUNhY2hlJztcbiAgICAvKipcbiAgICAgKiBGaW5kIGEgdmFsdWUgZm9yIHdoaWNoIHRoZSBzdXBwbGllZCBmbiBtZXRob2QgcmV0dXJucyBhIHRydXRoeSB2YWx1ZSxcbiAgICAgKiBzaW1pbGFyIHRvIGBBcnJheS5maW5kKClgLiBmbiBpcyBjYWxsZWQgYXMgYGZuKHZhbHVlLCBrZXksIGNhY2hlKWAuXG4gICAgICovXG4gICAgZmluZChmbiwgZ2V0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGZuKHZhbHVlLCB0aGlzLiNrZXlMaXN0W2ldLCB0aGlzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldCh0aGlzLiNrZXlMaXN0W2ldLCBnZXRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBvbiBlYWNoIGl0ZW0gaW4gdGhlIGNhY2hlLCBpbiBvcmRlciBmcm9tIG1vc3RcbiAgICAgKiByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICpcbiAgICAgKiBgZm5gIGlzIGNhbGxlZCBhcyBgZm4odmFsdWUsIGtleSwgY2FjaGUpYC5cbiAgICAgKlxuICAgICAqIElmIGB0aGlzcGAgaXMgcHJvdmlkZWQsIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBgdGhpc2AtY29udGV4dCBvZlxuICAgICAqIHRoZSBwcm92aWRlZCBvYmplY3QsIG9yIHRoZSBjYWNoZSBpZiBubyBgdGhpc3BgIG9iamVjdCBpcyBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHVwZGF0ZSBhZ2Ugb3IgcmVjZW50eSBvZiB1c2UsIG9yIGl0ZXJhdGUgb3ZlciBzdGFsZSB2YWx1ZXMuXG4gICAgICovXG4gICAgZm9yRWFjaChmbiwgdGhpc3AgPSB0aGlzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzcCwgdmFsdWUsIHRoaXMuI2tleUxpc3RbaV0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayBMUlVDYWNoZS5mb3JFYWNofSBidXQgaXRlbXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW5cbiAgICAgKiByZXZlcnNlIG9yZGVyLiAgKGllLCBsZXNzIHJlY2VudGx5IHVzZWQgaXRlbXMgYXJlIGl0ZXJhdGVkIG92ZXIgZmlyc3QuKVxuICAgICAqL1xuICAgIHJmb3JFYWNoKGZuLCB0aGlzcCA9IHRoaXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzcCwgdmFsdWUsIHRoaXMuI2tleUxpc3RbaV0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhbnkgc3RhbGUgZW50cmllcy4gUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIHdhcyByZW1vdmVkLFxuICAgICAqIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdXJnZVN0YWxlKCkge1xuICAgICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNTdGFsZShpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZSh0aGlzLiNrZXlMaXN0W2ldLCAnZXhwaXJlJyk7XG4gICAgICAgICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZXh0ZW5kZWQgaW5mbyBhYm91dCBhIGdpdmVuIGVudHJ5LCB0byBnZXQgaXRzIHZhbHVlLCBzaXplLCBhbmRcbiAgICAgKiBUVEwgaW5mbyBzaW11bHRhbmVvdXNseS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50LlxuICAgICAqXG4gICAgICogVW5saWtlIHtAbGluayBMUlVDYWNoZSNkdW1wfSwgd2hpY2ggaXMgZGVzaWduZWQgdG8gYmUgcG9ydGFibGUgYW5kIHN1cnZpdmVcbiAgICAgKiBzZXJpYWxpemF0aW9uLCB0aGUgYHN0YXJ0YCB2YWx1ZSBpcyBhbHdheXMgdGhlIGN1cnJlbnQgdGltZXN0YW1wLCBhbmQgdGhlXG4gICAgICogYHR0bGAgaXMgYSBjYWxjdWxhdGVkIHJlbWFpbmluZyB0aW1lIHRvIGxpdmUgKG5lZ2F0aXZlIGlmIGV4cGlyZWQpLlxuICAgICAqXG4gICAgICogQWx3YXlzIHJldHVybnMgc3RhbGUgdmFsdWVzLCBpZiB0aGVpciBpbmZvIGlzIGZvdW5kIGluIHRoZSBjYWNoZSwgc28gYmVcbiAgICAgKiBzdXJlIHRvIGNoZWNrIGZvciBleHBpcmF0aW9ucyAoaWUsIGEgbmVnYXRpdmUge0BsaW5rIExSVUNhY2hlLkVudHJ5I3R0bH0pXG4gICAgICogaWYgcmVsZXZhbnQuXG4gICAgICovXG4gICAgaW5mbyhrZXkpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuI2tleU1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgIDogdjtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHsgdmFsdWUgfTtcbiAgICAgICAgaWYgKHRoaXMuI3R0bHMgJiYgdGhpcy4jc3RhcnRzKSB7XG4gICAgICAgICAgICBjb25zdCB0dGwgPSB0aGlzLiN0dGxzW2ldO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLiNzdGFydHNbaV07XG4gICAgICAgICAgICBpZiAodHRsICYmIHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtYWluID0gdHRsIC0gKHBlcmYubm93KCkgLSBzdGFydCk7XG4gICAgICAgICAgICAgICAgZW50cnkudHRsID0gcmVtYWluO1xuICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc2l6ZXMpIHtcbiAgICAgICAgICAgIGVudHJ5LnNpemUgPSB0aGlzLiNzaXplc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBba2V5LCB7QGxpbmsgTFJVQ2FjaGUuRW50cnl9XSB0dXBsZXMgd2hpY2ggY2FuIGJlXG4gICAgICogcGFzc2VkIHRvIHtAbGluayBMUlVDYWNoZSNsb2FkfS5cbiAgICAgKlxuICAgICAqIFRoZSBgc3RhcnRgIGZpZWxkcyBhcmUgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIGBEYXRlLm5vdygpYFxuICAgICAqIHRpbWVzdGFtcCwgZXZlbiBpZiBgcGVyZm9ybWFuY2Uubm93KClgIGlzIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIFN0YWxlIGVudHJpZXMgYXJlIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgYGR1bXBgLCBldmVuIGlmXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGV9IGlzIGZhbHNlLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyByZXR1cm5zIGFuIGFjdHVhbCBhcnJheSwgbm90IGEgZ2VuZXJhdG9yLCBzbyBpdCBjYW4gYmUgbW9yZVxuICAgICAqIGVhc2lseSBwYXNzZWQgYXJvdW5kLlxuICAgICAqL1xuICAgIGR1bXAoKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuI2tleUxpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgICAgICA6IHY7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0geyB2YWx1ZSB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuI3R0bHMgJiYgdGhpcy4jc3RhcnRzKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHRsID0gdGhpcy4jdHRsc1tpXTtcbiAgICAgICAgICAgICAgICAvLyBhbHdheXMgZHVtcCB0aGUgc3RhcnQgcmVsYXRpdmUgdG8gYSBwb3J0YWJsZSB0aW1lc3RhbXBcbiAgICAgICAgICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgICBjb25zdCBhZ2UgPSBwZXJmLm5vdygpIC0gdGhpcy4jc3RhcnRzW2ldO1xuICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC0gYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgICAgICAgICAgIGVudHJ5LnNpemUgPSB0aGlzLiNzaXplc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyci51bnNoaWZ0KFtrZXksIGVudHJ5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXQgdGhlIGNhY2hlIGFuZCBsb2FkIGluIHRoZSBpdGVtcyBpbiBlbnRyaWVzIGluIHRoZSBvcmRlciBsaXN0ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgc2hhcGUgb2YgdGhlIHJlc3VsdGluZyBjYWNoZSBtYXkgYmUgZGlmZmVyZW50IGlmIHRoZSBzYW1lIG9wdGlvbnMgYXJlXG4gICAgICogbm90IHVzZWQgaW4gYm90aCBjYWNoZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYHN0YXJ0YCBmaWVsZHMgYXJlIGFzc3VtZWQgdG8gYmUgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlXG4gICAgICogYERhdGUubm93KClgIHRpbWVzdGFtcCwgZXZlbiBpZiBgcGVyZm9ybWFuY2Uubm93KClgIGlzIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBsb2FkKGFycikge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIGFycikge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgLy8gZW50cnkuc3RhcnQgaXMgYSBwb3J0YWJsZSB0aW1lc3RhbXAsIGJ1dCB3ZSBtYXkgYmUgdXNpbmdcbiAgICAgICAgICAgICAgICAvLyBub2RlJ3MgcGVyZm9ybWFuY2Uubm93KCksIHNvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gd2UgZ2V0IHRoZSBpbnRlbmRlZCByZW1haW5pbmcgVFRMLCBubyBtYXR0ZXIgaG93IGxvbmcgaXQnc1xuICAgICAgICAgICAgICAgIC8vIGJlZW4gb24gaWNlLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaXQncyBvayBmb3IgdGhpcyB0byBiZSBhIGJpdCBzbG93LCBpdCdzIGEgcmFyZSBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGVudHJ5LnN0YXJ0O1xuICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0ID0gcGVyZi5ub3coKSAtIGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgZW50cnkudmFsdWUsIGVudHJ5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSB2YWx1ZSB0byB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBOb3RlOiBpZiBgdW5kZWZpbmVkYCBpcyBzcGVjaWZpZWQgYXMgYSB2YWx1ZSwgdGhpcyBpcyBhbiBhbGlhcyBmb3JcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUjZGVsZXRlfVxuICAgICAqXG4gICAgICogRmllbGRzIG9uIHRoZSB7QGxpbmsgTFJVQ2FjaGUuU2V0T3B0aW9uc30gb3B0aW9ucyBwYXJhbSB3aWxsIG92ZXJyaWRlXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMgZm9yIHRoZSBzY29wZVxuICAgICAqIG9mIHRoaXMgc2luZ2xlIGBzZXQoKWAgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogSWYgYHN0YXJ0YCBpcyBwcm92aWRlZCwgdGhlbiB0aGF0IHdpbGwgc2V0IHRoZSBlZmZlY3RpdmUgc3RhcnRcbiAgICAgKiB0aW1lIGZvciB0aGUgVFRMIGNhbGN1bGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBtdXN0IGJlIGEgcHJldmlvdXNcbiAgICAgKiB2YWx1ZSBvZiBgcGVyZm9ybWFuY2Uubm93KClgIGlmIHN1cHBvcnRlZCwgb3IgYSBwcmV2aW91cyB2YWx1ZSBvZlxuICAgICAqIGBEYXRlLm5vdygpYCBpZiBub3QuXG4gICAgICpcbiAgICAgKiBPcHRpb25zIG9iamVjdCBtYXkgYWxzbyBpbmNsdWRlIGBzaXplYCwgd2hpY2ggd2lsbCBwcmV2ZW50XG4gICAgICogY2FsbGluZyB0aGUgYHNpemVDYWxjdWxhdGlvbmAgZnVuY3Rpb24gYW5kIGp1c3QgdXNlIHRoZSBzcGVjaWZpZWRcbiAgICAgKiBudW1iZXIgaWYgaXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBhbmQgYG5vRGlzcG9zZU9uU2V0YCB3aGljaFxuICAgICAqIHdpbGwgcHJldmVudCBjYWxsaW5nIGEgYGRpc3Bvc2VgIGZ1bmN0aW9uIGluIHRoZSBjYXNlIG9mXG4gICAgICogb3ZlcndyaXRlcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBgc2l6ZWAgKG9yIHJldHVybiB2YWx1ZSBvZiBgc2l6ZUNhbGN1bGF0aW9uYCkgZm9yIGEgZ2l2ZW5cbiAgICAgKiBlbnRyeSBpcyBncmVhdGVyIHRoYW4gYG1heEVudHJ5U2l6ZWAsIHRoZW4gdGhlIGl0ZW0gd2lsbCBub3QgYmVcbiAgICAgKiBhZGRlZCB0byB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBXaWxsIHVwZGF0ZSB0aGUgcmVjZW5jeSBvZiB0aGUgZW50cnkuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdmFsdWUgaXMgYHVuZGVmaW5lZGAsIHRoZW4gdGhpcyBpcyBhbiBhbGlhcyBmb3JcbiAgICAgKiBgY2FjaGUuZGVsZXRlKGtleSlgLiBgdW5kZWZpbmVkYCBpcyBuZXZlciBzdG9yZWQgaW4gdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIHNldChrLCB2LCBzZXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGUoayk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR0bCA9IHRoaXMudHRsLCBzdGFydCwgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LCBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbiwgc3RhdHVzLCB9ID0gc2V0T3B0aW9ucztcbiAgICAgICAgbGV0IHsgbm9VcGRhdGVUVEwgPSB0aGlzLm5vVXBkYXRlVFRMIH0gPSBzZXRPcHRpb25zO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy4jcmVxdWlyZVNpemUoaywgdiwgc2V0T3B0aW9ucy5zaXplIHx8IDAsIHNpemVDYWxjdWxhdGlvbik7XG4gICAgICAgIC8vIGlmIHRoZSBpdGVtIGRvZXNuJ3QgZml0LCBkb24ndCBkbyBhbnl0aGluZ1xuICAgICAgICAvLyBOQjogbWF4RW50cnlTaXplIHNldCB0byBtYXhTaXplIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKHRoaXMubWF4RW50cnlTaXplICYmIHNpemUgPiB0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQgPSAnbWlzcyc7XG4gICAgICAgICAgICAgICAgc3RhdHVzLm1heEVudHJ5U2l6ZUV4Y2VlZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhdmUgdG8gZGVsZXRlLCBpbiBjYXNlIHNvbWV0aGluZyBpcyB0aGVyZSBhbHJlYWR5LlxuICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdzZXQnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuI3NpemUgPT09IDAgPyB1bmRlZmluZWQgOiB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gYWRkaXRpb25cbiAgICAgICAgICAgIGluZGV4ID0gKHRoaXMuI3NpemUgPT09IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMuI3RhaWxcbiAgICAgICAgICAgICAgICA6IHRoaXMuI2ZyZWUubGVuZ3RoICE9PSAwXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy4jZnJlZS5wb3AoKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuI3NpemUgPT09IHRoaXMuI21heFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLiNldmljdChmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy4jc2l6ZSk7XG4gICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2luZGV4XSA9IGs7XG4gICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHY7XG4gICAgICAgICAgICB0aGlzLiNrZXlNYXAuc2V0KGssIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuI25leHRbdGhpcy4jdGFpbF0gPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMuI3ByZXZbaW5kZXhdID0gdGhpcy4jdGFpbDtcbiAgICAgICAgICAgIHRoaXMuI3RhaWwgPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMuI3NpemUrKztcbiAgICAgICAgICAgIHRoaXMuI2FkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICBzdGF0dXMuc2V0ID0gJ2FkZCc7XG4gICAgICAgICAgICBub1VwZGF0ZVRUTCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc09uSW5zZXJ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jb25JbnNlcnQ/Lih2LCBrLCAnYWRkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB1cGRhdGVcbiAgICAgICAgICAgIHRoaXMuI21vdmVUb1RhaWwoaW5kZXgpO1xuICAgICAgICAgICAgY29uc3Qgb2xkVmFsID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBpZiAodiAhPT0gb2xkVmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0ZldGNoTWV0aG9kICYmIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKG9sZFZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkVmFsLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigncmVwbGFjZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgX19zdGFsZVdoaWxlRmV0Y2hpbmc6IHMgfSA9IG9sZFZhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT09IHVuZGVmaW5lZCAmJiAhbm9EaXNwb3NlT25TZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHMsIGssICdzZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbcywgaywgJ3NldCddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghbm9EaXNwb3NlT25TZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/LihvbGRWYWwsIGssICdzZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbb2xkVmFsLCBrLCAnc2V0J10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplKGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGRJdGVtU2l6ZShpbmRleCwgc2l6ZSwgc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHY7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0ID0gJ3JlcGxhY2UnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IG9sZFZhbCAmJiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaChvbGRWYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9sZFZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBvbGRWYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnNldCA9ICd1cGRhdGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc09uSW5zZXJ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkluc2VydD8uKHYsIGssIHYgPT09IG9sZFZhbCA/ICd1cGRhdGUnIDogJ3JlcGxhY2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHRsICE9PSAwICYmICF0aGlzLiN0dGxzKSB7XG4gICAgICAgICAgICB0aGlzLiNpbml0aWFsaXplVFRMVHJhY2tpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jdHRscykge1xuICAgICAgICAgICAgaWYgKCFub1VwZGF0ZVRUTCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3NldEl0ZW1UVEwoaW5kZXgsIHR0bCwgc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub0Rpc3Bvc2VPblNldCAmJiB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWQ7XG4gICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmljdCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtLCByZXR1cm5pbmcgaXRzIHZhbHVlIG9yXG4gICAgICogYHVuZGVmaW5lZGAgaWYgY2FjaGUgaXMgZW1wdHkuXG4gICAgICovXG4gICAgcG9wKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuI3NpemUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLiN2YWxMaXN0W3RoaXMuI2hlYWRdO1xuICAgICAgICAgICAgICAgIHRoaXMuI2V2aWN0KHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuX19zdGFsZVdoaWxlRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZDtcbiAgICAgICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICNldmljdChmcmVlKSB7XG4gICAgICAgIGNvbnN0IGhlYWQgPSB0aGlzLiNoZWFkO1xuICAgICAgICBjb25zdCBrID0gdGhpcy4ja2V5TGlzdFtoZWFkXTtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaGVhZF07XG4gICAgICAgIGlmICh0aGlzLiNoYXNGZXRjaE1ldGhvZCAmJiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2V2aWN0ZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy4jaGFzRGlzcG9zZSB8fCB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYsIGssICdldmljdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFt2LCBrLCAnZXZpY3QnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUoaGVhZCk7XG4gICAgICAgIC8vIGlmIHdlIGFyZW4ndCBhYm91dCB0byB1c2UgdGhlIGluZGV4LCB0aGVuIG51bGwgdGhlc2Ugb3V0XG4gICAgICAgIGlmIChmcmVlKSB7XG4gICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2hlYWRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtoZWFkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuI2ZyZWUucHVzaChoZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc2l6ZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI3RhaWwgPSAwO1xuICAgICAgICAgICAgdGhpcy4jZnJlZS5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI25leHRbaGVhZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4ja2V5TWFwLmRlbGV0ZShrKTtcbiAgICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaGVhZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBrZXkgaXMgaW4gdGhlIGNhY2hlLCB3aXRob3V0IHVwZGF0aW5nIHRoZSByZWNlbmN5IG9mIHVzZS5cbiAgICAgKiBXaWxsIHJldHVybiBmYWxzZSBpZiB0aGUgaXRlbSBpcyBzdGFsZSwgZXZlbiB0aG91Z2ggaXQgaXMgdGVjaG5pY2FsbHlcbiAgICAgKiBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBDaGVjayBpZiBhIGtleSBpcyBpbiB0aGUgY2FjaGUsIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHJlY2VuY3kgb2ZcbiAgICAgKiB1c2UuIEFnZSBpcyB1cGRhdGVkIGlmIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkhhc30gaXMgc2V0XG4gICAgICogdG8gYHRydWVgIGluIGVpdGhlciB0aGUgb3B0aW9ucyBvciB0aGUgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBXaWxsIHJldHVybiBgZmFsc2VgIGlmIHRoZSBpdGVtIGlzIHN0YWxlLCBldmVuIHRob3VnaCBpdCBpcyB0ZWNobmljYWxseSBpblxuICAgICAqIHRoZSBjYWNoZS4gVGhlIGRpZmZlcmVuY2UgY2FuIGJlIGRldGVybWluZWQgKGlmIGl0IG1hdHRlcnMpIGJ5IHVzaW5nIGFcbiAgICAgKiBgc3RhdHVzYCBhcmd1bWVudCwgYW5kIGluc3BlY3RpbmcgdGhlIGBoYXNgIGZpZWxkLlxuICAgICAqXG4gICAgICogV2lsbCBub3QgdXBkYXRlIGl0ZW0gYWdlIHVubGVzc1xuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkhhc30gaXMgc2V0LlxuICAgICAqL1xuICAgIGhhcyhrLCBoYXNPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB1cGRhdGVBZ2VPbkhhcyA9IHRoaXMudXBkYXRlQWdlT25IYXMsIHN0YXR1cyB9ID0gaGFzT3B0aW9ucztcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpICYmXG4gICAgICAgICAgICAgICAgdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLiNpc1N0YWxlKGluZGV4KSkge1xuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVBZ2VPbkhhcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiN1cGRhdGVJdGVtQWdlKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuaGFzID0gJ2hpdCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuaGFzID0gJ3N0YWxlJztcbiAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBzdGF0dXMuaGFzID0gJ21pc3MnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlrZSB7QGxpbmsgTFJVQ2FjaGUjZ2V0fSBidXQgZG9lc24ndCB1cGRhdGUgcmVjZW5jeSBvciBkZWxldGUgc3RhbGVcbiAgICAgKiBpdGVtcy5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGl0ZW0gaXMgc3RhbGUsIHVubGVzc1xuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlfSBpcyBzZXQuXG4gICAgICovXG4gICAgcGVlayhrLCBwZWVrT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0gcGVla09wdGlvbnM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICghYWxsb3dTdGFsZSAmJiB0aGlzLiNpc1N0YWxlKGluZGV4KSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgIC8vIGVpdGhlciBzdGFsZSBhbmQgYWxsb3dlZCwgb3IgZm9yY2luZyBhIHJlZnJlc2ggb2Ygbm9uLXN0YWxlIHZhbHVlXG4gICAgICAgIHJldHVybiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiB2O1xuICAgIH1cbiAgICAjYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHYgPSBpbmRleCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWMgPSBuZXcgQUMoKTtcbiAgICAgICAgY29uc3QgeyBzaWduYWwgfSA9IG9wdGlvbnM7XG4gICAgICAgIC8vIHdoZW4vaWYgb3VyIEFDIHNpZ25hbHMsIHRoZW4gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlaXJzLlxuICAgICAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gYWMuYWJvcnQoc2lnbmFsLnJlYXNvbiksIHtcbiAgICAgICAgICAgIHNpZ25hbDogYWMuc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRzID0ge1xuICAgICAgICAgICAgc2lnbmFsOiBhYy5zaWduYWwsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2IgPSAodiwgdXBkYXRlQ2FjaGUgPSBmYWxzZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhYm9ydGVkIH0gPSBhYy5zaWduYWw7XG4gICAgICAgICAgICBjb25zdCBpZ25vcmVBYm9ydCA9IG9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCAmJiB2ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hBYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hFcnJvciA9IGFjLnNpZ25hbC5yZWFzb247XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVBYm9ydClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoQWJvcnRJZ25vcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhYm9ydGVkICYmICFpZ25vcmVBYm9ydCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hGYWlsKGFjLnNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWl0aGVyIHdlIGRpZG4ndCBhYm9ydCwgYW5kIGFyZSBzdGlsbCBoZXJlLCBvciB3ZSBkaWQsIGFuZCBpZ25vcmVkXG4gICAgICAgICAgICBjb25zdCBiZiA9IHA7XG4gICAgICAgICAgICBpZiAodGhpcy4jdmFsTGlzdFtpbmRleF0gPT09IHApIHtcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiZi5fX3N0YWxlV2hpbGVGZXRjaGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnZmV0Y2gnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoaywgdiwgZmV0Y2hPcHRzLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlYiA9IChlcikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hFcnJvciA9IGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZldGNoRmFpbChlcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZldGNoRmFpbCA9IChlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhYm9ydGVkIH0gPSBhYy5zaWduYWw7XG4gICAgICAgICAgICBjb25zdCBhbGxvd1N0YWxlQWJvcnRlZCA9IGFib3J0ZWQgJiYgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0O1xuICAgICAgICAgICAgY29uc3QgYWxsb3dTdGFsZSA9IGFsbG93U3RhbGVBYm9ydGVkIHx8IG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgICAgICAgICBjb25zdCBub0RlbGV0ZSA9IGFsbG93U3RhbGUgfHwgb3B0aW9ucy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgICAgICAgICBjb25zdCBiZiA9IHA7XG4gICAgICAgICAgICBpZiAodGhpcy4jdmFsTGlzdFtpbmRleF0gPT09IHApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhbGxvdyBzdGFsZSBvbiBmZXRjaCByZWplY3Rpb25zLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgICAgICAgICAvLyB0aGUgc3RhbGUgdmFsdWUgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUgd2hlbiB0aGUgZmV0Y2ggZmFpbHMuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVsID0gIW5vRGVsZXRlIHx8IGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGRlbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ2ZldGNoJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFhbGxvd1N0YWxlQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCByZXBsYWNlIHRoZSAqcHJvbWlzZSogd2l0aCB0aGUgc3RhbGUgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSBkb25lIHdpdGggdGhlIHByb21pc2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgaXQgdW50b3VjaGVkIGlmIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIGFuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFib3J0ZWQgYmFja2dyb3VuZCBmZXRjaCB0aGF0IGhhc24ndCB5ZXQgcmV0dXJuZWQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbG93U3RhbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMgJiYgYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmYuX19yZXR1cm5lZCA9PT0gYmYpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGNhbGwgPSAocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZtcCA9IHRoaXMuI2ZldGNoTWV0aG9kPy4oaywgdiwgZmV0Y2hPcHRzKTtcbiAgICAgICAgICAgIGlmIChmbXAgJiYgZm1wIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGZtcC50aGVuKHYgPT4gcmVzKHYgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHYpLCByZWopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWdub3JlZCwgd2UgZ28gdW50aWwgd2UgZmluaXNoLCByZWdhcmRsZXNzLlxuICAgICAgICAgICAgLy8gZGVmZXIgY2hlY2sgdW50aWwgd2UgYXJlIGFjdHVhbGx5IGFib3J0aW5nLFxuICAgICAgICAgICAgLy8gc28gZmV0Y2hNZXRob2QgY2FuIG92ZXJyaWRlLlxuICAgICAgICAgICAgYWMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0IHx8XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCkge1xuICAgICAgICAgICAgICAgICAgICByZXModW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBpdCBldmVudHVhbGx5IHJlc29sdmVzLCB1cGRhdGUgdGhlIGNhY2hlLlxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB2ID0+IGNiKHYsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zLnN0YXR1cylcbiAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoRGlzcGF0Y2hlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShwY2FsbCkudGhlbihjYiwgZWIpO1xuICAgICAgICBjb25zdCBiZiA9IE9iamVjdC5hc3NpZ24ocCwge1xuICAgICAgICAgICAgX19hYm9ydENvbnRyb2xsZXI6IGFjLFxuICAgICAgICAgICAgX19zdGFsZVdoaWxlRmV0Y2hpbmc6IHYsXG4gICAgICAgICAgICBfX3JldHVybmVkOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gaW50ZXJuYWwsIGRvbid0IGV4cG9zZSBzdGF0dXMuXG4gICAgICAgICAgICB0aGlzLnNldChrLCBiZiwgeyAuLi5mZXRjaE9wdHMub3B0aW9ucywgc3RhdHVzOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IGJmO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZjtcbiAgICB9XG4gICAgI2lzQmFja2dyb3VuZEZldGNoKHApIHtcbiAgICAgICAgaWYgKCF0aGlzLiNoYXNGZXRjaE1ldGhvZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgYiA9IHA7XG4gICAgICAgIHJldHVybiAoISFiICYmXG4gICAgICAgICAgICBiIGluc3RhbmNlb2YgUHJvbWlzZSAmJlxuICAgICAgICAgICAgYi5oYXNPd25Qcm9wZXJ0eSgnX19zdGFsZVdoaWxlRmV0Y2hpbmcnKSAmJlxuICAgICAgICAgICAgYi5fX2Fib3J0Q29udHJvbGxlciBpbnN0YW5jZW9mIEFDKTtcbiAgICB9XG4gICAgYXN5bmMgZmV0Y2goaywgZmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBcbiAgICAgICAgLy8gZ2V0IG9wdGlvbnNcbiAgICAgICAgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSwgdXBkYXRlQWdlT25HZXQgPSB0aGlzLnVwZGF0ZUFnZU9uR2V0LCBub0RlbGV0ZU9uU3RhbGVHZXQgPSB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCwgXG4gICAgICAgIC8vIHNldCBvcHRpb25zXG4gICAgICAgIHR0bCA9IHRoaXMudHRsLCBub0Rpc3Bvc2VPblNldCA9IHRoaXMubm9EaXNwb3NlT25TZXQsIHNpemUgPSAwLCBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbiwgbm9VcGRhdGVUVEwgPSB0aGlzLm5vVXBkYXRlVFRMLCBcbiAgICAgICAgLy8gZmV0Y2ggZXhjbHVzaXZlIG9wdGlvbnNcbiAgICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiwgaWdub3JlRmV0Y2hBYm9ydCA9IHRoaXMuaWdub3JlRmV0Y2hBYm9ydCwgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCwgY29udGV4dCwgZm9yY2VSZWZyZXNoID0gZmFsc2UsIHN0YXR1cywgc2lnbmFsLCB9ID0gZmV0Y2hPcHRpb25zO1xuICAgICAgICBpZiAoIXRoaXMuI2hhc0ZldGNoTWV0aG9kKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdnZXQnO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGssIHtcbiAgICAgICAgICAgICAgICBhbGxvd1N0YWxlLFxuICAgICAgICAgICAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgICAgICAgICAgIG5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgYWxsb3dTdGFsZSxcbiAgICAgICAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgICAgICAgdHRsLFxuICAgICAgICAgICAgbm9EaXNwb3NlT25TZXQsXG4gICAgICAgICAgICBzaXplLFxuICAgICAgICAgICAgc2l6ZUNhbGN1bGF0aW9uLFxuICAgICAgICAgICAgbm9VcGRhdGVUVEwsXG4gICAgICAgICAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICAgICAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixcbiAgICAgICAgICAgIGFsbG93U3RhbGVPbkZldGNoQWJvcnQsXG4gICAgICAgICAgICBpZ25vcmVGZXRjaEFib3J0LFxuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSAnbWlzcyc7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy4jYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KTtcbiAgICAgICAgICAgIHJldHVybiAocC5fX3JldHVybmVkID0gcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbiBjYWNoZSwgbWF5YmUgYWxyZWFkeSBmZXRjaGluZ1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhbGUgPSBhbGxvd1N0YWxlICYmIHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdpbmZsaWdodCc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWxlID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6ICh2Ll9fcmV0dXJuZWQgPSB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHdlIGZvcmNlIGEgcmVmcmVzaCwgdGhhdCBtZWFucyBkbyBOT1Qgc2VydmUgdGhlIGNhY2hlZCB2YWx1ZSxcbiAgICAgICAgICAgIC8vIHVubGVzcyB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiByZWZyZXNoaW5nIHRoZSBjYWNoZS5cbiAgICAgICAgICAgIGNvbnN0IGlzU3RhbGUgPSB0aGlzLiNpc1N0YWxlKGluZGV4KTtcbiAgICAgICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICFpc1N0YWxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gJ2hpdCc7XG4gICAgICAgICAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UoaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBvaywgaXQgaXMgc3RhbGUgb3IgYSBmb3JjZWQgcmVmcmVzaCwgYW5kIG5vdCBhbHJlYWR5IGZldGNoaW5nLlxuICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgY2FjaGUuXG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy4jYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IGhhc1N0YWxlID0gcC5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc3RhbGVWYWwgPSBoYXNTdGFsZSAmJiBhbGxvd1N0YWxlO1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9IGlzU3RhbGUgPyAnc3RhbGUnIDogJ3JlZnJlc2gnO1xuICAgICAgICAgICAgICAgIGlmIChzdGFsZVZhbCAmJiBpc1N0YWxlKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhbGVWYWwgPyBwLl9fc3RhbGVXaGlsZUZldGNoaW5nIDogKHAuX19yZXR1cm5lZCA9IHApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZvcmNlRmV0Y2goaywgZmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgdiA9IGF3YWl0IHRoaXMuZmV0Y2goaywgZmV0Y2hPcHRpb25zKTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmV0Y2goKSByZXR1cm5lZCB1bmRlZmluZWQnKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIG1lbW8oaywgbWVtb09wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBtZW1vTWV0aG9kID0gdGhpcy4jbWVtb01ldGhvZDtcbiAgICAgICAgaWYgKCFtZW1vTWV0aG9kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIG1lbW9NZXRob2QgcHJvdmlkZWQgdG8gY29uc3RydWN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGNvbnRleHQsIGZvcmNlUmVmcmVzaCwgLi4ub3B0aW9ucyB9ID0gbWVtb09wdGlvbnM7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLmdldChrLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgdiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNvbnN0IHZ2ID0gbWVtb01ldGhvZChrLCB2LCB7XG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0KGssIHZ2LCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHZ2O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB2YWx1ZSBmcm9tIHRoZSBjYWNoZS4gV2lsbCB1cGRhdGUgdGhlIHJlY2VuY3kgb2YgdGhlIGNhY2hlXG4gICAgICogZW50cnkgZm91bmQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgZ2V0KCkgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZ2V0KGssIGdldE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUsIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCwgbm9EZWxldGVPblN0YWxlR2V0ID0gdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQsIHN0YXR1cywgfSA9IGdldE9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBmZXRjaGluZyA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmdldCA9ICdzdGFsZSc7XG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlIG9ubHkgaWYgbm90IGFuIGluLWZsaWdodCBiYWNrZ3JvdW5kIGZldGNoXG4gICAgICAgICAgICAgICAgaWYgKCFmZXRjaGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vRGVsZXRlT25TdGFsZUdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdleHBpcmUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYmIGFsbG93U3RhbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd1N0YWxlID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1N0YWxlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0ID0gJ2hpdCc7XG4gICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgY3VycmVudGx5IGZldGNoaW5nIGl0LCB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIGl0IHlldFxuICAgICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHN0YWxlLCB3aGljaCBtZWFucyB0aGlzIGlzbid0IGEgc3RhbGVXaGlsZVJlZmV0Y2hpbmcuXG4gICAgICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3RhbGUsIGFuZCBmZXRjaGluZywgQU5EIGhhcyBhIF9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUsIHRoZW4gdGhhdCBtZWFucyB0aGUgdXNlciBmZXRjaGVkIHdpdGgge2ZvcmNlUmVmcmVzaDp0cnVlfSxcbiAgICAgICAgICAgICAgICAvLyBzbyBpdCdzIHNhZmUgdG8gcmV0dXJuIHRoYXQgdmFsdWUuXG4gICAgICAgICAgICAgICAgaWYgKGZldGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UoaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBzdGF0dXMuZ2V0ID0gJ21pc3MnO1xuICAgICAgICB9XG4gICAgfVxuICAgICNjb25uZWN0KHAsIG4pIHtcbiAgICAgICAgdGhpcy4jcHJldltuXSA9IHA7XG4gICAgICAgIHRoaXMuI25leHRbcF0gPSBuO1xuICAgIH1cbiAgICAjbW92ZVRvVGFpbChpbmRleCkge1xuICAgICAgICAvLyBpZiB0YWlsIGFscmVhZHksIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgLy8gaWYgaGVhZCwgbW92ZSBoZWFkIHRvIG5leHRbaW5kZXhdXG4gICAgICAgIC8vIGVsc2VcbiAgICAgICAgLy8gICBtb3ZlIG5leHRbcHJldltpbmRleF1dIHRvIG5leHRbaW5kZXhdIChoZWFkIGhhcyBubyBwcmV2KVxuICAgICAgICAvLyAgIG1vdmUgcHJldltuZXh0W2luZGV4XV0gdG8gcHJldltpbmRleF1cbiAgICAgICAgLy8gcHJldltpbmRleF0gPSB0YWlsXG4gICAgICAgIC8vIG5leHRbdGFpbF0gPSBpbmRleFxuICAgICAgICAvLyB0YWlsID0gaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuI2hlYWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jbmV4dFtpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb25uZWN0KHRoaXMuI3ByZXZbaW5kZXhdLCB0aGlzLiNuZXh0W2luZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNjb25uZWN0KHRoaXMuI3RhaWwsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuI3RhaWwgPSBpbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGEga2V5IG91dCBvZiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSB3YXMgZGVsZXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGRlbGV0ZShrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxldGUoaywgJ2RlbGV0ZScpO1xuICAgIH1cbiAgICAjZGVsZXRlKGssIHJlYXNvbikge1xuICAgICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy4jc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jc2l6ZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNjbGVhcihyZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy4jaGFzRGlzcG9zZSB8fCB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYsIGssIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3YsIGssIHJlYXNvbl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2tleU1hcC5kZWxldGUoayk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaW5kZXhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiN0YWlsID0gdGhpcy4jcHJldltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuI2hlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2hlYWQgPSB0aGlzLiNuZXh0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpID0gdGhpcy4jcHJldltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNuZXh0W3BpXSA9IHRoaXMuI25leHRbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmkgPSB0aGlzLiNuZXh0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3ByZXZbbmldID0gdGhpcy4jcHJldltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNmcmVlLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWQ7XG4gICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxldGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgY2FjaGUgZW50aXJlbHksIHRocm93aW5nIGF3YXkgYWxsIHZhbHVlcy5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NsZWFyKCdkZWxldGUnKTtcbiAgICB9XG4gICAgI2NsZWFyKHJlYXNvbikge1xuICAgICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHRoaXMuI3JpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gdGhpcy4ja2V5TGlzdFtpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYsIGssIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3YsIGssIHJlYXNvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNrZXlNYXAuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jdmFsTGlzdC5maWxsKHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuI2tleUxpc3QuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICBpZiAodGhpcy4jdHRscyAmJiB0aGlzLiNzdGFydHMpIHtcbiAgICAgICAgICAgIHRoaXMuI3R0bHMuZmlsbCgwKTtcbiAgICAgICAgICAgIHRoaXMuI3N0YXJ0cy5maWxsKDApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgICAgICAgdGhpcy4jc2l6ZXMuZmlsbCgwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoZWFkID0gMDtcbiAgICAgICAgdGhpcy4jdGFpbCA9IDA7XG4gICAgICAgIHRoaXMuI2ZyZWUubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgPSAwO1xuICAgICAgICB0aGlzLiNzaXplID0gMDtcbiAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZDtcbiAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgImltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCB7IHBvc2l4LCB3aW4zMiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgbHN0YXRTeW5jLCByZWFkZGlyIGFzIHJlYWRkaXJDQiwgcmVhZGRpclN5bmMsIHJlYWRsaW5rU3luYywgcmVhbHBhdGhTeW5jIGFzIHJwcywgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBhY3R1YWxGUyBmcm9tICdub2RlOmZzJztcbmNvbnN0IHJlYWxwYXRoU3luYyA9IHJwcy5uYXRpdmU7XG4vLyBUT0RPOiB0ZXN0IHBlcmYgb2YgZnMvcHJvbWlzZXMgcmVhbHBhdGggdnMgcmVhbHBhdGhDQixcbi8vIHNpbmNlIHRoZSBwcm9taXNlcyBvbmUgdXNlcyByZWFscGF0aC5uYXRpdmVcbmltcG9ydCB7IGxzdGF0LCByZWFkZGlyLCByZWFkbGluaywgcmVhbHBhdGggfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IE1pbmlwYXNzIH0gZnJvbSAnbWluaXBhc3MnO1xuY29uc3QgZGVmYXVsdEZTID0ge1xuICAgIGxzdGF0U3luYyxcbiAgICByZWFkZGlyOiByZWFkZGlyQ0IsXG4gICAgcmVhZGRpclN5bmMsXG4gICAgcmVhZGxpbmtTeW5jLFxuICAgIHJlYWxwYXRoU3luYyxcbiAgICBwcm9taXNlczoge1xuICAgICAgICBsc3RhdCxcbiAgICAgICAgcmVhZGRpcixcbiAgICAgICAgcmVhZGxpbmssXG4gICAgICAgIHJlYWxwYXRoLFxuICAgIH0sXG59O1xuLy8gaWYgdGhleSBqdXN0IGdhdmUgdXMgcmVxdWlyZSgnZnMnKSB0aGVuIHVzZSBvdXIgZGVmYXVsdFxuY29uc3QgZnNGcm9tT3B0aW9uID0gKGZzT3B0aW9uKSA9PiAhZnNPcHRpb24gfHwgZnNPcHRpb24gPT09IGRlZmF1bHRGUyB8fCBmc09wdGlvbiA9PT0gYWN0dWFsRlMgP1xuICAgIGRlZmF1bHRGU1xuICAgIDoge1xuICAgICAgICAuLi5kZWZhdWx0RlMsXG4gICAgICAgIC4uLmZzT3B0aW9uLFxuICAgICAgICBwcm9taXNlczoge1xuICAgICAgICAgICAgLi4uZGVmYXVsdEZTLnByb21pc2VzLFxuICAgICAgICAgICAgLi4uKGZzT3B0aW9uLnByb21pc2VzIHx8IHt9KSxcbiAgICAgICAgfSxcbiAgICB9O1xuLy8gdHVybiBzb21ldGhpbmcgbGlrZSAvLz8vYzovIGludG8gYzpcXFxuY29uc3QgdW5jRHJpdmVSZWdleHAgPSAvXlxcXFxcXFxcXFw/XFxcXChbYS16XTopXFxcXD8kL2k7XG5jb25zdCB1bmNUb0RyaXZlID0gKHJvb3RQYXRoKSA9PiByb290UGF0aC5yZXBsYWNlKC9cXC8vZywgJ1xcXFwnKS5yZXBsYWNlKHVuY0RyaXZlUmVnZXhwLCAnJDFcXFxcJyk7XG4vLyB3aW5kb3dzIHBhdGhzIGFyZSBzZXBhcmF0ZWQgYnkgZWl0aGVyIC8gb3IgXFxcbmNvbnN0IGVpdGhlclNlcCA9IC9bXFxcXFxcL10vO1xuY29uc3QgVU5LTk9XTiA9IDA7IC8vIG1heSBub3QgZXZlbiBleGlzdCwgZm9yIGFsbCB3ZSBrbm93XG5jb25zdCBJRklGTyA9IDBiMDAwMTtcbmNvbnN0IElGQ0hSID0gMGIwMDEwO1xuY29uc3QgSUZESVIgPSAwYjAxMDA7XG5jb25zdCBJRkJMSyA9IDBiMDExMDtcbmNvbnN0IElGUkVHID0gMGIxMDAwO1xuY29uc3QgSUZMTksgPSAwYjEwMTA7XG5jb25zdCBJRlNPQ0sgPSAwYjExMDA7XG5jb25zdCBJRk1UID0gMGIxMTExO1xuLy8gbWFzayB0byB1bnNldCBsb3cgNCBiaXRzXG5jb25zdCBJRk1UX1VOS05PV04gPSB+SUZNVDtcbi8vIHNldCBhZnRlciBzdWNjZXNzZnVsbHkgY2FsbGluZyByZWFkZGlyKCkgYW5kIGdldHRpbmcgZW50cmllcy5cbmNvbnN0IFJFQURESVJfQ0FMTEVEID0gMGIwMDAwXzAwMDFfMDAwMDtcbi8vIHNldCBhZnRlciBhIHN1Y2Nlc3NmdWwgbHN0YXQoKVxuY29uc3QgTFNUQVRfQ0FMTEVEID0gMGIwMDAwXzAwMTBfMDAwMDtcbi8vIHNldCBpZiBhbiBlbnRyeSAob3Igb25lIG9mIGl0cyBwYXJlbnRzKSBpcyBkZWZpbml0ZWx5IG5vdCBhIGRpclxuY29uc3QgRU5PVERJUiA9IDBiMDAwMF8wMTAwXzAwMDA7XG4vLyBzZXQgaWYgYW4gZW50cnkgKG9yIG9uZSBvZiBpdHMgcGFyZW50cykgZG9lcyBub3QgZXhpc3Rcbi8vIChjYW4gYWxzbyBiZSBzZXQgb24gbHN0YXQgZXJyb3JzIGxpa2UgRUFDQ0VTIG9yIEVOQU1FVE9PTE9ORylcbmNvbnN0IEVOT0VOVCA9IDBiMDAwMF8xMDAwXzAwMDA7XG4vLyBjYW5ub3QgaGF2ZSBjaGlsZCBlbnRyaWVzIC0tIGFsc28gdmVyaWZ5ICZJRk1UIGlzIGVpdGhlciBJRkRJUiBvciBJRkxOS1xuLy8gc2V0IGlmIHdlIGZhaWwgdG8gcmVhZGxpbmtcbmNvbnN0IEVOT1JFQURMSU5LID0gMGIwMDAxXzAwMDBfMDAwMDtcbi8vIHNldCBpZiB3ZSBrbm93IHJlYWxwYXRoKCkgd2lsbCBmYWlsXG5jb25zdCBFTk9SRUFMUEFUSCA9IDBiMDAxMF8wMDAwXzAwMDA7XG5jb25zdCBFTk9DSElMRCA9IEVOT1RESVIgfCBFTk9FTlQgfCBFTk9SRUFMUEFUSDtcbmNvbnN0IFRZUEVNQVNLID0gMGIwMDExXzExMTFfMTExMTtcbmNvbnN0IGVudFRvVHlwZSA9IChzKSA9PiBzLmlzRmlsZSgpID8gSUZSRUdcbiAgICA6IHMuaXNEaXJlY3RvcnkoKSA/IElGRElSXG4gICAgICAgIDogcy5pc1N5bWJvbGljTGluaygpID8gSUZMTktcbiAgICAgICAgICAgIDogcy5pc0NoYXJhY3RlckRldmljZSgpID8gSUZDSFJcbiAgICAgICAgICAgICAgICA6IHMuaXNCbG9ja0RldmljZSgpID8gSUZCTEtcbiAgICAgICAgICAgICAgICAgICAgOiBzLmlzU29ja2V0KCkgPyBJRlNPQ0tcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcy5pc0ZJRk8oKSA/IElGSUZPXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBVTktOT1dOO1xuLy8gbm9ybWFsaXplIHVuaWNvZGUgcGF0aCBuYW1lc1xuY29uc3Qgbm9ybWFsaXplQ2FjaGUgPSBuZXcgTWFwKCk7XG5jb25zdCBub3JtYWxpemUgPSAocykgPT4ge1xuICAgIGNvbnN0IGMgPSBub3JtYWxpemVDYWNoZS5nZXQocyk7XG4gICAgaWYgKGMpXG4gICAgICAgIHJldHVybiBjO1xuICAgIGNvbnN0IG4gPSBzLm5vcm1hbGl6ZSgnTkZLRCcpO1xuICAgIG5vcm1hbGl6ZUNhY2hlLnNldChzLCBuKTtcbiAgICByZXR1cm4gbjtcbn07XG5jb25zdCBub3JtYWxpemVOb2Nhc2VDYWNoZSA9IG5ldyBNYXAoKTtcbmNvbnN0IG5vcm1hbGl6ZU5vY2FzZSA9IChzKSA9PiB7XG4gICAgY29uc3QgYyA9IG5vcm1hbGl6ZU5vY2FzZUNhY2hlLmdldChzKTtcbiAgICBpZiAoYylcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgY29uc3QgbiA9IG5vcm1hbGl6ZShzLnRvTG93ZXJDYXNlKCkpO1xuICAgIG5vcm1hbGl6ZU5vY2FzZUNhY2hlLnNldChzLCBuKTtcbiAgICByZXR1cm4gbjtcbn07XG4vKipcbiAqIEFuIExSVUNhY2hlIGZvciBzdG9yaW5nIHJlc29sdmVkIHBhdGggc3RyaW5ncyBvciBQYXRoIG9iamVjdHMuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc29sdmVDYWNoZSBleHRlbmRzIExSVUNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoeyBtYXg6IDI1NiB9KTtcbiAgICB9XG59XG4vLyBJbiBvcmRlciB0byBwcmV2ZW50IGJsb3dpbmcgb3V0IHRoZSBqcyBoZWFwIGJ5IGFsbG9jYXRpbmcgaHVuZHJlZHMgb2Zcbi8vIHRob3VzYW5kcyBvZiBQYXRoIGVudHJpZXMgd2hlbiB3YWxraW5nIGV4dHJlbWVseSBsYXJnZSB0cmVlcywgdGhlIFwiY2hpbGRyZW5cIlxuLy8gaW4gdGhpcyB0cmVlIGFyZSByZXByZXNlbnRlZCBieSBzdG9yaW5nIGFuIGFycmF5IG9mIFBhdGggZW50cmllcyBpbiBhblxuLy8gTFJVQ2FjaGUsIGluZGV4ZWQgYnkgdGhlIHBhcmVudC4gIEF0IGFueSB0aW1lLCBQYXRoLmNoaWxkcmVuKCkgbWF5IHJldHVybiBhblxuLy8gZW1wdHkgYXJyYXksIGluZGljYXRpbmcgdGhhdCBpdCBkb2Vzbid0IGtub3cgYWJvdXQgYW55IG9mIGl0cyBjaGlsZHJlbiwgYW5kXG4vLyB0aHVzIGhhcyB0byByZWJ1aWxkIHRoYXQgY2FjaGUuICBUaGlzIGlzIGZpbmUsIGl0IGp1c3QgbWVhbnMgdGhhdCB3ZSBkb24ndFxuLy8gYmVuZWZpdCBhcyBtdWNoIGZyb20gaGF2aW5nIHRoZSBjYWNoZWQgZW50cmllcywgYnV0IGh1Z2UgZGlyZWN0b3J5IHdhbGtzXG4vLyBkb24ndCBibG93IG91dCB0aGUgc3RhY2ssIGFuZCBzbWFsbGVyIG9uZXMgYXJlIHN0aWxsIGFzIGZhc3QgYXMgcG9zc2libGUuXG4vL1xuLy9JdCBkb2VzIGltcG9zZSBzb21lIGNvbXBsZXhpdHkgd2hlbiBidWlsZGluZyB1cCB0aGUgcmVhZGRpciBkYXRhLCBiZWNhdXNlIHdlXG4vL25lZWQgdG8gcGFzcyBhIHJlZmVyZW5jZSB0byB0aGUgY2hpbGRyZW4gYXJyYXkgdGhhdCB3ZSBzdGFydGVkIHdpdGguXG4vKipcbiAqIGFuIExSVUNhY2hlIGZvciBzdG9yaW5nIGNoaWxkIGVudHJpZXMuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENoaWxkcmVuQ2FjaGUgZXh0ZW5kcyBMUlVDYWNoZSB7XG4gICAgY29uc3RydWN0b3IobWF4U2l6ZSA9IDE2ICogMTAyNCkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBtYXhTaXplLFxuICAgICAgICAgICAgLy8gcGFyZW50ICsgY2hpbGRyZW5cbiAgICAgICAgICAgIHNpemVDYWxjdWxhdGlvbjogYSA9PiBhLmxlbmd0aCArIDEsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNvbnN0IHNldEFzQ3dkID0gU3ltYm9sKCdQYXRoU2N1cnJ5IHNldEFzQ3dkJyk7XG4vKipcbiAqIFBhdGggb2JqZWN0cyBhcmUgc29ydCBvZiBsaWtlIGEgc3VwZXItcG93ZXJlZFxuICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9kb2NzL2xhdGVzdC9hcGkvZnMuaHRtbCNjbGFzcy1mc2RpcmVudCBmcy5EaXJlbnR9XG4gKlxuICogRWFjaCBvbmUgcmVwcmVzZW50cyBhIHNpbmdsZSBmaWxlc3lzdGVtIGVudHJ5IG9uIGRpc2ssIHdoaWNoIG1heSBvciBtYXkgbm90XG4gKiBleGlzdC4gSXQgaW5jbHVkZXMgbWV0aG9kcyBmb3IgcmVhZGluZyB2YXJpb3VzIHR5cGVzIG9mIGluZm9ybWF0aW9uIHZpYVxuICogbHN0YXQsIHJlYWRsaW5rLCBhbmQgcmVhZGRpciwgYW5kIGNhY2hlcyBhbGwgaW5mb3JtYXRpb24gdG8gdGhlIGdyZWF0ZXN0XG4gKiBkZWdyZWUgcG9zc2libGUuXG4gKlxuICogTm90ZSB0aGF0IGZzIG9wZXJhdGlvbnMgdGhhdCB3b3VsZCBub3JtYWxseSB0aHJvdyB3aWxsIGluc3RlYWQgcmV0dXJuIGFuXG4gKiBcImVtcHR5XCIgdmFsdWUuIFRoaXMgaXMgaW4gb3JkZXIgdG8gcHJldmVudCBleGNlc3NpdmUgb3ZlcmhlYWQgZnJvbSBlcnJvclxuICogc3RhY2sgdHJhY2VzLlxuICovXG5leHBvcnQgY2xhc3MgUGF0aEJhc2Uge1xuICAgIC8qKlxuICAgICAqIHRoZSBiYXNlbmFtZSBvZiB0aGlzIHBhdGhcbiAgICAgKlxuICAgICAqICoqSW1wb3J0YW50Kio6ICphbHdheXMqIHRlc3QgdGhlIHBhdGggbmFtZSBhZ2FpbnN0IGFueSB0ZXN0IHN0cmluZ1xuICAgICAqIHVzaW5ndGhlIHtAbGluayBpc05hbWVkfSBtZXRob2QsIGFuZCBub3QgYnkgZGlyZWN0bHkgY29tcGFyaW5nIHRoaXNcbiAgICAgKiBzdHJpbmcuIE90aGVyd2lzZSwgdW5pY29kZSBwYXRoIHN0cmluZ3MgdGhhdCB0aGUgc3lzdGVtIHNlZXMgYXMgaWRlbnRpY2FsXG4gICAgICogd2lsbCBub3QgYmUgcHJvcGVybHkgdHJlYXRlZCBhcyB0aGUgc2FtZSBwYXRoLCBsZWFkaW5nIHRvIGluY29ycmVjdFxuICAgICAqIGJlaGF2aW9yIGFuZCBwb3NzaWJsZSBzZWN1cml0eSBpc3N1ZXMuXG4gICAgICovXG4gICAgbmFtZTtcbiAgICAvKipcbiAgICAgKiB0aGUgUGF0aCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXRoIHJvb3QuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICByb290O1xuICAgIC8qKlxuICAgICAqIEFsbCByb290cyBmb3VuZCB3aXRoaW4gdGhlIGN1cnJlbnQgUGF0aFNjdXJyeSBmYW1pbHlcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHJvb3RzO1xuICAgIC8qKlxuICAgICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgcGF0aCwgb3IgdW5kZWZpbmVkIGluIHRoZSBjYXNlIG9mIHJvb3QgZW50cmllc1xuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcGFyZW50O1xuICAgIC8qKlxuICAgICAqIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHBhdGhzIGFyZSBjb21wYXJlZCBjYXNlLWluc2Vuc2l0aXZlbHlcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBub2Nhc2U7XG4gICAgLyoqXG4gICAgICogYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhpcyBwYXRoIGlzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICogb2YgdGhlIFBhdGhTY3VycnkgY29sbGVjdGlvbiB0aGF0IGNvbnRhaW5zIGl0LlxuICAgICAqL1xuICAgIGlzQ1dEID0gZmFsc2U7XG4gICAgLy8gcG90ZW50aWFsIGRlZmF1bHQgZnMgb3ZlcnJpZGVcbiAgICAjZnM7XG4gICAgLy8gU3RhdHMgZmllbGRzXG4gICAgI2RldjtcbiAgICBnZXQgZGV2KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGV2O1xuICAgIH1cbiAgICAjbW9kZTtcbiAgICBnZXQgbW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21vZGU7XG4gICAgfVxuICAgICNubGluaztcbiAgICBnZXQgbmxpbmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNubGluaztcbiAgICB9XG4gICAgI3VpZDtcbiAgICBnZXQgdWlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdWlkO1xuICAgIH1cbiAgICAjZ2lkO1xuICAgIGdldCBnaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNnaWQ7XG4gICAgfVxuICAgICNyZGV2O1xuICAgIGdldCByZGV2KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmRldjtcbiAgICB9XG4gICAgI2Jsa3NpemU7XG4gICAgZ2V0IGJsa3NpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNibGtzaXplO1xuICAgIH1cbiAgICAjaW5vO1xuICAgIGdldCBpbm8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpbm87XG4gICAgfVxuICAgICNzaXplO1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2l6ZTtcbiAgICB9XG4gICAgI2Jsb2NrcztcbiAgICBnZXQgYmxvY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYmxvY2tzO1xuICAgIH1cbiAgICAjYXRpbWVNcztcbiAgICBnZXQgYXRpbWVNcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2F0aW1lTXM7XG4gICAgfVxuICAgICNtdGltZU1zO1xuICAgIGdldCBtdGltZU1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbXRpbWVNcztcbiAgICB9XG4gICAgI2N0aW1lTXM7XG4gICAgZ2V0IGN0aW1lTXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjdGltZU1zO1xuICAgIH1cbiAgICAjYmlydGh0aW1lTXM7XG4gICAgZ2V0IGJpcnRodGltZU1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYmlydGh0aW1lTXM7XG4gICAgfVxuICAgICNhdGltZTtcbiAgICBnZXQgYXRpbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhdGltZTtcbiAgICB9XG4gICAgI210aW1lO1xuICAgIGdldCBtdGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI210aW1lO1xuICAgIH1cbiAgICAjY3RpbWU7XG4gICAgZ2V0IGN0aW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY3RpbWU7XG4gICAgfVxuICAgICNiaXJ0aHRpbWU7XG4gICAgZ2V0IGJpcnRodGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2JpcnRodGltZTtcbiAgICB9XG4gICAgI21hdGNoTmFtZTtcbiAgICAjZGVwdGg7XG4gICAgI2Z1bGxwYXRoO1xuICAgICNmdWxscGF0aFBvc2l4O1xuICAgICNyZWxhdGl2ZTtcbiAgICAjcmVsYXRpdmVQb3NpeDtcbiAgICAjdHlwZTtcbiAgICAjY2hpbGRyZW47XG4gICAgI2xpbmtUYXJnZXQ7XG4gICAgI3JlYWxwYXRoO1xuICAgIC8qKlxuICAgICAqIFRoaXMgcHJvcGVydHkgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgRGlyZW50IGNsYXNzIGFzIG9mXG4gICAgICogTm9kZSB2MjAsIHdoZXJlIERpcmVudFsncGFyZW50UGF0aCddIHJlZmVycyB0byB0aGUgcGF0aCBvZiB0aGVcbiAgICAgKiBkaXJlY3RvcnkgdGhhdCB3YXMgcGFzc2VkIHRvIHJlYWRkaXIuIEZvciByb290IGVudHJpZXMsIGl0J3MgdGhlIHBhdGhcbiAgICAgKiB0byB0aGUgZW50cnkgaXRzZWxmLlxuICAgICAqL1xuICAgIGdldCBwYXJlbnRQYXRoKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucGFyZW50IHx8IHRoaXMpLmZ1bGxwYXRoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgYWxpYXMgZm9yIERpcmVudFsncGFyZW50UGF0aCddIFNvbWV3aGF0IGNvdW50ZXJpbnR1aXRpdmVseSxcbiAgICAgKiB0aGlzIHByb3BlcnR5IHJlZmVycyB0byB0aGUgKnBhcmVudCogcGF0aCwgbm90IHRoZSBwYXRoIG9iamVjdCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBwYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRQYXRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEbyBub3QgY3JlYXRlIG5ldyBQYXRoIG9iamVjdHMgZGlyZWN0bHkuICBUaGV5IHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWRcbiAgICAgKiB2aWEgdGhlIFBhdGhTY3VycnkgY2xhc3Mgb3Igb3RoZXIgbWV0aG9kcyBvbiB0aGUgUGF0aCBjbGFzcy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHR5cGUgPSBVTktOT1dOLCByb290LCByb290cywgbm9jYXNlLCBjaGlsZHJlbiwgb3B0cykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLiNtYXRjaE5hbWUgPSBub2Nhc2UgPyBub3JtYWxpemVOb2Nhc2UobmFtZSkgOiBub3JtYWxpemUobmFtZSk7XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0eXBlICYgVFlQRU1BU0s7XG4gICAgICAgIHRoaXMubm9jYXNlID0gbm9jYXNlO1xuICAgICAgICB0aGlzLnJvb3RzID0gcm9vdHM7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3QgfHwgdGhpcztcbiAgICAgICAgdGhpcy4jY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy4jZnVsbHBhdGggPSBvcHRzLmZ1bGxwYXRoO1xuICAgICAgICB0aGlzLiNyZWxhdGl2ZSA9IG9wdHMucmVsYXRpdmU7XG4gICAgICAgIHRoaXMuI3JlbGF0aXZlUG9zaXggPSBvcHRzLnJlbGF0aXZlUG9zaXg7XG4gICAgICAgIHRoaXMucGFyZW50ID0gb3B0cy5wYXJlbnQ7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy4jZnMgPSB0aGlzLnBhcmVudC4jZnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNmcyA9IGZzRnJvbU9wdGlvbihvcHRzLmZzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZXB0aCBvZiB0aGUgUGF0aCBvYmplY3QgZnJvbSBpdHMgcm9vdC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCBhIHBhdGggYXQgYC9mb28vYmFyYCB3b3VsZCBoYXZlIGEgZGVwdGggb2YgMi5cbiAgICAgKi9cbiAgICBkZXB0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RlcHRoICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZGVwdGg7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI2RlcHRoID0gMCk7XG4gICAgICAgIHJldHVybiAodGhpcy4jZGVwdGggPSB0aGlzLnBhcmVudC5kZXB0aCgpICsgMSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNoaWxkcmVuQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjaGlsZHJlbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBQYXRoIG9iamVjdCByZWZlcmVuY2VkIGJ5IHRoZSBzdHJpbmcgcGF0aCwgcmVzb2x2ZWQgZnJvbSB0aGlzIFBhdGhcbiAgICAgKi9cbiAgICByZXNvbHZlKHBhdGgpIHtcbiAgICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb290UGF0aCA9IHRoaXMuZ2V0Um9vdFN0cmluZyhwYXRoKTtcbiAgICAgICAgY29uc3QgZGlyID0gcGF0aC5zdWJzdHJpbmcocm9vdFBhdGgubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZGlyUGFydHMgPSBkaXIuc3BsaXQodGhpcy5zcGxpdFNlcCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJvb3RQYXRoID9cbiAgICAgICAgICAgIHRoaXMuZ2V0Um9vdChyb290UGF0aCkuI3Jlc29sdmVQYXJ0cyhkaXJQYXJ0cylcbiAgICAgICAgICAgIDogdGhpcy4jcmVzb2x2ZVBhcnRzKGRpclBhcnRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgI3Jlc29sdmVQYXJ0cyhkaXJQYXJ0cykge1xuICAgICAgICBsZXQgcCA9IHRoaXM7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBkaXJQYXJ0cykge1xuICAgICAgICAgICAgcCA9IHAuY2hpbGQocGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCBjaGlsZHJlbiBQYXRoIG9iamVjdHMsIGlmIHN0aWxsIGF2YWlsYWJsZS4gIElmIHRoZXlcbiAgICAgKiBoYXZlIGZhbGxlbiBvdXQgb2YgdGhlIGNhY2hlLCB0aGVuIHJldHVybnMgYW4gZW1wdHkgYXJyYXksIGFuZCByZXNldHMgdGhlXG4gICAgICogUkVBRERJUl9DQUxMRUQgYml0LCBzbyB0aGF0IGZ1dHVyZSBjYWxscyB0byByZWFkZGlyKCkgd2lsbCByZXF1aXJlIGFuIGZzXG4gICAgICogbG9va3VwLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY2hpbGRyZW4oKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuI2NoaWxkcmVuLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IE9iamVjdC5hc3NpZ24oW10sIHsgcHJvdmlzaW9uYWw6IDAgfSk7XG4gICAgICAgIHRoaXMuI2NoaWxkcmVuLnNldCh0aGlzLCBjaGlsZHJlbik7XG4gICAgICAgIHRoaXMuI3R5cGUgJj0gflJFQURESVJfQ0FMTEVEO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIGEgcGF0aCBwb3J0aW9uIGFuZCByZXR1cm5zIG9yIGNyZWF0ZXMgdGhlIGNoaWxkIFBhdGguXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGB0aGlzYCBpZiBwYXRoUGFydCBpcyBgJydgIG9yIGAnLidgLCBvciBgcGFyZW50YCBpZiBwYXRoUGFydCBpc1xuICAgICAqIGAnLi4nYC5cbiAgICAgKlxuICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuICBJZiBgcGF0aFBhcnRgIGNvbnRhaW5zIGFueSBwYXRoXG4gICAgICogc2VwYXJhdG9ycywgaXQgd2lsbCBsZWFkIHRvIHVuc2FmZSB1bmRlZmluZWQgYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiBVc2UgYFBhdGgucmVzb2x2ZSgpYCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY2hpbGQocGF0aFBhcnQsIG9wdHMpIHtcbiAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSAnJyB8fCBwYXRoUGFydCA9PT0gJy4nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09ICcuLicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudCB8fCB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgdGhlIGNoaWxkXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbigpO1xuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5ub2Nhc2UgPyBub3JtYWxpemVOb2Nhc2UocGF0aFBhcnQpIDogbm9ybWFsaXplKHBhdGhQYXJ0KTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAocC4jbWF0Y2hOYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlkbid0IGZpbmQgaXQsIGNyZWF0ZSBwcm92aXNpb25hbCBjaGlsZCwgc2luY2UgaXQgbWlnaHQgbm90XG4gICAgICAgIC8vIGFjdHVhbGx5IGV4aXN0LiAgSWYgd2Uga25vdyB0aGUgcGFyZW50IGlzbid0IGEgZGlyLCB0aGVuXG4gICAgICAgIC8vIGluIGZhY3QgaXQgQ0FOJ1QgZXhpc3QuXG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLnBhcmVudCA/IHRoaXMuc2VwIDogJyc7XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gdGhpcy4jZnVsbHBhdGggPyB0aGlzLiNmdWxscGF0aCArIHMgKyBwYXRoUGFydCA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcGNoaWxkID0gdGhpcy5uZXdDaGlsZChwYXRoUGFydCwgVU5LTk9XTiwge1xuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgICAgICAgIGZ1bGxwYXRoLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0aGlzLmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgcGNoaWxkLiN0eXBlIHw9IEVOT0VOVDtcbiAgICAgICAgfVxuICAgICAgICAvLyBkb24ndCBoYXZlIHRvIHVwZGF0ZSBwcm92aXNpb25hbCwgYmVjYXVzZSBpZiB3ZSBoYXZlIHJlYWwgY2hpbGRyZW4sXG4gICAgICAgIC8vIHRoZW4gcHJvdmlzaW9uYWwgaXMgc2V0IHRvIGNoaWxkcmVuLmxlbmd0aCwgb3RoZXJ3aXNlIGEgbG93ZXIgbnVtYmVyXG4gICAgICAgIGNoaWxkcmVuLnB1c2gocGNoaWxkKTtcbiAgICAgICAgcmV0dXJuIHBjaGlsZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgY3dkLiBJZiBpdCBkb2VzIG5vdCBzaGFyZSBhbiBhbmNlc3RvciB3aXRoXG4gICAgICogdGhlIGN3ZCwgdGhlbiB0aGlzIGVuZHMgdXAgYmVpbmcgZXF1aXZhbGVudCB0byB0aGUgZnVsbHBhdGgoKVxuICAgICAqL1xuICAgIHJlbGF0aXZlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0NXRClcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgaWYgKHRoaXMuI3JlbGF0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNyZWxhdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICBjb25zdCBwID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgIGlmICghcCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNyZWxhdGl2ZSA9IHRoaXMubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHYgPSBwLnJlbGF0aXZlKCk7XG4gICAgICAgIHJldHVybiBwdiArICghcHYgfHwgIXAucGFyZW50ID8gJycgOiB0aGlzLnNlcCkgKyBuYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBjd2QsIHVzaW5nIC8gYXMgdGhlIHBhdGggc2VwYXJhdG9yLlxuICAgICAqIElmIGl0IGRvZXMgbm90IHNoYXJlIGFuIGFuY2VzdG9yIHdpdGhcbiAgICAgKiB0aGUgY3dkLCB0aGVuIHRoaXMgZW5kcyB1cCBiZWluZyBlcXVpdmFsZW50IHRvIHRoZSBmdWxscGF0aFBvc2l4KClcbiAgICAgKiBPbiBwb3NpeCBzeXN0ZW1zLCB0aGlzIGlzIGlkZW50aWNhbCB0byByZWxhdGl2ZSgpLlxuICAgICAqL1xuICAgIHJlbGF0aXZlUG9zaXgoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlcCA9PT0gJy8nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpdmUoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNDV0QpXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIGlmICh0aGlzLiNyZWxhdGl2ZVBvc2l4ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jcmVsYXRpdmVQb3NpeDtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMucGFyZW50O1xuICAgICAgICBpZiAoIXApIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jcmVsYXRpdmVQb3NpeCA9IHRoaXMuZnVsbHBhdGhQb3NpeCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdiA9IHAucmVsYXRpdmVQb3NpeCgpO1xuICAgICAgICByZXR1cm4gcHYgKyAoIXB2IHx8ICFwLnBhcmVudCA/ICcnIDogJy8nKSArIG5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxseSByZXNvbHZlZCBwYXRoIHN0cmluZyBmb3IgdGhpcyBQYXRoIGVudHJ5XG4gICAgICovXG4gICAgZnVsbHBhdGgoKSB7XG4gICAgICAgIGlmICh0aGlzLiNmdWxscGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZnVsbHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMucGFyZW50O1xuICAgICAgICBpZiAoIXApIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jZnVsbHBhdGggPSB0aGlzLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB2ID0gcC5mdWxscGF0aCgpO1xuICAgICAgICBjb25zdCBmcCA9IHB2ICsgKCFwLnBhcmVudCA/ICcnIDogdGhpcy5zZXApICsgbmFtZTtcbiAgICAgICAgcmV0dXJuICh0aGlzLiNmdWxscGF0aCA9IGZwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT24gcGxhdGZvcm1zIG90aGVyIHRoYW4gd2luZG93cywgdGhpcyBpcyBpZGVudGljYWwgdG8gZnVsbHBhdGguXG4gICAgICpcbiAgICAgKiBPbiB3aW5kb3dzLCB0aGlzIGlzIG92ZXJyaWRkZW4gdG8gcmV0dXJuIHRoZSBmb3J3YXJkLXNsYXNoIGZvcm0gb2YgdGhlXG4gICAgICogZnVsbCBVTkMgcGF0aC5cbiAgICAgKi9cbiAgICBmdWxscGF0aFBvc2l4KCkge1xuICAgICAgICBpZiAodGhpcy4jZnVsbHBhdGhQb3NpeCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2Z1bGxwYXRoUG9zaXg7XG4gICAgICAgIGlmICh0aGlzLnNlcCA9PT0gJy8nKVxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNmdWxscGF0aFBvc2l4ID0gdGhpcy5mdWxscGF0aCgpKTtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMuZnVsbHBhdGgoKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgICAgICBpZiAoL15bYS16XTpcXC8vaS50ZXN0KHApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNmdWxscGF0aFBvc2l4ID0gYC8vPy8ke3B9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuI2Z1bGxwYXRoUG9zaXggPSBwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgIGNvbnN0IHBmcHAgPSBwLmZ1bGxwYXRoUG9zaXgoKTtcbiAgICAgICAgY29uc3QgZnBwID0gcGZwcCArICghcGZwcCB8fCAhcC5wYXJlbnQgPyAnJyA6ICcvJykgKyB0aGlzLm5hbWU7XG4gICAgICAgIHJldHVybiAodGhpcy4jZnVsbHBhdGhQb3NpeCA9IGZwcCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBQYXRoIG9mIGFuIHVua25vd24gdHlwZT9cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB3ZSBtaWdodCBrbm93ICpzb21ldGhpbmcqIGFib3V0IGl0IGlmIHRoZXJlIGhhcyBiZWVuIGEgcHJldmlvdXNcbiAgICAgKiBmaWxlc3lzdGVtIG9wZXJhdGlvbiwgZm9yIGV4YW1wbGUgdGhhdCBpdCBkb2VzIG5vdCBleGlzdCwgb3IgaXMgbm90IGFcbiAgICAgKiBsaW5rLCBvciB3aGV0aGVyIGl0IGhhcyBjaGlsZCBlbnRyaWVzLlxuICAgICAqL1xuICAgIGlzVW5rbm93bigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiN0eXBlICYgSUZNVCkgPT09IFVOS05PV047XG4gICAgfVxuICAgIGlzVHlwZSh0eXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2BpcyR7dHlwZX1gXSgpO1xuICAgIH1cbiAgICBnZXRUeXBlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaXNVbmtub3duKCkgPyAnVW5rbm93bidcbiAgICAgICAgICAgIDogdGhpcy5pc0RpcmVjdG9yeSgpID8gJ0RpcmVjdG9yeSdcbiAgICAgICAgICAgICAgICA6IHRoaXMuaXNGaWxlKCkgPyAnRmlsZSdcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmlzU3ltYm9saWNMaW5rKCkgPyAnU3ltYm9saWNMaW5rJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmlzRklGTygpID8gJ0ZJRk8nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmlzQ2hhcmFjdGVyRGV2aWNlKCkgPyAnQ2hhcmFjdGVyRGV2aWNlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuaXNCbG9ja0RldmljZSgpID8gJ0Jsb2NrRGV2aWNlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAvKiBjOCBpZ25vcmUgc3RhcnQgKi8gdGhpcy5pc1NvY2tldCgpID8gJ1NvY2tldCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdVbmtub3duJyk7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBQYXRoIGEgcmVndWxhciBmaWxlP1xuICAgICAqL1xuICAgIGlzRmlsZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiN0eXBlICYgSUZNVCkgPT09IElGUkVHO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgUGF0aCBhIGRpcmVjdG9yeT9cbiAgICAgKi9cbiAgICBpc0RpcmVjdG9yeSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiN0eXBlICYgSUZNVCkgPT09IElGRElSO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgcGF0aCBhIGNoYXJhY3RlciBkZXZpY2U/XG4gICAgICovXG4gICAgaXNDaGFyYWN0ZXJEZXZpY2UoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jdHlwZSAmIElGTVQpID09PSBJRkNIUjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIHBhdGggYSBibG9jayBkZXZpY2U/XG4gICAgICovXG4gICAgaXNCbG9ja0RldmljZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiN0eXBlICYgSUZNVCkgPT09IElGQkxLO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgcGF0aCBhIEZJRk8gcGlwZT9cbiAgICAgKi9cbiAgICBpc0ZJRk8oKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jdHlwZSAmIElGTVQpID09PSBJRklGTztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIHBhdGggYSBzb2NrZXQ/XG4gICAgICovXG4gICAgaXNTb2NrZXQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jdHlwZSAmIElGTVQpID09PSBJRlNPQ0s7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBwYXRoIGEgc3ltYm9saWMgbGluaz9cbiAgICAgKi9cbiAgICBpc1N5bWJvbGljTGluaygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiN0eXBlICYgSUZMTkspID09PSBJRkxOSztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBlbnRyeSBpZiBpdCBoYXMgYmVlbiBzdWJqZWN0IG9mIGEgc3VjY2Vzc2Z1bCBsc3RhdCwgb3JcbiAgICAgKiB1bmRlZmluZWQgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogRG9lcyBub3QgcmVhZCB0aGUgZmlsZXN5c3RlbSwgc28gYW4gdW5kZWZpbmVkIHJlc3VsdCAqY291bGQqIHNpbXBseVxuICAgICAqIG1lYW4gdGhhdCB3ZSBoYXZlbid0IGNhbGxlZCBsc3RhdCBvbiBpdC5cbiAgICAgKi9cbiAgICBsc3RhdENhY2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3R5cGUgJiBMU1RBVF9DQUxMRUQgPyB0aGlzIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGNhY2hlZCBsaW5rIHRhcmdldCBpZiB0aGUgZW50cnkgaGFzIGJlZW4gdGhlIHN1YmplY3Qgb2YgYVxuICAgICAqIHN1Y2Nlc3NmdWwgcmVhZGxpbmssIG9yIHVuZGVmaW5lZCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBEb2VzIG5vdCByZWFkIHRoZSBmaWxlc3lzdGVtLCBzbyBhbiB1bmRlZmluZWQgcmVzdWx0ICpjb3VsZCoganVzdCBtZWFuIHdlXG4gICAgICogZG9uJ3QgaGF2ZSBhbnkgY2FjaGVkIGRhdGEuIE9ubHkgdXNlIGl0IGlmIHlvdSBhcmUgdmVyeSBzdXJlIHRoYXQgYVxuICAgICAqIHJlYWRsaW5rKCkgaGFzIGJlZW4gY2FsbGVkIGF0IHNvbWUgcG9pbnQuXG4gICAgICovXG4gICAgcmVhZGxpbmtDYWNoZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsaW5rVGFyZ2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZWQgcmVhbHBhdGggdGFyZ2V0IGlmIHRoZSBlbnRyeSBoYXMgYmVlbiB0aGUgc3ViamVjdFxuICAgICAqIG9mIGEgc3VjY2Vzc2Z1bCByZWFscGF0aCwgb3IgdW5kZWZpbmVkIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHJlYWQgdGhlIGZpbGVzeXN0ZW0sIHNvIGFuIHVuZGVmaW5lZCByZXN1bHQgKmNvdWxkKiBqdXN0IG1lYW4gd2VcbiAgICAgKiBkb24ndCBoYXZlIGFueSBjYWNoZWQgZGF0YS4gT25seSB1c2UgaXQgaWYgeW91IGFyZSB2ZXJ5IHN1cmUgdGhhdCBhXG4gICAgICogcmVhbHBhdGgoKSBoYXMgYmVlbiBjYWxsZWQgYXQgc29tZSBwb2ludC5cbiAgICAgKi9cbiAgICByZWFscGF0aENhY2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlYWxwYXRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZWQgY2hpbGQgUGF0aCBlbnRyaWVzIGFycmF5IGlmIHRoZSBlbnRyeSBoYXMgYmVlbiB0aGVcbiAgICAgKiBzdWJqZWN0IG9mIGEgc3VjY2Vzc2Z1bCByZWFkZGlyKCksIG9yIFtdIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHJlYWQgdGhlIGZpbGVzeXN0ZW0sIHNvIGFuIGVtcHR5IGFycmF5ICpjb3VsZCoganVzdCBtZWFuIHdlXG4gICAgICogZG9uJ3QgaGF2ZSBhbnkgY2FjaGVkIGRhdGEuIE9ubHkgdXNlIGl0IGlmIHlvdSBhcmUgdmVyeSBzdXJlIHRoYXQgYVxuICAgICAqIHJlYWRkaXIoKSBoYXMgYmVlbiBjYWxsZWQgcmVjZW50bHkgZW5vdWdoIHRvIHN0aWxsIGJlIHZhbGlkLlxuICAgICAqL1xuICAgIHJlYWRkaXJDYWNoZWQoKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbigpO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW4uc2xpY2UoMCwgY2hpbGRyZW4ucHJvdmlzaW9uYWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBpdCdzIHdvcnRoIHRyeWluZyB0byByZWFkbGluay4gIEllLCB3ZSBkb24ndCAoeWV0KSBoYXZlXG4gICAgICogYW55IGluZGljYXRpb24gdGhhdCByZWFkbGluayB3aWxsIGRlZmluaXRlbHkgZmFpbC5cbiAgICAgKlxuICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIHBhdGggaXMga25vd24gdG8gbm90IGJlIGEgc3ltbGluaywgaWYgYSBwcmV2aW91c1xuICAgICAqIHJlYWRsaW5rIGZhaWxlZCwgb3IgaWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0LlxuICAgICAqL1xuICAgIGNhblJlYWRsaW5rKCkge1xuICAgICAgICBpZiAodGhpcy4jbGlua1RhcmdldClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBjYXNlcyB3aGVyZSBpdCBjYW5ub3QgcG9zc2libHkgc3VjY2VlZFxuICAgICAgICBjb25zdCBpZm10ID0gdGhpcy4jdHlwZSAmIElGTVQ7XG4gICAgICAgIHJldHVybiAhKChpZm10ICE9PSBVTktOT1dOICYmIGlmbXQgIT09IElGTE5LKSB8fFxuICAgICAgICAgICAgdGhpcy4jdHlwZSAmIEVOT1JFQURMSU5LIHx8XG4gICAgICAgICAgICB0aGlzLiN0eXBlICYgRU5PRU5UKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRydWUgaWYgcmVhZGRpciBoYXMgcHJldmlvdXNseSBiZWVuIHN1Y2Nlc3NmdWxseSBjYWxsZWQgb24gdGhpc1xuICAgICAqIHBhdGgsIGluZGljYXRpbmcgdGhhdCBjYWNoZWRSZWFkZGlyKCkgaXMgbGlrZWx5IHZhbGlkLlxuICAgICAqL1xuICAgIGNhbGxlZFJlYWRkaXIoKSB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLiN0eXBlICYgUkVBRERJUl9DQUxMRUQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggaXMga25vd24gdG8gbm90IGV4aXN0LiBUaGF0IGlzLCBhIHByZXZpb3VzIGxzdGF0XG4gICAgICogb3IgcmVhZGRpciBmYWlsZWQgdG8gdmVyaWZ5IGl0cyBleGlzdGVuY2Ugd2hlbiB0aGF0IHdvdWxkIGhhdmUgYmVlblxuICAgICAqIGV4cGVjdGVkLCBvciBhIHBhcmVudCBlbnRyeSB3YXMgbWFya2VkIGVpdGhlciBlbm9lbnQgb3IgZW5vdGRpci5cbiAgICAgKi9cbiAgICBpc0VOT0VOVCgpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuI3R5cGUgJiBFTk9FTlQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0aCBpcyBhIG1hdGNoIGZvciB0aGUgZ2l2ZW4gcGF0aCBuYW1lLiAgVGhpcyBoYW5kbGVzXG4gICAgICogY2FzZSBzZW5zaXRpdml0eSBhbmQgdW5pY29kZSBub3JtYWxpemF0aW9uLlxuICAgICAqXG4gICAgICogTm90ZTogZXZlbiBvbiBjYXNlLXNlbnNpdGl2ZSBzeXN0ZW1zLCBpdCBpcyAqKm5vdCoqIHNhZmUgdG8gdGVzdCB0aGVcbiAgICAgKiBlcXVhbGl0eSBvZiB0aGUgYC5uYW1lYCBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIHBhdGhuYW1lXG4gICAgICogbWF0Y2hlcywgZHVlIHRvIHVuaWNvZGUgbm9ybWFsaXphdGlvbiBtaXNtYXRjaGVzLlxuICAgICAqXG4gICAgICogQWx3YXlzIHVzZSB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIHRlc3RpbmcgdGhlIGBwYXRoLm5hbWVgIHByb3BlcnR5XG4gICAgICogZGlyZWN0bHkuXG4gICAgICovXG4gICAgaXNOYW1lZChuKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5ub2Nhc2UgP1xuICAgICAgICAgICAgdGhpcy4jbWF0Y2hOYW1lID09PSBub3JtYWxpemUobilcbiAgICAgICAgICAgIDogdGhpcy4jbWF0Y2hOYW1lID09PSBub3JtYWxpemVOb2Nhc2Uobik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgUGF0aCBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgdGFyZ2V0IG9mIGEgc3ltYm9saWMgbGluay5cbiAgICAgKlxuICAgICAqIElmIHRoZSBQYXRoIGlzIG5vdCBhIHN5bWJvbGljIGxpbmssIG9yIGlmIHRoZSByZWFkbGluayBjYWxsIGZhaWxzIGZvciBhbnlcbiAgICAgKiByZWFzb24sIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogUmVzdWx0IGlzIGNhY2hlZCwgYW5kIHRodXMgbWF5IGJlIG91dGRhdGVkIGlmIHRoZSBmaWxlc3lzdGVtIGlzIG11dGF0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgcmVhZGxpbmsoKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI2xpbmtUYXJnZXQ7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNhblJlYWRsaW5rKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIC8vIGFscmVhZHkgY292ZXJlZCBieSB0aGUgY2FuUmVhZGxpbmsgdGVzdCwgaGVyZSBmb3IgdHMgZ3J1bXBsZXNcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVhZCA9IGF3YWl0IHRoaXMuI2ZzLnByb21pc2VzLnJlYWRsaW5rKHRoaXMuZnVsbHBhdGgoKSk7XG4gICAgICAgICAgICBjb25zdCBsaW5rVGFyZ2V0ID0gKGF3YWl0IHRoaXMucGFyZW50LnJlYWxwYXRoKCkpPy5yZXNvbHZlKHJlYWQpO1xuICAgICAgICAgICAgaWYgKGxpbmtUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuI2xpbmtUYXJnZXQgPSBsaW5rVGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIHRoaXMuI3JlYWRsaW5rRmFpbChlci5jb2RlKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU3luY2hyb25vdXMge0BsaW5rIFBhdGhCYXNlLnJlYWRsaW5rfVxuICAgICAqL1xuICAgIHJlYWRsaW5rU3luYygpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4jbGlua1RhcmdldDtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY2FuUmVhZGxpbmsoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgLy8gYWxyZWFkeSBjb3ZlcmVkIGJ5IHRoZSBjYW5SZWFkbGluayB0ZXN0LCBoZXJlIGZvciB0cyBncnVtcGxlc1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZWFkID0gdGhpcy4jZnMucmVhZGxpbmtTeW5jKHRoaXMuZnVsbHBhdGgoKSk7XG4gICAgICAgICAgICBjb25zdCBsaW5rVGFyZ2V0ID0gdGhpcy5wYXJlbnQucmVhbHBhdGhTeW5jKCk/LnJlc29sdmUocmVhZCk7XG4gICAgICAgICAgICBpZiAobGlua1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy4jbGlua1RhcmdldCA9IGxpbmtUYXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcikge1xuICAgICAgICAgICAgdGhpcy4jcmVhZGxpbmtGYWlsKGVyLmNvZGUpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjcmVhZGRpclN1Y2Nlc3MoY2hpbGRyZW4pIHtcbiAgICAgICAgLy8gc3VjY2VlZGVkLCBtYXJrIHJlYWRkaXIgY2FsbGVkIGJpdFxuICAgICAgICB0aGlzLiN0eXBlIHw9IFJFQURESVJfQ0FMTEVEO1xuICAgICAgICAvLyBtYXJrIGFsbCByZW1haW5pbmcgcHJvdmlzaW9uYWwgY2hpbGRyZW4gYXMgRU5PRU5UXG4gICAgICAgIGZvciAobGV0IHAgPSBjaGlsZHJlbi5wcm92aXNpb25hbDsgcCA8IGNoaWxkcmVuLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY2hpbGRyZW5bcF07XG4gICAgICAgICAgICBpZiAoYylcbiAgICAgICAgICAgICAgICBjLiNtYXJrRU5PRU5UKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI21hcmtFTk9FTlQoKSB7XG4gICAgICAgIC8vIG1hcmsgYXMgVU5LTk9XTiBhbmQgRU5PRU5UXG4gICAgICAgIGlmICh0aGlzLiN0eXBlICYgRU5PRU5UKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLiN0eXBlID0gKHRoaXMuI3R5cGUgfCBFTk9FTlQpICYgSUZNVF9VTktOT1dOO1xuICAgICAgICB0aGlzLiNtYXJrQ2hpbGRyZW5FTk9FTlQoKTtcbiAgICB9XG4gICAgI21hcmtDaGlsZHJlbkVOT0VOVCgpIHtcbiAgICAgICAgLy8gYWxsIGNoaWxkcmVuIGFyZSBwcm92aXNpb25hbCBhbmQgZG8gbm90IGV4aXN0XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbigpO1xuICAgICAgICBjaGlsZHJlbi5wcm92aXNpb25hbCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgcC4jbWFya0VOT0VOVCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNtYXJrRU5PUkVBTFBBVEgoKSB7XG4gICAgICAgIHRoaXMuI3R5cGUgfD0gRU5PUkVBTFBBVEg7XG4gICAgICAgIHRoaXMuI21hcmtFTk9URElSKCk7XG4gICAgfVxuICAgIC8vIHNhdmUgdGhlIGluZm9ybWF0aW9uIHdoZW4gd2Uga25vdyB0aGUgZW50cnkgaXMgbm90IGEgZGlyXG4gICAgI21hcmtFTk9URElSKCkge1xuICAgICAgICAvLyBlbnRyeSBpcyBub3QgYSBkaXJlY3RvcnksIHNvIGFueSBjaGlsZHJlbiBjYW4ndCBleGlzdC5cbiAgICAgICAgLy8gdGhpcyAqc2hvdWxkKiBiZSBpbXBvc3NpYmxlLCBzaW5jZSBhbnkgY2hpbGRyZW4gY3JlYXRlZFxuICAgICAgICAvLyBhZnRlciBpdCdzIGJlZW4gbWFya2VkIEVOT1RESVIgc2hvdWxkIGJlIG1hcmtlZCBFTk9FTlQsXG4gICAgICAgIC8vIHNvIGl0IHdvbid0IGV2ZW4gZ2V0IHRvIHRoaXMgcG9pbnQuXG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAodGhpcy4jdHlwZSAmIEVOT1RESVIpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIGxldCB0ID0gdGhpcy4jdHlwZTtcbiAgICAgICAgLy8gdGhpcyBjb3VsZCBoYXBwZW4gaWYgd2Ugc3RhdCBhIGRpciwgdGhlbiBkZWxldGUgaXQsXG4gICAgICAgIC8vIHRoZW4gdHJ5IHRvIHJlYWQgaXQgb3Igb25lIG9mIGl0cyBjaGlsZHJlbi5cbiAgICAgICAgaWYgKCh0ICYgSUZNVCkgPT09IElGRElSKVxuICAgICAgICAgICAgdCAmPSBJRk1UX1VOS05PV047XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0IHwgRU5PVERJUjtcbiAgICAgICAgdGhpcy4jbWFya0NoaWxkcmVuRU5PRU5UKCk7XG4gICAgfVxuICAgICNyZWFkZGlyRmFpbChjb2RlID0gJycpIHtcbiAgICAgICAgLy8gbWFya0VOT1RESVIgYW5kIG1hcmtFTk9FTlQgYWxzbyBzZXQgcHJvdmlzaW9uYWw9MFxuICAgICAgICBpZiAoY29kZSA9PT0gJ0VOT1RESVInIHx8IGNvZGUgPT09ICdFUEVSTScpIHtcbiAgICAgICAgICAgIHRoaXMuI21hcmtFTk9URElSKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIHRoaXMuI21hcmtFTk9FTlQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4oKS5wcm92aXNpb25hbCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2xzdGF0RmFpbChjb2RlID0gJycpIHtcbiAgICAgICAgLy8gV2luZG93cyBqdXN0IHJhaXNlcyBFTk9FTlQgaW4gdGhpcyBjYXNlLCBkaXNhYmxlIGZvciB3aW4gQ0lcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmIChjb2RlID09PSAnRU5PVERJUicpIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkga25vdyBpdCBoYXMgYSBwYXJlbnQgYnkgdGhpcyBwb2ludFxuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgcC4jbWFya0VOT1RESVIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIHRoaXMuI21hcmtFTk9FTlQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjcmVhZGxpbmtGYWlsKGNvZGUgPSAnJykge1xuICAgICAgICBsZXQgdGVyID0gdGhpcy4jdHlwZTtcbiAgICAgICAgdGVyIHw9IEVOT1JFQURMSU5LO1xuICAgICAgICBpZiAoY29kZSA9PT0gJ0VOT0VOVCcpXG4gICAgICAgICAgICB0ZXIgfD0gRU5PRU5UO1xuICAgICAgICAvLyB3aW5kb3dzIGdldHMgYSB3ZWlyZCBlcnJvciB3aGVuIHlvdSB0cnkgdG8gcmVhZGxpbmsgYSBmaWxlXG4gICAgICAgIGlmIChjb2RlID09PSAnRUlOVkFMJyB8fCBjb2RlID09PSAnVU5LTk9XTicpIHtcbiAgICAgICAgICAgIC8vIGV4aXN0cywgYnV0IG5vdCBhIHN5bWxpbmssIHdlIGRvbid0IGtub3cgV0hBVCBpdCBpcywgc28gcmVtb3ZlXG4gICAgICAgICAgICAvLyBhbGwgSUZNVCBiaXRzLlxuICAgICAgICAgICAgdGVyICY9IElGTVRfVU5LTk9XTjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN0eXBlID0gdGVyO1xuICAgICAgICAvLyB3aW5kb3dzIGp1c3QgZ2V0cyBFTk9FTlQgaW4gdGhpcyBjYXNlLiAgV2UgZG8gY292ZXIgdGhlIGNhc2UsXG4gICAgICAgIC8vIGp1c3QgZGlzYWJsZWQgYmVjYXVzZSBpdCdzIGltcG9zc2libGUgb24gV2luZG93cyBDSVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKGNvZGUgPT09ICdFTk9URElSJyAmJiB0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuI21hcmtFTk9URElSKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICB9XG4gICAgI3JlYWRkaXJBZGRDaGlsZChlLCBjKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jcmVhZGRpck1heWJlUHJvbW90ZUNoaWxkKGUsIGMpIHx8XG4gICAgICAgICAgICB0aGlzLiNyZWFkZGlyQWRkTmV3Q2hpbGQoZSwgYykpO1xuICAgIH1cbiAgICAjcmVhZGRpckFkZE5ld0NoaWxkKGUsIGMpIHtcbiAgICAgICAgLy8gYWxsb2MgbmV3IGVudHJ5IGF0IGhlYWQsIHNvIGl0J3MgbmV2ZXIgcHJvdmlzaW9uYWxcbiAgICAgICAgY29uc3QgdHlwZSA9IGVudFRvVHlwZShlKTtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLm5ld0NoaWxkKGUubmFtZSwgdHlwZSwgeyBwYXJlbnQ6IHRoaXMgfSk7XG4gICAgICAgIGNvbnN0IGlmbXQgPSBjaGlsZC4jdHlwZSAmIElGTVQ7XG4gICAgICAgIGlmIChpZm10ICE9PSBJRkRJUiAmJiBpZm10ICE9PSBJRkxOSyAmJiBpZm10ICE9PSBVTktOT1dOKSB7XG4gICAgICAgICAgICBjaGlsZC4jdHlwZSB8PSBFTk9URElSO1xuICAgICAgICB9XG4gICAgICAgIGMudW5zaGlmdChjaGlsZCk7XG4gICAgICAgIGMucHJvdmlzaW9uYWwrKztcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH1cbiAgICAjcmVhZGRpck1heWJlUHJvbW90ZUNoaWxkKGUsIGMpIHtcbiAgICAgICAgZm9yIChsZXQgcCA9IGMucHJvdmlzaW9uYWw7IHAgPCBjLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICBjb25zdCBwY2hpbGQgPSBjW3BdO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMubm9jYXNlID8gbm9ybWFsaXplTm9jYXNlKGUubmFtZSkgOiBub3JtYWxpemUoZS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBwY2hpbGQuI21hdGNoTmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3JlYWRkaXJQcm9tb3RlQ2hpbGQoZSwgcGNoaWxkLCBwLCBjKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjcmVhZGRpclByb21vdGVDaGlsZChlLCBwLCBpbmRleCwgYykge1xuICAgICAgICBjb25zdCB2ID0gcC5uYW1lO1xuICAgICAgICAvLyByZXRhaW4gYW55IG90aGVyIGZsYWdzLCBidXQgc2V0IGlmbXQgZnJvbSBkaXJlbnRcbiAgICAgICAgcC4jdHlwZSA9IChwLiN0eXBlICYgSUZNVF9VTktOT1dOKSB8IGVudFRvVHlwZShlKTtcbiAgICAgICAgLy8gY2FzZSBzZW5zaXRpdml0eSBmaXhpbmcgd2hlbiB3ZSBsZWFybiB0aGUgdHJ1ZSBuYW1lLlxuICAgICAgICBpZiAodiAhPT0gZS5uYW1lKVxuICAgICAgICAgICAgcC5uYW1lID0gZS5uYW1lO1xuICAgICAgICAvLyBqdXN0IGFkdmFuY2UgcHJvdmlzaW9uYWwgaW5kZXggKHBvdGVudGlhbGx5IG9mZiB0aGUgbGlzdCksXG4gICAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIHRvIHNwbGljZS9wb3AgaXQgb3V0IGFuZCByZS1pbnNlcnQgYXQgaGVhZFxuICAgICAgICBpZiAoaW5kZXggIT09IGMucHJvdmlzaW9uYWwpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gYy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgIGMucG9wKCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgYy51bnNoaWZ0KHApO1xuICAgICAgICB9XG4gICAgICAgIGMucHJvdmlzaW9uYWwrKztcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgbHN0YXQoKSBvbiB0aGlzIFBhdGgsIGFuZCB1cGRhdGUgYWxsIGtub3duIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlXG4gICAgICogZGV0ZXJtaW5lZC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1bmxpa2UgYGZzLmxzdGF0KClgLCB0aGUgcmV0dXJuZWQgdmFsdWUgZG9lcyBub3QgY29udGFpbiBzb21lXG4gICAgICogaW5mb3JtYXRpb24sIHN1Y2ggYXMgYG1vZGVgLCBgZGV2YCwgYG5saW5rYCwgYW5kIGBpbm9gLiAgSWYgdGhhdFxuICAgICAqIGluZm9ybWF0aW9uIGlzIHJlcXVpcmVkLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgYGZzLmxzdGF0YCB5b3Vyc2VsZi5cbiAgICAgKlxuICAgICAqIElmIHRoZSBQYXRoIHJlZmVycyB0byBhIG5vbmV4aXN0ZW50IGZpbGUsIG9yIGlmIHRoZSBsc3RhdCBjYWxsIGZhaWxzIGZvclxuICAgICAqIGFueSByZWFzb24sIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlIHRoZSB1cGRhdGVkIFBhdGggb2JqZWN0IGlzXG4gICAgICogcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBSZXN1bHRzIGFyZSBjYWNoZWQsIGFuZCB0aHVzIG1heSBiZSBvdXQgb2YgZGF0ZSBpZiB0aGUgZmlsZXN5c3RlbSBpc1xuICAgICAqIG11dGF0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgbHN0YXQoKSB7XG4gICAgICAgIGlmICgodGhpcy4jdHlwZSAmIEVOT0VOVCkgPT09IDApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jYXBwbHlTdGF0KGF3YWl0IHRoaXMuI2ZzLnByb21pc2VzLmxzdGF0KHRoaXMuZnVsbHBhdGgoKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jbHN0YXRGYWlsKGVyLmNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHN5bmNocm9ub3VzIHtAbGluayBQYXRoQmFzZS5sc3RhdH1cbiAgICAgKi9cbiAgICBsc3RhdFN5bmMoKSB7XG4gICAgICAgIGlmICgodGhpcy4jdHlwZSAmIEVOT0VOVCkgPT09IDApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jYXBwbHlTdGF0KHRoaXMuI2ZzLmxzdGF0U3luYyh0aGlzLmZ1bGxwYXRoKCkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI2xzdGF0RmFpbChlci5jb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjYXBwbHlTdGF0KHN0KSB7XG4gICAgICAgIGNvbnN0IHsgYXRpbWUsIGF0aW1lTXMsIGJpcnRodGltZSwgYmlydGh0aW1lTXMsIGJsa3NpemUsIGJsb2NrcywgY3RpbWUsIGN0aW1lTXMsIGRldiwgZ2lkLCBpbm8sIG1vZGUsIG10aW1lLCBtdGltZU1zLCBubGluaywgcmRldiwgc2l6ZSwgdWlkLCB9ID0gc3Q7XG4gICAgICAgIHRoaXMuI2F0aW1lID0gYXRpbWU7XG4gICAgICAgIHRoaXMuI2F0aW1lTXMgPSBhdGltZU1zO1xuICAgICAgICB0aGlzLiNiaXJ0aHRpbWUgPSBiaXJ0aHRpbWU7XG4gICAgICAgIHRoaXMuI2JpcnRodGltZU1zID0gYmlydGh0aW1lTXM7XG4gICAgICAgIHRoaXMuI2Jsa3NpemUgPSBibGtzaXplO1xuICAgICAgICB0aGlzLiNibG9ja3MgPSBibG9ja3M7XG4gICAgICAgIHRoaXMuI2N0aW1lID0gY3RpbWU7XG4gICAgICAgIHRoaXMuI2N0aW1lTXMgPSBjdGltZU1zO1xuICAgICAgICB0aGlzLiNkZXYgPSBkZXY7XG4gICAgICAgIHRoaXMuI2dpZCA9IGdpZDtcbiAgICAgICAgdGhpcy4jaW5vID0gaW5vO1xuICAgICAgICB0aGlzLiNtb2RlID0gbW9kZTtcbiAgICAgICAgdGhpcy4jbXRpbWUgPSBtdGltZTtcbiAgICAgICAgdGhpcy4jbXRpbWVNcyA9IG10aW1lTXM7XG4gICAgICAgIHRoaXMuI25saW5rID0gbmxpbms7XG4gICAgICAgIHRoaXMuI3JkZXYgPSByZGV2O1xuICAgICAgICB0aGlzLiNzaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy4jdWlkID0gdWlkO1xuICAgICAgICBjb25zdCBpZm10ID0gZW50VG9UeXBlKHN0KTtcbiAgICAgICAgLy8gcmV0YWluIGFueSBvdGhlciBmbGFncywgYnV0IHNldCB0aGUgaWZtdFxuICAgICAgICB0aGlzLiN0eXBlID0gKHRoaXMuI3R5cGUgJiBJRk1UX1VOS05PV04pIHwgaWZtdCB8IExTVEFUX0NBTExFRDtcbiAgICAgICAgaWYgKGlmbXQgIT09IFVOS05PV04gJiYgaWZtdCAhPT0gSUZESVIgJiYgaWZtdCAhPT0gSUZMTkspIHtcbiAgICAgICAgICAgIHRoaXMuI3R5cGUgfD0gRU5PVERJUjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjb25SZWFkZGlyQ0IgPSBbXTtcbiAgICAjcmVhZGRpckNCSW5GbGlnaHQgPSBmYWxzZTtcbiAgICAjY2FsbE9uUmVhZGRpckNCKGNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuI3JlYWRkaXJDQkluRmxpZ2h0ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNicyA9IHRoaXMuI29uUmVhZGRpckNCLnNsaWNlKCk7XG4gICAgICAgIHRoaXMuI29uUmVhZGRpckNCLmxlbmd0aCA9IDA7XG4gICAgICAgIGNicy5mb3JFYWNoKGNiID0+IGNiKG51bGwsIGNoaWxkcmVuKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YW5kYXJkIG5vZGUtc3R5bGUgY2FsbGJhY2sgaW50ZXJmYWNlIHRvIGdldCBsaXN0IG9mIGRpcmVjdG9yeSBlbnRyaWVzLlxuICAgICAqXG4gICAgICogSWYgdGhlIFBhdGggY2Fubm90IG9yIGRvZXMgbm90IGNvbnRhaW4gYW55IGNoaWxkcmVuLCB0aGVuIGFuIGVtcHR5IGFycmF5XG4gICAgICogaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBSZXN1bHRzIGFyZSBjYWNoZWQsIGFuZCB0aHVzIG1heSBiZSBvdXQgb2YgZGF0ZSBpZiB0aGUgZmlsZXN5c3RlbSBpc1xuICAgICAqIG11dGF0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2IgVGhlIGNhbGxiYWNrIGNhbGxlZCB3aXRoIChlciwgZW50cmllcykuICBOb3RlIHRoYXQgdGhlIGBlcmBcbiAgICAgKiBwYXJhbSBpcyBzb21ld2hhdCBleHRyYW5lb3VzLCBhcyBhbGwgcmVhZGRpcigpIGVycm9ycyBhcmUgaGFuZGxlZCBhbmRcbiAgICAgKiBzaW1wbHkgcmVzdWx0IGluIGFuIGVtcHR5IHNldCBvZiBlbnRyaWVzIGJlaW5nIHJldHVybmVkLlxuICAgICAqIEBwYXJhbSBhbGxvd1phbGdvIEJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IGltbWVkaWF0ZWx5IGtub3duIHJlc3VsdHMgc2hvdWxkXG4gICAgICogKm5vdCogYmUgZGVmZXJyZWQgd2l0aCBgcXVldWVNaWNyb3Rhc2tgLiBEZWZhdWx0cyB0byBgZmFsc2VgLiBSZWxlYXNlXG4gICAgICogemFsZ28gYXQgeW91ciBwZXJpbCwgdGhlIGRhcmsgcG9ueSBsb3JkIGlzIGRldmlvdXMgYW5kIHVuZm9yZ2l2aW5nLlxuICAgICAqL1xuICAgIHJlYWRkaXJDQihjYiwgYWxsb3daYWxnbyA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghdGhpcy5jYW5SZWFkZGlyKCkpIHtcbiAgICAgICAgICAgIGlmIChhbGxvd1phbGdvKVxuICAgICAgICAgICAgICAgIGNiKG51bGwsIFtdKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYihudWxsLCBbXSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbigpO1xuICAgICAgICBpZiAodGhpcy5jYWxsZWRSZWFkZGlyKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBjaGlsZHJlbi5zbGljZSgwLCBjaGlsZHJlbi5wcm92aXNpb25hbCk7XG4gICAgICAgICAgICBpZiAoYWxsb3daYWxnbylcbiAgICAgICAgICAgICAgICBjYihudWxsLCBjKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYihudWxsLCBjKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB6YWxnbyBhdCB0aGlzIHBvaW50LlxuICAgICAgICB0aGlzLiNvblJlYWRkaXJDQi5wdXNoKGNiKTtcbiAgICAgICAgaWYgKHRoaXMuI3JlYWRkaXJDQkluRmxpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcmVhZGRpckNCSW5GbGlnaHQgPSB0cnVlO1xuICAgICAgICAvLyBlbHNlIHJlYWQgdGhlIGRpcmVjdG9yeSwgZmlsbCB1cCBjaGlsZHJlblxuICAgICAgICAvLyBkZS1wcm92aXNpb25hbGl6ZSBhbnkgcHJvdmlzaW9uYWwgY2hpbGRyZW4uXG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gdGhpcy5mdWxscGF0aCgpO1xuICAgICAgICB0aGlzLiNmcy5yZWFkZGlyKGZ1bGxwYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSwgKGVyLCBlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZWFkZGlyRmFpbChlci5jb2RlKTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wcm92aXNpb25hbCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IGFuIGVycm9yLCB3ZSBhbHdheXMgZ2V0IGVudHJpZXMuXG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVhZGRpckFkZENoaWxkKGUsIGNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jcmVhZGRpclN1Y2Nlc3MoY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY2FsbE9uUmVhZGRpckNCKGNoaWxkcmVuLnNsaWNlKDAsIGNoaWxkcmVuLnByb3Zpc2lvbmFsKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjYXN5bmNSZWFkZGlySW5GbGlnaHQ7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIGtub3duIGNoaWxkIGVudHJpZXMuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgUGF0aCBjYW5ub3Qgb3IgZG9lcyBub3QgY29udGFpbiBhbnkgY2hpbGRyZW4sIHRoZW4gYW4gZW1wdHkgYXJyYXlcbiAgICAgKiBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIFJlc3VsdHMgYXJlIGNhY2hlZCwgYW5kIHRodXMgbWF5IGJlIG91dCBvZiBkYXRlIGlmIHRoZSBmaWxlc3lzdGVtIGlzXG4gICAgICogbXV0YXRlZC5cbiAgICAgKi9cbiAgICBhc3luYyByZWFkZGlyKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2FuUmVhZGRpcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuKCk7XG4gICAgICAgIGlmICh0aGlzLmNhbGxlZFJlYWRkaXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuLnNsaWNlKDAsIGNoaWxkcmVuLnByb3Zpc2lvbmFsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIHJlYWQgdGhlIGRpcmVjdG9yeSwgZmlsbCB1cCBjaGlsZHJlblxuICAgICAgICAvLyBkZS1wcm92aXNpb25hbGl6ZSBhbnkgcHJvdmlzaW9uYWwgY2hpbGRyZW4uXG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gdGhpcy5mdWxscGF0aCgpO1xuICAgICAgICBpZiAodGhpcy4jYXN5bmNSZWFkZGlySW5GbGlnaHQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2FzeW5jUmVhZGRpckluRmxpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICBsZXQgcmVzb2x2ZSA9ICgpID0+IHsgfTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICB0aGlzLiNhc3luY1JlYWRkaXJJbkZsaWdodCA9IG5ldyBQcm9taXNlKHJlcyA9PiAocmVzb2x2ZSA9IHJlcykpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgYXdhaXQgdGhpcy4jZnMucHJvbWlzZXMucmVhZGRpcihmdWxscGF0aCwge1xuICAgICAgICAgICAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3JlYWRkaXJBZGRDaGlsZChlLCBjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuI3JlYWRkaXJTdWNjZXNzKGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI3JlYWRkaXJGYWlsKGVyLmNvZGUpO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnByb3Zpc2lvbmFsID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2FzeW5jUmVhZGRpckluRmxpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5zbGljZSgwLCBjaGlsZHJlbi5wcm92aXNpb25hbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHN5bmNocm9ub3VzIHtAbGluayBQYXRoQmFzZS5yZWFkZGlyfVxuICAgICAqL1xuICAgIHJlYWRkaXJTeW5jKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2FuUmVhZGRpcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuKCk7XG4gICAgICAgIGlmICh0aGlzLmNhbGxlZFJlYWRkaXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuLnNsaWNlKDAsIGNoaWxkcmVuLnByb3Zpc2lvbmFsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIHJlYWQgdGhlIGRpcmVjdG9yeSwgZmlsbCB1cCBjaGlsZHJlblxuICAgICAgICAvLyBkZS1wcm92aXNpb25hbGl6ZSBhbnkgcHJvdmlzaW9uYWwgY2hpbGRyZW4uXG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gdGhpcy5mdWxscGF0aCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMuI2ZzLnJlYWRkaXJTeW5jKGZ1bGxwYXRoLCB7XG4gICAgICAgICAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcmVhZGRpckFkZENoaWxkKGUsIGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI3JlYWRkaXJTdWNjZXNzKGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIHRoaXMuI3JlYWRkaXJGYWlsKGVyLmNvZGUpO1xuICAgICAgICAgICAgY2hpbGRyZW4ucHJvdmlzaW9uYWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5zbGljZSgwLCBjaGlsZHJlbi5wcm92aXNpb25hbCk7XG4gICAgfVxuICAgIGNhblJlYWRkaXIoKSB7XG4gICAgICAgIGlmICh0aGlzLiN0eXBlICYgRU5PQ0hJTEQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGlmbXQgPSBJRk1UICYgdGhpcy4jdHlwZTtcbiAgICAgICAgLy8gd2UgYWx3YXlzIHNldCBFTk9URElSIHdoZW4gc2V0dGluZyBJRk1ULCBzbyBzaG91bGQgYmUgaW1wb3NzaWJsZVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKCEoaWZtdCA9PT0gVU5LTk9XTiB8fCBpZm10ID09PSBJRkRJUiB8fCBpZm10ID09PSBJRkxOSykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2hvdWxkV2FsayhkaXJzLCB3YWxrRmlsdGVyKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXMuI3R5cGUgJiBJRkRJUikgPT09IElGRElSICYmXG4gICAgICAgICAgICAhKHRoaXMuI3R5cGUgJiBFTk9DSElMRCkgJiZcbiAgICAgICAgICAgICFkaXJzLmhhcyh0aGlzKSAmJlxuICAgICAgICAgICAgKCF3YWxrRmlsdGVyIHx8IHdhbGtGaWx0ZXIodGhpcykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBQYXRoIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHBhdGggYXMgcmVzb2x2ZWRcbiAgICAgKiBieSByZWFscGF0aCgzKS5cbiAgICAgKlxuICAgICAqIElmIHRoZSByZWFscGF0aCBjYWxsIGZhaWxzIGZvciBhbnkgcmVhc29uLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIFJlc3VsdCBpcyBjYWNoZWQsIGFuZCB0aHVzIG1heSBiZSBvdXRkYXRlZCBpZiB0aGUgZmlsZXN5c3RlbSBpcyBtdXRhdGVkLlxuICAgICAqIE9uIHN1Y2Nlc3MsIHJldHVybnMgYSBQYXRoIG9iamVjdC5cbiAgICAgKi9cbiAgICBhc3luYyByZWFscGF0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI3JlYWxwYXRoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3JlYWxwYXRoO1xuICAgICAgICBpZiAoKEVOT1JFQUxQQVRIIHwgRU5PUkVBRExJTksgfCBFTk9FTlQpICYgdGhpcy4jdHlwZSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBycCA9IGF3YWl0IHRoaXMuI2ZzLnByb21pc2VzLnJlYWxwYXRoKHRoaXMuZnVsbHBhdGgoKSk7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI3JlYWxwYXRoID0gdGhpcy5yZXNvbHZlKHJwKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIHRoaXMuI21hcmtFTk9SRUFMUEFUSCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN5bmNocm9ub3VzIHtAbGluayByZWFscGF0aH1cbiAgICAgKi9cbiAgICByZWFscGF0aFN5bmMoKSB7XG4gICAgICAgIGlmICh0aGlzLiNyZWFscGF0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNyZWFscGF0aDtcbiAgICAgICAgaWYgKChFTk9SRUFMUEFUSCB8IEVOT1JFQURMSU5LIHwgRU5PRU5UKSAmIHRoaXMuI3R5cGUpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcnAgPSB0aGlzLiNmcy5yZWFscGF0aFN5bmModGhpcy5mdWxscGF0aCgpKTtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jcmVhbHBhdGggPSB0aGlzLnJlc29sdmUocnApKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgdGhpcy4jbWFya0VOT1JFQUxQQVRIKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIG1hcmsgdGhpcyBQYXRoIG9iamVjdCBhcyB0aGUgc2N1cnJ5IGN3ZCxcbiAgICAgKiBjYWxsZWQgYnkge0BsaW5rIFBhdGhTY3VycnkjY2hkaXJ9XG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBbc2V0QXNDd2RdKG9sZEN3ZCkge1xuICAgICAgICBpZiAob2xkQ3dkID09PSB0aGlzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBvbGRDd2QuaXNDV0QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0NXRCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSBuZXcgU2V0KFtdKTtcbiAgICAgICAgbGV0IHJwID0gW107XG4gICAgICAgIGxldCBwID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHAgJiYgcC5wYXJlbnQpIHtcbiAgICAgICAgICAgIGNoYW5nZWQuYWRkKHApO1xuICAgICAgICAgICAgcC4jcmVsYXRpdmUgPSBycC5qb2luKHRoaXMuc2VwKTtcbiAgICAgICAgICAgIHAuI3JlbGF0aXZlUG9zaXggPSBycC5qb2luKCcvJyk7XG4gICAgICAgICAgICBwID0gcC5wYXJlbnQ7XG4gICAgICAgICAgICBycC5wdXNoKCcuLicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyB1bi1tZW1vaXplIHBhcmVudHMgb2Ygb2xkIGN3ZFxuICAgICAgICBwID0gb2xkQ3dkO1xuICAgICAgICB3aGlsZSAocCAmJiBwLnBhcmVudCAmJiAhY2hhbmdlZC5oYXMocCkpIHtcbiAgICAgICAgICAgIHAuI3JlbGF0aXZlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcC4jcmVsYXRpdmVQb3NpeCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHAgPSBwLnBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogUGF0aCBjbGFzcyB1c2VkIG9uIHdpbjMyIHN5c3RlbXNcbiAqXG4gKiBVc2VzIGAnXFxcXCdgIGFzIHRoZSBwYXRoIHNlcGFyYXRvciBmb3IgcmV0dXJuZWQgcGF0aHMsIGVpdGhlciBgJ1xcXFwnYCBvciBgJy8nYFxuICogYXMgdGhlIHBhdGggc2VwYXJhdG9yIGZvciBwYXJzaW5nIHBhdGhzLlxuICovXG5leHBvcnQgY2xhc3MgUGF0aFdpbjMyIGV4dGVuZHMgUGF0aEJhc2Uge1xuICAgIC8qKlxuICAgICAqIFNlcGFyYXRvciBmb3IgZ2VuZXJhdGluZyBwYXRoIHN0cmluZ3MuXG4gICAgICovXG4gICAgc2VwID0gJ1xcXFwnO1xuICAgIC8qKlxuICAgICAqIFNlcGFyYXRvciBmb3IgcGFyc2luZyBwYXRoIHN0cmluZ3MuXG4gICAgICovXG4gICAgc3BsaXRTZXAgPSBlaXRoZXJTZXA7XG4gICAgLyoqXG4gICAgICogRG8gbm90IGNyZWF0ZSBuZXcgUGF0aCBvYmplY3RzIGRpcmVjdGx5LiAgVGhleSBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkXG4gICAgICogdmlhIHRoZSBQYXRoU2N1cnJ5IGNsYXNzIG9yIG90aGVyIG1ldGhvZHMgb24gdGhlIFBhdGggY2xhc3MuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB0eXBlID0gVU5LTk9XTiwgcm9vdCwgcm9vdHMsIG5vY2FzZSwgY2hpbGRyZW4sIG9wdHMpIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdHlwZSwgcm9vdCwgcm9vdHMsIG5vY2FzZSwgY2hpbGRyZW4sIG9wdHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBuZXdDaGlsZChuYW1lLCB0eXBlID0gVU5LTk9XTiwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGF0aFdpbjMyKG5hbWUsIHR5cGUsIHRoaXMucm9vdCwgdGhpcy5yb290cywgdGhpcy5ub2Nhc2UsIHRoaXMuY2hpbGRyZW5DYWNoZSgpLCBvcHRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0Um9vdFN0cmluZyhwYXRoKSB7XG4gICAgICAgIHJldHVybiB3aW4zMi5wYXJzZShwYXRoKS5yb290O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRSb290KHJvb3RQYXRoKSB7XG4gICAgICAgIHJvb3RQYXRoID0gdW5jVG9Ecml2ZShyb290UGF0aC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgaWYgKHJvb3RQYXRoID09PSB0aGlzLnJvb3QubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvaywgbm90IHRoYXQgb25lLCBjaGVjayBpZiBpdCBtYXRjaGVzIGFub3RoZXIgd2Uga25vdyBhYm91dFxuICAgICAgICBmb3IgKGNvbnN0IFtjb21wYXJlLCByb290XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJvb3RzKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2FtZVJvb3Qocm9vdFBhdGgsIGNvbXBhcmUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnJvb3RzW3Jvb3RQYXRoXSA9IHJvb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSwgaGF2ZSB0byBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAgICByZXR1cm4gKHRoaXMucm9vdHNbcm9vdFBhdGhdID0gbmV3IFBhdGhTY3VycnlXaW4zMihyb290UGF0aCwgdGhpcykucm9vdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHNhbWVSb290KHJvb3RQYXRoLCBjb21wYXJlID0gdGhpcy5yb290Lm5hbWUpIHtcbiAgICAgICAgLy8gd2luZG93cyBjYW4gKHJhcmVseSkgaGF2ZSBjYXNlLXNlbnNpdGl2ZSBmaWxlc3lzdGVtLCBidXRcbiAgICAgICAgLy8gVU5DIGFuZCBkcml2ZSBsZXR0ZXJzIGFyZSBhbHdheXMgY2FzZS1pbnNlbnNpdGl2ZSwgYW5kIGNhbm9uaWNhbGx5XG4gICAgICAgIC8vIHJlcHJlc2VudGVkIHVwcGVyY2FzZS5cbiAgICAgICAgcm9vdFBhdGggPSByb290UGF0aFxuICAgICAgICAgICAgLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ1xcXFwnKVxuICAgICAgICAgICAgLnJlcGxhY2UodW5jRHJpdmVSZWdleHAsICckMVxcXFwnKTtcbiAgICAgICAgcmV0dXJuIHJvb3RQYXRoID09PSBjb21wYXJlO1xuICAgIH1cbn1cbi8qKlxuICogUGF0aCBjbGFzcyB1c2VkIG9uIGFsbCBwb3NpeCBzeXN0ZW1zLlxuICpcbiAqIFVzZXMgYCcvJ2AgYXMgdGhlIHBhdGggc2VwYXJhdG9yLlxuICovXG5leHBvcnQgY2xhc3MgUGF0aFBvc2l4IGV4dGVuZHMgUGF0aEJhc2Uge1xuICAgIC8qKlxuICAgICAqIHNlcGFyYXRvciBmb3IgcGFyc2luZyBwYXRoIHN0cmluZ3NcbiAgICAgKi9cbiAgICBzcGxpdFNlcCA9ICcvJztcbiAgICAvKipcbiAgICAgKiBzZXBhcmF0b3IgZm9yIGdlbmVyYXRpbmcgcGF0aCBzdHJpbmdzXG4gICAgICovXG4gICAgc2VwID0gJy8nO1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBjcmVhdGUgbmV3IFBhdGggb2JqZWN0cyBkaXJlY3RseS4gIFRoZXkgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZFxuICAgICAqIHZpYSB0aGUgUGF0aFNjdXJyeSBjbGFzcyBvciBvdGhlciBtZXRob2RzIG9uIHRoZSBQYXRoIGNsYXNzLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSwgdHlwZSA9IFVOS05PV04sIHJvb3QsIHJvb3RzLCBub2Nhc2UsIGNoaWxkcmVuLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHR5cGUsIHJvb3QsIHJvb3RzLCBub2Nhc2UsIGNoaWxkcmVuLCBvcHRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0Um9vdFN0cmluZyhwYXRoKSB7XG4gICAgICAgIHJldHVybiBwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/ICcvJyA6ICcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRSb290KF9yb290UGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBuZXdDaGlsZChuYW1lLCB0eXBlID0gVU5LTk9XTiwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGF0aFBvc2l4KG5hbWUsIHR5cGUsIHRoaXMucm9vdCwgdGhpcy5yb290cywgdGhpcy5ub2Nhc2UsIHRoaXMuY2hpbGRyZW5DYWNoZSgpLCBvcHRzKTtcbiAgICB9XG59XG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgUGF0aFNjdXJyeSBjbGFzc2VzLCBwcm92aWRpbmcgdGhlIGludGVyZmFjZSBmb3IgcGF0aFxuICogcmVzb2x1dGlvbiBhbmQgZmlsZXN5c3RlbSBvcGVyYXRpb25zLlxuICpcbiAqIFR5cGljYWxseSwgeW91IHNob3VsZCAqbm90KiBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5LCBidXQgcmF0aGVyIG9uZVxuICogb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNsYXNzZXMsIG9yIHRoZSBleHBvcnRlZCB7QGxpbmsgUGF0aFNjdXJyeX0gd2hpY2hcbiAqIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICovXG5leHBvcnQgY2xhc3MgUGF0aFNjdXJyeUJhc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSByb290IFBhdGggZW50cnkgZm9yIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoaXMgU2N1cnJ5XG4gICAgICovXG4gICAgcm9vdDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHBhdGggZm9yIHRoZSByb290IG9mIHRoaXMgU2N1cnJ5J3MgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAqL1xuICAgIHJvb3RQYXRoO1xuICAgIC8qKlxuICAgICAqIEEgY29sbGVjdGlvbiBvZiBhbGwgcm9vdHMgZW5jb3VudGVyZWQsIHJlZmVyZW5jZWQgYnkgcm9vdFBhdGhcbiAgICAgKi9cbiAgICByb290cztcbiAgICAvKipcbiAgICAgKiBUaGUgUGF0aCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgUGF0aFNjdXJyeSdzIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgY3dkO1xuICAgICNyZXNvbHZlQ2FjaGU7XG4gICAgI3Jlc29sdmVQb3NpeENhY2hlO1xuICAgICNjaGlsZHJlbjtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIHBhdGggY29tcGFyaXNvbnMgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdHJ1ZSBvbiBEYXJ3aW4gYW5kIFdpbmRvd3Mgc3lzdGVtcywgZmFsc2UgZWxzZXdoZXJlLlxuICAgICAqL1xuICAgIG5vY2FzZTtcbiAgICAjZnM7XG4gICAgLyoqXG4gICAgICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS5cbiAgICAgKlxuICAgICAqIFVzZSBQYXRoU2N1cnJ5V2luMzIsIFBhdGhTY3VycnlEYXJ3aW4sIFBhdGhTY3VycnlQb3NpeCwgb3IgUGF0aFNjdXJyeVxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY3dkID0gcHJvY2Vzcy5jd2QoKSwgcGF0aEltcGwsIHNlcCwgeyBub2Nhc2UsIGNoaWxkcmVuQ2FjaGVTaXplID0gMTYgKiAxMDI0LCBmcyA9IGRlZmF1bHRGUywgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuI2ZzID0gZnNGcm9tT3B0aW9uKGZzKTtcbiAgICAgICAgaWYgKGN3ZCBpbnN0YW5jZW9mIFVSTCB8fCBjd2Quc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgICAgICAgICBjd2QgPSBmaWxlVVJMVG9QYXRoKGN3ZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzb2x2ZSBhbmQgc3BsaXQgcm9vdCwgYW5kIHRoZW4gYWRkIHRvIHRoZSBzdG9yZS5cbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgb25seSB0aW1lIHdlIGNhbGwgcGF0aC5yZXNvbHZlKClcbiAgICAgICAgY29uc3QgY3dkUGF0aCA9IHBhdGhJbXBsLnJlc29sdmUoY3dkKTtcbiAgICAgICAgdGhpcy5yb290cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMucm9vdFBhdGggPSB0aGlzLnBhcnNlUm9vdFBhdGgoY3dkUGF0aCk7XG4gICAgICAgIHRoaXMuI3Jlc29sdmVDYWNoZSA9IG5ldyBSZXNvbHZlQ2FjaGUoKTtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZVBvc2l4Q2FjaGUgPSBuZXcgUmVzb2x2ZUNhY2hlKCk7XG4gICAgICAgIHRoaXMuI2NoaWxkcmVuID0gbmV3IENoaWxkcmVuQ2FjaGUoY2hpbGRyZW5DYWNoZVNpemUpO1xuICAgICAgICBjb25zdCBzcGxpdCA9IGN3ZFBhdGguc3Vic3RyaW5nKHRoaXMucm9vdFBhdGgubGVuZ3RoKS5zcGxpdChzZXApO1xuICAgICAgICAvLyByZXNvbHZlKCcvJykgbGVhdmVzICcnLCBzcGxpdHMgdG8gWycnXSwgd2UgZG9uJ3Qgd2FudCB0aGF0LlxuICAgICAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAxICYmICFzcGxpdFswXSkge1xuICAgICAgICAgICAgc3BsaXQucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmIChub2Nhc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBwcm92aWRlIG5vY2FzZSBzZXR0aW5nIHRvIFBhdGhTY3VycnlCYXNlIGN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB0aGlzLm5vY2FzZSA9IG5vY2FzZTtcbiAgICAgICAgdGhpcy5yb290ID0gdGhpcy5uZXdSb290KHRoaXMuI2ZzKTtcbiAgICAgICAgdGhpcy5yb290c1t0aGlzLnJvb3RQYXRoXSA9IHRoaXMucm9vdDtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLnJvb3Q7XG4gICAgICAgIGxldCBsZW4gPSBzcGxpdC5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBqb2luU2VwID0gcGF0aEltcGwuc2VwO1xuICAgICAgICBsZXQgYWJzID0gdGhpcy5yb290UGF0aDtcbiAgICAgICAgbGV0IHNhd0ZpcnN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBzcGxpdCkge1xuICAgICAgICAgICAgY29uc3QgbCA9IGxlbi0tO1xuICAgICAgICAgICAgcHJldiA9IHByZXYuY2hpbGQocGFydCwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiBuZXcgQXJyYXkobCkuZmlsbCgnLi4nKS5qb2luKGpvaW5TZXApLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlUG9zaXg6IG5ldyBBcnJheShsKS5maWxsKCcuLicpLmpvaW4oJy8nKSxcbiAgICAgICAgICAgICAgICBmdWxscGF0aDogKGFicyArPSAoc2F3Rmlyc3QgPyAnJyA6IGpvaW5TZXApICsgcGFydCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNhd0ZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN3ZCA9IHByZXY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVwdGggb2YgYSBwcm92aWRlZCBwYXRoLCBzdHJpbmcsIG9yIHRoZSBjd2RcbiAgICAgKi9cbiAgICBkZXB0aChwYXRoID0gdGhpcy5jd2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGF0aCA9IHRoaXMuY3dkLnJlc29sdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGguZGVwdGgoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjYWNoZSBvZiBjaGlsZCBlbnRyaWVzLiAgRXhwb3NlZCBzbyBzdWJjbGFzc2VzIGNhbiBjcmVhdGVcbiAgICAgKiBjaGlsZCBQYXRoIG9iamVjdHMgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyB3YXkuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjaGlsZHJlbkNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2hpbGRyZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgb25lIG9yIG1vcmUgcGF0aCBzdHJpbmdzIHRvIGEgcmVzb2x2ZWQgc3RyaW5nXG4gICAgICpcbiAgICAgKiBTYW1lIGludGVyZmFjZSBhcyByZXF1aXJlKCdwYXRoJykucmVzb2x2ZS5cbiAgICAgKlxuICAgICAqIE11Y2ggZmFzdGVyIHRoYW4gcGF0aC5yZXNvbHZlKCkgd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lXG4gICAgICogcGF0aCwgYmVjYXVzZSB0aGUgcmVzb2x2ZWQgUGF0aCBvYmplY3RzIGFyZSBjYWNoZWQuICBNdWNoIHNsb3dlclxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZXNvbHZlKC4uLnBhdGhzKSB7XG4gICAgICAgIC8vIGZpcnN0IGZpZ3VyZSBvdXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBhdGhzIHdlIGhhdmUgdG8gdGVzdFxuICAgICAgICAvLyB3ZSBhbHdheXMgc3RhcnQgYXQgY3dkLCBidXQgYW55IGFic29sdXRlcyB3aWxsIGJ1bXAgdGhlIHN0YXJ0XG4gICAgICAgIGxldCByID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSBwYXRocy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgcCA9IHBhdGhzW2ldO1xuICAgICAgICAgICAgaWYgKCFwIHx8IHAgPT09ICcuJylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHIgPSByID8gYCR7cH0vJHtyfWAgOiBwO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNBYnNvbHV0ZShwKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuI3Jlc29sdmVDYWNoZS5nZXQocik7XG4gICAgICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmN3ZC5yZXNvbHZlKHIpLmZ1bGxwYXRoKCk7XG4gICAgICAgIHRoaXMuI3Jlc29sdmVDYWNoZS5zZXQociwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBvbmUgb3IgbW9yZSBwYXRoIHN0cmluZ3MgdG8gYSByZXNvbHZlZCBzdHJpbmcsIHJldHVybmluZ1xuICAgICAqIHRoZSBwb3NpeCBwYXRoLiAgSWRlbnRpY2FsIHRvIC5yZXNvbHZlKCkgb24gcG9zaXggc3lzdGVtcywgYnV0IG9uXG4gICAgICogd2luZG93cyB3aWxsIHJldHVybiBhIGZvcndhcmQtc2xhc2ggc2VwYXJhdGVkIFVOQyBwYXRoLlxuICAgICAqXG4gICAgICogU2FtZSBpbnRlcmZhY2UgYXMgcmVxdWlyZSgncGF0aCcpLnJlc29sdmUuXG4gICAgICpcbiAgICAgKiBNdWNoIGZhc3RlciB0aGFuIHBhdGgucmVzb2x2ZSgpIHdoZW4gY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZVxuICAgICAqIHBhdGgsIGJlY2F1c2UgdGhlIHJlc29sdmVkIFBhdGggb2JqZWN0cyBhcmUgY2FjaGVkLiAgTXVjaCBzbG93ZXJcbiAgICAgKiBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVzb2x2ZVBvc2l4KC4uLnBhdGhzKSB7XG4gICAgICAgIC8vIGZpcnN0IGZpZ3VyZSBvdXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBhdGhzIHdlIGhhdmUgdG8gdGVzdFxuICAgICAgICAvLyB3ZSBhbHdheXMgc3RhcnQgYXQgY3dkLCBidXQgYW55IGFic29sdXRlcyB3aWxsIGJ1bXAgdGhlIHN0YXJ0XG4gICAgICAgIGxldCByID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSBwYXRocy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgcCA9IHBhdGhzW2ldO1xuICAgICAgICAgICAgaWYgKCFwIHx8IHAgPT09ICcuJylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHIgPSByID8gYCR7cH0vJHtyfWAgOiBwO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNBYnNvbHV0ZShwKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuI3Jlc29sdmVQb3NpeENhY2hlLmdldChyKTtcbiAgICAgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY3dkLnJlc29sdmUocikuZnVsbHBhdGhQb3NpeCgpO1xuICAgICAgICB0aGlzLiNyZXNvbHZlUG9zaXhDYWNoZS5zZXQociwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogZmluZCB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBjd2QgdG8gdGhlIHN1cHBsaWVkIHBhdGggc3RyaW5nIG9yIGVudHJ5XG4gICAgICovXG4gICAgcmVsYXRpdmUoZW50cnkgPSB0aGlzLmN3ZCkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnkucmVsYXRpdmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogZmluZCB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBjd2QgdG8gdGhlIHN1cHBsaWVkIHBhdGggc3RyaW5nIG9yXG4gICAgICogZW50cnksIHVzaW5nIC8gYXMgdGhlIHBhdGggZGVsaW1pdGVyLCBldmVuIG9uIFdpbmRvd3MuXG4gICAgICovXG4gICAgcmVsYXRpdmVQb3NpeChlbnRyeSA9IHRoaXMuY3dkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeS5yZWxhdGl2ZVBvc2l4KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYmFzZW5hbWUgZm9yIHRoZSBwcm92aWRlZCBzdHJpbmcgb3IgUGF0aCBvYmplY3RcbiAgICAgKi9cbiAgICBiYXNlbmFtZShlbnRyeSA9IHRoaXMuY3dkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeS5uYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGRpcm5hbWUgZm9yIHRoZSBwcm92aWRlZCBzdHJpbmcgb3IgUGF0aCBvYmplY3RcbiAgICAgKi9cbiAgICBkaXJuYW1lKGVudHJ5ID0gdGhpcy5jd2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChlbnRyeS5wYXJlbnQgfHwgZW50cnkpLmZ1bGxwYXRoKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlYWRkaXIoZW50cnkgPSB0aGlzLmN3ZCwgb3B0cyA9IHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICB9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIG9wdHMgPSBlbnRyeTtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB3aXRoRmlsZVR5cGVzIH0gPSBvcHRzO1xuICAgICAgICBpZiAoIWVudHJ5LmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcCA9IGF3YWl0IGVudHJ5LnJlYWRkaXIoKTtcbiAgICAgICAgICAgIHJldHVybiB3aXRoRmlsZVR5cGVzID8gcCA6IHAubWFwKGUgPT4gZS5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkZGlyU3luYyhlbnRyeSA9IHRoaXMuY3dkLCBvcHRzID0ge1xuICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgIH0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShlbnRyeSBpbnN0YW5jZW9mIFBhdGhCYXNlKSkge1xuICAgICAgICAgICAgb3B0cyA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHdpdGhGaWxlVHlwZXMgPSB0cnVlIH0gPSBvcHRzO1xuICAgICAgICBpZiAoIWVudHJ5LmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdpdGhGaWxlVHlwZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS5yZWFkZGlyU3luYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnJlYWRkaXJTeW5jKCkubWFwKGUgPT4gZS5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGxzdGF0KCkgb24gdGhlIHN0cmluZyBvciBQYXRoIG9iamVjdCwgYW5kIHVwZGF0ZSBhbGwga25vd25cbiAgICAgKiBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVubGlrZSBgZnMubHN0YXQoKWAsIHRoZSByZXR1cm5lZCB2YWx1ZSBkb2VzIG5vdCBjb250YWluIHNvbWVcbiAgICAgKiBpbmZvcm1hdGlvbiwgc3VjaCBhcyBgbW9kZWAsIGBkZXZgLCBgbmxpbmtgLCBhbmQgYGlub2AuICBJZiB0aGF0XG4gICAgICogaW5mb3JtYXRpb24gaXMgcmVxdWlyZWQsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgZnMubHN0YXRgIHlvdXJzZWxmLlxuICAgICAqXG4gICAgICogSWYgdGhlIFBhdGggcmVmZXJzIHRvIGEgbm9uZXhpc3RlbnQgZmlsZSwgb3IgaWYgdGhlIGxzdGF0IGNhbGwgZmFpbHMgZm9yXG4gICAgICogYW55IHJlYXNvbiwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UgdGhlIHVwZGF0ZWQgUGF0aCBvYmplY3QgaXNcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIFJlc3VsdHMgYXJlIGNhY2hlZCwgYW5kIHRodXMgbWF5IGJlIG91dCBvZiBkYXRlIGlmIHRoZSBmaWxlc3lzdGVtIGlzXG4gICAgICogbXV0YXRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBsc3RhdChlbnRyeSA9IHRoaXMuY3dkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeS5sc3RhdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBzeW5jaHJvbm91cyB7QGxpbmsgUGF0aFNjdXJyeUJhc2UubHN0YXR9XG4gICAgICovXG4gICAgbHN0YXRTeW5jKGVudHJ5ID0gdGhpcy5jd2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5LmxzdGF0U3luYygpO1xuICAgIH1cbiAgICBhc3luYyByZWFkbGluayhlbnRyeSA9IHRoaXMuY3dkLCB7IHdpdGhGaWxlVHlwZXMgfSA9IHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogZmFsc2UsXG4gICAgfSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICB3aXRoRmlsZVR5cGVzID0gZW50cnkud2l0aEZpbGVUeXBlcztcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGVudHJ5LnJlYWRsaW5rKCk7XG4gICAgICAgIHJldHVybiB3aXRoRmlsZVR5cGVzID8gZSA6IGU/LmZ1bGxwYXRoKCk7XG4gICAgfVxuICAgIHJlYWRsaW5rU3luYyhlbnRyeSA9IHRoaXMuY3dkLCB7IHdpdGhGaWxlVHlwZXMgfSA9IHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogZmFsc2UsXG4gICAgfSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICB3aXRoRmlsZVR5cGVzID0gZW50cnkud2l0aEZpbGVUeXBlcztcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IGVudHJ5LnJlYWRsaW5rU3luYygpO1xuICAgICAgICByZXR1cm4gd2l0aEZpbGVUeXBlcyA/IGUgOiBlPy5mdWxscGF0aCgpO1xuICAgIH1cbiAgICBhc3luYyByZWFscGF0aChlbnRyeSA9IHRoaXMuY3dkLCB7IHdpdGhGaWxlVHlwZXMgfSA9IHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogZmFsc2UsXG4gICAgfSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICB3aXRoRmlsZVR5cGVzID0gZW50cnkud2l0aEZpbGVUeXBlcztcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGVudHJ5LnJlYWxwYXRoKCk7XG4gICAgICAgIHJldHVybiB3aXRoRmlsZVR5cGVzID8gZSA6IGU/LmZ1bGxwYXRoKCk7XG4gICAgfVxuICAgIHJlYWxwYXRoU3luYyhlbnRyeSA9IHRoaXMuY3dkLCB7IHdpdGhGaWxlVHlwZXMgfSA9IHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogZmFsc2UsXG4gICAgfSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICB3aXRoRmlsZVR5cGVzID0gZW50cnkud2l0aEZpbGVUeXBlcztcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IGVudHJ5LnJlYWxwYXRoU3luYygpO1xuICAgICAgICByZXR1cm4gd2l0aEZpbGVUeXBlcyA/IGUgOiBlPy5mdWxscGF0aCgpO1xuICAgIH1cbiAgICBhc3luYyB3YWxrKGVudHJ5ID0gdGhpcy5jd2QsIG9wdHMgPSB7fSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICBvcHRzID0gZW50cnk7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgd2l0aEZpbGVUeXBlcyA9IHRydWUsIGZvbGxvdyA9IGZhbHNlLCBmaWx0ZXIsIHdhbGtGaWx0ZXIsIH0gPSBvcHRzO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihlbnRyeSkpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh3aXRoRmlsZVR5cGVzID8gZW50cnkgOiBlbnRyeS5mdWxscGF0aCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXJzID0gbmV3IFNldCgpO1xuICAgICAgICBjb25zdCB3YWxrID0gKGRpciwgY2IpID0+IHtcbiAgICAgICAgICAgIGRpcnMuYWRkKGRpcik7XG4gICAgICAgICAgICBkaXIucmVhZGRpckNCKChlciwgZW50cmllcykgPT4ge1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgICAgIGlmIChlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2IoZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoIWxlbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC0tbGVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh3aXRoRmlsZVR5cGVzID8gZSA6IGUuZnVsbHBhdGgoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGxvdyAmJiBlLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucmVhbHBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHIgPT4gKHI/LmlzVW5rbm93bigpID8gci5sc3RhdCgpIDogcikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ociA9PiByPy5zaG91bGRXYWxrKGRpcnMsIHdhbGtGaWx0ZXIpID8gd2FsayhyLCBuZXh0KSA6IG5leHQoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaG91bGRXYWxrKGRpcnMsIHdhbGtGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsayhlLCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRydWUpOyAvLyB6YWxnb29vb29vb1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGFydCA9IGVudHJ5O1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICB3YWxrKHN0YXJ0LCBlciA9PiB7XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgaWYgKGVyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqKGVyKTtcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgICAgIHJlcyhyZXN1bHRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2Fsa1N5bmMoZW50cnkgPSB0aGlzLmN3ZCwgb3B0cyA9IHt9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIG9wdHMgPSBlbnRyeTtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB3aXRoRmlsZVR5cGVzID0gdHJ1ZSwgZm9sbG93ID0gZmFsc2UsIGZpbHRlciwgd2Fsa0ZpbHRlciwgfSA9IG9wdHM7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHdpdGhGaWxlVHlwZXMgPyBlbnRyeSA6IGVudHJ5LmZ1bGxwYXRoKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpcnMgPSBuZXcgU2V0KFtlbnRyeV0pO1xuICAgICAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gZGlyLnJlYWRkaXJTeW5jKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2god2l0aEZpbGVUeXBlcyA/IGUgOiBlLmZ1bGxwYXRoKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgciA9IGU7XG4gICAgICAgICAgICAgICAgaWYgKGUuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShmb2xsb3cgJiYgKHIgPSBlLnJlYWxwYXRoU3luYygpKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIuaXNVbmtub3duKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByLmxzdGF0U3luYygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoci5zaG91bGRXYWxrKGRpcnMsIHdhbGtGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnMuYWRkKHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3VwcG9ydCBmb3IgYGZvciBhd2FpdGBcbiAgICAgKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgUGF0aFNjdXJyeUJhc2UuaXRlcmF0ZX1cbiAgICAgKlxuICAgICAqIE5vdGU6IEFzIG9mIE5vZGUgMTksIHRoaXMgaXMgdmVyeSBzbG93LCBjb21wYXJlZCB0byBvdGhlciBtZXRob2RzIG9mXG4gICAgICogd2Fsa2luZy4gIENvbnNpZGVyIHVzaW5nIHtAbGluayBQYXRoU2N1cnJ5QmFzZS5zdHJlYW19IGlmIG1lbW9yeSBvdmVyaGVhZFxuICAgICAqIGFuZCBiYWNrcHJlc3N1cmUgYXJlIGNvbmNlcm5zLCBvciB7QGxpbmsgUGF0aFNjdXJyeUJhc2Uud2Fsa30gaWYgbm90LlxuICAgICAqL1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZXJhdGUoKTtcbiAgICB9XG4gICAgaXRlcmF0ZShlbnRyeSA9IHRoaXMuY3dkLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gaXRlcmF0aW5nIGFzeW5jIG92ZXIgdGhlIHN0cmVhbSBpcyBzaWduaWZpY2FudGx5IG1vcmUgcGVyZm9ybWFudCxcbiAgICAgICAgLy8gZXNwZWNpYWxseSBpbiB0aGUgd2FybS1jYWNoZSBzY2VuYXJpbywgYmVjYXVzZSBpdCBidWZmZXJzIHVwIGRpcmVjdG9yeVxuICAgICAgICAvLyBlbnRyaWVzIGluIHRoZSBiYWNrZ3JvdW5kIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgYSB5aWVsZCBmb3IgZWFjaCBvbmUuXG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBlbnRyeTtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtKGVudHJ5LCBvcHRpb25zKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0aW5nIG92ZXIgYSBQYXRoU2N1cnJ5IHBlcmZvcm1zIGEgc3luY2hyb25vdXMgd2Fsay5cbiAgICAgKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgUGF0aFNjdXJyeUJhc2UuaXRlcmF0ZVN5bmN9XG4gICAgICovXG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZXJhdGVTeW5jKCk7XG4gICAgfVxuICAgICppdGVyYXRlU3luYyhlbnRyeSA9IHRoaXMuY3dkLCBvcHRzID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShlbnRyeSBpbnN0YW5jZW9mIFBhdGhCYXNlKSkge1xuICAgICAgICAgICAgb3B0cyA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHdpdGhGaWxlVHlwZXMgPSB0cnVlLCBmb2xsb3cgPSBmYWxzZSwgZmlsdGVyLCB3YWxrRmlsdGVyLCB9ID0gb3B0cztcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgeWllbGQgd2l0aEZpbGVUeXBlcyA/IGVudHJ5IDogZW50cnkuZnVsbHBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXJzID0gbmV3IFNldChbZW50cnldKTtcbiAgICAgICAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGRpci5yZWFkZGlyU3luYygpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgd2l0aEZpbGVUeXBlcyA/IGUgOiBlLmZ1bGxwYXRoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByID0gZTtcbiAgICAgICAgICAgICAgICBpZiAoZS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGZvbGxvdyAmJiAociA9IGUucmVhbHBhdGhTeW5jKCkpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoci5pc1Vua25vd24oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHIubHN0YXRTeW5jKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyLnNob3VsZFdhbGsoZGlycywgd2Fsa0ZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlycy5hZGQocik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0cmVhbShlbnRyeSA9IHRoaXMuY3dkLCBvcHRzID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShlbnRyeSBpbnN0YW5jZW9mIFBhdGhCYXNlKSkge1xuICAgICAgICAgICAgb3B0cyA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHdpdGhGaWxlVHlwZXMgPSB0cnVlLCBmb2xsb3cgPSBmYWxzZSwgZmlsdGVyLCB3YWxrRmlsdGVyLCB9ID0gb3B0cztcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IG5ldyBNaW5pcGFzcyh7IG9iamVjdE1vZGU6IHRydWUgfSk7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihlbnRyeSkpIHtcbiAgICAgICAgICAgIHJlc3VsdHMud3JpdGUod2l0aEZpbGVUeXBlcyA/IGVudHJ5IDogZW50cnkuZnVsbHBhdGgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlycyA9IG5ldyBTZXQoKTtcbiAgICAgICAgY29uc3QgcXVldWUgPSBbZW50cnldO1xuICAgICAgICBsZXQgcHJvY2Vzc2luZyA9IDA7XG4gICAgICAgIGNvbnN0IHByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGF1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAoIXBhdXNlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpciA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NpbmcgPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcrKztcbiAgICAgICAgICAgICAgICBkaXJzLmFkZChkaXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9uUmVhZGRpciA9IChlciwgZW50cmllcywgZGlkUmVhbHBhdGhzID0gZmFsc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgICAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9sbG93ICYmICFkaWRSZWFscGF0aHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVhbHBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHIpID0+IHI/LmlzVW5rbm93bigpID8gci5sc3RhdCgpIDogcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiBvblJlYWRkaXIobnVsbCwgZW50cmllcywgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKGUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy53cml0ZSh3aXRoRmlsZVR5cGVzID8gZSA6IGUuZnVsbHBhdGgoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZy0tO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IGUucmVhbHBhdGhDYWNoZWQoKSB8fCBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuc2hvdWxkV2FsayhkaXJzLCB3YWxrRmlsdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdXNlZCAmJiAhcmVzdWx0cy5mbG93aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLm9uY2UoJ2RyYWluJywgcHJvY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gemFsZ28gY29udGFpbm1lbnRcbiAgICAgICAgICAgICAgICBsZXQgc3luYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGlyLnJlYWRkaXJDQihvblJlYWRkaXIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHN5bmMgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcHJvY2VzcygpO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgc3RyZWFtU3luYyhlbnRyeSA9IHRoaXMuY3dkLCBvcHRzID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShlbnRyeSBpbnN0YW5jZW9mIFBhdGhCYXNlKSkge1xuICAgICAgICAgICAgb3B0cyA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHdpdGhGaWxlVHlwZXMgPSB0cnVlLCBmb2xsb3cgPSBmYWxzZSwgZmlsdGVyLCB3YWxrRmlsdGVyLCB9ID0gb3B0cztcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IG5ldyBNaW5pcGFzcyh7IG9iamVjdE1vZGU6IHRydWUgfSk7XG4gICAgICAgIGNvbnN0IGRpcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihlbnRyeSkpIHtcbiAgICAgICAgICAgIHJlc3VsdHMud3JpdGUod2l0aEZpbGVUeXBlcyA/IGVudHJ5IDogZW50cnkuZnVsbHBhdGgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXVldWUgPSBbZW50cnldO1xuICAgICAgICBsZXQgcHJvY2Vzc2luZyA9IDA7XG4gICAgICAgIGNvbnN0IHByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGF1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAoIXBhdXNlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpciA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NpbmcgPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcrKztcbiAgICAgICAgICAgICAgICBkaXJzLmFkZChkaXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBkaXIucmVhZGRpclN5bmMoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy53cml0ZSh3aXRoRmlsZVR5cGVzID8gZSA6IGUuZnVsbHBhdGgoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmctLTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgciA9IGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGZvbGxvdyAmJiAociA9IGUucmVhbHBhdGhTeW5jKCkpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmlzVW5rbm93bigpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubHN0YXRTeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHIuc2hvdWxkV2FsayhkaXJzLCB3YWxrRmlsdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXVzZWQgJiYgIXJlc3VsdHMuZmxvd2luZylcbiAgICAgICAgICAgICAgICByZXN1bHRzLm9uY2UoJ2RyYWluJywgcHJvY2Vzcyk7XG4gICAgICAgIH07XG4gICAgICAgIHByb2Nlc3MoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIGNoZGlyKHBhdGggPSB0aGlzLmN3ZCkge1xuICAgICAgICBjb25zdCBvbGRDd2QgPSB0aGlzLmN3ZDtcbiAgICAgICAgdGhpcy5jd2QgPSB0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycgPyB0aGlzLmN3ZC5yZXNvbHZlKHBhdGgpIDogcGF0aDtcbiAgICAgICAgdGhpcy5jd2Rbc2V0QXNDd2RdKG9sZEN3ZCk7XG4gICAgfVxufVxuLyoqXG4gKiBXaW5kb3dzIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQYXRoU2N1cnJ5QmFzZX1cbiAqXG4gKiBEZWZhdWx0cyB0byBjYXNlIGluc2Vuc2l0dmUsIHVzZXMgYCdcXFxcJ2AgdG8gZ2VuZXJhdGUgcGF0aCBzdHJpbmdzLiAgVXNlc1xuICoge0BsaW5rIFBhdGhXaW4zMn0gZm9yIFBhdGggb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhTY3VycnlXaW4zMiBleHRlbmRzIFBhdGhTY3VycnlCYXNlIHtcbiAgICAvKipcbiAgICAgKiBzZXBhcmF0b3IgZm9yIGdlbmVyYXRpbmcgcGF0aCBzdHJpbmdzXG4gICAgICovXG4gICAgc2VwID0gJ1xcXFwnO1xuICAgIGNvbnN0cnVjdG9yKGN3ZCA9IHByb2Nlc3MuY3dkKCksIG9wdHMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IG5vY2FzZSA9IHRydWUgfSA9IG9wdHM7XG4gICAgICAgIHN1cGVyKGN3ZCwgd2luMzIsICdcXFxcJywgeyAuLi5vcHRzLCBub2Nhc2UgfSk7XG4gICAgICAgIHRoaXMubm9jYXNlID0gbm9jYXNlO1xuICAgICAgICBmb3IgKGxldCBwID0gdGhpcy5jd2Q7IHA7IHAgPSBwLnBhcmVudCkge1xuICAgICAgICAgICAgcC5ub2Nhc2UgPSB0aGlzLm5vY2FzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwYXJzZVJvb3RQYXRoKGRpcikge1xuICAgICAgICAvLyBpZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBhIHNpbmdsZSBzZXBhcmF0b3IsIGl0J3Mgbm90IGEgVU5DLCBhbmQgd2UnbGxcbiAgICAgICAgLy8ganVzdCBnZXQgc2VwYXJhdG9yIGFzIHRoZSByb290LCBhbmQgZHJpdmVGcm9tVU5DIHdpbGwgcmV0dXJuIFxcXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgbW91bnQgXFwgb24gdGhlIHJvb3QgZnJvbSB0aGUgY3dkLlxuICAgICAgICByZXR1cm4gd2luMzIucGFyc2UoZGlyKS5yb290LnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIG5ld1Jvb3QoZnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXRoV2luMzIodGhpcy5yb290UGF0aCwgSUZESVIsIHVuZGVmaW5lZCwgdGhpcy5yb290cywgdGhpcy5ub2Nhc2UsIHRoaXMuY2hpbGRyZW5DYWNoZSgpLCB7IGZzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgcGF0aCBzdHJpbmcgaXMgYW4gYWJzb2x1dGUgcGF0aFxuICAgICAqL1xuICAgIGlzQWJzb2x1dGUocCkge1xuICAgICAgICByZXR1cm4gKHAuc3RhcnRzV2l0aCgnLycpIHx8IHAuc3RhcnRzV2l0aCgnXFxcXCcpIHx8IC9eW2Etel06KFxcL3xcXFxcKS9pLnRlc3QocCkpO1xuICAgIH1cbn1cbi8qKlxuICoge0BsaW5rIFBhdGhTY3VycnlCYXNlfSBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIHBvc2l4IHN5c3RlbXMgb3RoZXIgdGhhbiBEYXJ3aW4uXG4gKlxuICogRGVmYXVsdHMgdG8gY2FzZS1zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZXMgYCcvJ2AgdG8gZ2VuZXJhdGUgcGF0aCBzdHJpbmdzLlxuICpcbiAqIFVzZXMge0BsaW5rIFBhdGhQb3NpeH0gZm9yIFBhdGggb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhTY3VycnlQb3NpeCBleHRlbmRzIFBhdGhTY3VycnlCYXNlIHtcbiAgICAvKipcbiAgICAgKiBzZXBhcmF0b3IgZm9yIGdlbmVyYXRpbmcgcGF0aCBzdHJpbmdzXG4gICAgICovXG4gICAgc2VwID0gJy8nO1xuICAgIGNvbnN0cnVjdG9yKGN3ZCA9IHByb2Nlc3MuY3dkKCksIG9wdHMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IG5vY2FzZSA9IGZhbHNlIH0gPSBvcHRzO1xuICAgICAgICBzdXBlcihjd2QsIHBvc2l4LCAnLycsIHsgLi4ub3B0cywgbm9jYXNlIH0pO1xuICAgICAgICB0aGlzLm5vY2FzZSA9IG5vY2FzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcGFyc2VSb290UGF0aChfZGlyKSB7XG4gICAgICAgIHJldHVybiAnLyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIG5ld1Jvb3QoZnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXRoUG9zaXgodGhpcy5yb290UGF0aCwgSUZESVIsIHVuZGVmaW5lZCwgdGhpcy5yb290cywgdGhpcy5ub2Nhc2UsIHRoaXMuY2hpbGRyZW5DYWNoZSgpLCB7IGZzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgcGF0aCBzdHJpbmcgaXMgYW4gYWJzb2x1dGUgcGF0aFxuICAgICAqL1xuICAgIGlzQWJzb2x1dGUocCkge1xuICAgICAgICByZXR1cm4gcC5zdGFydHNXaXRoKCcvJyk7XG4gICAgfVxufVxuLyoqXG4gKiB7QGxpbmsgUGF0aFNjdXJyeUJhc2V9IGltcGxlbWVudGF0aW9uIGZvciBEYXJ3aW4gKG1hY09TKSBzeXN0ZW1zLlxuICpcbiAqIERlZmF1bHRzIHRvIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZXMgYCcvJ2AgZm9yIGdlbmVyYXRpbmcgcGF0aFxuICogc3RyaW5ncy5cbiAqXG4gKiBVc2VzIHtAbGluayBQYXRoUG9zaXh9IGZvciBQYXRoIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoU2N1cnJ5RGFyd2luIGV4dGVuZHMgUGF0aFNjdXJyeVBvc2l4IHtcbiAgICBjb25zdHJ1Y3Rvcihjd2QgPSBwcm9jZXNzLmN3ZCgpLCBvcHRzID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBub2Nhc2UgPSB0cnVlIH0gPSBvcHRzO1xuICAgICAgICBzdXBlcihjd2QsIHsgLi4ub3B0cywgbm9jYXNlIH0pO1xuICAgIH1cbn1cbi8qKlxuICogRGVmYXVsdCB7QGxpbmsgUGF0aEJhc2V9IGltcGxlbWVudGF0aW9uIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqXG4gKiB7QGxpbmsgUGF0aFdpbjMyfSBvbiBXaW5kb3dzIHN5c3RlbXMsIHtAbGluayBQYXRoUG9zaXh9IG9uIGFsbCBvdGhlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBQYXRoID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFBhdGhXaW4zMiA6IFBhdGhQb3NpeDtcbi8qKlxuICogRGVmYXVsdCB7QGxpbmsgUGF0aFNjdXJyeUJhc2V9IGltcGxlbWVudGF0aW9uIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqXG4gKiB7QGxpbmsgUGF0aFNjdXJyeVdpbjMyfSBvbiBXaW5kb3dzIHN5c3RlbXMsIHtAbGluayBQYXRoU2N1cnJ5RGFyd2lufSBvblxuICogRGFyd2luIChtYWNPUykgc3lzdGVtcywge0BsaW5rIFBhdGhTY3VycnlQb3NpeH0gb24gYWxsIG90aGVycy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBhdGhTY3VycnkgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gUGF0aFNjdXJyeVdpbjMyXG4gICAgOiBwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJyA/IFBhdGhTY3VycnlEYXJ3aW5cbiAgICAgICAgOiBQYXRoU2N1cnJ5UG9zaXg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgImNvbnN0IHByb2MgPSB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzc1xuICAgID8gcHJvY2Vzc1xuICAgIDoge1xuICAgICAgICBzdGRvdXQ6IG51bGwsXG4gICAgICAgIHN0ZGVycjogbnVsbCxcbiAgICB9O1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuaW1wb3J0IFN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSc7XG5pbXBvcnQgeyBTdHJpbmdEZWNvZGVyIH0gZnJvbSAnbm9kZTpzdHJpbmdfZGVjb2Rlcic7XG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIE1pbmlwYXNzIHN0cmVhbSwgTm9kZSBzdHJlYW0sIG9yIHNvbWV0aGluZ1xuICogZWxzZSB0aGF0IE1pbmlwYXNzIGNhbiBpbnRlcmFjdCB3aXRoLlxuICovXG5leHBvcnQgY29uc3QgaXNTdHJlYW0gPSAocykgPT4gISFzICYmXG4gICAgdHlwZW9mIHMgPT09ICdvYmplY3QnICYmXG4gICAgKHMgaW5zdGFuY2VvZiBNaW5pcGFzcyB8fFxuICAgICAgICBzIGluc3RhbmNlb2YgU3RyZWFtIHx8XG4gICAgICAgIGlzUmVhZGFibGUocykgfHxcbiAgICAgICAgaXNXcml0YWJsZShzKSk7XG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIHZhbGlkIHtAbGluayBNaW5pcGFzcy5SZWFkYWJsZX1cbiAqL1xuZXhwb3J0IGNvbnN0IGlzUmVhZGFibGUgPSAocykgPT4gISFzICYmXG4gICAgdHlwZW9mIHMgPT09ICdvYmplY3QnICYmXG4gICAgcyBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlciAmJlxuICAgIHR5cGVvZiBzLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICAvLyBub2RlIGNvcmUgV3JpdGFibGUgc3RyZWFtcyBoYXZlIGEgcGlwZSgpIG1ldGhvZCwgYnV0IGl0IHRocm93c1xuICAgIHMucGlwZSAhPT0gU3RyZWFtLldyaXRhYmxlLnByb3RvdHlwZS5waXBlO1xuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSB2YWxpZCB7QGxpbmsgTWluaXBhc3MuV3JpdGFibGV9XG4gKi9cbmV4cG9ydCBjb25zdCBpc1dyaXRhYmxlID0gKHMpID0+ICEhcyAmJlxuICAgIHR5cGVvZiBzID09PSAnb2JqZWN0JyAmJlxuICAgIHMgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIgJiZcbiAgICB0eXBlb2Ygcy53cml0ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBzLmVuZCA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IEVPRiA9IFN5bWJvbCgnRU9GJyk7XG5jb25zdCBNQVlCRV9FTUlUX0VORCA9IFN5bWJvbCgnbWF5YmVFbWl0RW5kJyk7XG5jb25zdCBFTUlUVEVEX0VORCA9IFN5bWJvbCgnZW1pdHRlZEVuZCcpO1xuY29uc3QgRU1JVFRJTkdfRU5EID0gU3ltYm9sKCdlbWl0dGluZ0VuZCcpO1xuY29uc3QgRU1JVFRFRF9FUlJPUiA9IFN5bWJvbCgnZW1pdHRlZEVycm9yJyk7XG5jb25zdCBDTE9TRUQgPSBTeW1ib2woJ2Nsb3NlZCcpO1xuY29uc3QgUkVBRCA9IFN5bWJvbCgncmVhZCcpO1xuY29uc3QgRkxVU0ggPSBTeW1ib2woJ2ZsdXNoJyk7XG5jb25zdCBGTFVTSENIVU5LID0gU3ltYm9sKCdmbHVzaENodW5rJyk7XG5jb25zdCBFTkNPRElORyA9IFN5bWJvbCgnZW5jb2RpbmcnKTtcbmNvbnN0IERFQ09ERVIgPSBTeW1ib2woJ2RlY29kZXInKTtcbmNvbnN0IEZMT1dJTkcgPSBTeW1ib2woJ2Zsb3dpbmcnKTtcbmNvbnN0IFBBVVNFRCA9IFN5bWJvbCgncGF1c2VkJyk7XG5jb25zdCBSRVNVTUUgPSBTeW1ib2woJ3Jlc3VtZScpO1xuY29uc3QgQlVGRkVSID0gU3ltYm9sKCdidWZmZXInKTtcbmNvbnN0IFBJUEVTID0gU3ltYm9sKCdwaXBlcycpO1xuY29uc3QgQlVGRkVSTEVOR1RIID0gU3ltYm9sKCdidWZmZXJMZW5ndGgnKTtcbmNvbnN0IEJVRkZFUlBVU0ggPSBTeW1ib2woJ2J1ZmZlclB1c2gnKTtcbmNvbnN0IEJVRkZFUlNISUZUID0gU3ltYm9sKCdidWZmZXJTaGlmdCcpO1xuY29uc3QgT0JKRUNUTU9ERSA9IFN5bWJvbCgnb2JqZWN0TW9kZScpO1xuLy8gaW50ZXJuYWwgZXZlbnQgd2hlbiBzdHJlYW0gaXMgZGVzdHJveWVkXG5jb25zdCBERVNUUk9ZRUQgPSBTeW1ib2woJ2Rlc3Ryb3llZCcpO1xuLy8gaW50ZXJuYWwgZXZlbnQgd2hlbiBzdHJlYW0gaGFzIGFuIGVycm9yXG5jb25zdCBFUlJPUiA9IFN5bWJvbCgnZXJyb3InKTtcbmNvbnN0IEVNSVREQVRBID0gU3ltYm9sKCdlbWl0RGF0YScpO1xuY29uc3QgRU1JVEVORCA9IFN5bWJvbCgnZW1pdEVuZCcpO1xuY29uc3QgRU1JVEVORDIgPSBTeW1ib2woJ2VtaXRFbmQyJyk7XG5jb25zdCBBU1lOQyA9IFN5bWJvbCgnYXN5bmMnKTtcbmNvbnN0IEFCT1JUID0gU3ltYm9sKCdhYm9ydCcpO1xuY29uc3QgQUJPUlRFRCA9IFN5bWJvbCgnYWJvcnRlZCcpO1xuY29uc3QgU0lHTkFMID0gU3ltYm9sKCdzaWduYWwnKTtcbmNvbnN0IERBVEFMSVNURU5FUlMgPSBTeW1ib2woJ2RhdGFMaXN0ZW5lcnMnKTtcbmNvbnN0IERJU0NBUkRFRCA9IFN5bWJvbCgnZGlzY2FyZGVkJyk7XG5jb25zdCBkZWZlciA9IChmbikgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbik7XG5jb25zdCBub2RlZmVyID0gKGZuKSA9PiBmbigpO1xuY29uc3QgaXNFbmRpc2ggPSAoZXYpID0+IGV2ID09PSAnZW5kJyB8fCBldiA9PT0gJ2ZpbmlzaCcgfHwgZXYgPT09ICdwcmVmaW5pc2gnO1xuY29uc3QgaXNBcnJheUJ1ZmZlckxpa2UgPSAoYikgPT4gYiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8XG4gICAgKCEhYiAmJlxuICAgICAgICB0eXBlb2YgYiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgYi5jb25zdHJ1Y3RvciAmJlxuICAgICAgICBiLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBcnJheUJ1ZmZlcicgJiZcbiAgICAgICAgYi5ieXRlTGVuZ3RoID49IDApO1xuY29uc3QgaXNBcnJheUJ1ZmZlclZpZXcgPSAoYikgPT4gIUJ1ZmZlci5pc0J1ZmZlcihiKSAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYik7XG4vKipcbiAqIEludGVybmFsIGNsYXNzIHJlcHJlc2VudGluZyBhIHBpcGUgdG8gYSBkZXN0aW5hdGlvbiBzdHJlYW0uXG4gKlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIFBpcGUge1xuICAgIHNyYztcbiAgICBkZXN0O1xuICAgIG9wdHM7XG4gICAgb25kcmFpbjtcbiAgICBjb25zdHJ1Y3RvcihzcmMsIGRlc3QsIG9wdHMpIHtcbiAgICAgICAgdGhpcy5zcmMgPSBzcmM7XG4gICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7XG4gICAgICAgIHRoaXMub3B0cyA9IG9wdHM7XG4gICAgICAgIHRoaXMub25kcmFpbiA9ICgpID0+IHNyY1tSRVNVTUVdKCk7XG4gICAgICAgIHRoaXMuZGVzdC5vbignZHJhaW4nLCB0aGlzLm9uZHJhaW4pO1xuICAgIH1cbiAgICB1bnBpcGUoKSB7XG4gICAgICAgIHRoaXMuZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCB0aGlzLm9uZHJhaW4pO1xuICAgIH1cbiAgICAvLyBvbmx5IGhlcmUgZm9yIHRoZSBwcm90b3R5cGVcbiAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICBwcm94eUVycm9ycyhfZXIpIHsgfVxuICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgZW5kKCkge1xuICAgICAgICB0aGlzLnVucGlwZSgpO1xuICAgICAgICBpZiAodGhpcy5vcHRzLmVuZClcbiAgICAgICAgICAgIHRoaXMuZGVzdC5lbmQoKTtcbiAgICB9XG59XG4vKipcbiAqIEludGVybmFsIGNsYXNzIHJlcHJlc2VudGluZyBhIHBpcGUgdG8gYSBkZXN0aW5hdGlvbiBzdHJlYW0gd2hlcmVcbiAqIGVycm9ycyBhcmUgcHJveGllZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgUGlwZVByb3h5RXJyb3JzIGV4dGVuZHMgUGlwZSB7XG4gICAgdW5waXBlKCkge1xuICAgICAgICB0aGlzLnNyYy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCB0aGlzLnByb3h5RXJyb3JzKTtcbiAgICAgICAgc3VwZXIudW5waXBlKCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHNyYywgZGVzdCwgb3B0cykge1xuICAgICAgICBzdXBlcihzcmMsIGRlc3QsIG9wdHMpO1xuICAgICAgICB0aGlzLnByb3h5RXJyb3JzID0gZXIgPT4gZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICAgICAgc3JjLm9uKCdlcnJvcicsIHRoaXMucHJveHlFcnJvcnMpO1xuICAgIH1cbn1cbmNvbnN0IGlzT2JqZWN0TW9kZU9wdGlvbnMgPSAobykgPT4gISFvLm9iamVjdE1vZGU7XG5jb25zdCBpc0VuY29kaW5nT3B0aW9ucyA9IChvKSA9PiAhby5vYmplY3RNb2RlICYmICEhby5lbmNvZGluZyAmJiBvLmVuY29kaW5nICE9PSAnYnVmZmVyJztcbi8qKlxuICogTWFpbiBleHBvcnQsIHRoZSBNaW5pcGFzcyBjbGFzc1xuICpcbiAqIGBSVHlwZWAgaXMgdGhlIHR5cGUgb2YgZGF0YSBlbWl0dGVkLCBkZWZhdWx0cyB0byBCdWZmZXJcbiAqXG4gKiBgV1R5cGVgIGlzIHRoZSB0eXBlIG9mIGRhdGEgdG8gYmUgd3JpdHRlbiwgaWYgUlR5cGUgaXMgYnVmZmVyIG9yIHN0cmluZyxcbiAqIHRoZW4gYW55IHtAbGluayBNaW5pcGFzcy5Db250aWd1b3VzRGF0YX0gaXMgYWxsb3dlZC5cbiAqXG4gKiBgRXZlbnRzYCBpcyB0aGUgc2V0IG9mIGV2ZW50IGhhbmRsZXIgc2lnbmF0dXJlcyB0aGF0IHRoaXMgb2JqZWN0XG4gKiB3aWxsIGVtaXQsIHNlZSB7QGxpbmsgTWluaXBhc3MuRXZlbnRzfVxuICovXG5leHBvcnQgY2xhc3MgTWluaXBhc3MgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIFtGTE9XSU5HXSA9IGZhbHNlO1xuICAgIFtQQVVTRURdID0gZmFsc2U7XG4gICAgW1BJUEVTXSA9IFtdO1xuICAgIFtCVUZGRVJdID0gW107XG4gICAgW09CSkVDVE1PREVdO1xuICAgIFtFTkNPRElOR107XG4gICAgW0FTWU5DXTtcbiAgICBbREVDT0RFUl07XG4gICAgW0VPRl0gPSBmYWxzZTtcbiAgICBbRU1JVFRFRF9FTkRdID0gZmFsc2U7XG4gICAgW0VNSVRUSU5HX0VORF0gPSBmYWxzZTtcbiAgICBbQ0xPU0VEXSA9IGZhbHNlO1xuICAgIFtFTUlUVEVEX0VSUk9SXSA9IG51bGw7XG4gICAgW0JVRkZFUkxFTkdUSF0gPSAwO1xuICAgIFtERVNUUk9ZRURdID0gZmFsc2U7XG4gICAgW1NJR05BTF07XG4gICAgW0FCT1JURURdID0gZmFsc2U7XG4gICAgW0RBVEFMSVNURU5FUlNdID0gMDtcbiAgICBbRElTQ0FSREVEXSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIHRydWUgaWYgdGhlIHN0cmVhbSBjYW4gYmUgd3JpdHRlblxuICAgICAqL1xuICAgIHdyaXRhYmxlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIHRoZSBzdHJlYW0gY2FuIGJlIHJlYWRcbiAgICAgKi9cbiAgICByZWFkYWJsZSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogSWYgYFJUeXBlYCBpcyBCdWZmZXIsIHRoZW4gb3B0aW9ucyBkbyBub3QgbmVlZCB0byBiZSBwcm92aWRlZC5cbiAgICAgKiBPdGhlcndpc2UsIGFuIG9wdGlvbnMgb2JqZWN0IG11c3QgYmUgcHJvdmlkZWQgdG8gc3BlY2lmeSBlaXRoZXJcbiAgICAgKiB7QGxpbmsgTWluaXBhc3MuU2hhcmVkT3B0aW9ucy5vYmplY3RNb2RlfSBvclxuICAgICAqIHtAbGluayBNaW5pcGFzcy5TaGFyZWRPcHRpb25zLmVuY29kaW5nfSwgYXMgYXBwcm9wcmlhdGUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gKGFyZ3NbMF0gfHxcbiAgICAgICAgICAgIHt9KTtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKG9wdGlvbnMub2JqZWN0TW9kZSAmJiB0eXBlb2Ygb3B0aW9ucy5lbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0VuY29kaW5nIGFuZCBvYmplY3RNb2RlIG1heSBub3QgYmUgdXNlZCB0b2dldGhlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc09iamVjdE1vZGVPcHRpb25zKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzW09CSkVDVE1PREVdID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXNbRU5DT0RJTkddID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0VuY29kaW5nT3B0aW9ucyhvcHRpb25zKSkge1xuICAgICAgICAgICAgdGhpc1tFTkNPRElOR10gPSBvcHRpb25zLmVuY29kaW5nO1xuICAgICAgICAgICAgdGhpc1tPQkpFQ1RNT0RFXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpc1tPQkpFQ1RNT0RFXSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpc1tFTkNPRElOR10gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXNbQVNZTkNdID0gISFvcHRpb25zLmFzeW5jO1xuICAgICAgICB0aGlzW0RFQ09ERVJdID0gdGhpc1tFTkNPRElOR11cbiAgICAgICAgICAgID8gbmV3IFN0cmluZ0RlY29kZXIodGhpc1tFTkNPRElOR10pXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIC8vQHRzLWlnbm9yZSAtIHByaXZhdGUgb3B0aW9uIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmdcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWJ1Z0V4cG9zZUJ1ZmZlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdidWZmZXInLCB7IGdldDogKCkgPT4gdGhpc1tCVUZGRVJdIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vQHRzLWlnbm9yZSAtIHByaXZhdGUgb3B0aW9uIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmdcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWJ1Z0V4cG9zZVBpcGVzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3BpcGVzJywgeyBnZXQ6ICgpID0+IHRoaXNbUElQRVNdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICB0aGlzW1NJR05BTF0gPSBzaWduYWw7XG4gICAgICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzW0FCT1JUXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpc1tBQk9SVF0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBkYXRhIHN0b3JlZCBpbiB0aGUgYnVmZmVyIHdhaXRpbmcgdG8gYmUgcmVhZC5cbiAgICAgKlxuICAgICAqIEZvciBCdWZmZXIgc3RyaW5ncywgdGhpcyB3aWxsIGJlIHRoZSB0b3RhbCBieXRlIGxlbmd0aC5cbiAgICAgKiBGb3Igc3RyaW5nIGVuY29kaW5nIHN0cmVhbXMsIHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIGNoYXJhY3RlciBsZW5ndGgsXG4gICAgICogYWNjb3JkaW5nIHRvIEphdmFTY3JpcHQncyBgc3RyaW5nLmxlbmd0aGAgbG9naWMuXG4gICAgICogRm9yIG9iamVjdE1vZGUgc3RyZWFtcywgdGhpcyBpcyBhIGNvdW50IG9mIHRoZSBpdGVtcyB3YWl0aW5nIHRvIGJlXG4gICAgICogZW1pdHRlZC5cbiAgICAgKi9cbiAgICBnZXQgYnVmZmVyTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tCVUZGRVJMRU5HVEhdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYEJ1ZmZlckVuY29kaW5nYCBjdXJyZW50bHkgaW4gdXNlLCBvciBgbnVsbGBcbiAgICAgKi9cbiAgICBnZXQgZW5jb2RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW0VOQ09ESU5HXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgLSBUaGlzIGlzIGEgcmVhZCBvbmx5IHByb3BlcnR5XG4gICAgICovXG4gICAgc2V0IGVuY29kaW5nKF9lbmMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvZGluZyBtdXN0IGJlIHNldCBhdCBpbnN0YW50aWF0aW9uIHRpbWUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgLSBFbmNvZGluZyBtYXkgb25seSBiZSBzZXQgYXQgaW5zdGFudGlhdGlvbiB0aW1lXG4gICAgICovXG4gICAgc2V0RW5jb2RpbmcoX2VuYykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY29kaW5nIG11c3QgYmUgc2V0IGF0IGluc3RhbnRpYXRpb24gdGltZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoaXMgaXMgYW4gb2JqZWN0TW9kZSBzdHJlYW1cbiAgICAgKi9cbiAgICBnZXQgb2JqZWN0TW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbT0JKRUNUTU9ERV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIC0gVGhpcyBpcyBhIHJlYWQtb25seSBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHNldCBvYmplY3RNb2RlKF9vbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29iamVjdE1vZGUgbXVzdCBiZSBzZXQgYXQgaW5zdGFudGlhdGlvbiB0aW1lJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHRydWUgaWYgdGhpcyBpcyBhbiBhc3luYyBzdHJlYW1cbiAgICAgKi9cbiAgICBnZXQgWydhc3luYyddKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tBU1lOQ107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0byB0cnVlIHRvIG1ha2UgdGhpcyBzdHJlYW0gYXN5bmMuXG4gICAgICpcbiAgICAgKiBPbmNlIHNldCwgaXQgY2Fubm90IGJlIHVuc2V0LCBhcyB0aGlzIHdvdWxkIHBvdGVudGlhbGx5IGNhdXNlIGluY29ycmVjdFxuICAgICAqIGJlaGF2aW9yLiAgSWUsIGEgc3luYyBzdHJlYW0gY2FuIGJlIG1hZGUgYXN5bmMsIGJ1dCBhbiBhc3luYyBzdHJlYW1cbiAgICAgKiBjYW5ub3QgYmUgc2FmZWx5IG1hZGUgc3luYy5cbiAgICAgKi9cbiAgICBzZXQgWydhc3luYyddKGEpIHtcbiAgICAgICAgdGhpc1tBU1lOQ10gPSB0aGlzW0FTWU5DXSB8fCAhIWE7XG4gICAgfVxuICAgIC8vIGRyb3AgZXZlcnl0aGluZyBhbmQgZ2V0IG91dCBvZiB0aGUgZmxvdyBjb21wbGV0ZWx5XG4gICAgW0FCT1JUXSgpIHtcbiAgICAgICAgdGhpc1tBQk9SVEVEXSA9IHRydWU7XG4gICAgICAgIHRoaXMuZW1pdCgnYWJvcnQnLCB0aGlzW1NJR05BTF0/LnJlYXNvbik7XG4gICAgICAgIHRoaXMuZGVzdHJveSh0aGlzW1NJR05BTF0/LnJlYXNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBhYm9ydGVkLlxuICAgICAqL1xuICAgIGdldCBhYm9ydGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tBQk9SVEVEXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm8tb3Agc2V0dGVyLiBTdHJlYW0gYWJvcnRlZCBzdGF0dXMgaXMgc2V0IHZpYSB0aGUgQWJvcnRTaWduYWwgcHJvdmlkZWRcbiAgICAgKiBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucy5cbiAgICAgKi9cbiAgICBzZXQgYWJvcnRlZChfKSB7IH1cbiAgICB3cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gICAgICAgIGlmICh0aGlzW0FCT1JURURdKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpc1tFT0ZdKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgICAgICAgaWYgKHRoaXNbREVTVFJPWUVEXSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdDYW5ub3QgY2FsbCB3cml0ZSBhZnRlciBhIHN0cmVhbSB3YXMgZGVzdHJveWVkJyksIHsgY29kZTogJ0VSUl9TVFJFQU1fREVTVFJPWUVEJyB9KSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYiA9IGVuY29kaW5nO1xuICAgICAgICAgICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbmNvZGluZylcbiAgICAgICAgICAgIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgICAgICBjb25zdCBmbiA9IHRoaXNbQVNZTkNdID8gZGVmZXIgOiBub2RlZmVyO1xuICAgICAgICAvLyBjb252ZXJ0IGFycmF5IGJ1ZmZlcnMgYW5kIHR5cGVkIGFycmF5IHZpZXdzIGludG8gYnVmZmVyc1xuICAgICAgICAvLyBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUsIHdlIG1heSB3YW50IHRvIGRvIHRoZSBvcHBvc2l0ZSFcbiAgICAgICAgLy8gbGVhdmUgc3RyaW5ncyBhbmQgYnVmZmVycyBhcy1pc1xuICAgICAgICAvLyBhbnl0aGluZyBpcyBvbmx5IGFsbG93ZWQgaWYgaW4gb2JqZWN0IG1vZGUsIHNvIHRocm93XG4gICAgICAgIGlmICghdGhpc1tPQkpFQ1RNT0RFXSAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgICAgICAgICAgaWYgKGlzQXJyYXlCdWZmZXJWaWV3KGNodW5rKSkge1xuICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZSAtIHNpbmZ1bCB1bnNhZmUgdHlwZSBjaGFuZ2luZ1xuICAgICAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmsuYnVmZmVyLCBjaHVuay5ieXRlT2Zmc2V0LCBjaHVuay5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzQXJyYXlCdWZmZXJMaWtlKGNodW5rKSkge1xuICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZSAtIHNpbmZ1bCB1bnNhZmUgdHlwZSBjaGFuZ2luZ1xuICAgICAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm9uLWNvbnRpZ3VvdXMgZGF0YSB3cml0dGVuIHRvIG5vbi1vYmplY3RNb2RlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBvYmplY3QgbW9kZSB1cCBmcm9udCwgc2luY2UgaXQncyBzaW1wbGVyXG4gICAgICAgIC8vIHRoaXMgeWllbGRzIGJldHRlciBwZXJmb3JtYW5jZSwgZmV3ZXIgY2hlY2tzIGxhdGVyLlxuICAgICAgICBpZiAodGhpc1tPQkpFQ1RNT0RFXSkge1xuICAgICAgICAgICAgLy8gbWF5YmUgaW1wb3NzaWJsZT9cbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKHRoaXNbRkxPV0lOR10gJiYgdGhpc1tCVUZGRVJMRU5HVEhdICE9PSAwKVxuICAgICAgICAgICAgICAgIHRoaXNbRkxVU0hdKHRydWUpO1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIGlmICh0aGlzW0ZMT1dJTkddKVxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzW0JVRkZFUlBVU0hdKGNodW5rKTtcbiAgICAgICAgICAgIGlmICh0aGlzW0JVRkZFUkxFTkdUSF0gIT09IDApXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWFkYWJsZScpO1xuICAgICAgICAgICAgaWYgKGNiKVxuICAgICAgICAgICAgICAgIGZuKGNiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW0ZMT1dJTkddO1xuICAgICAgICB9XG4gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgdGhlIGNodW5rIGlzIGEgYnVmZmVyIG9yIHN0cmluZ1xuICAgICAgICAvLyBkb24ndCBidWZmZXIgaXQgdXAgb3Igc2VuZCBpdCB0byB0aGUgZGVjb2RlclxuICAgICAgICBpZiAoIWNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXNbQlVGRkVSTEVOR1RIXSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlYWRhYmxlJyk7XG4gICAgICAgICAgICBpZiAoY2IpXG4gICAgICAgICAgICAgICAgZm4oY2IpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbRkxPV0lOR107XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmFzdC1wYXRoIHdyaXRpbmcgc3RyaW5ncyBvZiBzYW1lIGVuY29kaW5nIHRvIGEgc3RyZWFtIHdpdGhcbiAgICAgICAgLy8gYW4gZW1wdHkgYnVmZmVyLCBza2lwcGluZyB0aGUgYnVmZmVyL2RlY29kZXIgZGFuY2VcbiAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIC8vIHVubGVzcyBpdCBpcyBhIHN0cmluZyBhbHJlYWR5IHJlYWR5IGZvciB1cyB0byB1c2VcbiAgICAgICAgICAgICEoZW5jb2RpbmcgPT09IHRoaXNbRU5DT0RJTkddICYmICF0aGlzW0RFQ09ERVJdPy5sYXN0TmVlZCkpIHtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZSAtIHNpbmZ1bCB1bnNhZmUgdHlwZSBjaGFuZ2VcbiAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0aGlzW0VOQ09ESU5HXSkge1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlIC0gc2luZnVsIHVuc2FmZSB0eXBlIGNoYW5nZVxuICAgICAgICAgICAgY2h1bmsgPSB0aGlzW0RFQ09ERVJdLndyaXRlKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBmbHVzaGluZyBDQU4gcG90ZW50aWFsbHkgc3dpdGNoIHVzIGludG8gbm90LWZsb3dpbmcgbW9kZVxuICAgICAgICBpZiAodGhpc1tGTE9XSU5HXSAmJiB0aGlzW0JVRkZFUkxFTkdUSF0gIT09IDApXG4gICAgICAgICAgICB0aGlzW0ZMVVNIXSh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXNbRkxPV0lOR10pXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXNbQlVGRkVSUFVTSF0oY2h1bmspO1xuICAgICAgICBpZiAodGhpc1tCVUZGRVJMRU5HVEhdICE9PSAwKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWFkYWJsZScpO1xuICAgICAgICBpZiAoY2IpXG4gICAgICAgICAgICBmbihjYik7XG4gICAgICAgIHJldHVybiB0aGlzW0ZMT1dJTkddO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb3ctbGV2ZWwgZXhwbGljaXQgcmVhZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBJbiBvYmplY3RNb2RlLCB0aGUgYXJndW1lbnQgaXMgaWdub3JlZCwgYW5kIG9uZSBpdGVtIGlzIHJldHVybmVkIGlmXG4gICAgICogYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogYG5gIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgKG9yIGluIHRoZSBjYXNlIG9mIGVuY29kaW5nIHN0cmVhbXMsXG4gICAgICogY2hhcmFjdGVycykgdG8gY29uc3VtZS4gSWYgYG5gIGlzIG5vdCBwcm92aWRlZCwgdGhlbiB0aGUgZW50aXJlIGJ1ZmZlclxuICAgICAqIGlzIHJldHVybmVkLCBvciBgbnVsbGAgaXMgcmV0dXJuZWQgaWYgbm8gZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBJZiBgbmAgaXMgZ3JlYXRlciB0aGF0IHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyLFxuICAgICAqIHRoZW4gYG51bGxgIGlzIHJldHVybmVkLlxuICAgICAqL1xuICAgIHJlYWQobikge1xuICAgICAgICBpZiAodGhpc1tERVNUUk9ZRURdKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXNbRElTQ0FSREVEXSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpc1tCVUZGRVJMRU5HVEhdID09PSAwIHx8XG4gICAgICAgICAgICBuID09PSAwIHx8XG4gICAgICAgICAgICAobiAmJiBuID4gdGhpc1tCVUZGRVJMRU5HVEhdKSkge1xuICAgICAgICAgICAgdGhpc1tNQVlCRV9FTUlUX0VORF0oKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzW09CSkVDVE1PREVdKVxuICAgICAgICAgICAgbiA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzW0JVRkZFUl0ubGVuZ3RoID4gMSAmJiAhdGhpc1tPQkpFQ1RNT0RFXSkge1xuICAgICAgICAgICAgLy8gbm90IG9iamVjdCBtb2RlLCBzbyBpZiB3ZSBoYXZlIGFuIGVuY29kaW5nLCB0aGVuIFJUeXBlIGlzIHN0cmluZ1xuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBtdXN0IGJlIEJ1ZmZlclxuICAgICAgICAgICAgdGhpc1tCVUZGRVJdID0gW1xuICAgICAgICAgICAgICAgICh0aGlzW0VOQ09ESU5HXVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXNbQlVGRkVSXS5qb2luKCcnKVxuICAgICAgICAgICAgICAgICAgICA6IEJ1ZmZlci5jb25jYXQodGhpc1tCVUZGRVJdLCB0aGlzW0JVRkZFUkxFTkdUSF0pKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gdGhpc1tSRUFEXShuIHx8IG51bGwsIHRoaXNbQlVGRkVSXVswXSk7XG4gICAgICAgIHRoaXNbTUFZQkVfRU1JVF9FTkRdKCk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIFtSRUFEXShuLCBjaHVuaykge1xuICAgICAgICBpZiAodGhpc1tPQkpFQ1RNT0RFXSlcbiAgICAgICAgICAgIHRoaXNbQlVGRkVSU0hJRlRdKCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNodW5rO1xuICAgICAgICAgICAgaWYgKG4gPT09IGMubGVuZ3RoIHx8IG4gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgdGhpc1tCVUZGRVJTSElGVF0oKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXNbQlVGRkVSXVswXSA9IGMuc2xpY2Uobik7XG4gICAgICAgICAgICAgICAgY2h1bmsgPSBjLnNsaWNlKDAsIG4pO1xuICAgICAgICAgICAgICAgIHRoaXNbQlVGRkVSTEVOR1RIXSAtPSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1tCVUZGRVJdWzBdID0gYy5zdWJhcnJheShuKTtcbiAgICAgICAgICAgICAgICBjaHVuayA9IGMuc3ViYXJyYXkoMCwgbik7XG4gICAgICAgICAgICAgICAgdGhpc1tCVUZGRVJMRU5HVEhdIC09IG47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgICAgICBpZiAoIXRoaXNbQlVGRkVSXS5sZW5ndGggJiYgIXRoaXNbRU9GXSlcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZHJhaW4nKTtcbiAgICAgICAgcmV0dXJuIGNodW5rO1xuICAgIH1cbiAgICBlbmQoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYiA9IGNodW5rO1xuICAgICAgICAgICAgY2h1bmsgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2IgPSBlbmNvZGluZztcbiAgICAgICAgICAgIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaHVuayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICBpZiAoY2IpXG4gICAgICAgICAgICB0aGlzLm9uY2UoJ2VuZCcsIGNiKTtcbiAgICAgICAgdGhpc1tFT0ZdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IHdyaXR0ZW4gYW55dGhpbmcsIHRoZW4gZ28gYWhlYWQgYW5kIGVtaXQsXG4gICAgICAgIC8vIGV2ZW4gaWYgd2UncmUgbm90IHJlYWRpbmcuXG4gICAgICAgIC8vIHdlJ2xsIHJlLWVtaXQgaWYgYSBuZXcgJ2VuZCcgbGlzdGVuZXIgaXMgYWRkZWQgYW55d2F5LlxuICAgICAgICAvLyBUaGlzIG1ha2VzIE1QIG1vcmUgc3VpdGFibGUgdG8gd3JpdGUtb25seSB1c2UgY2FzZXMuXG4gICAgICAgIGlmICh0aGlzW0ZMT1dJTkddIHx8ICF0aGlzW1BBVVNFRF0pXG4gICAgICAgICAgICB0aGlzW01BWUJFX0VNSVRfRU5EXSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLy8gZG9uJ3QgbGV0IHRoZSBpbnRlcm5hbCByZXN1bWUgYmUgb3ZlcndyaXR0ZW5cbiAgICBbUkVTVU1FXSgpIHtcbiAgICAgICAgaWYgKHRoaXNbREVTVFJPWUVEXSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzW0RBVEFMSVNURU5FUlNdICYmICF0aGlzW1BJUEVTXS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXNbRElTQ0FSREVEXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpc1tQQVVTRURdID0gZmFsc2U7XG4gICAgICAgIHRoaXNbRkxPV0lOR10gPSB0cnVlO1xuICAgICAgICB0aGlzLmVtaXQoJ3Jlc3VtZScpO1xuICAgICAgICBpZiAodGhpc1tCVUZGRVJdLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXNbRkxVU0hdKCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXNbRU9GXSlcbiAgICAgICAgICAgIHRoaXNbTUFZQkVfRU1JVF9FTkRdKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZHJhaW4nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBzdHJlYW0gaWYgaXQgaXMgY3VycmVudGx5IGluIGEgcGF1c2VkIHN0YXRlXG4gICAgICpcbiAgICAgKiBJZiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgbm8gcGlwZSBkZXN0aW5hdGlvbnMgb3IgYGRhdGFgIGV2ZW50IGxpc3RlbmVycyxcbiAgICAgKiB0aGlzIHdpbGwgcGxhY2UgdGhlIHN0cmVhbSBpbiBhIFwiZGlzY2FyZGVkXCIgc3RhdGUsIHdoZXJlIGFsbCBkYXRhIHdpbGxcbiAgICAgKiBiZSB0aHJvd24gYXdheS4gVGhlIGRpc2NhcmRlZCBzdGF0ZSBpcyByZW1vdmVkIGlmIGEgcGlwZSBkZXN0aW5hdGlvbiBvclxuICAgICAqIGRhdGEgaGFuZGxlciBpcyBhZGRlZCwgaWYgcGF1c2UoKSBpcyBjYWxsZWQsIG9yIGlmIGFueSBzeW5jaHJvbm91cyBvclxuICAgICAqIGFzeW5jaHJvbm91cyBpdGVyYXRpb24gaXMgc3RhcnRlZC5cbiAgICAgKi9cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW1JFU1VNRV0oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIHN0cmVhbVxuICAgICAqL1xuICAgIHBhdXNlKCkge1xuICAgICAgICB0aGlzW0ZMT1dJTkddID0gZmFsc2U7XG4gICAgICAgIHRoaXNbUEFVU0VEXSA9IHRydWU7XG4gICAgICAgIHRoaXNbRElTQ0FSREVEXSA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gZm9yY2libHkgZGVzdHJveWVkXG4gICAgICovXG4gICAgZ2V0IGRlc3Ryb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbREVTVFJPWUVEXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGN1cnJlbnRseSBpbiBhIGZsb3dpbmcgc3RhdGUsIG1lYW5pbmcgdGhhdFxuICAgICAqIGFueSB3cml0ZXMgd2lsbCBiZSBpbW1lZGlhdGVseSBlbWl0dGVkLlxuICAgICAqL1xuICAgIGdldCBmbG93aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tGTE9XSU5HXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGN1cnJlbnRseSBpbiBhIHBhdXNlZCBzdGF0ZVxuICAgICAqL1xuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW1BBVVNFRF07XG4gICAgfVxuICAgIFtCVUZGRVJQVVNIXShjaHVuaykge1xuICAgICAgICBpZiAodGhpc1tPQkpFQ1RNT0RFXSlcbiAgICAgICAgICAgIHRoaXNbQlVGRkVSTEVOR1RIXSArPSAxO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzW0JVRkZFUkxFTkdUSF0gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICB0aGlzW0JVRkZFUl0ucHVzaChjaHVuayk7XG4gICAgfVxuICAgIFtCVUZGRVJTSElGVF0oKSB7XG4gICAgICAgIGlmICh0aGlzW09CSkVDVE1PREVdKVxuICAgICAgICAgICAgdGhpc1tCVUZGRVJMRU5HVEhdIC09IDE7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXNbQlVGRkVSTEVOR1RIXSAtPSB0aGlzW0JVRkZFUl1bMF0ubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpc1tCVUZGRVJdLnNoaWZ0KCk7XG4gICAgfVxuICAgIFtGTFVTSF0obm9EcmFpbiA9IGZhbHNlKSB7XG4gICAgICAgIGRvIHsgfSB3aGlsZSAodGhpc1tGTFVTSENIVU5LXSh0aGlzW0JVRkZFUlNISUZUXSgpKSAmJlxuICAgICAgICAgICAgdGhpc1tCVUZGRVJdLmxlbmd0aCk7XG4gICAgICAgIGlmICghbm9EcmFpbiAmJiAhdGhpc1tCVUZGRVJdLmxlbmd0aCAmJiAhdGhpc1tFT0ZdKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkcmFpbicpO1xuICAgIH1cbiAgICBbRkxVU0hDSFVOS10oY2h1bmspIHtcbiAgICAgICAgdGhpcy5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgICAgICByZXR1cm4gdGhpc1tGTE9XSU5HXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGlwZSBhbGwgZGF0YSBlbWl0dGVkIGJ5IHRoaXMgc3RyZWFtIGludG8gdGhlIGRlc3RpbmF0aW9uIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogVHJpZ2dlcnMgdGhlIGZsb3cgb2YgZGF0YS5cbiAgICAgKi9cbiAgICBwaXBlKGRlc3QsIG9wdHMpIHtcbiAgICAgICAgaWYgKHRoaXNbREVTVFJPWUVEXSlcbiAgICAgICAgICAgIHJldHVybiBkZXN0O1xuICAgICAgICB0aGlzW0RJU0NBUkRFRF0gPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZW5kZWQgPSB0aGlzW0VNSVRURURfRU5EXTtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIGlmIChkZXN0ID09PSBwcm9jLnN0ZG91dCB8fCBkZXN0ID09PSBwcm9jLnN0ZGVycilcbiAgICAgICAgICAgIG9wdHMuZW5kID0gZmFsc2U7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG9wdHMuZW5kID0gb3B0cy5lbmQgIT09IGZhbHNlO1xuICAgICAgICBvcHRzLnByb3h5RXJyb3JzID0gISFvcHRzLnByb3h5RXJyb3JzO1xuICAgICAgICAvLyBwaXBpbmcgYW4gZW5kZWQgc3RyZWFtIGVuZHMgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgICBpZiAob3B0cy5lbmQpXG4gICAgICAgICAgICAgICAgZGVzdC5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFwiYXNcIiBoZXJlIGp1c3QgaWdub3JlcyB0aGUgV1R5cGUsIHdoaWNoIHBpcGVzIGRvbid0IGNhcmUgYWJvdXQsXG4gICAgICAgICAgICAvLyBzaW5jZSB0aGV5J3JlIG9ubHkgY29uc3VtaW5nIGZyb20gdXMsIGFuZCB3cml0aW5nIHRvIHRoZSBkZXN0XG4gICAgICAgICAgICB0aGlzW1BJUEVTXS5wdXNoKCFvcHRzLnByb3h5RXJyb3JzXG4gICAgICAgICAgICAgICAgPyBuZXcgUGlwZSh0aGlzLCBkZXN0LCBvcHRzKVxuICAgICAgICAgICAgICAgIDogbmV3IFBpcGVQcm94eUVycm9ycyh0aGlzLCBkZXN0LCBvcHRzKSk7XG4gICAgICAgICAgICBpZiAodGhpc1tBU1lOQ10pXG4gICAgICAgICAgICAgICAgZGVmZXIoKCkgPT4gdGhpc1tSRVNVTUVdKCkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXNbUkVTVU1FXSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdWxseSB1bmhvb2sgYSBwaXBlZCBkZXN0aW5hdGlvbiBzdHJlYW0uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZGVzdGluYXRpb24gc3RyZWFtIHdhcyB0aGUgb25seSBjb25zdW1lciBvZiB0aGlzIHN0cmVhbSAoaWUsXG4gICAgICogdGhlcmUgYXJlIG5vIG90aGVyIHBpcGVkIGRlc3RpbmF0aW9ucyBvciBgJ2RhdGEnYCBldmVudCBsaXN0ZW5lcnMpXG4gICAgICogdGhlbiB0aGUgZmxvdyBvZiBkYXRhIHdpbGwgc3RvcCB1bnRpbCB0aGVyZSBpcyBhbm90aGVyIGNvbnN1bWVyIG9yXG4gICAgICoge0BsaW5rIE1pbmlwYXNzI3Jlc3VtZX0gaXMgZXhwbGljaXRseSBjYWxsZWQuXG4gICAgICovXG4gICAgdW5waXBlKGRlc3QpIHtcbiAgICAgICAgY29uc3QgcCA9IHRoaXNbUElQRVNdLmZpbmQocCA9PiBwLmRlc3QgPT09IGRlc3QpO1xuICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgaWYgKHRoaXNbUElQRVNdLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW0ZMT1dJTkddICYmIHRoaXNbREFUQUxJU1RFTkVSU10gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tGTE9XSU5HXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzW1BJUEVTXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXNbUElQRVNdLnNwbGljZSh0aGlzW1BJUEVTXS5pbmRleE9mKHApLCAxKTtcbiAgICAgICAgICAgIHAudW5waXBlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBNaW5pcGFzcyNvbn1cbiAgICAgKi9cbiAgICBhZGRMaXN0ZW5lcihldiwgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5vbihldiwgaGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vc3RseSBpZGVudGljYWwgdG8gYEV2ZW50RW1pdHRlci5vbmAsIHdpdGggdGhlIGZvbGxvd2luZ1xuICAgICAqIGJlaGF2aW9yIGRpZmZlcmVuY2VzIHRvIHByZXZlbnQgZGF0YSBsb3NzIGFuZCB1bm5lY2Vzc2FyeSBoYW5nczpcbiAgICAgKlxuICAgICAqIC0gQWRkaW5nIGEgJ2RhdGEnIGV2ZW50IGhhbmRsZXIgd2lsbCB0cmlnZ2VyIHRoZSBmbG93IG9mIGRhdGFcbiAgICAgKlxuICAgICAqIC0gQWRkaW5nIGEgJ3JlYWRhYmxlJyBldmVudCBoYW5kbGVyIHdoZW4gdGhlcmUgaXMgZGF0YSB3YWl0aW5nIHRvIGJlIHJlYWRcbiAgICAgKiAgIHdpbGwgY2F1c2UgJ3JlYWRhYmxlJyB0byBiZSBlbWl0dGVkIGltbWVkaWF0ZWx5LlxuICAgICAqXG4gICAgICogLSBBZGRpbmcgYW4gJ2VuZGlzaCcgZXZlbnQgaGFuZGxlciAoJ2VuZCcsICdmaW5pc2gnLCBldGMuKSB3aGljaCBoYXNcbiAgICAgKiAgIGFscmVhZHkgcGFzc2VkIHdpbGwgY2F1c2UgdGhlIGV2ZW50IHRvIGJlIGVtaXR0ZWQgaW1tZWRpYXRlbHkgYW5kIGFsbFxuICAgICAqICAgaGFuZGxlcnMgcmVtb3ZlZC5cbiAgICAgKlxuICAgICAqIC0gQWRkaW5nIGFuICdlcnJvcicgZXZlbnQgaGFuZGxlciBhZnRlciBhbiBlcnJvciBoYXMgYmVlbiBlbWl0dGVkIHdpbGxcbiAgICAgKiAgIGNhdXNlIHRoZSBldmVudCB0byBiZSByZS1lbWl0dGVkIGltbWVkaWF0ZWx5IHdpdGggdGhlIGVycm9yIHByZXZpb3VzbHlcbiAgICAgKiAgIHJhaXNlZC5cbiAgICAgKi9cbiAgICBvbihldiwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCByZXQgPSBzdXBlci5vbihldiwgaGFuZGxlcik7XG4gICAgICAgIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICB0aGlzW0RJU0NBUkRFRF0gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXNbREFUQUxJU1RFTkVSU10rKztcbiAgICAgICAgICAgIGlmICghdGhpc1tQSVBFU10ubGVuZ3RoICYmICF0aGlzW0ZMT1dJTkddKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tSRVNVTUVdKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScgJiYgdGhpc1tCVUZGRVJMRU5HVEhdICE9PSAwKSB7XG4gICAgICAgICAgICBzdXBlci5lbWl0KCdyZWFkYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzRW5kaXNoKGV2KSAmJiB0aGlzW0VNSVRURURfRU5EXSkge1xuICAgICAgICAgICAgc3VwZXIuZW1pdChldik7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhldik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXYgPT09ICdlcnJvcicgJiYgdGhpc1tFTUlUVEVEX0VSUk9SXSkge1xuICAgICAgICAgICAgY29uc3QgaCA9IGhhbmRsZXI7XG4gICAgICAgICAgICBpZiAodGhpc1tBU1lOQ10pXG4gICAgICAgICAgICAgICAgZGVmZXIoKCkgPT4gaC5jYWxsKHRoaXMsIHRoaXNbRU1JVFRFRF9FUlJPUl0pKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBoLmNhbGwodGhpcywgdGhpc1tFTUlUVEVEX0VSUk9SXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBNaW5pcGFzcyNvZmZ9XG4gICAgICovXG4gICAgcmVtb3ZlTGlzdGVuZXIoZXYsIGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2ZmKGV2LCBoYW5kbGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW9zdGx5IGlkZW50aWNhbCB0byBgRXZlbnRFbWl0dGVyLm9mZmBcbiAgICAgKlxuICAgICAqIElmIGEgJ2RhdGEnIGV2ZW50IGhhbmRsZXIgaXMgcmVtb3ZlZCwgYW5kIGl0IHdhcyB0aGUgbGFzdCBjb25zdW1lclxuICAgICAqIChpZSwgdGhlcmUgYXJlIG5vIHBpcGUgZGVzdGluYXRpb25zIG9yIG90aGVyICdkYXRhJyBldmVudCBsaXN0ZW5lcnMpLFxuICAgICAqIHRoZW4gdGhlIGZsb3cgb2YgZGF0YSB3aWxsIHN0b3AgdW50aWwgdGhlcmUgaXMgYW5vdGhlciBjb25zdW1lciBvclxuICAgICAqIHtAbGluayBNaW5pcGFzcyNyZXN1bWV9IGlzIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqL1xuICAgIG9mZihldiwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCByZXQgPSBzdXBlci5vZmYoZXYsIGhhbmRsZXIpO1xuICAgICAgICAvLyBpZiB3ZSBwcmV2aW91c2x5IGhhZCBsaXN0ZW5lcnMsIGFuZCBub3cgd2UgZG9uJ3QsIGFuZCB3ZSBkb24ndFxuICAgICAgICAvLyBoYXZlIGFueSBwaXBlcywgdGhlbiBzdG9wIHRoZSBmbG93LCB1bmxlc3MgaXQncyBiZWVuIGV4cGxpY2l0bHlcbiAgICAgICAgLy8gcHV0IGluIGEgZGlzY2FyZGVkIGZsb3dpbmcgc3RhdGUgdmlhIHN0cmVhbS5yZXN1bWUoKS5cbiAgICAgICAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIHRoaXNbREFUQUxJU1RFTkVSU10gPSB0aGlzLmxpc3RlbmVycygnZGF0YScpLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICh0aGlzW0RBVEFMSVNURU5FUlNdID09PSAwICYmXG4gICAgICAgICAgICAgICAgIXRoaXNbRElTQ0FSREVEXSAmJlxuICAgICAgICAgICAgICAgICF0aGlzW1BJUEVTXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzW0ZMT1dJTkddID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW9zdGx5IGlkZW50aWNhbCB0byBgRXZlbnRFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVyc2BcbiAgICAgKlxuICAgICAqIElmIGFsbCAnZGF0YScgZXZlbnQgaGFuZGxlcnMgYXJlIHJlbW92ZWQsIGFuZCB0aGV5IHdlcmUgdGhlIGxhc3QgY29uc3VtZXJcbiAgICAgKiAoaWUsIHRoZXJlIGFyZSBubyBwaXBlIGRlc3RpbmF0aW9ucyksIHRoZW4gdGhlIGZsb3cgb2YgZGF0YSB3aWxsIHN0b3BcbiAgICAgKiB1bnRpbCB0aGVyZSBpcyBhbm90aGVyIGNvbnN1bWVyIG9yIHtAbGluayBNaW5pcGFzcyNyZXN1bWV9IGlzIGV4cGxpY2l0bHlcbiAgICAgKiBjYWxsZWQuXG4gICAgICovXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzKGV2KSB7XG4gICAgICAgIGNvbnN0IHJldCA9IHN1cGVyLnJlbW92ZUFsbExpc3RlbmVycyhldik7XG4gICAgICAgIGlmIChldiA9PT0gJ2RhdGEnIHx8IGV2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXNbREFUQUxJU1RFTkVSU10gPSAwO1xuICAgICAgICAgICAgaWYgKCF0aGlzW0RJU0NBUkRFRF0gJiYgIXRoaXNbUElQRVNdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXNbRkxPV0lOR10gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIHRoZSAnZW5kJyBldmVudCBoYXMgYmVlbiBlbWl0dGVkXG4gICAgICovXG4gICAgZ2V0IGVtaXR0ZWRFbmQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW0VNSVRURURfRU5EXTtcbiAgICB9XG4gICAgW01BWUJFX0VNSVRfRU5EXSgpIHtcbiAgICAgICAgaWYgKCF0aGlzW0VNSVRUSU5HX0VORF0gJiZcbiAgICAgICAgICAgICF0aGlzW0VNSVRURURfRU5EXSAmJlxuICAgICAgICAgICAgIXRoaXNbREVTVFJPWUVEXSAmJlxuICAgICAgICAgICAgdGhpc1tCVUZGRVJdLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpc1tFT0ZdKSB7XG4gICAgICAgICAgICB0aGlzW0VNSVRUSU5HX0VORF0gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncHJlZmluaXNoJyk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2ZpbmlzaCcpO1xuICAgICAgICAgICAgaWYgKHRoaXNbQ0xPU0VEXSlcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gICAgICAgICAgICB0aGlzW0VNSVRUSU5HX0VORF0gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb3N0bHkgaWRlbnRpY2FsIHRvIGBFdmVudEVtaXR0ZXIuZW1pdGAsIHdpdGggdGhlIGZvbGxvd2luZ1xuICAgICAqIGJlaGF2aW9yIGRpZmZlcmVuY2VzIHRvIHByZXZlbnQgZGF0YSBsb3NzIGFuZCB1bm5lY2Vzc2FyeSBoYW5nczpcbiAgICAgKlxuICAgICAqIElmIHRoZSBzdHJlYW0gaGFzIGJlZW4gZGVzdHJveWVkLCBhbmQgdGhlIGV2ZW50IGlzIHNvbWV0aGluZyBvdGhlclxuICAgICAqIHRoYW4gJ2Nsb3NlJyBvciAnZXJyb3InLCB0aGVuIGBmYWxzZWAgaXMgcmV0dXJuZWQgYW5kIG5vIGhhbmRsZXJzXG4gICAgICogYXJlIGNhbGxlZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBldmVudCBpcyAnZW5kJywgYW5kIGhhcyBhbHJlYWR5IGJlZW4gZW1pdHRlZCwgdGhlbiB0aGUgZXZlbnRcbiAgICAgKiBpcyBpZ25vcmVkLiBJZiB0aGUgc3RyZWFtIGlzIGluIGEgcGF1c2VkIG9yIG5vbi1mbG93aW5nIHN0YXRlLCB0aGVuXG4gICAgICogdGhlIGV2ZW50IHdpbGwgYmUgZGVmZXJyZWQgdW50aWwgZGF0YSBmbG93IHJlc3VtZXMuIElmIHRoZSBzdHJlYW0gaXNcbiAgICAgKiBhc3luYywgdGhlbiBoYW5kbGVycyB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgbmV4dCB0aWNrIHJhdGhlciB0aGFuXG4gICAgICogaW1tZWRpYXRlbHkuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZXZlbnQgaXMgJ2Nsb3NlJywgYW5kICdlbmQnIGhhcyBub3QgeWV0IGJlZW4gZW1pdHRlZCwgdGhlblxuICAgICAqIHRoZSBldmVudCB3aWxsIGJlIGRlZmVycmVkIHVudGlsIGFmdGVyICdlbmQnIGlzIGVtaXR0ZWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZXZlbnQgaXMgJ2Vycm9yJywgYW5kIGFuIEFib3J0U2lnbmFsIHdhcyBwcm92aWRlZCBmb3IgdGhlIHN0cmVhbSxcbiAgICAgKiBhbmQgdGhlcmUgYXJlIG5vIGxpc3RlbmVycywgdGhlbiB0aGUgZXZlbnQgaXMgaWdub3JlZCwgbWF0Y2hpbmcgdGhlXG4gICAgICogYmVoYXZpb3Igb2Ygbm9kZSBjb3JlIHN0cmVhbXMgaW4gdGhlIHByZXNlbnNlIG9mIGFuIEFib3J0U2lnbmFsLlxuICAgICAqXG4gICAgICogSWYgdGhlIGV2ZW50IGlzICdmaW5pc2gnIG9yICdwcmVmaW5pc2gnLCB0aGVuIGFsbCBsaXN0ZW5lcnMgd2lsbCBiZVxuICAgICAqIHJlbW92ZWQgYWZ0ZXIgZW1pdHRpbmcgdGhlIGV2ZW50LCB0byBwcmV2ZW50IGRvdWJsZS1maXJpbmcuXG4gICAgICovXG4gICAgZW1pdChldiwgLi4uYXJncykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXJnc1swXTtcbiAgICAgICAgLy8gZXJyb3IgYW5kIGNsb3NlIGFyZSBvbmx5IGV2ZW50cyBhbGxvd2VkIGFmdGVyIGNhbGxpbmcgZGVzdHJveSgpXG4gICAgICAgIGlmIChldiAhPT0gJ2Vycm9yJyAmJlxuICAgICAgICAgICAgZXYgIT09ICdjbG9zZScgJiZcbiAgICAgICAgICAgIGV2ICE9PSBERVNUUk9ZRUQgJiZcbiAgICAgICAgICAgIHRoaXNbREVTVFJPWUVEXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIHJldHVybiAhdGhpc1tPQkpFQ1RNT0RFXSAmJiAhZGF0YVxuICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICA6IHRoaXNbQVNZTkNdXG4gICAgICAgICAgICAgICAgICAgID8gKGRlZmVyKCgpID0+IHRoaXNbRU1JVERBVEFdKGRhdGEpKSwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzW0VNSVREQVRBXShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW0VNSVRFTkRdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXYgPT09ICdjbG9zZScpIHtcbiAgICAgICAgICAgIHRoaXNbQ0xPU0VEXSA9IHRydWU7XG4gICAgICAgICAgICAvLyBkb24ndCBlbWl0IGNsb3NlIGJlZm9yZSAnZW5kJyBhbmQgJ2ZpbmlzaCdcbiAgICAgICAgICAgIGlmICghdGhpc1tFTUlUVEVEX0VORF0gJiYgIXRoaXNbREVTVFJPWUVEXSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCByZXQgPSBzdXBlci5lbWl0KCdjbG9zZScpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICB0aGlzW0VNSVRURURfRVJST1JdID0gZGF0YTtcbiAgICAgICAgICAgIHN1cGVyLmVtaXQoRVJST1IsIGRhdGEpO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gIXRoaXNbU0lHTkFMXSB8fCB0aGlzLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHN1cGVyLmVtaXQoJ2Vycm9yJywgZGF0YSlcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgdGhpc1tNQVlCRV9FTUlUX0VORF0oKTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXYgPT09ICdyZXN1bWUnKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSBzdXBlci5lbWl0KCdyZXN1bWUnKTtcbiAgICAgICAgICAgIHRoaXNbTUFZQkVfRU1JVF9FTkRdKCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ID09PSAnZmluaXNoJyB8fCBldiA9PT0gJ3ByZWZpbmlzaCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHN1cGVyLmVtaXQoZXYpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoZXYpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb21lIG90aGVyIHVua25vd24gZXZlbnRcbiAgICAgICAgY29uc3QgcmV0ID0gc3VwZXIuZW1pdChldiwgLi4uYXJncyk7XG4gICAgICAgIHRoaXNbTUFZQkVfRU1JVF9FTkRdKCk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIFtFTUlUREFUQV0oZGF0YSkge1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpc1tQSVBFU10pIHtcbiAgICAgICAgICAgIGlmIChwLmRlc3Qud3JpdGUoZGF0YSkgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXQgPSB0aGlzW0RJU0NBUkRFRF0gPyBmYWxzZSA6IHN1cGVyLmVtaXQoJ2RhdGEnLCBkYXRhKTtcbiAgICAgICAgdGhpc1tNQVlCRV9FTUlUX0VORF0oKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgW0VNSVRFTkRdKCkge1xuICAgICAgICBpZiAodGhpc1tFTUlUVEVEX0VORF0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXNbRU1JVFRFRF9FTkRdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpc1tBU1lOQ11cbiAgICAgICAgICAgID8gKGRlZmVyKCgpID0+IHRoaXNbRU1JVEVORDJdKCkpLCB0cnVlKVxuICAgICAgICAgICAgOiB0aGlzW0VNSVRFTkQyXSgpO1xuICAgIH1cbiAgICBbRU1JVEVORDJdKCkge1xuICAgICAgICBpZiAodGhpc1tERUNPREVSXSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXNbREVDT0RFUl0uZW5kKCk7XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzW1BJUEVTXSkge1xuICAgICAgICAgICAgICAgICAgICBwLmRlc3Qud3JpdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpc1tESVNDQVJERURdKVxuICAgICAgICAgICAgICAgICAgICBzdXBlci5lbWl0KCdkYXRhJywgZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXNbUElQRVNdKSB7XG4gICAgICAgICAgICBwLmVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldCA9IHN1cGVyLmVtaXQoJ2VuZCcpO1xuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygnZW5kJyk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBhbGwgZW1pdHRlZCBkYXRhIG9uY2VcbiAgICAgKiB0aGUgc3RyZWFtIGVuZHMuXG4gICAgICovXG4gICAgYXN5bmMgY29sbGVjdCgpIHtcbiAgICAgICAgY29uc3QgYnVmID0gT2JqZWN0LmFzc2lnbihbXSwge1xuICAgICAgICAgICAgZGF0YUxlbmd0aDogMCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpc1tPQkpFQ1RNT0RFXSlcbiAgICAgICAgICAgIGJ1Zi5kYXRhTGVuZ3RoID0gMDtcbiAgICAgICAgLy8gc2V0IHRoZSBwcm9taXNlIGZpcnN0LCBpbiBjYXNlIGFuIGVycm9yIGlzIHJhaXNlZFxuICAgICAgICAvLyBieSB0cmlnZ2VyaW5nIHRoZSBmbG93IGhlcmUuXG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLnByb21pc2UoKTtcbiAgICAgICAgdGhpcy5vbignZGF0YScsIGMgPT4ge1xuICAgICAgICAgICAgYnVmLnB1c2goYyk7XG4gICAgICAgICAgICBpZiAoIXRoaXNbT0JKRUNUTU9ERV0pXG4gICAgICAgICAgICAgICAgYnVmLmRhdGFMZW5ndGggKz0gYy5sZW5ndGg7XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBwO1xuICAgICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgYWxsIGVtaXR0ZWQgZGF0YVxuICAgICAqIG9uY2UgdGhlIHN0cmVhbSBlbmRzLlxuICAgICAqXG4gICAgICogTm90IGFsbG93ZWQgb24gb2JqZWN0TW9kZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIGFzeW5jIGNvbmNhdCgpIHtcbiAgICAgICAgaWYgKHRoaXNbT0JKRUNUTU9ERV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGNvbmNhdCBpbiBvYmplY3RNb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmID0gYXdhaXQgdGhpcy5jb2xsZWN0KCk7XG4gICAgICAgIHJldHVybiAodGhpc1tFTkNPRElOR11cbiAgICAgICAgICAgID8gYnVmLmpvaW4oJycpXG4gICAgICAgICAgICA6IEJ1ZmZlci5jb25jYXQoYnVmLCBidWYuZGF0YUxlbmd0aCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB2b2lkIFByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdHJlYW0gZW5kcy5cbiAgICAgKi9cbiAgICBhc3luYyBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbihERVNUUk9ZRUQsICgpID0+IHJlamVjdChuZXcgRXJyb3IoJ3N0cmVhbSBkZXN0cm95ZWQnKSkpO1xuICAgICAgICAgICAgdGhpcy5vbignZXJyb3InLCBlciA9PiByZWplY3QoZXIpKTtcbiAgICAgICAgICAgIHRoaXMub24oJ2VuZCcsICgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgYGZvciBhd2FpdCBvZmAgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGNvbnRpbnVlIGVtaXR0aW5nIGFsbCBjaHVua3MgdW50aWwgdGhlIHN0cmVhbSB0ZXJtaW5hdGVzLlxuICAgICAqL1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIC8vIHNldCB0aGlzIHVwIGZyb250LCBpbiBjYXNlIHRoZSBjb25zdW1lciBkb2Vzbid0IGNhbGwgbmV4dCgpXG4gICAgICAgIC8vIHJpZ2h0IGF3YXkuXG4gICAgICAgIHRoaXNbRElTQ0FSREVEXSA9IGZhbHNlO1xuICAgICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzdG9wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RvcHBlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RvcCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5yZWFkKCk7XG4gICAgICAgICAgICBpZiAocmVzICE9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJlcyB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzW0VPRl0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3AoKTtcbiAgICAgICAgICAgIGxldCByZXNvbHZlO1xuICAgICAgICAgICAgbGV0IHJlamVjdDtcbiAgICAgICAgICAgIGNvbnN0IG9uZXJyID0gKGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoJ2RhdGEnLCBvbmRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmKCdlbmQnLCBvbmVuZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoREVTVFJPWUVELCBvbmRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgIHN0b3AoKTtcbiAgICAgICAgICAgICAgICByZWplY3QoZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IG9uZGF0YSA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmKCdlcnJvcicsIG9uZXJyKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZignZW5kJywgb25lbmQpO1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmKERFU1RST1lFRCwgb25kZXN0cm95KTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHZhbHVlLCBkb25lOiAhIXRoaXNbRU9GXSB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBvbmVuZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZignZXJyb3InLCBvbmVycik7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoJ2RhdGEnLCBvbmRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmKERFU1RST1lFRCwgb25kZXN0cm95KTtcbiAgICAgICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgb25kZXN0cm95ID0gKCkgPT4gb25lcnIobmV3IEVycm9yKCdzdHJlYW0gZGVzdHJveWVkJykpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdCA9IHJlajtcbiAgICAgICAgICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICAgICAgICAgIHRoaXMub25jZShERVNUUk9ZRUQsIG9uZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKCdlcnJvcicsIG9uZXJyKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2UoJ2RhdGEnLCBvbmRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgdGhyb3c6IHN0b3AsXG4gICAgICAgICAgICByZXR1cm46IHN0b3AsXG4gICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3luY2hyb25vdXMgYGZvciBvZmAgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogVGhlIGl0ZXJhdGlvbiB3aWxsIHRlcm1pbmF0ZSB3aGVuIHRoZSBpbnRlcm5hbCBidWZmZXIgcnVucyBvdXQsIGV2ZW5cbiAgICAgKiBpZiB0aGUgc3RyZWFtIGhhcyBub3QgeWV0IHRlcm1pbmF0ZWQuXG4gICAgICovXG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIC8vIHNldCB0aGlzIHVwIGZyb250LCBpbiBjYXNlIHRoZSBjb25zdW1lciBkb2Vzbid0IGNhbGwgbmV4dCgpXG4gICAgICAgIC8vIHJpZ2h0IGF3YXkuXG4gICAgICAgIHRoaXNbRElTQ0FSREVEXSA9IGZhbHNlO1xuICAgICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzdG9wID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgICAgICAgdGhpcy5vZmYoRVJST1IsIHN0b3ApO1xuICAgICAgICAgICAgdGhpcy5vZmYoREVTVFJPWUVELCBzdG9wKTtcbiAgICAgICAgICAgIHRoaXMub2ZmKCdlbmQnLCBzdG9wKTtcbiAgICAgICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0b3BwZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3AoKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWFkKCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyBzdG9wKCkgOiB7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uY2UoJ2VuZCcsIHN0b3ApO1xuICAgICAgICB0aGlzLm9uY2UoRVJST1IsIHN0b3ApO1xuICAgICAgICB0aGlzLm9uY2UoREVTVFJPWUVELCBzdG9wKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICB0aHJvdzogc3RvcCxcbiAgICAgICAgICAgIHJldHVybjogc3RvcCxcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVzdHJveSBhIHN0cmVhbSwgcHJldmVudGluZyBpdCBmcm9tIGJlaW5nIHVzZWQgZm9yIGFueSBmdXJ0aGVyIHB1cnBvc2UuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc3RyZWFtIGhhcyBhIGBjbG9zZSgpYCBtZXRob2QsIHRoZW4gaXQgd2lsbCBiZSBjYWxsZWQgb25cbiAgICAgKiBkZXN0cnVjdGlvbi5cbiAgICAgKlxuICAgICAqIEFmdGVyIGRlc3RydWN0aW9uLCBhbnkgYXR0ZW1wdCB0byB3cml0ZSBkYXRhLCByZWFkIGRhdGEsIG9yIGVtaXQgbW9zdFxuICAgICAqIGV2ZW50cyB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBlcnJvciBhcmd1bWVudCBpcyBwcm92aWRlZCwgdGhlbiBpdCB3aWxsIGJlIGVtaXR0ZWQgaW4gYW5cbiAgICAgKiAnZXJyb3InIGV2ZW50LlxuICAgICAqL1xuICAgIGRlc3Ryb3koZXIpIHtcbiAgICAgICAgaWYgKHRoaXNbREVTVFJPWUVEXSkge1xuICAgICAgICAgICAgaWYgKGVyKVxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KERFU1RST1lFRCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzW0RFU1RST1lFRF0gPSB0cnVlO1xuICAgICAgICB0aGlzW0RJU0NBUkRFRF0gPSB0cnVlO1xuICAgICAgICAvLyB0aHJvdyBhd2F5IGFsbCBidWZmZXJlZCBkYXRhLCBpdCdzIG5ldmVyIGNvbWluZyBvdXRcbiAgICAgICAgdGhpc1tCVUZGRVJdLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXNbQlVGRkVSTEVOR1RIXSA9IDA7XG4gICAgICAgIGNvbnN0IHdjID0gdGhpcztcbiAgICAgICAgaWYgKHR5cGVvZiB3Yy5jbG9zZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGhpc1tDTE9TRURdKVxuICAgICAgICAgICAgd2MuY2xvc2UoKTtcbiAgICAgICAgaWYgKGVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICAgICAgLy8gaWYgbm8gZXJyb3IgdG8gZW1pdCwgc3RpbGwgcmVqZWN0IHBlbmRpbmcgcHJvbWlzZXNcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5lbWl0KERFU1RST1lFRCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Ige0BsaW5rIGlzU3RyZWFtfVxuICAgICAqXG4gICAgICogRm9ybWVyIGV4cG9ydCBsb2NhdGlvbiwgbWFpbnRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgaXNTdHJlYW0oKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmVhbTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgIi8vIHRoaXMgaXMganVzdCBhIHZlcnkgbGlnaHQgd3JhcHBlciBhcm91bmQgMiBhcnJheXMgd2l0aCBhbiBvZmZzZXQgaW5kZXhcbmltcG9ydCB7IEdMT0JTVEFSIH0gZnJvbSAnbWluaW1hdGNoJztcbmNvbnN0IGlzUGF0dGVybkxpc3QgPSAocGwpID0+IHBsLmxlbmd0aCA+PSAxO1xuY29uc3QgaXNHbG9iTGlzdCA9IChnbCkgPT4gZ2wubGVuZ3RoID49IDE7XG4vKipcbiAqIEFuIGltbXV0YWJsZS1pc2ggdmlldyBvbiBhbiBhcnJheSBvZiBnbG9iIHBhcnRzIGFuZCB0aGVpciBwYXJzZWRcbiAqIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhdHRlcm4ge1xuICAgICNwYXR0ZXJuTGlzdDtcbiAgICAjZ2xvYkxpc3Q7XG4gICAgI2luZGV4O1xuICAgIGxlbmd0aDtcbiAgICAjcGxhdGZvcm07XG4gICAgI3Jlc3Q7XG4gICAgI2dsb2JTdHJpbmc7XG4gICAgI2lzRHJpdmU7XG4gICAgI2lzVU5DO1xuICAgICNpc0Fic29sdXRlO1xuICAgICNmb2xsb3dHbG9ic3RhciA9IHRydWU7XG4gICAgY29uc3RydWN0b3IocGF0dGVybkxpc3QsIGdsb2JMaXN0LCBpbmRleCwgcGxhdGZvcm0pIHtcbiAgICAgICAgaWYgKCFpc1BhdHRlcm5MaXN0KHBhdHRlcm5MaXN0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW1wdHkgcGF0dGVybiBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0dsb2JMaXN0KGdsb2JMaXN0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW1wdHkgZ2xvYiBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdsb2JMaXN0Lmxlbmd0aCAhPT0gcGF0dGVybkxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNtYXRjaGVkIHBhdHRlcm4gbGlzdCBhbmQgZ2xvYiBsaXN0IGxlbmd0aHMnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlbmd0aCA9IHBhdHRlcm5MaXN0Lmxlbmd0aDtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcGF0dGVybkxpc3QgPSBwYXR0ZXJuTGlzdDtcbiAgICAgICAgdGhpcy4jZ2xvYkxpc3QgPSBnbG9iTGlzdDtcbiAgICAgICAgdGhpcy4jaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy4jcGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgICAgICAgLy8gbm9ybWFsaXplIHJvb3QgZW50cmllcyBvZiBhYnNvbHV0ZSBwYXR0ZXJucyBvbiBpbml0aWFsIGNyZWF0aW9uLlxuICAgICAgICBpZiAodGhpcy4jaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGM6ID0+IFsnYzovJ11cbiAgICAgICAgICAgIC8vIEM6LyA9PiBbJ0M6LyddXG4gICAgICAgICAgICAvLyBDOi94ID0+IFsnQzovJywgJ3gnXVxuICAgICAgICAgICAgLy8gLy9ob3N0L3NoYXJlID0+IFsnLy9ob3N0L3NoYXJlLyddXG4gICAgICAgICAgICAvLyAvL2hvc3Qvc2hhcmUvID0+IFsnLy9ob3N0L3NoYXJlLyddXG4gICAgICAgICAgICAvLyAvL2hvc3Qvc2hhcmUveCA9PiBbJy8vaG9zdC9zaGFyZS8nLCAneCddXG4gICAgICAgICAgICAvLyAvZXRjID0+IFsnLycsICdldGMnXVxuICAgICAgICAgICAgLy8gLyA9PiBbJy8nXVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNVTkMoKSkge1xuICAgICAgICAgICAgICAgIC8vICcnIC8gJycgLyAnaG9zdCcgLyAnc2hhcmUnXG4gICAgICAgICAgICAgICAgY29uc3QgW3AwLCBwMSwgcDIsIHAzLCAuLi5wcmVzdF0gPSB0aGlzLiNwYXR0ZXJuTGlzdDtcbiAgICAgICAgICAgICAgICBjb25zdCBbZzAsIGcxLCBnMiwgZzMsIC4uLmdyZXN0XSA9IHRoaXMuI2dsb2JMaXN0O1xuICAgICAgICAgICAgICAgIGlmIChwcmVzdFswXSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kcyBpbiAvXG4gICAgICAgICAgICAgICAgICAgIHByZXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGdyZXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBbcDAsIHAxLCBwMiwgcDMsICcnXS5qb2luKCcvJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZyA9IFtnMCwgZzEsIGcyLCBnMywgJyddLmpvaW4oJy8nKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNwYXR0ZXJuTGlzdCA9IFtwLCAuLi5wcmVzdF07XG4gICAgICAgICAgICAgICAgdGhpcy4jZ2xvYkxpc3QgPSBbZywgLi4uZ3Jlc3RdO1xuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy4jcGF0dGVybkxpc3QubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc0RyaXZlKCkgfHwgdGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbcDEsIC4uLnByZXN0XSA9IHRoaXMuI3BhdHRlcm5MaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IFtnMSwgLi4uZ3Jlc3RdID0gdGhpcy4jZ2xvYkxpc3Q7XG4gICAgICAgICAgICAgICAgaWYgKHByZXN0WzBdID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbmRzIGluIC9cbiAgICAgICAgICAgICAgICAgICAgcHJlc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZ3Jlc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHAxICsgJy8nO1xuICAgICAgICAgICAgICAgIGNvbnN0IGcgPSBnMSArICcvJztcbiAgICAgICAgICAgICAgICB0aGlzLiNwYXR0ZXJuTGlzdCA9IFtwLCAuLi5wcmVzdF07XG4gICAgICAgICAgICAgICAgdGhpcy4jZ2xvYkxpc3QgPSBbZywgLi4uZ3Jlc3RdO1xuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy4jcGF0dGVybkxpc3QubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcGFyc2VkIGxpc3Qgb2YgcGF0dGVybnNcbiAgICAgKi9cbiAgICBwYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGF0dGVybkxpc3RbdGhpcy4jaW5kZXhdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIG9mIGlmIHBhdHRlcm4oKSByZXR1cm5zIGEgc3RyaW5nXG4gICAgICovXG4gICAgaXNTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy4jcGF0dGVybkxpc3RbdGhpcy4jaW5kZXhdID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJ1ZSBvZiBpZiBwYXR0ZXJuKCkgcmV0dXJucyBHTE9CU1RBUlxuICAgICAqL1xuICAgIGlzR2xvYnN0YXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwYXR0ZXJuTGlzdFt0aGlzLiNpbmRleF0gPT09IEdMT0JTVEFSO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIHBhdHRlcm4oKSByZXR1cm5zIGEgcmVnZXhwXG4gICAgICovXG4gICAgaXNSZWdFeHAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwYXR0ZXJuTGlzdFt0aGlzLiNpbmRleF0gaW5zdGFuY2VvZiBSZWdFeHA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSAvLWpvaW5lZCBzZXQgb2YgZ2xvYiBwYXJ0cyB0aGF0IG1ha2UgdXAgdGhpcyBwYXR0ZXJuXG4gICAgICovXG4gICAgZ2xvYlN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiNnbG9iU3RyaW5nID1cbiAgICAgICAgICAgIHRoaXMuI2dsb2JTdHJpbmcgfHxcbiAgICAgICAgICAgICAgICAodGhpcy4jaW5kZXggPT09IDAgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNnbG9iTGlzdFswXSArIHRoaXMuI2dsb2JMaXN0LnNsaWNlKDEpLmpvaW4oJy8nKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLiNnbG9iTGlzdC5qb2luKCcvJylcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLiNnbG9iTGlzdC5zbGljZSh0aGlzLiNpbmRleCkuam9pbignLycpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgcGF0dGVybiBwYXJ0cyBhZnRlciB0aGlzIG9uZVxuICAgICAqL1xuICAgIGhhc01vcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IHRoaXMuI2luZGV4ICsgMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gYWZ0ZXIgdGhpcyBwYXJ0LCBvciBudWxsIGlmIHRoaXMgaXMgdGhlIGVuZFxuICAgICAqL1xuICAgIHJlc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLiNyZXN0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jcmVzdDtcbiAgICAgICAgaWYgKCF0aGlzLmhhc01vcmUoKSlcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jcmVzdCA9IG51bGwpO1xuICAgICAgICB0aGlzLiNyZXN0ID0gbmV3IFBhdHRlcm4odGhpcy4jcGF0dGVybkxpc3QsIHRoaXMuI2dsb2JMaXN0LCB0aGlzLiNpbmRleCArIDEsIHRoaXMuI3BsYXRmb3JtKTtcbiAgICAgICAgdGhpcy4jcmVzdC4jaXNBYnNvbHV0ZSA9IHRoaXMuI2lzQWJzb2x1dGU7XG4gICAgICAgIHRoaXMuI3Jlc3QuI2lzVU5DID0gdGhpcy4jaXNVTkM7XG4gICAgICAgIHRoaXMuI3Jlc3QuI2lzRHJpdmUgPSB0aGlzLiNpc0RyaXZlO1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVzdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiB0aGUgcGF0dGVybiByZXByZXNlbnRzIGEgLy91bmMvcGF0aC8gb24gd2luZG93c1xuICAgICAqL1xuICAgIGlzVU5DKCkge1xuICAgICAgICBjb25zdCBwbCA9IHRoaXMuI3BhdHRlcm5MaXN0O1xuICAgICAgICByZXR1cm4gdGhpcy4jaXNVTkMgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB0aGlzLiNpc1VOQ1xuICAgICAgICAgICAgOiAodGhpcy4jaXNVTkMgPVxuICAgICAgICAgICAgICAgIHRoaXMuI3BsYXRmb3JtID09PSAnd2luMzInICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2luZGV4ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIHBsWzBdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICBwbFsxXSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBsWzJdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAhIXBsWzJdICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwbFszXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgISFwbFszXSk7XG4gICAgfVxuICAgIC8vIHBhdHRlcm4gbGlrZSBDOi8uLi5cbiAgICAvLyBzcGxpdCA9IFsnQzonLCAuLi5dXG4gICAgLy8gWFhYOiB3b3VsZCBiZSBuaWNlIHRvIGhhbmRsZSBwYXR0ZXJucyBsaWtlIGBjOipgIHRvIHRlc3QgdGhlIGN3ZFxuICAgIC8vIGluIGM6IGZvciAqLCBidXQgSSBkb24ndCBrbm93IG9mIGEgd2F5IHRvIGV2ZW4gZmlndXJlIG91dCB3aGF0IHRoYXRcbiAgICAvLyBjd2QgaXMgd2l0aG91dCBhY3R1YWxseSBjaGRpcidpbmcgaW50byBpdD9cbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoZSBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgZHJpdmUgbGV0dGVyIG9uIFdpbmRvd3NcbiAgICAgKi9cbiAgICBpc0RyaXZlKCkge1xuICAgICAgICBjb25zdCBwbCA9IHRoaXMuI3BhdHRlcm5MaXN0O1xuICAgICAgICByZXR1cm4gdGhpcy4jaXNEcml2ZSAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHRoaXMuI2lzRHJpdmVcbiAgICAgICAgICAgIDogKHRoaXMuI2lzRHJpdmUgPVxuICAgICAgICAgICAgICAgIHRoaXMuI3BsYXRmb3JtID09PSAnd2luMzInICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2luZGV4ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcGxbMF0gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIC9eW2Etel06JC9pLnRlc3QocGxbMF0pKTtcbiAgICB9XG4gICAgLy8gcGF0dGVybiA9ICcvJyBvciAnLy4uLicgb3IgJy94Ly4uLidcbiAgICAvLyBzcGxpdCA9IFsnJywgJyddIG9yIFsnJywgLi4uXSBvciBbJycsICd4JywgLi4uXVxuICAgIC8vIERyaXZlIGFuZCBVTkMgYm90aCBjb25zaWRlcmVkIGFic29sdXRlIG9uIHdpbmRvd3NcbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoZSBwYXR0ZXJuIGlzIHJvb3RlZCBvbiBhbiBhYnNvbHV0ZSBwYXRoXG4gICAgICovXG4gICAgaXNBYnNvbHV0ZSgpIHtcbiAgICAgICAgY29uc3QgcGwgPSB0aGlzLiNwYXR0ZXJuTGlzdDtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzQWJzb2x1dGUgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB0aGlzLiNpc0Fic29sdXRlXG4gICAgICAgICAgICA6ICh0aGlzLiNpc0Fic29sdXRlID1cbiAgICAgICAgICAgICAgICAocGxbMF0gPT09ICcnICYmIHBsLmxlbmd0aCA+IDEpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNEcml2ZSgpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVTkMoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGNvbnN1bWUgdGhlIHJvb3Qgb2YgdGhlIHBhdHRlcm4sIGFuZCByZXR1cm4gaXRcbiAgICAgKi9cbiAgICByb290KCkge1xuICAgICAgICBjb25zdCBwID0gdGhpcy4jcGF0dGVybkxpc3RbMF07XG4gICAgICAgIHJldHVybiAodHlwZW9mIHAgPT09ICdzdHJpbmcnICYmIHRoaXMuaXNBYnNvbHV0ZSgpICYmIHRoaXMuI2luZGV4ID09PSAwKSA/XG4gICAgICAgICAgICBwXG4gICAgICAgICAgICA6ICcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIGN1cnJlbnQgZ2xvYnN0YXIgcGF0dGVybiBpcyBhbGxvd2VkIHRvIGZvbGxvd1xuICAgICAqIGEgc3ltYm9saWMgbGluay5cbiAgICAgKi9cbiAgICBjaGVja0ZvbGxvd0dsb2JzdGFyKCkge1xuICAgICAgICByZXR1cm4gISh0aGlzLiNpbmRleCA9PT0gMCB8fFxuICAgICAgICAgICAgIXRoaXMuaXNHbG9ic3RhcigpIHx8XG4gICAgICAgICAgICAhdGhpcy4jZm9sbG93R2xvYnN0YXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrIHRoYXQgdGhlIGN1cnJlbnQgZ2xvYnN0YXIgcGF0dGVybiBpcyBmb2xsb3dpbmcgYSBzeW1ib2xpYyBsaW5rXG4gICAgICovXG4gICAgbWFya0ZvbGxvd0dsb2JzdGFyKCkge1xuICAgICAgICBpZiAodGhpcy4jaW5kZXggPT09IDAgfHwgIXRoaXMuaXNHbG9ic3RhcigpIHx8ICF0aGlzLiNmb2xsb3dHbG9ic3RhcilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy4jZm9sbG93R2xvYnN0YXIgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGF0dGVybi5qcy5tYXAiLAogICAgIi8vIGdpdmUgaXQgYSBwYXR0ZXJuLCBhbmQgaXQnbGwgYmUgYWJsZSB0byB0ZWxsIHlvdSBpZlxuLy8gYSBnaXZlbiBwYXRoIHNob3VsZCBiZSBpZ25vcmVkLlxuLy8gSWdub3JpbmcgYSBwYXRoIGlnbm9yZXMgaXRzIGNoaWxkcmVuIGlmIHRoZSBwYXR0ZXJuIGVuZHMgaW4gLyoqXG4vLyBJZ25vcmVzIGFyZSBhbHdheXMgcGFyc2VkIGluIGRvdDp0cnVlIG1vZGVcbmltcG9ydCB7IE1pbmltYXRjaCB9IGZyb20gJ21pbmltYXRjaCc7XG5pbXBvcnQgeyBQYXR0ZXJuIH0gZnJvbSAnLi9wYXR0ZXJuLmpzJztcbmNvbnN0IGRlZmF1bHRQbGF0Zm9ybSA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgICBwcm9jZXNzICYmXG4gICAgdHlwZW9mIHByb2Nlc3MucGxhdGZvcm0gPT09ICdzdHJpbmcnKSA/XG4gICAgcHJvY2Vzcy5wbGF0Zm9ybVxuICAgIDogJ2xpbnV4Jztcbi8qKlxuICogQ2xhc3MgdXNlZCB0byBwcm9jZXNzIGlnbm9yZWQgcGF0dGVybnNcbiAqL1xuZXhwb3J0IGNsYXNzIElnbm9yZSB7XG4gICAgcmVsYXRpdmU7XG4gICAgcmVsYXRpdmVDaGlsZHJlbjtcbiAgICBhYnNvbHV0ZTtcbiAgICBhYnNvbHV0ZUNoaWxkcmVuO1xuICAgIHBsYXRmb3JtO1xuICAgIG1tb3B0cztcbiAgICBjb25zdHJ1Y3RvcihpZ25vcmVkLCB7IG5vYnJhY2UsIG5vY2FzZSwgbm9leHQsIG5vZ2xvYnN0YXIsIHBsYXRmb3JtID0gZGVmYXVsdFBsYXRmb3JtLCB9KSB7XG4gICAgICAgIHRoaXMucmVsYXRpdmUgPSBbXTtcbiAgICAgICAgdGhpcy5hYnNvbHV0ZSA9IFtdO1xuICAgICAgICB0aGlzLnJlbGF0aXZlQ2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5hYnNvbHV0ZUNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgICAgICAgdGhpcy5tbW9wdHMgPSB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBub2JyYWNlLFxuICAgICAgICAgICAgbm9jYXNlLFxuICAgICAgICAgICAgbm9leHQsXG4gICAgICAgICAgICBub2dsb2JzdGFyLFxuICAgICAgICAgICAgb3B0aW1pemF0aW9uTGV2ZWw6IDIsXG4gICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICAgIG5vY29tbWVudDogdHJ1ZSxcbiAgICAgICAgICAgIG5vbmVnYXRlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IGlnbiBvZiBpZ25vcmVkKVxuICAgICAgICAgICAgdGhpcy5hZGQoaWduKTtcbiAgICB9XG4gICAgYWRkKGlnbikge1xuICAgICAgICAvLyB0aGlzIGlzIGEgbGl0dGxlIHdlaXJkLCBidXQgaXQgZ2l2ZXMgdXMgYSBjbGVhbiBzZXQgb2Ygb3B0aW1pemVkXG4gICAgICAgIC8vIG1pbmltYXRjaCBtYXRjaGVycywgd2l0aG91dCBnZXR0aW5nIHRyaXBwZWQgdXAgaWYgb25lIG9mIHRoZW1cbiAgICAgICAgLy8gZW5kcyBpbiAvKiogaW5zaWRlIGEgYnJhY2Ugc2VjdGlvbiwgYW5kIGl0J3Mgb25seSBpbmVmZmljaWVudCBhdFxuICAgICAgICAvLyB0aGUgc3RhcnQgb2YgdGhlIHdhbGssIG5vdCBhbG9uZyBpdC5cbiAgICAgICAgLy8gSXQnZCBiZSBuaWNlIGlmIHRoZSBQYXR0ZXJuIGNsYXNzIGp1c3QgaGFkIGEgLnRlc3QoKSBtZXRob2QsIGJ1dFxuICAgICAgICAvLyBoYW5kbGluZyBnbG9ic3RhcnMgaXMgYSBiaXQgb2YgYSBwaXRhLCBhbmQgdGhhdCBjb2RlIGFscmVhZHkgbGl2ZXNcbiAgICAgICAgLy8gaW4gbWluaW1hdGNoIGFueXdheS5cbiAgICAgICAgLy8gQW5vdGhlciB3YXkgd291bGQgYmUgaWYgbWF5YmUgTWluaW1hdGNoIGNvdWxkIHRha2UgaXRzIHNldC9nbG9iUGFydHNcbiAgICAgICAgLy8gYXMgYW4gb3B0aW9uLCBhbmQgdGhlbiB3ZSBjb3VsZCBhdCBsZWFzdCBqdXN0IHVzZSBQYXR0ZXJuIHRvIHRlc3RcbiAgICAgICAgLy8gZm9yIGFic29sdXRlLW5lc3MuXG4gICAgICAgIC8vIFlldCBhbm90aGVyIHdheSwgTWluaW1hdGNoIGNvdWxkIHRha2UgYW4gYXJyYXkgb2YgZ2xvYiBzdHJpbmdzLCBhbmRcbiAgICAgICAgLy8gYSBjd2Qgb3B0aW9uLCBhbmQgZG8gdGhlIHJpZ2h0IHRoaW5nLlxuICAgICAgICBjb25zdCBtbSA9IG5ldyBNaW5pbWF0Y2goaWduLCB0aGlzLm1tb3B0cyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW0uc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBtbS5zZXRbaV07XG4gICAgICAgICAgICBjb25zdCBnbG9iUGFydHMgPSBtbS5nbG9iUGFydHNbaV07XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgIGlmICghcGFyc2VkIHx8ICFnbG9iUGFydHMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGF0dGVybiBvYmplY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHN0cmlwIG9mZiBsZWFkaW5nIC4vIHBvcnRpb25zXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ2xvYi9pc3N1ZXMvNTcwXG4gICAgICAgICAgICB3aGlsZSAocGFyc2VkWzBdID09PSAnLicgJiYgZ2xvYlBhcnRzWzBdID09PSAnLicpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWQuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBnbG9iUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICBjb25zdCBwID0gbmV3IFBhdHRlcm4ocGFyc2VkLCBnbG9iUGFydHMsIDAsIHRoaXMucGxhdGZvcm0pO1xuICAgICAgICAgICAgY29uc3QgbSA9IG5ldyBNaW5pbWF0Y2gocC5nbG9iU3RyaW5nKCksIHRoaXMubW1vcHRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ2xvYlBhcnRzW2dsb2JQYXJ0cy5sZW5ndGggLSAxXSA9PT0gJyoqJztcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlID0gcC5pc0Fic29sdXRlKCk7XG4gICAgICAgICAgICBpZiAoYWJzb2x1dGUpXG4gICAgICAgICAgICAgICAgdGhpcy5hYnNvbHV0ZS5wdXNoKG0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmUucHVzaChtKTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChhYnNvbHV0ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYnNvbHV0ZUNoaWxkcmVuLnB1c2gobSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlQ2hpbGRyZW4ucHVzaChtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZ25vcmVkKHApIHtcbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSBwLmZ1bGxwYXRoKCk7XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRocyA9IGAke2Z1bGxwYXRofS9gO1xuICAgICAgICBjb25zdCByZWxhdGl2ZSA9IHAucmVsYXRpdmUoKSB8fCAnLic7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlcyA9IGAke3JlbGF0aXZlfS9gO1xuICAgICAgICBmb3IgKGNvbnN0IG0gb2YgdGhpcy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG0ubWF0Y2gocmVsYXRpdmUpIHx8IG0ubWF0Y2gocmVsYXRpdmVzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG0gb2YgdGhpcy5hYnNvbHV0ZSkge1xuICAgICAgICAgICAgaWYgKG0ubWF0Y2goZnVsbHBhdGgpIHx8IG0ubWF0Y2goZnVsbHBhdGhzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNoaWxkcmVuSWdub3JlZChwKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gcC5mdWxscGF0aCgpICsgJy8nO1xuICAgICAgICBjb25zdCByZWxhdGl2ZSA9IChwLnJlbGF0aXZlKCkgfHwgJy4nKSArICcvJztcbiAgICAgICAgZm9yIChjb25zdCBtIG9mIHRoaXMucmVsYXRpdmVDaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKG0ubWF0Y2gocmVsYXRpdmUpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbSBvZiB0aGlzLmFic29sdXRlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChtLm1hdGNoKGZ1bGxwYXRoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aWdub3JlLmpzLm1hcCIsCiAgICAiLy8gc3luY2hyb25vdXMgdXRpbGl0eSBmb3IgZmlsdGVyaW5nIGVudHJpZXMgYW5kIGNhbGN1bGF0aW5nIHN1YndhbGtzXG5pbXBvcnQgeyBHTE9CU1RBUiB9IGZyb20gJ21pbmltYXRjaCc7XG4vKipcbiAqIEEgY2FjaGUgb2Ygd2hpY2ggcGF0dGVybnMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBmb3IgYSBnaXZlbiBQYXRoXG4gKi9cbmV4cG9ydCBjbGFzcyBIYXNXYWxrZWRDYWNoZSB7XG4gICAgc3RvcmU7XG4gICAgY29uc3RydWN0b3Ioc3RvcmUgPSBuZXcgTWFwKCkpIHtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgIH1cbiAgICBjb3B5KCkge1xuICAgICAgICByZXR1cm4gbmV3IEhhc1dhbGtlZENhY2hlKG5ldyBNYXAodGhpcy5zdG9yZSkpO1xuICAgIH1cbiAgICBoYXNXYWxrZWQodGFyZ2V0LCBwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldCh0YXJnZXQuZnVsbHBhdGgoKSk/LmhhcyhwYXR0ZXJuLmdsb2JTdHJpbmcoKSk7XG4gICAgfVxuICAgIHN0b3JlV2Fsa2VkKHRhcmdldCwgcGF0dGVybikge1xuICAgICAgICBjb25zdCBmdWxscGF0aCA9IHRhcmdldC5mdWxscGF0aCgpO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnN0b3JlLmdldChmdWxscGF0aCk7XG4gICAgICAgIGlmIChjYWNoZWQpXG4gICAgICAgICAgICBjYWNoZWQuYWRkKHBhdHRlcm4uZ2xvYlN0cmluZygpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXQoZnVsbHBhdGgsIG5ldyBTZXQoW3BhdHRlcm4uZ2xvYlN0cmluZygpXSkpO1xuICAgIH1cbn1cbi8qKlxuICogQSByZWNvcmQgb2Ygd2hpY2ggcGF0aHMgaGF2ZSBiZWVuIG1hdGNoZWQgaW4gYSBnaXZlbiB3YWxrIHN0ZXAsXG4gKiBhbmQgd2hldGhlciB0aGV5IG9ubHkgYXJlIGNvbnNpZGVyZWQgYSBtYXRjaCBpZiB0aGV5IGFyZSBhIGRpcmVjdG9yeSxcbiAqIGFuZCB3aGV0aGVyIHRoZWlyIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggc2hvdWxkIGJlIHJldHVybmVkLlxuICovXG5leHBvcnQgY2xhc3MgTWF0Y2hSZWNvcmQge1xuICAgIHN0b3JlID0gbmV3IE1hcCgpO1xuICAgIGFkZCh0YXJnZXQsIGFic29sdXRlLCBpZkRpcikge1xuICAgICAgICBjb25zdCBuID0gKGFic29sdXRlID8gMiA6IDApIHwgKGlmRGlyID8gMSA6IDApO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zdG9yZS5nZXQodGFyZ2V0KTtcbiAgICAgICAgdGhpcy5zdG9yZS5zZXQodGFyZ2V0LCBjdXJyZW50ID09PSB1bmRlZmluZWQgPyBuIDogbiAmIGN1cnJlbnQpO1xuICAgIH1cbiAgICAvLyBtYXRjaCwgYWJzb2x1dGUsIGlmZGlyXG4gICAgZW50cmllcygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnN0b3JlLmVudHJpZXMoKV0ubWFwKChbcGF0aCwgbl0pID0+IFtcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAhIShuICYgMiksXG4gICAgICAgICAgICAhIShuICYgMSksXG4gICAgICAgIF0pO1xuICAgIH1cbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHBhdHRlcm5zIHRoYXQgbXVzdCBiZSBwcm9jZXNzZWQgaW4gYSBzdWJzZXF1ZW50IHN0ZXBcbiAqIGZvciBhIGdpdmVuIHBhdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWJXYWxrcyB7XG4gICAgc3RvcmUgPSBuZXcgTWFwKCk7XG4gICAgYWRkKHRhcmdldCwgcGF0dGVybikge1xuICAgICAgICBpZiAoIXRhcmdldC5jYW5SZWFkZGlyKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdWJzID0gdGhpcy5zdG9yZS5nZXQodGFyZ2V0KTtcbiAgICAgICAgaWYgKHN1YnMpIHtcbiAgICAgICAgICAgIGlmICghc3Vicy5maW5kKHAgPT4gcC5nbG9iU3RyaW5nKCkgPT09IHBhdHRlcm4uZ2xvYlN0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHN1YnMucHVzaChwYXR0ZXJuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldCh0YXJnZXQsIFtwYXR0ZXJuXSk7XG4gICAgfVxuICAgIGdldCh0YXJnZXQpIHtcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuc3RvcmUuZ2V0KHRhcmdldCk7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAoIXN1YnMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYXR0ZW1wdGluZyB0byB3YWxrIHVua25vd24gcGF0aCcpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHJldHVybiBzdWJzO1xuICAgIH1cbiAgICBlbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzKCkubWFwKGsgPT4gW2ssIHRoaXMuc3RvcmUuZ2V0KGspXSk7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5zdG9yZS5rZXlzKCldLmZpbHRlcih0ID0+IHQuY2FuUmVhZGRpcigpKTtcbiAgICB9XG59XG4vKipcbiAqIFRoZSBjbGFzcyB0aGF0IHByb2Nlc3NlcyBwYXR0ZXJucyBmb3IgYSBnaXZlbiBwYXRoLlxuICpcbiAqIEhhbmRsZXMgY2hpbGQgZW50cnkgZmlsdGVyaW5nLCBhbmQgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHBhdGgnc1xuICogZGlyZWN0b3J5IGNvbnRlbnRzIG11c3QgYmUgcmVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2Nlc3NvciB7XG4gICAgaGFzV2Fsa2VkQ2FjaGU7XG4gICAgbWF0Y2hlcyA9IG5ldyBNYXRjaFJlY29yZCgpO1xuICAgIHN1YndhbGtzID0gbmV3IFN1YldhbGtzKCk7XG4gICAgcGF0dGVybnM7XG4gICAgZm9sbG93O1xuICAgIGRvdDtcbiAgICBvcHRzO1xuICAgIGNvbnN0cnVjdG9yKG9wdHMsIGhhc1dhbGtlZENhY2hlKSB7XG4gICAgICAgIHRoaXMub3B0cyA9IG9wdHM7XG4gICAgICAgIHRoaXMuZm9sbG93ID0gISFvcHRzLmZvbGxvdztcbiAgICAgICAgdGhpcy5kb3QgPSAhIW9wdHMuZG90O1xuICAgICAgICB0aGlzLmhhc1dhbGtlZENhY2hlID1cbiAgICAgICAgICAgIGhhc1dhbGtlZENhY2hlID8gaGFzV2Fsa2VkQ2FjaGUuY29weSgpIDogbmV3IEhhc1dhbGtlZENhY2hlKCk7XG4gICAgfVxuICAgIHByb2Nlc3NQYXR0ZXJucyh0YXJnZXQsIHBhdHRlcm5zKSB7XG4gICAgICAgIHRoaXMucGF0dGVybnMgPSBwYXR0ZXJucztcbiAgICAgICAgY29uc3QgcHJvY2Vzc2luZ1NldCA9IHBhdHRlcm5zLm1hcChwID0+IFt0YXJnZXQsIHBdKTtcbiAgICAgICAgLy8gbWFwIG9mIHBhdGhzIHRvIHRoZSBtYWdpYy1zdGFydGluZyBzdWJ3YWxrcyB0aGV5IG5lZWQgdG8gd2Fsa1xuICAgICAgICAvLyBmaXJzdCBpdGVtIGluIHBhdHRlcm5zIGlzIHRoZSBmaWx0ZXJcbiAgICAgICAgZm9yIChsZXQgW3QsIHBhdHRlcm5dIG9mIHByb2Nlc3NpbmdTZXQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzV2Fsa2VkQ2FjaGUuc3RvcmVXYWxrZWQodCwgcGF0dGVybik7XG4gICAgICAgICAgICBjb25zdCByb290ID0gcGF0dGVybi5yb290KCk7XG4gICAgICAgICAgICBjb25zdCBhYnNvbHV0ZSA9IHBhdHRlcm4uaXNBYnNvbHV0ZSgpICYmIHRoaXMub3B0cy5hYnNvbHV0ZSAhPT0gZmFsc2U7XG4gICAgICAgICAgICAvLyBzdGFydCBhYnNvbHV0ZSBwYXR0ZXJucyBhdCByb290XG4gICAgICAgICAgICBpZiAocm9vdCkge1xuICAgICAgICAgICAgICAgIHQgPSB0LnJlc29sdmUocm9vdCA9PT0gJy8nICYmIHRoaXMub3B0cy5yb290ICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMucm9vdFxuICAgICAgICAgICAgICAgICAgICA6IHJvb3QpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBwYXR0ZXJuLnJlc3QoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVzLmFkZCh0LCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHQuaXNFTk9FTlQoKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBwO1xuICAgICAgICAgICAgbGV0IHJlc3Q7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgd2hpbGUgKHR5cGVvZiAocCA9IHBhdHRlcm4ucGF0dGVybigpKSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAocmVzdCA9IHBhdHRlcm4ucmVzdCgpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSB0LnJlc29sdmUocCk7XG4gICAgICAgICAgICAgICAgdCA9IGM7XG4gICAgICAgICAgICAgICAgcGF0dGVybiA9IHJlc3Q7XG4gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwID0gcGF0dGVybi5wYXR0ZXJuKCk7XG4gICAgICAgICAgICByZXN0ID0gcGF0dGVybi5yZXN0KCk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1dhbGtlZENhY2hlLmhhc1dhbGtlZCh0LCBwYXR0ZXJuKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNXYWxrZWRDYWNoZS5zdG9yZVdhbGtlZCh0LCBwYXR0ZXJuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG5vdyB3ZSBoYXZlIGVpdGhlciBhIGZpbmFsIHN0cmluZyBmb3IgYSBrbm93biBlbnRyeSxcbiAgICAgICAgICAgIC8vIG1vcmUgc3RyaW5ncyBmb3IgYW4gdW5rbm93biBlbnRyeSxcbiAgICAgICAgICAgIC8vIG9yIGEgcGF0dGVybiBzdGFydGluZyB3aXRoIG1hZ2ljLCBtb3VudGVkIG9uIHQuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgLy8gbXVzdCBub3QgYmUgZmluYWwgZW50cnksIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlXG4gICAgICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGVkIGl0IGVhcmxpZXIuXG4gICAgICAgICAgICAgICAgY29uc3QgaWZEaXIgPSBwID09PSAnLi4nIHx8IHAgPT09ICcnIHx8IHAgPT09ICcuJztcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZXMuYWRkKHQucmVzb2x2ZShwKSwgYWJzb2x1dGUsIGlmRGlyKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IEdMT0JTVEFSKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgbm8gcmVzdCwgbWF0Y2ggYW5kIHN1YndhbGsgcGF0dGVyblxuICAgICAgICAgICAgICAgIC8vIGlmIHJlc3QsIHByb2Nlc3MgcmVzdCBhbmQgc3Vid2FsayBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgLy8gaWYgaXQncyBhIHN5bWxpbmssIGJ1dCB3ZSBkaWRuJ3QgZ2V0IGhlcmUgYnkgd2F5IG9mIGFcbiAgICAgICAgICAgICAgICAvLyBnbG9ic3RhciBtYXRjaCAobWVhbmluZyBpdCdzIHRoZSBmaXJzdCB0aW1lIFRISVMgZ2xvYnN0YXJcbiAgICAgICAgICAgICAgICAvLyBoYXMgdHJhdmVyc2VkIGEgc3ltbGluayksIHRoZW4gd2UgZm9sbG93IGl0LiBPdGhlcndpc2UsIHN0b3AuXG4gICAgICAgICAgICAgICAgaWYgKCF0LmlzU3ltYm9saWNMaW5rKCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2xsb3cgfHxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5jaGVja0ZvbGxvd0dsb2JzdGFyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJ3YWxrcy5hZGQodCwgcGF0dGVybik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJwID0gcmVzdD8ucGF0dGVybigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJyZXN0ID0gcmVzdD8ucmVzdCgpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdCB8fCAoKHJwID09PSAnJyB8fCBycCA9PT0gJy4nKSAmJiAhcnJlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgSEFTIHRvIGJlIGEgZGlyIGlmIGl0IGVuZHMgaW4gKiovIG9yICoqLy5cbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGVuZGluZyBpbiAqKiB3aWxsIG1hdGNoIGZpbGVzIGFzIHdlbGwuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcy5hZGQodCwgYWJzb2x1dGUsIHJwID09PSAnJyB8fCBycCA9PT0gJy4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChycCA9PT0gJy4uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3b3VsZCBtZWFuIHlvdSdyZSBtYXRjaGluZyAqKi8uLiBhdCB0aGUgZnMgcm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyB0aGFua3MsIEknbSBub3QgZ29ubmEgdGVzdCB0aGF0IHNwZWNpZmljIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRwID0gdC5wYXJlbnQgfHwgdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJyZXN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcy5hZGQodHAsIGFic29sdXRlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmhhc1dhbGtlZENhY2hlLmhhc1dhbGtlZCh0cCwgcnJlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJ3YWxrcy5hZGQodHAsIHJyZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZCh0LCBwYXR0ZXJuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3Vid2Fsa1RhcmdldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YndhbGtzLmtleXMoKTtcbiAgICB9XG4gICAgY2hpbGQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvY2Vzc29yKHRoaXMub3B0cywgdGhpcy5oYXNXYWxrZWRDYWNoZSk7XG4gICAgfVxuICAgIC8vIHJldHVybiBhIG5ldyBQcm9jZXNzb3IgY29udGFpbmluZyB0aGUgc3Vid2Fsa3MgZm9yIGVhY2hcbiAgICAvLyBjaGlsZCBlbnRyeSwgYW5kIGEgc2V0IG9mIG1hdGNoZXMsIGFuZFxuICAgIC8vIGEgaGFzV2Fsa2VkQ2FjaGUgdGhhdCdzIGEgY29weSBvZiB0aGlzIG9uZVxuICAgIC8vIHRoZW4gd2UncmUgZ29pbmcgdG8gY2FsbFxuICAgIGZpbHRlckVudHJpZXMocGFyZW50LCBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5zdWJ3YWxrcy5nZXQocGFyZW50KTtcbiAgICAgICAgLy8gcHV0IG1hdGNoZXMgYW5kIGVudHJ5IHdhbGtzIGludG8gdGhlIHJlc3VsdHMgcHJvY2Vzc29yXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmNoaWxkKCk7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhYnNvbHV0ZSA9IHBhdHRlcm4uaXNBYnNvbHV0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBwYXR0ZXJuLnBhdHRlcm4oKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN0ID0gcGF0dGVybi5yZXN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHAgPT09IEdMT0JTVEFSKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMudGVzdEdsb2JzdGFyKGUsIHBhdHRlcm4sIHJlc3QsIGFic29sdXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnRlc3RSZWdFeHAoZSwgcCwgcmVzdCwgYWJzb2x1dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy50ZXN0U3RyaW5nKGUsIHAsIHJlc3QsIGFic29sdXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHRlc3RHbG9ic3RhcihlLCBwYXR0ZXJuLCByZXN0LCBhYnNvbHV0ZSkge1xuICAgICAgICBpZiAodGhpcy5kb3QgfHwgIWUubmFtZS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICAgIGlmICghcGF0dGVybi5oYXNNb3JlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZXMuYWRkKGUsIGFic29sdXRlLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZS5jYW5SZWFkZGlyKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBmb2xsb3cgbW9kZSBvciBpdCdzIG5vdCBhIHN5bWxpbmssIGp1c3Qga2VlcFxuICAgICAgICAgICAgICAgIC8vIHRlc3RpbmcgdGhlIHNhbWUgcGF0dGVybi4gSWYgdGhlcmUncyBtb3JlIGFmdGVyIHRoZSBnbG9ic3RhcixcbiAgICAgICAgICAgICAgICAvLyB0aGVuIHRoaXMgc3ltbGluayBjb25zdW1lcyB0aGUgZ2xvYnN0YXIuIElmIG5vdCwgdGhlbiB3ZSBjYW5cbiAgICAgICAgICAgICAgICAvLyBmb2xsb3cgYXQgbW9zdCBPTkUgc3ltbGluayBhbG9uZyB0aGUgd2F5LCBzbyB3ZSBtYXJrIGl0LCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIGFsc28gY2hlY2tzIHRvIGVuc3VyZSB0aGF0IGl0IHdhc24ndCBhbHJlYWR5IG1hcmtlZC5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2xsb3cgfHwgIWUuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZChlLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN0ICYmIHBhdHRlcm4uY2hlY2tGb2xsb3dHbG9ic3RhcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZChlLCByZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXR0ZXJuLm1hcmtGb2xsb3dHbG9ic3RhcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZChlLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0aGUgTkVYVCB0aGluZyBtYXRjaGVzIHRoaXMgZW50cnksIHRoZW4gYWxzbyBhZGRcbiAgICAgICAgLy8gdGhlIHJlc3QuXG4gICAgICAgIGlmIChyZXN0KSB7XG4gICAgICAgICAgICBjb25zdCBycCA9IHJlc3QucGF0dGVybigpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBycCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAvLyBkb3RzIGFuZCBlbXB0eSB3ZXJlIGhhbmRsZWQgYWxyZWFkeVxuICAgICAgICAgICAgICAgIHJwICE9PSAnLi4nICYmXG4gICAgICAgICAgICAgICAgcnAgIT09ICcnICYmXG4gICAgICAgICAgICAgICAgcnAgIT09ICcuJykge1xuICAgICAgICAgICAgICAgIHRoaXMudGVzdFN0cmluZyhlLCBycCwgcmVzdC5yZXN0KCksIGFic29sdXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJwID09PSAnLi4nKSB7XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgY29uc3QgZXAgPSBlLnBhcmVudCB8fCBlO1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJ3YWxrcy5hZGQoZXAsIHJlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocnAgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRlc3RSZWdFeHAoZSwgcnAsIHJlc3QucmVzdCgpLCBhYnNvbHV0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGVzdFJlZ0V4cChlLCBwLCByZXN0LCBhYnNvbHV0ZSkge1xuICAgICAgICBpZiAoIXAudGVzdChlLm5hbWUpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoIXJlc3QpIHtcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlcy5hZGQoZSwgYWJzb2x1dGUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3Vid2Fsa3MuYWRkKGUsIHJlc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRlc3RTdHJpbmcoZSwgcCwgcmVzdCwgYWJzb2x1dGUpIHtcbiAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbj9cbiAgICAgICAgaWYgKCFlLmlzTmFtZWQocCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghcmVzdCkge1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVzLmFkZChlLCBhYnNvbHV0ZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdWJ3YWxrcy5hZGQoZSwgcmVzdCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm9jZXNzb3IuanMubWFwIiwKICAgICIvKipcbiAqIFNpbmdsZS11c2UgdXRpbGl0eSBjbGFzc2VzIHRvIHByb3ZpZGUgZnVuY3Rpb25hbGl0eSB0byB0aGUge0BsaW5rIEdsb2J9XG4gKiBtZXRob2RzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgTWluaXBhc3MgfSBmcm9tICdtaW5pcGFzcyc7XG5pbXBvcnQgeyBJZ25vcmUgfSBmcm9tICcuL2lnbm9yZS5qcyc7XG5pbXBvcnQgeyBQcm9jZXNzb3IgfSBmcm9tICcuL3Byb2Nlc3Nvci5qcyc7XG5jb25zdCBtYWtlSWdub3JlID0gKGlnbm9yZSwgb3B0cykgPT4gdHlwZW9mIGlnbm9yZSA9PT0gJ3N0cmluZycgPyBuZXcgSWdub3JlKFtpZ25vcmVdLCBvcHRzKVxuICAgIDogQXJyYXkuaXNBcnJheShpZ25vcmUpID8gbmV3IElnbm9yZShpZ25vcmUsIG9wdHMpXG4gICAgICAgIDogaWdub3JlO1xuLyoqXG4gKiBiYXNpYyB3YWxraW5nIHV0aWxpdGllcyB0aGF0IGFsbCB0aGUgZ2xvYiB3YWxrZXIgdHlwZXMgdXNlXG4gKi9cbmV4cG9ydCBjbGFzcyBHbG9iVXRpbCB7XG4gICAgcGF0aDtcbiAgICBwYXR0ZXJucztcbiAgICBvcHRzO1xuICAgIHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgcGF1c2VkID0gZmFsc2U7XG4gICAgYWJvcnRlZCA9IGZhbHNlO1xuICAgICNvblJlc3VtZSA9IFtdO1xuICAgICNpZ25vcmU7XG4gICAgI3NlcDtcbiAgICBzaWduYWw7XG4gICAgbWF4RGVwdGg7XG4gICAgaW5jbHVkZUNoaWxkTWF0Y2hlcztcbiAgICBjb25zdHJ1Y3RvcihwYXR0ZXJucywgcGF0aCwgb3B0cykge1xuICAgICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnM7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMub3B0cyA9IG9wdHM7XG4gICAgICAgIHRoaXMuI3NlcCA9ICFvcHRzLnBvc2l4ICYmIG9wdHMucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnXFxcXCcgOiAnLyc7XG4gICAgICAgIHRoaXMuaW5jbHVkZUNoaWxkTWF0Y2hlcyA9IG9wdHMuaW5jbHVkZUNoaWxkTWF0Y2hlcyAhPT0gZmFsc2U7XG4gICAgICAgIGlmIChvcHRzLmlnbm9yZSB8fCAhdGhpcy5pbmNsdWRlQ2hpbGRNYXRjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLiNpZ25vcmUgPSBtYWtlSWdub3JlKG9wdHMuaWdub3JlID8/IFtdLCBvcHRzKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmNsdWRlQ2hpbGRNYXRjaGVzICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuI2lnbm9yZS5hZGQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtID0gJ2Nhbm5vdCBpZ25vcmUgY2hpbGQgbWF0Y2hlcywgaWdub3JlIGxhY2tzIGFkZCgpIG1ldGhvZC4nO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZ25vcmUsIGFsd2F5cyBzZXQgd2l0aCBtYXhEZXB0aCwgYnV0IGl0J3Mgb3B0aW9uYWwgb24gdGhlXG4gICAgICAgIC8vIEdsb2JPcHRpb25zIHR5cGVcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIHRoaXMubWF4RGVwdGggPSBvcHRzLm1heERlcHRoIHx8IEluZmluaXR5O1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICBpZiAob3B0cy5zaWduYWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2lnbmFsID0gb3B0cy5zaWduYWw7XG4gICAgICAgICAgICB0aGlzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNvblJlc3VtZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2lnbm9yZWQocGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWVuLmhhcyhwYXRoKSB8fCAhIXRoaXMuI2lnbm9yZT8uaWdub3JlZD8uKHBhdGgpO1xuICAgIH1cbiAgICAjY2hpbGRyZW5JZ25vcmVkKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy4jaWdub3JlPy5jaGlsZHJlbklnbm9yZWQ/LihwYXRoKTtcbiAgICB9XG4gICAgLy8gYmFja3ByZXNzdXJlIG1lY2hhbmlzbVxuICAgIHBhdXNlKCkge1xuICAgICAgICB0aGlzLnBhdXNlZCA9IHRydWU7XG4gICAgfVxuICAgIHJlc3VtZSgpIHtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGZuID0gdW5kZWZpbmVkO1xuICAgICAgICB3aGlsZSAoIXRoaXMucGF1c2VkICYmIChmbiA9IHRoaXMuI29uUmVzdW1lLnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICBmbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uUmVzdW1lKGZuKSB7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICghdGhpcy5wYXVzZWQpIHtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgdGhpcy4jb25SZXN1bWUucHVzaChmbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZG8gdGhlIHJlcXVpc2l0ZSByZWFscGF0aC9zdGF0IGNoZWNraW5nLCBhbmQgcmV0dXJuIHRoZSBwYXRoXG4gICAgLy8gdG8gYWRkIG9yIHVuZGVmaW5lZCB0byBmaWx0ZXIgaXQgb3V0LlxuICAgIGFzeW5jIG1hdGNoQ2hlY2soZSwgaWZEaXIpIHtcbiAgICAgICAgaWYgKGlmRGlyICYmIHRoaXMub3B0cy5ub2RpcilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBycGM7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucmVhbHBhdGgpIHtcbiAgICAgICAgICAgIHJwYyA9IGUucmVhbHBhdGhDYWNoZWQoKSB8fCAoYXdhaXQgZS5yZWFscGF0aCgpKTtcbiAgICAgICAgICAgIGlmICghcnBjKVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlID0gcnBjO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5lZWRTdGF0ID0gZS5pc1Vua25vd24oKSB8fCB0aGlzLm9wdHMuc3RhdDtcbiAgICAgICAgY29uc3QgcyA9IG5lZWRTdGF0ID8gYXdhaXQgZS5sc3RhdCgpIDogZTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5mb2xsb3cgJiYgdGhpcy5vcHRzLm5vZGlyICYmIHM/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHMucmVhbHBhdGgoKTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAodGFyZ2V0LmlzVW5rbm93bigpIHx8IHRoaXMub3B0cy5zdGF0KSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRhcmdldC5sc3RhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaENoZWNrVGVzdChzLCBpZkRpcik7XG4gICAgfVxuICAgIG1hdGNoQ2hlY2tUZXN0KGUsIGlmRGlyKSB7XG4gICAgICAgIHJldHVybiAoZSAmJlxuICAgICAgICAgICAgKHRoaXMubWF4RGVwdGggPT09IEluZmluaXR5IHx8IGUuZGVwdGgoKSA8PSB0aGlzLm1heERlcHRoKSAmJlxuICAgICAgICAgICAgKCFpZkRpciB8fCBlLmNhblJlYWRkaXIoKSkgJiZcbiAgICAgICAgICAgICghdGhpcy5vcHRzLm5vZGlyIHx8ICFlLmlzRGlyZWN0b3J5KCkpICYmXG4gICAgICAgICAgICAoIXRoaXMub3B0cy5ub2RpciB8fFxuICAgICAgICAgICAgICAgICF0aGlzLm9wdHMuZm9sbG93IHx8XG4gICAgICAgICAgICAgICAgIWUuaXNTeW1ib2xpY0xpbmsoKSB8fFxuICAgICAgICAgICAgICAgICFlLnJlYWxwYXRoQ2FjaGVkKCk/LmlzRGlyZWN0b3J5KCkpICYmXG4gICAgICAgICAgICAhdGhpcy4jaWdub3JlZChlKSkgP1xuICAgICAgICAgICAgZVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIG1hdGNoQ2hlY2tTeW5jKGUsIGlmRGlyKSB7XG4gICAgICAgIGlmIChpZkRpciAmJiB0aGlzLm9wdHMubm9kaXIpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcnBjO1xuICAgICAgICBpZiAodGhpcy5vcHRzLnJlYWxwYXRoKSB7XG4gICAgICAgICAgICBycGMgPSBlLnJlYWxwYXRoQ2FjaGVkKCkgfHwgZS5yZWFscGF0aFN5bmMoKTtcbiAgICAgICAgICAgIGlmICghcnBjKVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlID0gcnBjO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5lZWRTdGF0ID0gZS5pc1Vua25vd24oKSB8fCB0aGlzLm9wdHMuc3RhdDtcbiAgICAgICAgY29uc3QgcyA9IG5lZWRTdGF0ID8gZS5sc3RhdFN5bmMoKSA6IGU7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZm9sbG93ICYmIHRoaXMub3B0cy5ub2RpciAmJiBzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBzLnJlYWxwYXRoU3luYygpO1xuICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAodGFyZ2V0Py5pc1Vua25vd24oKSB8fCB0aGlzLm9wdHMuc3RhdCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQubHN0YXRTeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hDaGVja1Rlc3QocywgaWZEaXIpO1xuICAgIH1cbiAgICBtYXRjaEZpbmlzaChlLCBhYnNvbHV0ZSkge1xuICAgICAgICBpZiAodGhpcy4jaWdub3JlZChlKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gd2Uga25vdyB3ZSBoYXZlIGFuIGlnbm9yZSBpZiB0aGlzIGlzIGZhbHNlLCBidXQgVFMgZG9lc24ndFxuICAgICAgICBpZiAoIXRoaXMuaW5jbHVkZUNoaWxkTWF0Y2hlcyAmJiB0aGlzLiNpZ25vcmU/LmFkZCkge1xuICAgICAgICAgICAgY29uc3QgaWduID0gYCR7ZS5yZWxhdGl2ZVBvc2l4KCl9LyoqYDtcbiAgICAgICAgICAgIHRoaXMuI2lnbm9yZS5hZGQoaWduKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhYnMgPSB0aGlzLm9wdHMuYWJzb2x1dGUgPT09IHVuZGVmaW5lZCA/IGFic29sdXRlIDogdGhpcy5vcHRzLmFic29sdXRlO1xuICAgICAgICB0aGlzLnNlZW4uYWRkKGUpO1xuICAgICAgICBjb25zdCBtYXJrID0gdGhpcy5vcHRzLm1hcmsgJiYgZS5pc0RpcmVjdG9yeSgpID8gdGhpcy4jc2VwIDogJyc7XG4gICAgICAgIC8vIG9rLCB3ZSBoYXZlIHdoYXQgd2UgbmVlZCFcbiAgICAgICAgaWYgKHRoaXMub3B0cy53aXRoRmlsZVR5cGVzKSB7XG4gICAgICAgICAgICB0aGlzLm1hdGNoRW1pdChlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhYnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFicyA9IHRoaXMub3B0cy5wb3NpeCA/IGUuZnVsbHBhdGhQb3NpeCgpIDogZS5mdWxscGF0aCgpO1xuICAgICAgICAgICAgdGhpcy5tYXRjaEVtaXQoYWJzICsgbWFyayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZWwgPSB0aGlzLm9wdHMucG9zaXggPyBlLnJlbGF0aXZlUG9zaXgoKSA6IGUucmVsYXRpdmUoKTtcbiAgICAgICAgICAgIGNvbnN0IHByZSA9IHRoaXMub3B0cy5kb3RSZWxhdGl2ZSAmJiAhcmVsLnN0YXJ0c1dpdGgoJy4uJyArIHRoaXMuI3NlcCkgP1xuICAgICAgICAgICAgICAgICcuJyArIHRoaXMuI3NlcFxuICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICB0aGlzLm1hdGNoRW1pdCghcmVsID8gJy4nICsgbWFyayA6IHByZSArIHJlbCArIG1hcmspO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIG1hdGNoKGUsIGFic29sdXRlLCBpZkRpcikge1xuICAgICAgICBjb25zdCBwID0gYXdhaXQgdGhpcy5tYXRjaENoZWNrKGUsIGlmRGlyKTtcbiAgICAgICAgaWYgKHApXG4gICAgICAgICAgICB0aGlzLm1hdGNoRmluaXNoKHAsIGFic29sdXRlKTtcbiAgICB9XG4gICAgbWF0Y2hTeW5jKGUsIGFic29sdXRlLCBpZkRpcikge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5tYXRjaENoZWNrU3luYyhlLCBpZkRpcik7XG4gICAgICAgIGlmIChwKVxuICAgICAgICAgICAgdGhpcy5tYXRjaEZpbmlzaChwLCBhYnNvbHV0ZSk7XG4gICAgfVxuICAgIHdhbGtDQih0YXJnZXQsIHBhdHRlcm5zLCBjYikge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKVxuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgdGhpcy53YWxrQ0IyKHRhcmdldCwgcGF0dGVybnMsIG5ldyBQcm9jZXNzb3IodGhpcy5vcHRzKSwgY2IpO1xuICAgIH1cbiAgICB3YWxrQ0IyKHRhcmdldCwgcGF0dGVybnMsIHByb2Nlc3NvciwgY2IpIHtcbiAgICAgICAgaWYgKHRoaXMuI2NoaWxkcmVuSWdub3JlZCh0YXJnZXQpKVxuICAgICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIGlmICh0aGlzLnBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5vblJlc3VtZSgoKSA9PiB0aGlzLndhbGtDQjIodGFyZ2V0LCBwYXR0ZXJucywgcHJvY2Vzc29yLCBjYikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzUGF0dGVybnModGFyZ2V0LCBwYXR0ZXJucyk7XG4gICAgICAgIC8vIGRvbmUgcHJvY2Vzc2luZy4gIGFsbCBvZiB0aGUgYWJvdmUgaXMgc3luYywgY2FuIGJlIGFic3RyYWN0ZWQgb3V0LlxuICAgICAgICAvLyBzdWJ3YWxrcyBpcyBhIG1hcCBvZiBwYXRocyB0byB0aGUgZW50cnkgZmlsdGVycyB0aGV5IG5lZWRcbiAgICAgICAgLy8gbWF0Y2hlcyBpcyBhIG1hcCBvZiBwYXRocyB0byBbYWJzb2x1dGUsIGlmRGlyXSB0dXBsZXMuXG4gICAgICAgIGxldCB0YXNrcyA9IDE7XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoLS10YXNrcyA9PT0gMClcbiAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IFttLCBhYnNvbHV0ZSwgaWZEaXJdIG9mIHByb2Nlc3Nvci5tYXRjaGVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lnbm9yZWQobSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0YXNrcysrO1xuICAgICAgICAgICAgdGhpcy5tYXRjaChtLCBhYnNvbHV0ZSwgaWZEaXIpLnRoZW4oKCkgPT4gbmV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgcHJvY2Vzc29yLnN1YndhbGtUYXJnZXRzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1heERlcHRoICE9PSBJbmZpbml0eSAmJiB0LmRlcHRoKCkgPj0gdGhpcy5tYXhEZXB0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFza3MrKztcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuQ2FjaGVkID0gdC5yZWFkZGlyQ2FjaGVkKCk7XG4gICAgICAgICAgICBpZiAodC5jYWxsZWRSZWFkZGlyKCkpXG4gICAgICAgICAgICAgICAgdGhpcy53YWxrQ0IzKHQsIGNoaWxkcmVuQ2FjaGVkLCBwcm9jZXNzb3IsIG5leHQpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdC5yZWFkZGlyQ0IoKF8sIGVudHJpZXMpID0+IHRoaXMud2Fsa0NCMyh0LCBlbnRyaWVzLCBwcm9jZXNzb3IsIG5leHQpLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXh0KCk7XG4gICAgfVxuICAgIHdhbGtDQjModGFyZ2V0LCBlbnRyaWVzLCBwcm9jZXNzb3IsIGNiKSB7XG4gICAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3Nvci5maWx0ZXJFbnRyaWVzKHRhcmdldCwgZW50cmllcyk7XG4gICAgICAgIGxldCB0YXNrcyA9IDE7XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoLS10YXNrcyA9PT0gMClcbiAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IFttLCBhYnNvbHV0ZSwgaWZEaXJdIG9mIHByb2Nlc3Nvci5tYXRjaGVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lnbm9yZWQobSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0YXNrcysrO1xuICAgICAgICAgICAgdGhpcy5tYXRjaChtLCBhYnNvbHV0ZSwgaWZEaXIpLnRoZW4oKCkgPT4gbmV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXQsIHBhdHRlcm5zXSBvZiBwcm9jZXNzb3Iuc3Vid2Fsa3MuZW50cmllcygpKSB7XG4gICAgICAgICAgICB0YXNrcysrO1xuICAgICAgICAgICAgdGhpcy53YWxrQ0IyKHRhcmdldCwgcGF0dGVybnMsIHByb2Nlc3Nvci5jaGlsZCgpLCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0KCk7XG4gICAgfVxuICAgIHdhbGtDQlN5bmModGFyZ2V0LCBwYXR0ZXJucywgY2IpIHtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHRoaXMud2Fsa0NCMlN5bmModGFyZ2V0LCBwYXR0ZXJucywgbmV3IFByb2Nlc3Nvcih0aGlzLm9wdHMpLCBjYik7XG4gICAgfVxuICAgIHdhbGtDQjJTeW5jKHRhcmdldCwgcGF0dGVybnMsIHByb2Nlc3NvciwgY2IpIHtcbiAgICAgICAgaWYgKHRoaXMuI2NoaWxkcmVuSWdub3JlZCh0YXJnZXQpKVxuICAgICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIGlmICh0aGlzLnBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5vblJlc3VtZSgoKSA9PiB0aGlzLndhbGtDQjJTeW5jKHRhcmdldCwgcGF0dGVybnMsIHByb2Nlc3NvciwgY2IpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc1BhdHRlcm5zKHRhcmdldCwgcGF0dGVybnMpO1xuICAgICAgICAvLyBkb25lIHByb2Nlc3NpbmcuICBhbGwgb2YgdGhlIGFib3ZlIGlzIHN5bmMsIGNhbiBiZSBhYnN0cmFjdGVkIG91dC5cbiAgICAgICAgLy8gc3Vid2Fsa3MgaXMgYSBtYXAgb2YgcGF0aHMgdG8gdGhlIGVudHJ5IGZpbHRlcnMgdGhleSBuZWVkXG4gICAgICAgIC8vIG1hdGNoZXMgaXMgYSBtYXAgb2YgcGF0aHMgdG8gW2Fic29sdXRlLCBpZkRpcl0gdHVwbGVzLlxuICAgICAgICBsZXQgdGFza3MgPSAxO1xuICAgICAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKC0tdGFza3MgPT09IDApXG4gICAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBbbSwgYWJzb2x1dGUsIGlmRGlyXSBvZiBwcm9jZXNzb3IubWF0Y2hlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpZ25vcmVkKG0pKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5tYXRjaFN5bmMobSwgYWJzb2x1dGUsIGlmRGlyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgcHJvY2Vzc29yLnN1YndhbGtUYXJnZXRzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1heERlcHRoICE9PSBJbmZpbml0eSAmJiB0LmRlcHRoKCkgPj0gdGhpcy5tYXhEZXB0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFza3MrKztcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdC5yZWFkZGlyU3luYygpO1xuICAgICAgICAgICAgdGhpcy53YWxrQ0IzU3luYyh0LCBjaGlsZHJlbiwgcHJvY2Vzc29yLCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0KCk7XG4gICAgfVxuICAgIHdhbGtDQjNTeW5jKHRhcmdldCwgZW50cmllcywgcHJvY2Vzc29yLCBjYikge1xuICAgICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3IuZmlsdGVyRW50cmllcyh0YXJnZXQsIGVudHJpZXMpO1xuICAgICAgICBsZXQgdGFza3MgPSAxO1xuICAgICAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKC0tdGFza3MgPT09IDApXG4gICAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBbbSwgYWJzb2x1dGUsIGlmRGlyXSBvZiBwcm9jZXNzb3IubWF0Y2hlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpZ25vcmVkKG0pKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5tYXRjaFN5bmMobSwgYWJzb2x1dGUsIGlmRGlyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXQsIHBhdHRlcm5zXSBvZiBwcm9jZXNzb3Iuc3Vid2Fsa3MuZW50cmllcygpKSB7XG4gICAgICAgICAgICB0YXNrcysrO1xuICAgICAgICAgICAgdGhpcy53YWxrQ0IyU3luYyh0YXJnZXQsIHBhdHRlcm5zLCBwcm9jZXNzb3IuY2hpbGQoKSwgbmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCgpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBHbG9iV2Fsa2VyIGV4dGVuZHMgR2xvYlV0aWwge1xuICAgIG1hdGNoZXMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3RydWN0b3IocGF0dGVybnMsIHBhdGgsIG9wdHMpIHtcbiAgICAgICAgc3VwZXIocGF0dGVybnMsIHBhdGgsIG9wdHMpO1xuICAgIH1cbiAgICBtYXRjaEVtaXQoZSkge1xuICAgICAgICB0aGlzLm1hdGNoZXMuYWRkKGUpO1xuICAgIH1cbiAgICBhc3luYyB3YWxrKCkge1xuICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpXG4gICAgICAgICAgICB0aHJvdyB0aGlzLnNpZ25hbC5yZWFzb247XG4gICAgICAgIGlmICh0aGlzLnBhdGguaXNVbmtub3duKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGF0aC5sc3RhdCgpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgdGhpcy53YWxrQ0IodGhpcy5wYXRoLCB0aGlzLnBhdHRlcm5zLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlaih0aGlzLnNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzKHRoaXMubWF0Y2hlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzO1xuICAgIH1cbiAgICB3YWxrU3luYygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKVxuICAgICAgICAgICAgdGhyb3cgdGhpcy5zaWduYWwucmVhc29uO1xuICAgICAgICBpZiAodGhpcy5wYXRoLmlzVW5rbm93bigpKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGgubHN0YXRTeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm90aGluZyBmb3IgdGhlIGNhbGxiYWNrIHRvIGRvLCBiZWNhdXNlIHRoaXMgbmV2ZXIgcGF1c2VzXG4gICAgICAgIHRoaXMud2Fsa0NCU3luYyh0aGlzLnBhdGgsIHRoaXMucGF0dGVybnMsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLnNpZ25hbC5yZWFzb247XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBHbG9iU3RyZWFtIGV4dGVuZHMgR2xvYlV0aWwge1xuICAgIHJlc3VsdHM7XG4gICAgY29uc3RydWN0b3IocGF0dGVybnMsIHBhdGgsIG9wdHMpIHtcbiAgICAgICAgc3VwZXIocGF0dGVybnMsIHBhdGgsIG9wdHMpO1xuICAgICAgICB0aGlzLnJlc3VsdHMgPSBuZXcgTWluaXBhc3Moe1xuICAgICAgICAgICAgc2lnbmFsOiB0aGlzLnNpZ25hbCxcbiAgICAgICAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc3VsdHMub24oJ2RyYWluJywgKCkgPT4gdGhpcy5yZXN1bWUoKSk7XG4gICAgICAgIHRoaXMucmVzdWx0cy5vbigncmVzdW1lJywgKCkgPT4gdGhpcy5yZXN1bWUoKSk7XG4gICAgfVxuICAgIG1hdGNoRW1pdChlKSB7XG4gICAgICAgIHRoaXMucmVzdWx0cy53cml0ZShlKTtcbiAgICAgICAgaWYgKCF0aGlzLnJlc3VsdHMuZmxvd2luZylcbiAgICAgICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9XG4gICAgc3RyZWFtKCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBhdGg7XG4gICAgICAgIGlmICh0YXJnZXQuaXNVbmtub3duKCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5sc3RhdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2Fsa0NCKHRhcmdldCwgdGhpcy5wYXR0ZXJucywgKCkgPT4gdGhpcy5yZXN1bHRzLmVuZCgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53YWxrQ0IodGFyZ2V0LCB0aGlzLnBhdHRlcm5zLCAoKSA9PiB0aGlzLnJlc3VsdHMuZW5kKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdHM7XG4gICAgfVxuICAgIHN0cmVhbVN5bmMoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhdGguaXNVbmtub3duKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGF0aC5sc3RhdFN5bmMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndhbGtDQlN5bmModGhpcy5wYXRoLCB0aGlzLnBhdHRlcm5zLCAoKSA9PiB0aGlzLnJlc3VsdHMuZW5kKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdhbGtlci5qcy5tYXAiLAogICAgImltcG9ydCB7IE1pbmltYXRjaCB9IGZyb20gJ21pbmltYXRjaCc7XG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJucyBwcm92aWRlZCBjb250YWluIGFueSBtYWdpYyBnbG9iIGNoYXJhY3RlcnMsXG4gKiBnaXZlbiB0aGUgb3B0aW9ucyBwcm92aWRlZC5cbiAqXG4gKiBCcmFjZSBleHBhbnNpb24gaXMgbm90IGNvbnNpZGVyZWQgXCJtYWdpY1wiIHVubGVzcyB0aGUgYG1hZ2ljYWxCcmFjZXNgIG9wdGlvblxuICogaXMgc2V0LCBhcyBicmFjZSBleHBhbnNpb24ganVzdCB0dXJucyBvbmUgc3RyaW5nIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIFNvIGEgcGF0dGVybiBsaWtlIGAneHthLGJ9eSdgIHdvdWxkIHJldHVybiBgZmFsc2VgLCBiZWNhdXNlIGAneGF5J2AgYW5kXG4gKiBgJ3hieSdgIGJvdGggZG8gbm90IGNvbnRhaW4gYW55IG1hZ2ljIGdsb2IgY2hhcmFjdGVycywgYW5kIGl0J3MgdHJlYXRlZCB0aGVcbiAqIHNhbWUgYXMgaWYgeW91IGhhZCBjYWxsZWQgaXQgb24gYFsneGF5JywgJ3hieSddYC4gV2hlbiBgbWFnaWNhbEJyYWNlczp0cnVlYFxuICogaXMgaW4gdGhlIG9wdGlvbnMsIGJyYWNlIGV4cGFuc2lvbiBfaXNfIHRyZWF0ZWQgYXMgYSBwYXR0ZXJuIGhhdmluZyBtYWdpYy5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc01hZ2ljID0gKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkge1xuICAgICAgICBwYXR0ZXJuID0gW3BhdHRlcm5dO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHAgb2YgcGF0dGVybikge1xuICAgICAgICBpZiAobmV3IE1pbmltYXRjaChwLCBvcHRpb25zKS5oYXNNYWdpYygpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXMtbWFnaWMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlc2NhcGUsIHVuZXNjYXBlIH0gZnJvbSAnbWluaW1hdGNoJztcbmltcG9ydCB7IEdsb2IgfSBmcm9tICcuL2dsb2IuanMnO1xuaW1wb3J0IHsgaGFzTWFnaWMgfSBmcm9tICcuL2hhcy1tYWdpYy5qcyc7XG5leHBvcnQgeyBlc2NhcGUsIHVuZXNjYXBlIH0gZnJvbSAnbWluaW1hdGNoJztcbmV4cG9ydCB7IEdsb2IgfSBmcm9tICcuL2dsb2IuanMnO1xuZXhwb3J0IHsgaGFzTWFnaWMgfSBmcm9tICcuL2hhcy1tYWdpYy5qcyc7XG5leHBvcnQgeyBJZ25vcmUgfSBmcm9tICcuL2lnbm9yZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gZ2xvYlN0cmVhbVN5bmMocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBHbG9iKHBhdHRlcm4sIG9wdGlvbnMpLnN0cmVhbVN5bmMoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnbG9iU3RyZWFtKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgR2xvYihwYXR0ZXJuLCBvcHRpb25zKS5zdHJlYW0oKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnbG9iU3luYyhwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IEdsb2IocGF0dGVybiwgb3B0aW9ucykud2Fsa1N5bmMoKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdsb2JfKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgR2xvYihwYXR0ZXJuLCBvcHRpb25zKS53YWxrKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2xvYkl0ZXJhdGVTeW5jKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgR2xvYihwYXR0ZXJuLCBvcHRpb25zKS5pdGVyYXRlU3luYygpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JJdGVyYXRlKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgR2xvYihwYXR0ZXJuLCBvcHRpb25zKS5pdGVyYXRlKCk7XG59XG4vLyBhbGlhc2VzOiBnbG9iLnN5bmMuc3RyZWFtKCkgZ2xvYi5zdHJlYW0uc3luYygpIGdsb2Iuc3luYygpIGV0Y1xuZXhwb3J0IGNvbnN0IHN0cmVhbVN5bmMgPSBnbG9iU3RyZWFtU3luYztcbmV4cG9ydCBjb25zdCBzdHJlYW0gPSBPYmplY3QuYXNzaWduKGdsb2JTdHJlYW0sIHsgc3luYzogZ2xvYlN0cmVhbVN5bmMgfSk7XG5leHBvcnQgY29uc3QgaXRlcmF0ZVN5bmMgPSBnbG9iSXRlcmF0ZVN5bmM7XG5leHBvcnQgY29uc3QgaXRlcmF0ZSA9IE9iamVjdC5hc3NpZ24oZ2xvYkl0ZXJhdGUsIHtcbiAgICBzeW5jOiBnbG9iSXRlcmF0ZVN5bmMsXG59KTtcbmV4cG9ydCBjb25zdCBzeW5jID0gT2JqZWN0LmFzc2lnbihnbG9iU3luYywge1xuICAgIHN0cmVhbTogZ2xvYlN0cmVhbVN5bmMsXG4gICAgaXRlcmF0ZTogZ2xvYkl0ZXJhdGVTeW5jLFxufSk7XG5leHBvcnQgY29uc3QgZ2xvYiA9IE9iamVjdC5hc3NpZ24oZ2xvYl8sIHtcbiAgICBnbG9iOiBnbG9iXyxcbiAgICBnbG9iU3luYyxcbiAgICBzeW5jLFxuICAgIGdsb2JTdHJlYW0sXG4gICAgc3RyZWFtLFxuICAgIGdsb2JTdHJlYW1TeW5jLFxuICAgIHN0cmVhbVN5bmMsXG4gICAgZ2xvYkl0ZXJhdGUsXG4gICAgaXRlcmF0ZSxcbiAgICBnbG9iSXRlcmF0ZVN5bmMsXG4gICAgaXRlcmF0ZVN5bmMsXG4gICAgR2xvYixcbiAgICBoYXNNYWdpYyxcbiAgICBlc2NhcGUsXG4gICAgdW5lc2NhcGUsXG59KTtcbmdsb2IuZ2xvYiA9IGdsb2I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgImltcG9ydCB7IGdsb2IgfSBmcm9tIFwiZ2xvYlwiO1xyXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xyXG5pbXBvcnQgeyBjd2QsIGVudiB9IGZyb20gXCJub2RlOnByb2Nlc3NcIjtcclxuaW1wb3J0IHR5cGUgeyBNaWxraW9BZGFwdGVyLCBWaXRlSW5wdXQsIFZpdGVPdXRwdXQgfSBmcm9tIFwiLi9pbmRleC50c1wiO1xyXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCI7XHJcblxyXG5jb25zdCBhZGFwdGVyTmFtZSA9IFwiZWRnZS1vbmVcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlZGdlT25lQWRhcHRlcigpOiBNaWxraW9BZGFwdGVyIHtcclxuICByZXR1cm4ge1xyXG4gICAgbmFtZTogYWRhcHRlck5hbWUsXHJcbiAgICBhZGFwdGVyOiBhc3luYyAob3B0aW9uczoge30pID0+IHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgKiBAc3RlcCBpbnB1dFxyXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICovXHJcbiAgICAgIGNvbnN0IGlucHV0OiBWaXRlSW5wdXQgPSB7fTtcclxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGdsb2IoXCJjb250cm9sbGVyLyoqLyoue2FjdGlvbixzdHJlYW19LnRzXCIpO1xyXG4gICAgICBjb25zdCB0YXNrczogQXJyYXk8UHJvbWlzZTx2b2lkPj4gPSBbXTtcclxuICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyUGF0aCBvZiByZXN1bHRzKSB7XHJcbiAgICAgICAgdGFza3MucHVzaChcclxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhTcGxpdCA9IGNvbnRyb2xsZXJQYXRoXHJcbiAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKVxyXG4gICAgICAgICAgICAgIC5zbGljZSgwLCBjb250cm9sbGVyUGF0aC5sZW5ndGggLSAxMCkgLy8gMTAgPT09IFwiLmFjdGlvbi50c1wiLmxlbmd0aCBvciBcIi5zdHJlYW0udHNcIi5sZW5ndGhcclxuICAgICAgICAgICAgICAuc3BsaXQoXCIvXCIpXHJcbiAgICAgICAgICAgICAgLnNsaWNlKDEpO1xyXG4gICAgICAgICAgICBjb25zdCBsZXZlbCA9IHBhdGhTcGxpdC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBwYXRoU3BsaXQuam9pbihcIi9cIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhY2tUb1Jvb3QgPSBcIi4uL1wiLnJlcGVhdChsZXZlbCArIDEpO1xyXG4gICAgICAgICAgICBjb25zdCByb3V0ZXNGb2xkZXIgPSBgLm1pbGtpby9nZW5lcmF0ZWQvcm91dGVzL2NvbnRyb2xsZXJfXyR7cGF0aC5yZXBsYWNlQWxsKFwiL1wiLCBcIl9fXCIpLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKX1gO1xyXG5cclxuICAgICAgICAgICAgLy8gVHJhdmVyc2UgdGhlIHJvdXRlcyBnZW5lcmF0ZWQgaW4gdGhlIGRpcmVjdG9yeSBhbmQgc2VsZWN0IHRoZSBsYXRlc3QgcGllY2Ugb2YgZGF0YVxyXG4gICAgICAgICAgICBjb25zdCByb3V0ZXNGb2xkZXJGaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIocm91dGVzRm9sZGVyKTtcclxuICAgICAgICAgICAgaWYgKHJvdXRlc0ZvbGRlckZpbGVzLmxlbmd0aCA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKGBObyByb3V0ZXMgZm91bmQgaW4gJHtyb3V0ZXNGb2xkZXJ9YCk7XHJcbiAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBmdWxsIHBhdGhzIGFuZCBzdGF0dXMgaW5mb3JtYXRpb24gb2YgYWxsIGZpbGVzXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzV2l0aFN0YXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgcm91dGVzRm9sZGVyRmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4ocm91dGVzRm9sZGVyLCBmaWxlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmaWxlUGF0aCwgYmlydGhUaW1lOiBzdGF0cy5iaXJ0aHRpbWUgfTtcclxuICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3Qgcm91dGVQYXRoID0gZmlsZXNXaXRoU3RhdHMuc29ydCgoYSwgYikgPT4gYi5iaXJ0aFRpbWUuZ2V0VGltZSgpIC0gYS5iaXJ0aFRpbWUuZ2V0VGltZSgpKS5hdCgwKT8uZmlsZVBhdGg7XHJcbiAgICAgICAgICAgIGlmICghcm91dGVQYXRoKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHJvdXRlcyBmb3VuZCBpbiAke3JvdXRlc0ZvbGRlcn1gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFBhdGggPSBgLm1pbGtpby8ke2FkYXB0ZXJOYW1lfS8ke3BhdGh9LnRzYDtcclxuICAgICAgICAgICAgYXdhaXQgZnMub3V0cHV0RmlsZShcclxuICAgICAgICAgICAgICBnZW5lcmF0ZWRQYXRoLFxyXG4gICAgICAgICAgICAgIGBpbXBvcnQgeyBjcmVhdGUgfSBmcm9tIFwiJHtiYWNrVG9Sb290fWluZGV4LnRzXCI7XHJcbmltcG9ydCByb3V0ZVNjaGVtYSBmcm9tIFwiJHtiYWNrVG9Sb290fSR7cm91dGVQYXRoLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKX1cIjtcclxuXHJcbmNvbnN0IHdvcmxkID0gY3JlYXRlKHtcclxuICBkZXZlbG9wOiAke2Vudi5NSUxLSU9fREVWRUxPUCA9PT0gXCJFTkFCTEVcIiA/IFwidHJ1ZVwiIDogXCJmYWxzZVwifSxcclxuICBhcmd2OiBbXSxcclxufSk7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25SZXF1ZXN0KGNvbnRleHQpIHtcclxuICByZXR1cm4gYXdhaXQgKGF3YWl0IHdvcmxkKS5saXN0ZW5lci5mZXRjaCh7XHJcbiAgICByZXF1ZXN0OiBjb250ZXh0LnJlcXVlc3QsXHJcbiAgICBlbnY6IGNvbnRleHQuZW52LFxyXG4gICAgZW52TW9kZTogXCIke2Vudi5NSUxLSU9fREVWRUxPUCA9PT0gXCJFTkFCTEVcIiA/IFwiZGV2ZWxvcG1lbnRcIiA6IFwicHJvZHVjdGlvblwifVwiLFxyXG4gICAgcm91dGVTY2hlbWEsXHJcbiAgfSk7XHJcbn1gLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgaW5wdXRbcGF0aF0gPSBnZW5lcmF0ZWRQYXRoO1xyXG4gICAgICAgICAgfSkoKSxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRhc2tzKTtcclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICogQHN0ZXAgb3V0cHV0XHJcbiAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgKi9cclxuICAgICAgY29uc3Qgb3V0cHV0OiBWaXRlT3V0cHV0ID0ge307XHJcbiAgICAgIG91dHB1dC5lbnRyeUZpbGVOYW1lcyA9IFwiZnVuY3Rpb25zL1tuYW1lXS5qc1wiO1xyXG4gICAgICBvdXRwdXQuY2h1bmtGaWxlTmFtZXMgPSBcImZ1bmN0aW9ucy8ubWlsa2lvL1tuYW1lXS1baGFzaF0uanNcIjtcclxuICAgICAgb3V0cHV0LmFzc2V0RmlsZU5hbWVzID0gXCJmdW5jdGlvbnMvLm1pbGtpby9bbmFtZV0tW2hhc2hdW2V4dG5hbWVdXCI7XHJcbiAgICAgIG91dHB1dC5zb3VyY2VtYXAgPSBcImlubGluZVwiO1xyXG4gICAgICBvdXRwdXQucHJlc2VydmVNb2R1bGVzID0gZmFsc2U7XHJcblxyXG4gICAgICByZXR1cm4geyBpbnB1dCwgb3V0cHV0IH07XHJcbiAgICB9LFxyXG4gIH0gc2F0aXNmaWVzIE1pbGtpb0FkYXB0ZXI7XHJcbn1cclxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiO1xyXG5pbXBvcnQgeyBlZGdlT25lQWRhcHRlciB9IGZyb20gXCIuL2VkZ2Utb25lLnRzXCI7XHJcblxyXG5leHBvcnQgdHlwZSBWaXRlSW5wdXQgPSBFeGNsdWRlPEV4Y2x1ZGU8VXNlckNvbmZpZ1tcImJ1aWxkXCJdLCB1bmRlZmluZWQ+W1wicm9sbHVwT3B0aW9uc1wiXSwgdW5kZWZpbmVkPltcImlucHV0XCJdO1xyXG5leHBvcnQgdHlwZSBWaXRlT3V0cHV0ID0gRXhjbHVkZTxFeGNsdWRlPFVzZXJDb25maWdbXCJidWlsZFwiXSwgdW5kZWZpbmVkPltcInJvbGx1cE9wdGlvbnNcIl0sIHVuZGVmaW5lZD5bXCJvdXRwdXRcIl07XHJcblxyXG5leHBvcnQgdHlwZSBNaWxraW9BZGFwdGVyID0ge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBhZGFwdGVyOiAob3B0aW9uczoge30pID0+IFByb21pc2U8e1xyXG4gICAgaW5wdXQ6IFZpdGVJbnB1dDtcclxuICAgIG91dHB1dDogVml0ZU91dHB1dDtcclxuICB9PjtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBhZGFwdGVyczogQXJyYXk8TWlsa2lvQWRhcHRlcj4gPSBbZWRnZU9uZUFkYXB0ZXIoKV07XHJcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFDQSxJQUFNLFlBQVk7QUFBQTtBQUFBLEVBQ2xCLE1BQU0sb0JBQW9CLE1BQU07QUFBQSxJQUU5QixXQUFZLENBQUMsS0FBSyxVQUFVLFlBQVk7QUFBQSxNQUN0QyxNQUFNLG1CQUFtQixLQUFLLFVBQVUsVUFBVTtBQUFBLE1BQ2xELEtBQUssT0FBTztBQUFBLE1BQ1osS0FBSyxPQUFPO0FBQUEsTUFDWixJQUFJLE1BQU07QUFBQSxRQUFtQixNQUFNLGtCQUFrQixNQUFNLFdBQVc7QUFBQTtBQUFBLEVBRTFFO0FBQUE7QUFBQSxFQUNBLE1BQU0sTUFBTTtBQUFBLElBQ1YsV0FBWSxDQUFDLFFBQVE7QUFBQSxNQUNuQixLQUFLLFNBQVM7QUFBQSxNQUNkLEtBQUssTUFBTTtBQUFBLE1BQ1gsS0FBSyxXQUFXO0FBQUEsTUFDaEIsS0FBSyxTQUFTO0FBQUEsTUFDZCxLQUFLLGNBQWM7QUFBQSxNQUNuQixLQUFLLFlBQVk7QUFBQTtBQUFBLEVBRXJCO0FBQUE7QUFBQSxFQUNBLE1BQU0sT0FBTztBQUFBLElBQ1gsV0FBWSxHQUFHO0FBQUEsTUFDYixLQUFLLE1BQU07QUFBQSxNQUNYLEtBQUssTUFBTTtBQUFBLE1BQ1gsS0FBSyxPQUFPO0FBQUEsTUFDWixLQUFLLE1BQU0sQ0FBQztBQUFBLE1BQ1osS0FBSyxNQUFNLEtBQUs7QUFBQSxNQUNoQixLQUFLLFFBQVEsQ0FBQztBQUFBLE1BQ2QsS0FBSyxPQUFPO0FBQUEsTUFDWixLQUFLLE9BQU87QUFBQSxNQUNaLEtBQUssS0FBSztBQUFBLE1BQ1YsS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLFVBQVU7QUFBQTtBQUFBLElBR3hDLEtBQU0sQ0FBQyxLQUFLO0FBQUEsTUFFVixJQUFJLElBQUksV0FBVyxLQUFLLElBQUksVUFBVTtBQUFBLFFBQU07QUFBQSxNQUU1QyxLQUFLLE9BQU8sT0FBTyxHQUFHO0FBQUEsTUFDdEIsS0FBSyxLQUFLO0FBQUEsTUFDVixLQUFLLE9BQU87QUFBQSxNQUNaLElBQUk7QUFBQSxNQUNKLE9BQU8sWUFBWSxTQUFTLEtBQUssU0FBUyxHQUFHO0FBQUEsUUFDM0MsVUFBVSxLQUFLLE9BQU87QUFBQSxNQUN4QjtBQUFBLE1BQ0EsS0FBSyxPQUFPO0FBQUE7QUFBQSxJQUVkLFFBQVMsR0FBRztBQUFBLE1BQ1YsSUFBSSxLQUFLLFNBQVMsSUFBTTtBQUFBLFVBQ3BCLEtBQUs7QUFBQSxRQUNQLEtBQUssTUFBTTtBQUFBLE1BQ2I7QUFBQSxRQUNFLEtBQUs7QUFBQSxNQUNQLEtBQUssT0FBTyxLQUFLLEtBQUssWUFBWSxLQUFLLEVBQUU7QUFBQSxRQUN2QyxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsTUFDUCxPQUFPLEtBQUssV0FBVztBQUFBO0FBQUEsSUFFekIsVUFBVyxHQUFHO0FBQUEsTUFDWixPQUFPLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFBQTtBQUFBLElBRTdCLE1BQU8sR0FBRztBQUFBLE1BQ1IsT0FBTyxLQUFLLE1BQU0sT0FBTyxLQUFLLE1BQU0sS0FBSyxNQUFNLFFBQVE7QUFBQTtBQUFBLElBRXpELE1BQU8sR0FBRztBQUFBLE1BQ1IsS0FBSyxPQUFPO0FBQUEsTUFDWixJQUFJO0FBQUEsTUFDSixHQUFHO0FBQUEsUUFDRCxPQUFPLEtBQUssTUFBTTtBQUFBLFFBQ2xCLEtBQUssT0FBTztBQUFBLE1BQ2QsU0FBUyxLQUFLLE1BQU0sV0FBVztBQUFBLE1BRS9CLEtBQUssTUFBTTtBQUFBLE1BQ1gsS0FBSyxRQUFRO0FBQUEsTUFDYixLQUFLLE9BQU87QUFBQSxNQUVaLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFFZCxJQUFLLENBQUMsSUFBSTtBQUFBLE1BRVIsSUFBSSxPQUFPLE9BQU87QUFBQSxRQUFZLE1BQU0sSUFBSSxZQUFZLCtDQUErQyxLQUFLLFVBQVUsRUFBRSxDQUFDO0FBQUEsTUFDckgsS0FBSyxNQUFNLFNBQVM7QUFBQTtBQUFBLElBRXRCLElBQUssQ0FBQyxJQUFJO0FBQUEsTUFDUixLQUFLLEtBQUssRUFBRTtBQUFBLE1BQ1osT0FBTyxLQUFLLE9BQU87QUFBQTtBQUFBLElBRXJCLElBQUssQ0FBQyxJQUFJLFlBQVk7QUFBQSxNQUNwQixJQUFJO0FBQUEsUUFBWSxLQUFLLEtBQUssVUFBVTtBQUFBLE1BQ3BDLEtBQUssTUFBTSxLQUFLLEtBQUssS0FBSztBQUFBLE1BQzFCLEtBQUssUUFBUSxJQUFJLE1BQU0sRUFBRTtBQUFBO0FBQUEsSUFFM0IsT0FBUSxDQUFDLElBQUksWUFBWTtBQUFBLE1BQ3ZCLEtBQUssS0FBSyxJQUFJLFVBQVU7QUFBQSxNQUN4QixPQUFPLEtBQUssT0FBTztBQUFBO0FBQUEsSUFFckIsTUFBTyxDQUFDLE9BQU87QUFBQSxNQUViLElBQUksS0FBSyxNQUFNLFdBQVc7QUFBQSxRQUFHLE1BQU0sS0FBSyxNQUFNLElBQUksWUFBWSxpQkFBaUIsQ0FBQztBQUFBLE1BQ2hGLElBQUksVUFBVTtBQUFBLFFBQVcsUUFBUSxLQUFLLE1BQU07QUFBQSxNQUM1QyxLQUFLLFFBQVEsS0FBSyxNQUFNLElBQUk7QUFBQSxNQUM1QixLQUFLLE1BQU0sV0FBVztBQUFBO0FBQUEsSUFFeEIsU0FBVSxDQUFDLE9BQU87QUFBQSxNQUNoQixLQUFLLE9BQU8sS0FBSztBQUFBLE1BQ2pCLE9BQU8sS0FBSyxPQUFPO0FBQUE7QUFBQSxJQUVyQixPQUFRLEdBQUc7QUFBQSxNQUVULElBQUksS0FBSyxTQUFTO0FBQUEsUUFBVyxNQUFNLEtBQUssTUFBTSxJQUFJLFlBQVksMEJBQTBCLENBQUM7QUFBQSxNQUN6RixLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsSUFFbkMsS0FBTSxDQUFDLEtBQUs7QUFBQSxNQUNWLElBQUksT0FBTyxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixPQUFPO0FBQUE7QUFBQSxJQUdULFVBQVcsR0FBRztBQUFBLE1BQ1osTUFBTSxJQUFJLFlBQVksa0NBQWtDO0FBQUE7QUFBQSxFQUU1RDtBQUFBLEVBQ0EsT0FBTyxNQUFNO0FBQUEsRUFDYixPQUFPLFFBQVE7QUFBQSxFQUNmLE9BQU8sVUFBVTtBQUFBOzs7O0VDN0hqQixPQUFPLFVBQVUsV0FBUztBQUFBLElBQ3hCLE1BQU0sT0FBTyxJQUFJLEtBQUssS0FBSztBQUFBLElBRTNCLElBQUksTUFBTSxJQUFJLEdBQUc7QUFBQSxNQUNmLE1BQU0sSUFBSSxVQUFVLGtCQUFrQjtBQUFBLElBQ3hDLEVBQU87QUFBQSxNQUNMLE9BQU87QUFBQTtBQUFBO0FBQUE7Ozs7RUNOWCxPQUFPLFVBQVUsQ0FBQyxHQUFHLFFBQVE7QUFBQSxJQUMzQixNQUFNLE9BQU8sR0FBRztBQUFBLElBQ2hCLE9BQU8sSUFBSSxTQUFTO0FBQUEsTUFBRyxNQUFNLE1BQU07QUFBQSxJQUNuQyxPQUFPO0FBQUE7QUFBQTs7OztFQ0hULElBQU07QUFBQTtBQUFBLEVBRU4sTUFBTSx5QkFBeUIsS0FBSztBQUFBLElBQ2xDLFdBQVksQ0FBQyxPQUFPO0FBQUEsTUFDbEIsTUFBTSxRQUFRLEdBQUc7QUFBQSxNQUNqQixLQUFLLGFBQWE7QUFBQTtBQUFBLElBRXBCLFdBQVksR0FBRztBQUFBLE1BQ2IsTUFBTSxPQUFPLEdBQUcsS0FBSyxlQUFlLEtBQUssRUFBRSxHQUFHLEtBQUssWUFBWSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxXQUFXLENBQUM7QUFBQSxNQUMvRixNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsS0FBSyxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxjQUFjLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxjQUFjLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQztBQUFBLE1BQ3RJLE9BQU8sR0FBRyxRQUFRO0FBQUE7QUFBQSxFQUV0QjtBQUFBLEVBRUEsT0FBTyxVQUFVLFdBQVM7QUFBQSxJQUN4QixNQUFNLE9BQU8sSUFBSSxpQkFBaUIsS0FBSztBQUFBLElBRXZDLElBQUksTUFBTSxJQUFJLEdBQUc7QUFBQSxNQUNmLE1BQU0sSUFBSSxVQUFVLGtCQUFrQjtBQUFBLElBQ3hDLEVBQU87QUFBQSxNQUNMLE9BQU87QUFBQTtBQUFBO0FBQUE7Ozs7RUNwQlgsSUFBTTtBQUFBLEVBQ04sSUFBTSxXQUFXLE9BQU87QUFBQTtBQUFBLEVBRXhCLE1BQU0sY0FBYSxTQUFTO0FBQUEsSUFDMUIsV0FBWSxDQUFDLE9BQU87QUFBQSxNQUNsQixNQUFNLEtBQUs7QUFBQSxNQUNYLEtBQUssU0FBUztBQUFBO0FBQUEsSUFFaEIsV0FBWSxHQUFHO0FBQUEsTUFDYixPQUFPLEdBQUcsS0FBSyxlQUFlLEtBQUssRUFBRSxHQUFHLEtBQUssWUFBWSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxXQUFXLENBQUM7QUFBQTtBQUFBLEVBRTdGO0FBQUEsRUFFQSxPQUFPLFVBQVUsV0FBUztBQUFBLElBQ3hCLE1BQU0sT0FBTyxJQUFJLE1BQUssS0FBSztBQUFBLElBRTNCLElBQUksTUFBTSxJQUFJLEdBQUc7QUFBQSxNQUNmLE1BQU0sSUFBSSxVQUFVLGtCQUFrQjtBQUFBLElBQ3hDLEVBQU87QUFBQSxNQUNMLE9BQU87QUFBQTtBQUFBO0FBQUE7Ozs7RUNuQlgsSUFBTTtBQUFBO0FBQUEsRUFFTixNQUFNLGFBQWEsS0FBSztBQUFBLElBQ3RCLFdBQVksQ0FBQyxPQUFPO0FBQUEsTUFDbEIsTUFBTSxjQUFjLFFBQVE7QUFBQSxNQUM1QixLQUFLLFNBQVM7QUFBQTtBQUFBLElBRWhCLFdBQVksR0FBRztBQUFBLE1BQ2IsT0FBTyxHQUFHLEVBQUUsR0FBRyxLQUFLLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLG1CQUFtQixDQUFDO0FBQUE7QUFBQSxFQUVwSTtBQUFBLEVBRUEsT0FBTyxVQUFVLFdBQVM7QUFBQSxJQUN4QixNQUFNLE9BQU8sSUFBSSxLQUFLLEtBQUs7QUFBQSxJQUUzQixJQUFJLE1BQU0sSUFBSSxHQUFHO0FBQUEsTUFDZixNQUFNLElBQUksVUFBVSxrQkFBa0I7QUFBQSxJQUN4QyxFQUFPO0FBQUEsTUFDTCxPQUFPO0FBQUE7QUFBQTtBQUFBOzs7O0VDakJYLE9BQU8sVUFBVSxnQ0FBc0M7QUFBQSxFQUN2RCxPQUFPLFFBQVEsa0JBQWtCO0FBQUE7QUFBQSxFQUVqQyxNQUFNLGtCQUFrQixNQUFNO0FBQUEsSUFDNUIsV0FBWSxDQUFDLEtBQUs7QUFBQSxNQUNoQixNQUFNLEdBQUc7QUFBQSxNQUNULEtBQUssT0FBTztBQUFBLE1BRVosSUFBSSxNQUFNO0FBQUEsUUFBbUIsTUFBTSxrQkFBa0IsTUFBTSxTQUFTO0FBQUEsTUFDcEUsS0FBSyxXQUFXO0FBQUEsTUFDaEIsS0FBSyxVQUFVO0FBQUE7QUFBQSxFQUVuQjtBQUFBLEVBQ0EsVUFBVSxPQUFPLFNBQU87QUFBQSxJQUN0QixNQUFNLE9BQU8sSUFBSSxVQUFVLElBQUksT0FBTztBQUFBLElBQ3RDLEtBQUssT0FBTyxJQUFJO0FBQUEsSUFDaEIsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUVULE9BQU8sUUFBUSxZQUFZO0FBQUEsRUFFM0IsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBRU4sSUFBTSxTQUFTO0FBQUEsRUFDZixJQUFNLFNBQVM7QUFBQSxFQUNmLElBQU0sU0FBUztBQUFBLEVBQ2YsSUFBTSxxQkFBcUI7QUFBQSxFQUMzQixJQUFNLFVBQVU7QUFBQSxFQUNoQixJQUFNLFlBQVk7QUFBQSxFQUNsQixJQUFNLFdBQVc7QUFBQSxFQUNqQixJQUFNLFlBQVk7QUFBQSxFQUNsQixJQUFNLFlBQVk7QUFBQSxFQUNsQixJQUFNLGFBQWE7QUFBQSxFQUNuQixJQUFNLGNBQWM7QUFBQSxFQUNwQixJQUFNLGNBQWM7QUFBQSxFQUNwQixJQUFNLFNBQVM7QUFBQSxFQUNmLElBQU0sU0FBUztBQUFBLEVBQ2YsSUFBTSxTQUFTO0FBQUEsRUFDZixJQUFNLFNBQVM7QUFBQSxFQUNmLElBQU0sYUFBYTtBQUFBLEVBQ25CLElBQU0sY0FBYztBQUFBLEVBQ3BCLElBQU0sU0FBUztBQUFBLEVBQ2YsSUFBTSxTQUFTO0FBQUEsRUFDZixJQUFNLFNBQVM7QUFBQSxFQUNmLElBQU0sU0FBUztBQUFBLEVBQ2YsSUFBTSxTQUFTO0FBQUEsRUFDZixJQUFNLFNBQVM7QUFBQSxFQUNmLElBQU0sY0FBYztBQUFBLEVBQ3BCLElBQU0sU0FBUztBQUFBLEVBQ2YsSUFBTSxTQUFTO0FBQUEsRUFDZixJQUFNLFNBQVM7QUFBQSxFQUNmLElBQU0sU0FBUztBQUFBLEVBQ2YsSUFBTSxTQUFTO0FBQUEsRUFDZixJQUFNLFNBQVM7QUFBQSxFQUNmLElBQU0sU0FBUztBQUFBLEVBQ2YsSUFBTSxTQUFTO0FBQUEsRUFDZixJQUFNLFNBQVM7QUFBQSxFQUNmLElBQU0sU0FBUztBQUFBLEVBQ2YsSUFBTSxTQUFTO0FBQUEsRUFDZixJQUFNLFNBQVM7QUFBQSxFQUNmLElBQU0sU0FBUztBQUFBLEVBQ2YsSUFBTSxTQUFTO0FBQUEsRUFDZixJQUFNLFlBQVk7QUFBQSxFQUNsQixJQUFNLFlBQVk7QUFBQSxFQUNsQixJQUFNLFlBQVk7QUFBQSxFQUNsQixJQUFNLFlBQVk7QUFBQSxFQUNsQixJQUFNLFlBQVk7QUFBQSxFQUNsQixJQUFNLFdBQVc7QUFBQSxFQUNqQixJQUFNLGtCQUFrQjtBQUFBLEVBQ3hCLElBQU0saUJBQWlCO0FBQUEsRUFFdkIsSUFBTSxVQUFVO0FBQUEsS0FDYixTQUFTO0FBQUEsS0FDVCxTQUFTO0FBQUEsS0FDVCxTQUFTO0FBQUE7QUFBQSxLQUNULFNBQVM7QUFBQSxLQUNULFNBQVM7QUFBQSxLQUNULFlBQVk7QUFBQSxLQUNaLFlBQVk7QUFBQSxFQUNmO0FBQUEsRUFFQSxTQUFTLE9BQVEsQ0FBQyxJQUFJO0FBQUEsSUFDcEIsT0FBTyxNQUFNLFVBQVUsTUFBTTtBQUFBO0FBQUEsRUFFL0IsU0FBUyxPQUFRLENBQUMsSUFBSTtBQUFBLElBQ3BCLE9BQVEsTUFBTSxVQUFVLE1BQU0sVUFBWSxNQUFNLFVBQVUsTUFBTSxVQUFZLE1BQU0sVUFBVSxNQUFNO0FBQUE7QUFBQSxFQUVwRyxTQUFTLEtBQU0sQ0FBQyxJQUFJO0FBQUEsSUFDbEIsT0FBTyxPQUFPLFVBQVUsT0FBTztBQUFBO0FBQUEsRUFFakMsU0FBUyxPQUFRLENBQUMsSUFBSTtBQUFBLElBQ3BCLE9BQVEsTUFBTSxVQUFVLE1BQU07QUFBQTtBQUFBLEVBRWhDLFNBQVMscUJBQXNCLENBQUMsSUFBSTtBQUFBLElBQ2xDLE9BQVEsTUFBTSxVQUFVLE1BQU0sVUFDdEIsTUFBTSxVQUFVLE1BQU0sVUFDdEIsTUFBTSxVQUFVLE1BQU0sVUFDdkIsT0FBTyxhQUNQLE9BQU8sYUFDUCxPQUFPLGVBQ1AsT0FBTztBQUFBO0FBQUEsRUFFaEIsU0FBUyxnQkFBaUIsQ0FBQyxJQUFJO0FBQUEsSUFDN0IsT0FBUSxNQUFNLFVBQVUsTUFBTSxVQUN0QixNQUFNLFVBQVUsTUFBTSxVQUN0QixNQUFNLFVBQVUsTUFBTSxVQUN2QixPQUFPLGVBQ1AsT0FBTztBQUFBO0FBQUEsRUFFaEIsSUFBTSxRQUFRLE9BQU8sTUFBTTtBQUFBLEVBQzNCLElBQU0sWUFBWSxPQUFPLFVBQVU7QUFBQSxFQUVuQyxJQUFNLGlCQUFpQixPQUFPLFVBQVU7QUFBQSxFQUN4QyxJQUFNLGlCQUFpQixPQUFPO0FBQUEsRUFDOUIsSUFBTSxhQUFhLEVBQUMsY0FBYyxNQUFNLFlBQVksTUFBTSxVQUFVLE1BQU0sT0FBTyxVQUFTO0FBQUEsRUFFMUYsU0FBUyxNQUFPLENBQUMsS0FBSyxLQUFLO0FBQUEsSUFDekIsSUFBSSxlQUFlLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFBRyxPQUFPO0FBQUEsSUFDMUMsSUFBSSxRQUFRO0FBQUEsTUFBYSxlQUFlLEtBQUssYUFBYSxVQUFVO0FBQUEsSUFDcEUsT0FBTztBQUFBO0FBQUEsRUFHVCxJQUFNLGVBQWUsT0FBTyxjQUFjO0FBQUEsRUFDMUMsU0FBUyxXQUFZLEdBQUc7QUFBQSxJQUN0QixPQUFPLE9BQU8saUJBQWlCLENBQUMsR0FBRztBQUFBLE9BQ2hDLFFBQVEsRUFBQyxPQUFPLGFBQVk7QUFBQSxJQUMvQixDQUFDO0FBQUE7QUFBQSxFQUVILFNBQVMsYUFBYyxDQUFDLEtBQUs7QUFBQSxJQUMzQixJQUFJLFFBQVEsUUFBUSxPQUFRLFFBQVM7QUFBQSxNQUFVLE9BQU87QUFBQSxJQUN0RCxPQUFPLElBQUksV0FBVztBQUFBO0FBQUEsRUFHeEIsSUFBTSxRQUFRLE9BQU8sT0FBTztBQUFBLEVBQzVCLFNBQVMsS0FBTSxHQUFHO0FBQUEsSUFDaEIsT0FBTyxPQUFPLGlCQUFpQixDQUFDLEdBQUc7QUFBQSxPQUNoQyxRQUFRLEVBQUMsT0FBTyxNQUFLO0FBQUEsT0FDckIsWUFBWSxFQUFDLE9BQU8sT0FBTyxVQUFVLEtBQUk7QUFBQSxJQUM1QyxDQUFDO0FBQUE7QUFBQSxFQUVILFNBQVMsT0FBUSxDQUFDLEtBQUs7QUFBQSxJQUNyQixJQUFJLFFBQVEsUUFBUSxPQUFRLFFBQVM7QUFBQSxNQUFVLE9BQU87QUFBQSxJQUN0RCxPQUFPLElBQUksV0FBVztBQUFBO0FBQUEsRUFHeEIsSUFBTSxlQUFlLE9BQU8sY0FBYztBQUFBLEVBQzFDLElBQU0sY0FBYyxPQUFPLGFBQWE7QUFBQSxFQUN4QyxTQUFTLFVBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDekIsT0FBTyxPQUFPLGlCQUFpQixDQUFDLEdBQUc7QUFBQSxPQUNoQyxRQUFRLEVBQUMsT0FBTyxZQUFXO0FBQUEsT0FDM0IsZUFBZSxFQUFDLE9BQU8sS0FBSTtBQUFBLElBQzlCLENBQUM7QUFBQTtBQUFBLEVBRUgsU0FBUyxZQUFhLENBQUMsS0FBSztBQUFBLElBQzFCLElBQUksUUFBUSxRQUFRLE9BQVEsUUFBUztBQUFBLE1BQVUsT0FBTztBQUFBLElBQ3RELE9BQU8sSUFBSSxXQUFXO0FBQUE7QUFBQSxFQUd4QixJQUFNLE9BQU8sT0FBTyxNQUFNO0FBQUEsRUFDMUIsU0FBUyxJQUFLLEdBQUc7QUFBQSxJQUNmLE9BQU8sT0FBTyxpQkFBaUIsQ0FBQyxHQUFHO0FBQUEsT0FDaEMsUUFBUSxFQUFDLE9BQU8sS0FBSTtBQUFBLElBQ3ZCLENBQUM7QUFBQTtBQUFBLEVBRUgsU0FBUyxNQUFPLENBQUMsS0FBSztBQUFBLElBQ3BCLElBQUksUUFBUSxRQUFRLE9BQVEsUUFBUztBQUFBLE1BQVUsT0FBTztBQUFBLElBQ3RELE9BQU8sSUFBSSxXQUFXO0FBQUE7QUFBQSxFQUl4QixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsSUFDRixNQUFNLGNBQWMsS0FBSyx5QkFBeUI7QUFBQSxJQUNsRCxVQUFVLFlBQVk7QUFBQSxJQUN0QixPQUFPLEdBQUc7QUFBQSxFQUlaLElBQU0sV0FBVyxXQUFXO0FBQUE7QUFBQSxFQUU1QixNQUFNLFlBQVk7QUFBQSxJQUNoQixXQUFZLENBQUMsT0FBTztBQUFBLE1BQ2xCLElBQUk7QUFBQSxRQUNGLEtBQUssUUFBUSxPQUFPLE9BQU8sT0FBTyxJQUFJLEtBQUs7QUFBQSxRQUMzQyxPQUFPLEdBQUc7QUFBQSxRQUVWLEtBQUssUUFBUTtBQUFBO0FBQUEsTUFFZixPQUFPLGVBQWUsTUFBTSxPQUFPLEVBQUMsT0FBTyxRQUFPLENBQUM7QUFBQTtBQUFBLElBRXJELEtBQU0sR0FBRztBQUFBLE1BQ1AsT0FBTyxLQUFLLFVBQVU7QUFBQTtBQUFBLElBR3hCLFFBQVMsR0FBRztBQUFBLE1BQ1YsT0FBTyxPQUFPLEtBQUssS0FBSztBQUFBO0FBQUEsS0FHekIsU0FBVSxHQUFHO0FBQUEsTUFDWixPQUFPLFlBQVksS0FBSyxTQUFTO0FBQUE7QUFBQSxJQUVuQyxPQUFRLEdBQUc7QUFBQSxNQUNULE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFaEI7QUFBQSxFQUVBLElBQU0sVUFBVSxPQUFPLFNBQVM7QUFBQSxFQUNoQyxTQUFTLE9BQVEsQ0FBQyxPQUFPO0FBQUEsSUFDdkIsSUFBSSxNQUFNLE9BQU8sS0FBSztBQUFBLElBRXRCLElBQUksT0FBTyxHQUFHLEtBQUssRUFBRTtBQUFBLE1BQUcsTUFBTTtBQUFBLElBRTlCLElBQUksT0FBTyxXQUFXLE9BQU8sY0FBYyxHQUFHLEdBQUc7QUFBQSxNQUMvQyxPQUFPLElBQUksWUFBWSxLQUFLO0FBQUEsSUFDOUIsRUFBTztBQUFBLE1BRUwsT0FBTyxPQUFPLGlCQUFpQixJQUFJLE9BQU8sR0FBRyxHQUFHO0FBQUEsUUFDOUMsT0FBTyxFQUFDLE9BQU8sUUFBUyxHQUFHO0FBQUEsVUFBRSxPQUFPLE1BQU0sSUFBSTtBQUFBLFVBQUc7QUFBQSxTQUNoRCxRQUFRLEVBQUMsT0FBTyxRQUFPO0FBQUEsU0FDdkIsV0FBVyxFQUFDLE9BQU8sTUFBTSxhQUFhLFNBQVE7QUFBQSxNQUNqRCxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBR0wsU0FBUyxTQUFVLENBQUMsS0FBSztBQUFBLElBQ3ZCLElBQUksUUFBUSxRQUFRLE9BQVEsUUFBUztBQUFBLE1BQVUsT0FBTztBQUFBLElBQ3RELE9BQU8sSUFBSSxXQUFXO0FBQUE7QUFBQSxFQUd4QixJQUFNLFFBQVEsT0FBTyxPQUFPO0FBQUEsRUFDNUIsU0FBUyxLQUFNLENBQUMsT0FBTztBQUFBLElBRXJCLE9BQU8sT0FBTyxpQkFBaUIsSUFBSSxPQUFPLEtBQUssR0FBRztBQUFBLE9BQy9DLFFBQVEsRUFBQyxPQUFPLE1BQUs7QUFBQSxPQUNyQixXQUFXLEVBQUMsT0FBTyxNQUFNLFdBQVcsU0FBUTtBQUFBLElBQy9DLENBQUM7QUFBQTtBQUFBLEVBRUgsU0FBUyxPQUFRLENBQUMsS0FBSztBQUFBLElBQ3JCLElBQUksUUFBUSxRQUFRLE9BQVEsUUFBUztBQUFBLE1BQVUsT0FBTztBQUFBLElBQ3RELE9BQU8sSUFBSSxXQUFXO0FBQUE7QUFBQSxFQUd4QixTQUFTLFFBQVMsQ0FBQyxPQUFPO0FBQUEsSUFDeEIsTUFBTSxPQUFPLE9BQU87QUFBQSxJQUNwQixJQUFJLFNBQVMsVUFBVTtBQUFBLE1BRXJCLElBQUksVUFBVTtBQUFBLFFBQU0sT0FBTztBQUFBLE1BQzNCLElBQUksaUJBQWlCO0FBQUEsUUFBTSxPQUFPO0FBQUEsTUFFbEMsSUFBSSxTQUFTLE9BQU87QUFBQSxRQUNsQixRQUFRLE1BQU07QUFBQSxlQUNQO0FBQUEsWUFBYyxPQUFPO0FBQUEsZUFDckI7QUFBQSxZQUFhLE9BQU87QUFBQSxlQUVwQjtBQUFBLFlBQU8sT0FBTztBQUFBLGVBRWQ7QUFBQSxZQUFNLE9BQU87QUFBQSxlQUNiO0FBQUEsWUFBTyxPQUFPO0FBQUEsZUFDZDtBQUFBLFlBQVMsT0FBTztBQUFBO0FBQUEsTUFFekI7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUdULFNBQVMsZUFBZ0IsQ0FBQyxRQUFRO0FBQUE7QUFBQSxJQUNoQyxNQUFNLG1CQUFtQixPQUFPO0FBQUEsTUFDOUIsV0FBWSxHQUFHO0FBQUEsUUFDYixNQUFNO0FBQUEsUUFDTixLQUFLLE1BQU0sS0FBSyxNQUFNLE1BQU07QUFBQTtBQUFBLE1BSTlCLFdBQVksR0FBRztBQUFBLFFBQ2IsT0FBTyxLQUFLLFNBQVMsWUFBWSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsV0FBVyxLQUFLLFlBQVk7QUFBQTtBQUFBLE1BRXJHLFdBQVksR0FBRztBQUFBLFFBQ2IsT0FBTyxLQUFLLFNBQVMsT0FBTyxPQUFPLEtBQUssU0FBUyxVQUFVLEtBQUssU0FBUztBQUFBO0FBQUEsTUFHM0UsVUFBVyxHQUFHO0FBQUEsUUFDWixJQUFJLEtBQUssU0FBUyxPQUFPLEtBQUs7QUFBQSxVQUM1QixPQUFPO0FBQUEsUUFDVCxFQUFPLFNBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxVQUNsQyxPQUFPLEtBQUssS0FBSyxLQUFLLGdCQUFnQjtBQUFBLFFBQ3hDLEVBQU8sU0FBSSxLQUFLLFNBQVMsVUFBVTtBQUFBLFVBQ2pDLE9BQU8sS0FBSyxLQUFLLEtBQUssWUFBWTtBQUFBLFFBQ3BDLEVBQU8sU0FBSSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsV0FBVyxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ3hHLE9BQU87QUFBQSxRQUNULEVBQU8sU0FBSSxzQkFBc0IsS0FBSyxJQUFJLEdBQUc7QUFBQSxVQUMzQyxPQUFPLEtBQUssUUFBUSxLQUFLLG9CQUFvQjtBQUFBLFFBQy9DLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxzQkFBc0IsS0FBSyxPQUFPLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFNdEUsb0JBQXFCLEdBQUc7QUFBQSxRQUN0QixJQUFJLEtBQUssU0FBUyxXQUFXLEtBQUssU0FBUyxVQUFVLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDekUsT0FBTztBQUFBLFFBQ1QsRUFBTyxTQUFJLEtBQUssU0FBUyxVQUFVO0FBQUEsVUFDakMsT0FBTyxLQUFLLEtBQUssS0FBSyxZQUFZO0FBQUEsUUFDcEMsRUFBTyxTQUFJLEtBQUssU0FBUyxPQUFPLE9BQU8sS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUMzRCxPQUFPLEtBQUssT0FBTztBQUFBLFFBQ3JCLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSw2RUFBNkUsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUtqSCxvQkFBcUIsR0FBRztBQUFBLFFBQ3RCLE9BQU8sS0FBSyxRQUFRLEtBQUssYUFBYSxLQUFLLHFCQUFxQjtBQUFBO0FBQUEsTUFFbEUscUJBQXNCLENBQUMsSUFBSTtBQUFBLFFBQ3pCLElBQUksU0FBUyxLQUFLO0FBQUEsUUFDbEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxJQUFJO0FBQUEsUUFDMUIsU0FBUyxNQUFNLEdBQUcsS0FBSztBQUFBLFVBQ3JCLElBQUksT0FBTyxRQUFRLEVBQUUsT0FBTyxRQUFRLE9BQU8sR0FBRyxLQUFLLE9BQU8sSUFBSSxhQUFhO0FBQUEsWUFDekUsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLDZCQUE2QixDQUFDO0FBQUEsVUFDL0Q7QUFBQSxVQUNBLFNBQVMsT0FBTyxNQUFNLE9BQU8sT0FBTyxNQUFNO0FBQUEsUUFDNUM7QUFBQSxRQUNBLElBQUksT0FBTyxRQUFRLFFBQVEsR0FBRztBQUFBLFVBQzVCLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSw2QkFBNkIsQ0FBQztBQUFBLFFBQy9EO0FBQUEsUUFFQSxJQUFJLFVBQVUsR0FBRyxLQUFLLEtBQUssUUFBUSxHQUFHLEtBQUssR0FBRztBQUFBLFVBQzVDLE9BQU8sWUFBWSxHQUFHLE1BQU0sUUFBUTtBQUFBLFFBQ3RDLEVBQU87QUFBQSxVQUNMLE9BQU8sWUFBWSxHQUFHO0FBQUE7QUFBQSxRQUV4QixPQUFPLEtBQUssS0FBSyxLQUFLLG9CQUFvQjtBQUFBO0FBQUEsTUFJNUMsV0FBWSxHQUFHO0FBQUEsUUFDYixPQUFPLEtBQUssUUFBUSxLQUFLLGNBQWMsS0FBSyxtQkFBbUI7QUFBQTtBQUFBLE1BRWpFLG1CQUFvQixDQUFDLEtBQUs7QUFBQSxRQUN4QixJQUFJLEtBQUssTUFBTSxhQUFhO0FBQUEsVUFDMUIsS0FBSyxNQUFNLFlBQVksS0FBSyxHQUFHO0FBQUEsUUFDakMsRUFBTztBQUFBLFVBQ0wsS0FBSyxNQUFNLGNBQWMsQ0FBQyxHQUFHO0FBQUE7QUFBQSxRQUUvQixPQUFPLEtBQUssS0FBSyxLQUFLLHdCQUF3QjtBQUFBO0FBQUEsTUFFaEQsd0JBQXlCLEdBQUc7QUFBQSxRQUMxQixJQUFJLEtBQUssU0FBUyxhQUFhO0FBQUEsVUFDN0IsT0FBTyxLQUFLLEtBQUssS0FBSyx5QkFBeUI7QUFBQSxRQUNqRCxFQUFPLFNBQUksS0FBSyxTQUFTLFdBQVcsS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUN4RCxPQUFPLEtBQUssS0FBSyxLQUFLLGdCQUFnQjtBQUFBLFFBQ3hDO0FBQUE7QUFBQSxNQUVGLHlCQUEwQixHQUFHO0FBQUEsUUFDM0IsSUFBSSxLQUFLLFNBQVMsV0FBVyxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ2pELE9BQU8sS0FBSyxRQUFRLEtBQUssY0FBYyxLQUFLLG1CQUFtQjtBQUFBLFFBQ2pFO0FBQUE7QUFBQSxNQUdGLGdCQUFpQixHQUFHO0FBQUEsUUFDbEIsSUFBSSxLQUFLLFNBQVMsYUFBYTtBQUFBLFVBQzdCLE9BQU8sS0FBSyxLQUFLLEtBQUssbUJBQW1CO0FBQUEsUUFDM0MsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGlDQUFpQyxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BR3JFLG1CQUFvQixHQUFHO0FBQUEsUUFDckIsSUFBSSxLQUFLLFNBQVMsV0FBVyxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ2pELE9BQU87QUFBQSxRQUNULEVBQU87QUFBQSxVQUNMLE9BQU8sS0FBSyxRQUFRLEtBQUssWUFBWSxLQUFLLGlCQUFpQjtBQUFBO0FBQUE7QUFBQSxNQUcvRCxpQkFBa0IsQ0FBQyxPQUFPO0FBQUEsUUFDeEIsT0FBTyxLQUFLLFVBQVUsRUFBQyxLQUFLLEtBQUssTUFBTSxhQUFhLE1BQVksQ0FBQztBQUFBO0FBQUEsTUFJbkUsWUFBYSxHQUFHO0FBQUEsUUFDZCxHQUFHO0FBQUEsVUFDRCxJQUFJLEtBQUssU0FBUyxPQUFPLE9BQU8sS0FBSyxTQUFTLFFBQVE7QUFBQSxZQUNwRCxPQUFPLEtBQUssT0FBTztBQUFBLFVBQ3JCO0FBQUEsUUFDRixTQUFTLEtBQUssU0FBUztBQUFBO0FBQUEsTUFJekIsZ0JBQWlCLEdBQUc7QUFBQSxRQUNsQixJQUFJLEtBQUssU0FBUyxXQUFXO0FBQUEsVUFDM0IsS0FBSyxLQUFLLEtBQUssU0FBUztBQUFBLFFBQzFCLEVBQU87QUFBQSxVQUNMLE9BQU8sS0FBSyxLQUFLLEtBQUssVUFBVTtBQUFBO0FBQUE7QUFBQSxNQUtwQyxVQUFXLEdBQUc7QUFBQSxRQUNaLEtBQUssTUFBTSxLQUFLO0FBQUEsUUFDaEIsT0FBTyxLQUFLLEtBQUssS0FBSyxjQUFjO0FBQUE7QUFBQSxNQUV0QyxjQUFlLEdBQUc7QUFBQSxRQUNoQixJQUFJLEtBQUssU0FBUyxXQUFXLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDakQsT0FBTztBQUFBLFFBQ1QsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLFFBQVEsS0FBSyxjQUFjLEtBQUssY0FBYztBQUFBO0FBQUE7QUFBQSxNQUc5RCxjQUFlLENBQUMsU0FBUztBQUFBLFFBQ3ZCLElBQUksS0FBSyxTQUFTLFdBQVcsS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUNqRCxPQUFPO0FBQUEsUUFDVCxFQUFPLFNBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxVQUNsQyxJQUFJLE9BQU8sS0FBSyxLQUFLLE9BQU8sT0FBTyxRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLFNBQVMsYUFBYTtBQUFBLFlBQzlGLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSw2QkFBNkIsQ0FBQztBQUFBLFVBQy9ELEVBQU87QUFBQSxZQUNMLEtBQUssTUFBTSxLQUFLLElBQUksV0FBVyxLQUFLLElBQUksWUFBWSxNQUFNO0FBQUEsWUFDMUQsS0FBSyxJQUFJLGFBQWE7QUFBQTtBQUFBLFVBRXhCLE9BQU8sS0FBSyxLQUFLLEtBQUssb0JBQW9CO0FBQUEsUUFDNUMsRUFBTyxTQUFJLEtBQUssU0FBUyxhQUFhO0FBQUEsVUFDcEMsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLEdBQUc7QUFBQSxZQUM5QixLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsTUFBTTtBQUFBLFVBQ3ZDLEVBQU8sU0FBSSxRQUFRLEtBQUssSUFBSSxRQUFRLEdBQUc7QUFBQSxZQUNyQyxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUEsVUFDdEIsRUFBTyxTQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVEsR0FBRztBQUFBLFlBQ3BDLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxLQUFLLElBQUksU0FBUyxTQUFTO0FBQUEsVUFDMUQsRUFBTztBQUFBLFlBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLDZCQUE2QixDQUFDO0FBQUE7QUFBQSxVQUUvRCxPQUFPLEtBQUssS0FBSyxLQUFLLGNBQWM7QUFBQSxRQUN0QyxFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsbURBQW1ELENBQUM7QUFBQTtBQUFBO0FBQUEsTUFLdkYsU0FBVSxHQUFHO0FBQUEsUUFDWCxLQUFLLE1BQU0sS0FBSztBQUFBLFFBQ2hCLE9BQU8sS0FBSyxLQUFLLEtBQUssYUFBYTtBQUFBO0FBQUEsTUFFckMsYUFBYyxHQUFHO0FBQUEsUUFDZixJQUFJLEtBQUssU0FBUyxXQUFXLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDakQsT0FBTztBQUFBLFFBQ1QsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLFFBQVEsS0FBSyxjQUFjLEtBQUssYUFBYTtBQUFBO0FBQUE7QUFBQSxNQUc3RCxhQUFjLENBQUMsU0FBUztBQUFBLFFBQ3RCLElBQUksS0FBSyxTQUFTLFdBQVcsS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUNqRCxPQUFPO0FBQUEsUUFDVCxFQUFPLFNBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxVQUNsQyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sR0FBRztBQUFBLFlBQzlCLEtBQUssSUFBSSxXQUFXLEtBQUs7QUFBQSxVQUMzQjtBQUFBLFVBQ0EsSUFBSSxhQUFhLEtBQUssSUFBSSxRQUFRLEdBQUc7QUFBQSxZQUNuQyxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsOEJBQThCLENBQUM7QUFBQSxVQUNoRSxFQUFPLFNBQUksT0FBTyxLQUFLLElBQUksUUFBUSxHQUFHO0FBQUEsWUFDcEMsTUFBTSxPQUFPLE1BQU07QUFBQSxZQUNuQixLQUFLLElBQUksU0FBUyxLQUFLLElBQUk7QUFBQSxZQUMzQixLQUFLLE1BQU07QUFBQSxVQUNiLEVBQU87QUFBQSxZQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxnQ0FBZ0MsQ0FBQztBQUFBO0FBQUEsVUFFbEUsT0FBTyxLQUFLLEtBQUssS0FBSyxZQUFZO0FBQUEsUUFDcEMsRUFBTyxTQUFJLEtBQUssU0FBUyxhQUFhO0FBQUEsVUFDcEMsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLEdBQUc7QUFBQSxZQUM5QixLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsTUFBTTtBQUFBLFVBQ3ZDLEVBQU8sU0FBSSxhQUFhLEtBQUssSUFBSSxRQUFRLEdBQUc7QUFBQSxZQUMxQyxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsOEJBQThCLENBQUM7QUFBQSxVQUNoRSxFQUFPLFNBQUksY0FBYyxLQUFLLElBQUksUUFBUSxHQUFHO0FBQUEsWUFDM0MsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLDhCQUE4QixDQUFDO0FBQUEsVUFDaEUsRUFBTyxTQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVEsR0FBRztBQUFBLFlBQ3BDLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxLQUFLLElBQUksU0FBUyxTQUFTO0FBQUEsVUFDMUQsRUFBTyxTQUFJLFFBQVEsS0FBSyxJQUFJLFFBQVEsR0FBRztBQUFBLFlBQ3JDLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQSxVQUN0QixFQUFPO0FBQUEsWUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsZ0NBQWdDLENBQUM7QUFBQTtBQUFBLFVBRWxFLE9BQU8sS0FBSyxLQUFLLEtBQUssYUFBYTtBQUFBLFFBQ3JDLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxtREFBbUQsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUd2RixZQUFhLENBQUMsU0FBUztBQUFBLFFBQ3JCLElBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxVQUMzQixPQUFPLEtBQUssS0FBSyxLQUFLLG9CQUFvQjtBQUFBLFFBQzVDLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxtREFBbUQsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUt2RixVQUFXLEdBQUc7QUFBQSxRQUNaLElBQUksS0FBSyxTQUFTLE9BQU8sS0FBSztBQUFBLFVBQzVCLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxtQkFBbUIsQ0FBQztBQUFBLFFBQ3JELEVBQU8sU0FBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQ2xDLE9BQU8sS0FBSyxLQUFLLEtBQUssaUJBQWlCO0FBQUEsUUFDekM7QUFBQSxRQUFFLElBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxVQUM3QixPQUFPLEtBQUssS0FBSyxLQUFLLGlCQUFpQjtBQUFBLFFBQ3pDLEVBQU8sU0FBSSxLQUFLLFNBQVMsZUFBZSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQy9ELE9BQU8sS0FBSyxLQUFLLEtBQUssZUFBZTtBQUFBLFFBQ3ZDLEVBQU8sU0FBSSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQy9CLE9BQU8sS0FBSyxLQUFLLEtBQUssUUFBUTtBQUFBLFFBQ2hDLEVBQU8sU0FBSSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQy9CLE9BQU8sS0FBSyxLQUFLLEtBQUssUUFBUTtBQUFBLFFBQ2hDLEVBQU8sU0FBSSxRQUFRLEtBQUssSUFBSSxHQUFHO0FBQUEsVUFDN0IsT0FBTyxLQUFLLEtBQUssS0FBSyxxQkFBcUI7QUFBQSxRQUM3QyxFQUFPLFNBQUksS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUN2RCxPQUFPLEtBQUssS0FBSyxLQUFLLFlBQVk7QUFBQSxRQUNwQyxFQUFPLFNBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxVQUNsQyxPQUFPLEtBQUssS0FBSyxLQUFLLGlCQUFpQixLQUFLLFdBQVc7QUFBQSxRQUN6RCxFQUFPLFNBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxVQUNsQyxPQUFPLEtBQUssS0FBSyxLQUFLLGtCQUFrQixLQUFLLFdBQVc7QUFBQSxRQUMxRCxFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsaUdBQWlHLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHckksV0FBWSxDQUFDLE9BQU87QUFBQSxRQUNsQixPQUFPLEtBQUssVUFBVSxLQUFLO0FBQUE7QUFBQSxNQUc3QixRQUFTLEdBQUc7QUFBQSxRQUNWLElBQUksS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUN4QixPQUFPLEtBQUssS0FBSyxLQUFLLFNBQVM7QUFBQSxRQUNqQyxFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsd0RBQXdELENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHNUYsU0FBVSxHQUFHO0FBQUEsUUFDWCxJQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDeEIsSUFBSSxLQUFLLE1BQU0sUUFBUSxLQUFLO0FBQUEsWUFDMUIsT0FBTyxLQUFLLE9BQU8sU0FBUztBQUFBLFVBQzlCLEVBQU87QUFBQSxZQUNMLE9BQU8sS0FBSyxPQUFPLFFBQVE7QUFBQTtBQUFBLFFBRS9CLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSx3REFBd0QsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUk1RixRQUFTLEdBQUc7QUFBQSxRQUNWLElBQUksS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUN4QixPQUFPLEtBQUssS0FBSyxLQUFLLFNBQVM7QUFBQSxRQUNqQyxFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsc0NBQXNDLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHMUUsU0FBVSxHQUFHO0FBQUEsUUFDWCxJQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDeEIsT0FBTyxLQUFLLE9BQU8sR0FBRztBQUFBLFFBQ3hCLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxzQ0FBc0MsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUsxRSxZQUFhLEdBQUc7QUFBQSxRQUNkLElBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxVQUMzQixPQUFPLEtBQUssS0FBSyxLQUFLLGdCQUFnQjtBQUFBLFFBQ3hDLEVBQU8sU0FBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQ2xDLE9BQU8sS0FBSyxLQUFLLEtBQUssa0JBQWtCO0FBQUEsUUFDMUMsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLEtBQUssS0FBSyxZQUFZO0FBQUE7QUFBQTtBQUFBLE1BS3RDLFlBQWEsR0FBRztBQUFBLFFBQ2QsR0FBRztBQUFBLFVBQ0QsSUFBSSxLQUFLLFNBQVMsT0FBTyxLQUFLO0FBQUEsWUFDNUIsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHlCQUF5QixDQUFDO0FBQUEsVUFDM0QsRUFBTyxTQUFJLGlCQUFpQixLQUFLLElBQUksR0FBRztBQUFBLFlBQ3RDLEtBQUssUUFBUTtBQUFBLFVBQ2YsRUFBTyxTQUFJLEtBQUssTUFBTSxJQUFJLFdBQVcsR0FBRztBQUFBLFlBQ3RDLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxpQ0FBaUMsQ0FBQztBQUFBLFVBQ25FLEVBQU87QUFBQSxZQUNMLE9BQU8sS0FBSyxVQUFVO0FBQUE7QUFBQSxRQUUxQixTQUFTLEtBQUssU0FBUztBQUFBO0FBQUEsTUFJekIsaUJBQWtCLEdBQUc7QUFBQSxRQUNuQixJQUFJLEtBQUssU0FBUyxXQUFXO0FBQUEsVUFDM0IsT0FBTyxLQUFLLEtBQUssS0FBSyw0QkFBNEI7QUFBQSxRQUNwRCxFQUFPO0FBQUEsVUFDTCxPQUFPLEtBQUssS0FBSyxLQUFLLGtCQUFrQjtBQUFBO0FBQUE7QUFBQSxNQUc1QyxrQkFBbUIsR0FBRztBQUFBLFFBQ3BCLEdBQUc7QUFBQSxVQUNELElBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxZQUMzQixPQUFPLEtBQUssT0FBTztBQUFBLFVBQ3JCLEVBQU8sU0FBSSxLQUFLLFlBQVksR0FBRztBQUFBLFlBQzdCLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxxQkFBcUIsQ0FBQztBQUFBLFVBQ3ZELEVBQU8sU0FBSSxLQUFLLFNBQVMsWUFBYSxLQUFLLFFBQVEsc0JBQXNCLEtBQUssU0FBUyxRQUFTO0FBQUEsWUFDOUYsTUFBTSxLQUFLLHlCQUF5QjtBQUFBLFVBQ3RDLEVBQU87QUFBQSxZQUNMLEtBQUssUUFBUTtBQUFBO0FBQUEsUUFFakIsU0FBUyxLQUFLLFNBQVM7QUFBQTtBQUFBLE1BRXpCLDRCQUE2QixHQUFHO0FBQUEsUUFDOUIsSUFBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQzNCLE9BQU8sS0FBSyxLQUFLLEtBQUssdUJBQXVCO0FBQUEsUUFDL0MsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLFVBQVU7QUFBQTtBQUFBO0FBQUEsTUFHMUIsdUJBQXdCLEdBQUc7QUFBQSxRQUN6QixJQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDeEIsT0FBTztBQUFBLFFBQ1QsRUFBTyxTQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDL0IsT0FBTyxLQUFLLEtBQUssS0FBSyw4QkFBOEI7QUFBQSxRQUN0RCxFQUFPO0FBQUEsVUFDTCxPQUFPLEtBQUssS0FBSyxLQUFLLDhCQUE4QjtBQUFBO0FBQUE7QUFBQSxNQUd4RCw4QkFBK0IsR0FBRztBQUFBLFFBQ2hDLEdBQUc7QUFBQSxVQUNELElBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxZQUMzQixPQUFPLEtBQUssS0FBSyxLQUFLLG9CQUFvQjtBQUFBLFVBQzVDLEVBQU8sU0FBSSxLQUFLLFNBQVMsT0FBTyxLQUFLO0FBQUEsWUFDbkMsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGdDQUFnQyxDQUFDO0FBQUEsVUFDbEUsRUFBTyxTQUFJLEtBQUssU0FBUyxZQUFhLEtBQUssUUFBUSxzQkFBc0IsS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLFFBQVM7QUFBQSxZQUM5SSxNQUFNLEtBQUsseUJBQXlCO0FBQUEsVUFDdEMsRUFBTztBQUFBLFlBQ0wsS0FBSyxRQUFRO0FBQUE7QUFBQSxRQUVqQixTQUFTLEtBQUssU0FBUztBQUFBO0FBQUEsTUFFekIsb0JBQXFCLEdBQUc7QUFBQSxRQUN0QixJQUFJLEtBQUssU0FBUyxXQUFXO0FBQUEsVUFDM0IsT0FBTyxLQUFLLEtBQUssS0FBSyxxQkFBcUI7QUFBQSxRQUM3QyxFQUFPO0FBQUEsVUFDTCxLQUFLLE1BQU0sT0FBTztBQUFBLFVBQ2xCLE9BQU8sS0FBSyxLQUFLLEtBQUssOEJBQThCO0FBQUE7QUFBQTtBQUFBLE1BR3hELHFCQUFzQixHQUFHO0FBQUEsUUFDdkIsSUFBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQzNCLE9BQU8sS0FBSyxPQUFPO0FBQUEsUUFDckIsRUFBTztBQUFBLFVBQ0wsS0FBSyxNQUFNLE9BQU87QUFBQSxVQUNsQixPQUFPLEtBQUssS0FBSyxLQUFLLDhCQUE4QjtBQUFBO0FBQUE7QUFBQSxNQUt4RCxpQkFBa0IsR0FBRztBQUFBLFFBQ25CLElBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxVQUMzQixPQUFPLEtBQUssS0FBSyxLQUFLLHFCQUFxQjtBQUFBLFFBQzdDLEVBQU87QUFBQSxVQUNMLE9BQU8sS0FBSyxLQUFLLEtBQUssZ0JBQWdCO0FBQUE7QUFBQTtBQUFBLE1BRzFDLGdCQUFpQixHQUFHO0FBQUEsUUFDbEIsR0FBRztBQUFBLFVBQ0QsSUFBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFlBQzNCLE9BQU8sS0FBSyxLQUFLLEtBQUssYUFBYSxLQUFLLHVCQUF1QjtBQUFBLFVBQ2pFLEVBQU8sU0FBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFlBQ2xDLE9BQU8sS0FBSyxPQUFPO0FBQUEsVUFDckIsRUFBTyxTQUFJLEtBQUssWUFBWSxHQUFHO0FBQUEsWUFDN0IsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHFCQUFxQixDQUFDO0FBQUEsVUFDdkQsRUFBTyxTQUFJLEtBQUssU0FBUyxZQUFhLEtBQUssUUFBUSxzQkFBc0IsS0FBSyxTQUFTLFFBQVM7QUFBQSxZQUM5RixNQUFNLEtBQUsseUJBQXlCO0FBQUEsVUFDdEMsRUFBTztBQUFBLFlBQ0wsS0FBSyxRQUFRO0FBQUE7QUFBQSxRQUVqQixTQUFTLEtBQUssU0FBUztBQUFBO0FBQUEsTUFFekIsdUJBQXdCLENBQUMsYUFBYTtBQUFBLFFBQ3BDLEtBQUssTUFBTSxPQUFPO0FBQUEsUUFDbEIsT0FBTyxLQUFLLEtBQUssS0FBSyxnQkFBZ0I7QUFBQTtBQUFBLE1BRXhDLHFCQUFzQixHQUFHO0FBQUEsUUFDdkIsSUFBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQzNCLE9BQU8sS0FBSyxLQUFLLEtBQUssZ0JBQWdCO0FBQUEsUUFDeEMsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLFVBQVU7QUFBQTtBQUFBO0FBQUEsTUFHMUIsZ0JBQWlCLEdBQUc7QUFBQSxRQUNsQixJQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDeEIsT0FBTztBQUFBLFFBQ1QsRUFBTyxTQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDL0IsT0FBTyxLQUFLLEtBQUssS0FBSyx1QkFBdUI7QUFBQSxRQUMvQyxFQUFPO0FBQUEsVUFDTCxPQUFPLEtBQUssS0FBSyxLQUFLLHVCQUF1QjtBQUFBO0FBQUE7QUFBQSxNQUdqRCx1QkFBd0IsR0FBRztBQUFBLFFBQ3pCLEdBQUc7QUFBQSxVQUNELElBQUksS0FBSyxTQUFTLFdBQVc7QUFBQSxZQUMzQixPQUFPLEtBQUssS0FBSyxLQUFLLGtCQUFrQixLQUFLLDRCQUE0QjtBQUFBLFVBQzNFLEVBQU8sU0FBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFlBQ2xDLE9BQU8sS0FBSyxLQUFLLEtBQUssYUFBYTtBQUFBLFVBQ3JDLEVBQU8sU0FBSSxLQUFLLFNBQVMsT0FBTyxLQUFLO0FBQUEsWUFDbkMsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGdDQUFnQyxDQUFDO0FBQUEsVUFDbEUsRUFBTyxTQUFJLEtBQUssU0FBUyxZQUFhLEtBQUssUUFBUSxzQkFBc0IsS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLFFBQVM7QUFBQSxZQUM5SSxNQUFNLEtBQUsseUJBQXlCO0FBQUEsVUFDdEMsRUFBTztBQUFBLFlBQ0wsS0FBSyxRQUFRO0FBQUE7QUFBQSxRQUVqQixTQUFTLEtBQUssU0FBUztBQUFBO0FBQUEsTUFFekIsd0JBQXlCLEdBQUc7QUFBQSxRQUMxQixJQUFJLGNBQWM7QUFBQSxRQUNsQixJQUFJLEtBQUssT0FBTyxJQUFJO0FBQUEsVUFDbEIsZUFBZTtBQUFBLFFBQ2pCO0FBQUEsUUFDQSxlQUFlLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFBQSxRQUVwQyxPQUFPLEtBQUssTUFBTSxJQUFJLFVBQVUsOEVBQThFLHFCQUFxQixDQUFDO0FBQUE7QUFBQSxNQUV0SSw0QkFBNkIsQ0FBQyxhQUFhO0FBQUEsUUFDekMsS0FBSyxNQUFNLE9BQU87QUFBQSxRQUNsQixPQUFPLEtBQUssS0FBSyxLQUFLLHVCQUF1QjtBQUFBO0FBQUEsTUFFL0MsYUFBYyxHQUFHO0FBQUEsUUFDZixJQUFJLEtBQUssU0FBUyxXQUFXO0FBQUEsVUFDM0IsT0FBTyxLQUFLLEtBQUssS0FBSyxjQUFjO0FBQUEsUUFDdEMsRUFBTztBQUFBLFVBQ0wsS0FBSyxNQUFNLE9BQU87QUFBQSxVQUNsQixPQUFPLEtBQUssS0FBSyxLQUFLLHVCQUF1QjtBQUFBO0FBQUE7QUFBQSxNQUdqRCxjQUFlLEdBQUc7QUFBQSxRQUNoQixJQUFJLEtBQUssU0FBUyxXQUFXO0FBQUEsVUFDM0IsT0FBTyxLQUFLLE9BQU87QUFBQSxRQUNyQixFQUFPO0FBQUEsVUFDTCxLQUFLLE1BQU0sT0FBTztBQUFBLFVBQ2xCLE9BQU8sS0FBSyxLQUFLLEtBQUssdUJBQXVCO0FBQUE7QUFBQTtBQUFBLE1BR2pELGdCQUFpQixHQUFHO0FBQUEsUUFDbEIsSUFBSSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ2hELE9BQU8sS0FBSyxLQUFLLEtBQUssY0FBYztBQUFBLFFBQ3RDLEVBQU8sU0FBSSxLQUFLLFNBQVMsV0FBVyxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ3hELE9BQU8sS0FBSyxLQUFLLEtBQUssaUJBQWlCO0FBQUEsUUFDekMsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLEtBQUssS0FBSyxXQUFXO0FBQUE7QUFBQTtBQUFBLE1BR3JDLGlCQUFrQixHQUFHO0FBQUEsUUFDbkIsSUFBSSxLQUFLLFNBQVMsV0FBVyxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ2pELE9BQU87QUFBQSxRQUNULEVBQU8sU0FBSSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ3ZELE9BQU8sS0FBSyxLQUFLLEtBQUssY0FBYztBQUFBLFFBQ3RDLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSx5QkFBeUIsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUc3RCxjQUFlLEdBQUc7QUFBQSxRQUVoQixJQUFJLEtBQUssU0FBUyxVQUFVLEtBQUssU0FBUyxXQUFXLEtBQUssU0FBUyxVQUFVLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDakcsT0FBTztBQUFBLFFBQ1QsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLFVBQVU7QUFBQTtBQUFBO0FBQUEsTUFHMUIsV0FBWSxHQUFHO0FBQUEsUUFDYixJQUFJLEtBQUssUUFBUSxTQUFTO0FBQUEsVUFDeEIsT0FBTyxLQUFLLE9BQU8sUUFBUSxLQUFLLEtBQUs7QUFBQSxRQUN2QyxFQUFPLFNBQUksS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUMvQixPQUFPLEtBQUssS0FBSyxLQUFLLG1CQUFtQixLQUFLLGtCQUFrQjtBQUFBLFFBQ2xFLEVBQU8sU0FBSSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQy9CLE9BQU8sS0FBSyxLQUFLLEtBQUssbUJBQW1CLEtBQUssa0JBQWtCO0FBQUEsUUFDbEUsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLCtCQUErQixLQUFLLElBQUksQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUc1RSxrQkFBbUIsQ0FBQyxNQUFNO0FBQUEsUUFDeEIsSUFBSTtBQUFBLFVBQ0YsTUFBTSxZQUFZLFNBQVMsTUFBTSxFQUFFO0FBQUEsVUFDbkMsSUFBSSxhQUFhLG1CQUFtQixhQUFhLGdCQUFnQjtBQUFBLFlBQy9ELE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxpRUFBaUUsQ0FBQztBQUFBLFVBQ25HO0FBQUEsVUFDQSxPQUFPLEtBQUssVUFBVSxPQUFPLGNBQWMsU0FBUyxDQUFDO0FBQUEsVUFDckQsT0FBTyxLQUFLO0FBQUEsVUFDWixNQUFNLEtBQUssTUFBTSxVQUFVLEtBQUssR0FBRyxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BR3hDLGlCQUFrQixHQUFHO0FBQUEsUUFDbkIsS0FBSyxRQUFRLEtBQUssSUFBSSxHQUFHO0FBQUEsVUFDdkIsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHFEQUFxRCxDQUFDO0FBQUEsUUFDdkYsRUFBTztBQUFBLFVBQ0wsS0FBSyxRQUFRO0FBQUEsVUFDYixJQUFJLEtBQUssTUFBTSxJQUFJLFVBQVU7QUFBQSxZQUFHLE9BQU8sS0FBSyxPQUFPO0FBQUE7QUFBQTtBQUFBLE1BR3ZELGlCQUFrQixHQUFHO0FBQUEsUUFDbkIsS0FBSyxRQUFRLEtBQUssSUFBSSxHQUFHO0FBQUEsVUFDdkIsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHFEQUFxRCxDQUFDO0FBQUEsUUFDdkYsRUFBTztBQUFBLFVBQ0wsS0FBSyxRQUFRO0FBQUEsVUFDYixJQUFJLEtBQUssTUFBTSxJQUFJLFVBQVU7QUFBQSxZQUFHLE9BQU8sS0FBSyxPQUFPO0FBQUE7QUFBQTtBQUFBLE1BS3ZELGVBQWdCLEdBQUc7QUFBQSxRQUNqQixLQUFLLFFBQVE7QUFBQSxRQUNiLE9BQU8sS0FBSyxLQUFLLEtBQUssd0JBQXdCO0FBQUE7QUFBQSxNQUVoRCx3QkFBeUIsR0FBRztBQUFBLFFBQzFCLElBQUksS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUN4QixPQUFPLEtBQUssS0FBSyxLQUFLLFFBQVE7QUFBQSxRQUNoQyxFQUFPLFNBQUksS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUMvQixPQUFPLEtBQUssS0FBSyxLQUFLLFFBQVE7QUFBQSxRQUNoQyxFQUFPO0FBQUEsVUFDTCxPQUFPLEtBQUssUUFBUSxLQUFLLGNBQWMsS0FBSyx1QkFBdUI7QUFBQTtBQUFBO0FBQUEsTUFHdkUsdUJBQXdCLEdBQUc7QUFBQSxRQUN6QixJQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDeEIsS0FBSyxRQUFRO0FBQUEsVUFDYixPQUFPLEtBQUssS0FBSyxLQUFLLG1DQUFtQztBQUFBLFFBQzNELEVBQU87QUFBQSxVQUNMLE9BQU8sS0FBSyxLQUFLLEtBQUssa0JBQWtCO0FBQUE7QUFBQTtBQUFBLE1BRzVDLG1DQUFvQyxHQUFHO0FBQUEsUUFDckMsSUFBSSxLQUFLLFNBQVMsYUFBYTtBQUFBLFVBQzdCLEtBQUssUUFBUTtBQUFBLFVBQ2IsT0FBTyxLQUFLLEtBQUssS0FBSyxjQUFjLEtBQUssZ0JBQWdCO0FBQUEsUUFDM0QsRUFBTyxTQUFJLEtBQUssU0FBUyxVQUFVLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDdkQsS0FBSyxRQUFRO0FBQUEsVUFDYixPQUFPLEtBQUssS0FBSyxLQUFLLHVCQUF1QjtBQUFBLFFBQy9DLEVBQU87QUFBQSxVQUNMLE9BQU8sS0FBSyxVQUFVLFFBQVEsS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUdqRCxrQkFBbUIsR0FBRztBQUFBLFFBQ3BCLElBQUksUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQ3RCLEtBQUssUUFBUTtBQUFBLFFBQ2YsRUFBTyxTQUFJLEtBQUssU0FBUyxhQUFhO0FBQUEsVUFDcEMsT0FBTyxLQUFLLEtBQUssS0FBSyxZQUFZO0FBQUEsUUFDcEMsRUFBTyxTQUFJLEtBQUssU0FBUyxVQUFVLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDdkQsS0FBSyxRQUFRO0FBQUEsVUFDYixPQUFPLEtBQUssS0FBSyxLQUFLLHVCQUF1QjtBQUFBLFFBQy9DLEVBQU8sU0FBSSxLQUFLLFNBQVMsYUFBYTtBQUFBLFVBQ3BDLEtBQUssUUFBUTtBQUFBLFVBQ2IsT0FBTyxLQUFLLEtBQUssS0FBSyxjQUFjLEtBQUssZ0JBQWdCO0FBQUEsUUFDM0QsRUFBTztBQUFBLFVBQ0wsTUFBTSxTQUFTLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFBQSxVQUVyQyxJQUFJLE9BQU8sTUFBTSxHQUFHO0FBQUEsWUFDbEIsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGdCQUFnQixDQUFDO0FBQUEsVUFDbEQsRUFBTztBQUFBLFlBQ0wsT0FBTyxLQUFLLFVBQVUsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSWxDLFlBQWEsR0FBRztBQUFBLFFBQ2QsSUFBSSxLQUFLLFNBQVMsZUFBZSxLQUFLLFNBQVMsZUFBZSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQzFHLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxzQ0FBc0MsQ0FBQztBQUFBLFFBQ3hFLEVBQU8sU0FBSSxLQUFLLFlBQVksR0FBRztBQUFBLFVBQzdCLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxtQkFBbUIsQ0FBQztBQUFBLFFBQ3JEO0FBQUEsUUFDQSxPQUFPLEtBQUssVUFBVTtBQUFBO0FBQUEsTUFFeEIsNEJBQTZCLEdBQUc7QUFBQSxRQUM5QixJQUFJLEtBQUssU0FBUyxlQUFlLEtBQUssU0FBUyxhQUFhO0FBQUEsVUFDMUQsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHNDQUFzQyxDQUFDO0FBQUEsUUFDeEUsRUFBTyxTQUFJLEtBQUssWUFBWSxHQUFHO0FBQUEsVUFDN0IsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLG1CQUFtQixDQUFDO0FBQUEsUUFDckQ7QUFBQSxRQUNBLE9BQU8sS0FBSyxVQUFVO0FBQUE7QUFBQSxNQUV4QixnQkFBaUIsR0FBRztBQUFBLFFBQ2xCLElBQUksS0FBSyxTQUFTLGFBQWE7QUFBQSxVQUM3QixPQUFPLEtBQUssS0FBSyxLQUFLLGNBQWMsS0FBSyxnQkFBZ0I7QUFBQSxRQUMzRCxFQUFPLFNBQUksUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQzdCLEtBQUssUUFBUTtBQUFBLFFBQ2YsRUFBTyxTQUFJLEtBQUssU0FBUyxVQUFVLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDdkQsS0FBSyxRQUFRO0FBQUEsVUFDYixPQUFPLEtBQUssS0FBSyxLQUFLLHVCQUF1QjtBQUFBLFFBQy9DLEVBQU87QUFBQSxVQUNMLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUcvQyx1QkFBd0IsR0FBRztBQUFBLFFBQ3pCLElBQUksUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQ3RCLE9BQU8sS0FBSyxLQUFLLEtBQUssbUJBQW1CO0FBQUEsUUFDM0MsRUFBTyxTQUFJLEtBQUssU0FBUyxlQUFlLEtBQUssU0FBUyxXQUFXO0FBQUEsVUFDL0QsS0FBSyxRQUFRO0FBQUEsVUFDYixLQUFLLEtBQUssS0FBSyxjQUFjLEtBQUssbUJBQW1CO0FBQUEsUUFDdkQsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLDhDQUE4QyxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BR2xGLG1CQUFvQixHQUFHO0FBQUEsUUFDckIsSUFBSSxRQUFRLEtBQUssSUFBSSxHQUFHO0FBQUEsVUFDdEIsS0FBSyxRQUFRO0FBQUEsUUFDZixFQUFPLFNBQUksS0FBSyxTQUFTLGFBQWE7QUFBQSxVQUNwQyxPQUFPLEtBQUssS0FBSyxLQUFLLFlBQVk7QUFBQSxRQUNwQyxFQUFPO0FBQUEsVUFDTCxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssTUFBTSxHQUFHLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFLL0MscUJBQXNCLEdBQUc7QUFBQSxRQUN2QixJQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDeEIsS0FBSyxRQUFRO0FBQUEsVUFDYixPQUFPLEtBQUssS0FBSyxLQUFLLHlCQUF5QjtBQUFBLFFBQ2pELEVBQU87QUFBQSxVQUNMLE9BQU8sS0FBSyxLQUFLLEtBQUsseUJBQXlCO0FBQUE7QUFBQTtBQUFBLE1BR25ELHlCQUEwQixHQUFHO0FBQUEsUUFFM0IsSUFBSSxLQUFLLFNBQVMsYUFBYTtBQUFBLFVBQzdCLE9BQU8sS0FBSyxLQUFLLEtBQUssY0FBYyxLQUFLLGtCQUFrQjtBQUFBLFFBQzdELEVBQU8sU0FBSSxRQUFRLEtBQUssSUFBSSxHQUFHO0FBQUEsVUFDN0IsS0FBSyxRQUFRO0FBQUEsVUFDYixJQUFJLEtBQUssTUFBTSxJQUFJLFNBQVM7QUFBQSxZQUFHLEtBQUssS0FBSyxLQUFLLGtCQUFrQjtBQUFBLFFBQ2xFLEVBQU8sU0FBSSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ3ZELEtBQUssUUFBUTtBQUFBLFVBQ2IsT0FBTyxLQUFLLEtBQUssS0FBSyx1QkFBdUI7QUFBQSxRQUMvQyxFQUFPLFNBQUksS0FBSyxTQUFTLGFBQWE7QUFBQSxVQUNwQyxLQUFLLFFBQVE7QUFBQSxVQUNiLE9BQU8sS0FBSyxLQUFLLEtBQUssY0FBYyxLQUFLLGdCQUFnQjtBQUFBLFFBQzNELEVBQU8sU0FBSSxLQUFLLFNBQVMsYUFBYTtBQUFBLFVBQ3BDLE9BQU8sS0FBSyxLQUFLLEtBQUssYUFBYTtBQUFBLFFBQ3JDLEVBQU8sU0FBSSxLQUFLLFNBQVMsWUFBWTtBQUFBLFVBQ25DLE9BQU8sS0FBSyxLQUFLLEtBQUssaUJBQWlCO0FBQUEsUUFDekMsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLFVBQVUsUUFBUSxLQUFLLE1BQU0sR0FBRyxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BR2pELGlCQUFrQixHQUFHO0FBQUEsUUFDbkIsSUFBSSxLQUFLLE1BQU0sSUFBSSxTQUFTLEdBQUc7QUFBQSxVQUM3QixJQUFJLFFBQVEsS0FBSyxJQUFJLEdBQUc7QUFBQSxZQUN0QixPQUFPLEtBQUssUUFBUTtBQUFBLFVBQ3RCLEVBQU8sU0FBSSxLQUFLLFNBQVMsWUFBWTtBQUFBLFlBQ25DLE9BQU8sS0FBSyxLQUFLLEtBQUssaUJBQWlCO0FBQUEsVUFDekMsRUFBTztBQUFBLFlBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGtEQUFrRCxDQUFDO0FBQUE7QUFBQSxRQUV0RixFQUFPO0FBQUEsVUFDTCxJQUFJLEtBQUssU0FBUyxhQUFhO0FBQUEsWUFDN0IsT0FBTyxLQUFLLEtBQUssS0FBSyxhQUFhO0FBQUEsVUFDckMsRUFBTztBQUFBLFlBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHFEQUFxRCxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJM0YseUJBQTBCLEdBQUc7QUFBQSxRQUMzQixJQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDeEIsS0FBSyxRQUFRO0FBQUEsVUFDYixPQUFPLEtBQUssS0FBSyxLQUFLLDhCQUE4QixLQUFLLGVBQWU7QUFBQSxRQUMxRSxFQUFPLFNBQUksS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUMvQixLQUFLLFFBQVE7QUFBQSxVQUNiLE9BQU8sS0FBSyxLQUFLLEtBQUssOEJBQThCLEtBQUssZUFBZTtBQUFBLFFBQzFFLEVBQU8sU0FBSSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQy9CLEtBQUssUUFBUTtBQUFBLFVBQ2IsT0FBTyxLQUFLLEtBQUssS0FBSyw4QkFBOEIsS0FBSyxlQUFlO0FBQUEsUUFDMUUsRUFBTyxTQUFJLEtBQUssU0FBUyxhQUFhO0FBQUEsVUFDcEMsT0FBTyxLQUFLLEtBQUssS0FBSyxrQkFBa0I7QUFBQSxRQUMxQyxFQUFPLFNBQUksUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQzdCLE9BQU8sS0FBSyxLQUFLLEtBQUssaUJBQWlCO0FBQUEsUUFDekMsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLFVBQVUsUUFBUSxLQUFLLE1BQU0sR0FBRyxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BR2pELGVBQWdCLEdBQUc7QUFBQSxRQUNqQixJQUFJLFFBQVEsS0FBSyxJQUFJLEdBQUc7QUFBQSxVQUN0QixLQUFLLFFBQVE7QUFBQSxRQUNmLEVBQU8sU0FBSSxLQUFLLFNBQVMsYUFBYTtBQUFBLFVBQ3BDLE9BQU8sS0FBSyxLQUFLLEtBQUssNEJBQTRCO0FBQUEsUUFDcEQsRUFBTztBQUFBLFVBQ0wsTUFBTSxTQUFTLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFBQSxVQUVyQyxJQUFJLE9BQU8sTUFBTSxHQUFHO0FBQUEsWUFDbEIsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGdCQUFnQixDQUFDO0FBQUEsVUFDbEQsRUFBTztBQUFBLFlBQ0wsT0FBTyxLQUFLLFVBQVUsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSWxDLGVBQWdCLEdBQUc7QUFBQSxRQUNqQixJQUFJLFFBQVEsS0FBSyxJQUFJLEdBQUc7QUFBQSxVQUN0QixLQUFLLFFBQVE7QUFBQSxRQUNmLEVBQU8sU0FBSSxLQUFLLFNBQVMsYUFBYTtBQUFBLFVBQ3BDLE9BQU8sS0FBSyxLQUFLLEtBQUssNEJBQTRCO0FBQUEsUUFDcEQsRUFBTztBQUFBLFVBQ0wsTUFBTSxTQUFTLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFBQSxVQUVyQyxJQUFJLE9BQU8sTUFBTSxHQUFHO0FBQUEsWUFDbEIsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGdCQUFnQixDQUFDO0FBQUEsVUFDbEQsRUFBTztBQUFBLFlBQ0wsT0FBTyxLQUFLLFVBQVUsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSWxDLGVBQWdCLEdBQUc7QUFBQSxRQUNqQixJQUFJLE1BQU0sS0FBSyxJQUFJLEdBQUc7QUFBQSxVQUNwQixLQUFLLFFBQVE7QUFBQSxRQUNmLEVBQU8sU0FBSSxLQUFLLFNBQVMsYUFBYTtBQUFBLFVBQ3BDLE9BQU8sS0FBSyxLQUFLLEtBQUssNEJBQTRCO0FBQUEsUUFDcEQsRUFBTztBQUFBLFVBQ0wsTUFBTSxTQUFTLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFBQSxVQUVyQyxJQUFJLE9BQU8sTUFBTSxHQUFHO0FBQUEsWUFDbEIsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGdCQUFnQixDQUFDO0FBQUEsVUFDbEQsRUFBTztBQUFBLFlBQ0wsT0FBTyxLQUFLLFVBQVUsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BTWxDLGFBQWMsR0FBRztBQUFBLFFBRWYsSUFBSSxLQUFLLE1BQU0sSUFBSSxTQUFTLEdBQUc7QUFBQSxVQUM3QixNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsNkRBQTZELENBQUM7QUFBQSxRQUMvRjtBQUFBLFFBQ0EsS0FBSyxNQUFNLFNBQVMsS0FBSyxNQUFNO0FBQUEsUUFDL0IsS0FBSyxNQUFNLE1BQU07QUFBQSxRQUNqQixPQUFPLEtBQUssS0FBSyxLQUFLLGNBQWM7QUFBQTtBQUFBLE1BRXRDLGNBQWUsR0FBRztBQUFBLFFBQ2hCLElBQUksS0FBSyxTQUFTLGFBQWE7QUFBQSxVQUM3QixJQUFJLEtBQUssTUFBTSxJQUFJLFNBQVMsR0FBRztBQUFBLFlBQzdCLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSwyREFBMkQsQ0FBQztBQUFBLFVBQzdGO0FBQUEsVUFDQSxLQUFLLE1BQU0sVUFBVSxNQUFNLEtBQUssTUFBTTtBQUFBLFVBQ3RDLEtBQUssTUFBTSxNQUFNO0FBQUEsVUFDakIsT0FBTyxLQUFLLEtBQUssS0FBSyxZQUFZO0FBQUEsUUFDcEMsRUFBTyxTQUFJLFFBQVEsS0FBSyxJQUFJLEdBQUc7QUFBQSxVQUM3QixLQUFLLFFBQVE7QUFBQSxRQUNmLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxxQkFBcUIsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUd6RCxZQUFhLEdBQUc7QUFBQSxRQUNkLElBQUksS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLFNBQVM7QUFBQSxVQUNqRCxJQUFJLEtBQUssTUFBTSxJQUFJLFNBQVMsR0FBRztBQUFBLFlBQzdCLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSx5REFBeUQsQ0FBQztBQUFBLFVBQzNGO0FBQUEsVUFDQSxLQUFLLE1BQU0sVUFBVSxNQUFNLEtBQUssTUFBTTtBQUFBLFVBQ3RDLEtBQUssTUFBTSxNQUFNO0FBQUEsVUFDakIsT0FBTyxLQUFLLEtBQUssS0FBSyxrQkFBa0I7QUFBQSxRQUMxQyxFQUFPLFNBQUksS0FBSyxZQUFZLEdBQUc7QUFBQSxVQUM3QixPQUFPLEtBQUssVUFBVSxXQUFXLEtBQUssTUFBTSxTQUFTLE1BQU0sS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBLFFBQzVFLEVBQU8sU0FBSSxRQUFRLEtBQUssSUFBSSxHQUFHO0FBQUEsVUFDN0IsS0FBSyxRQUFRO0FBQUEsUUFDZixFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUscUJBQXFCLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHekQsa0JBQW1CLEdBQUc7QUFBQSxRQUNwQixJQUFJLEtBQUssWUFBWSxHQUFHO0FBQUEsVUFDdEIsT0FBTyxLQUFLLFVBQVUsV0FBVyxLQUFLLE1BQU0sTUFBTSxDQUFDO0FBQUEsUUFDckQsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLEtBQUssS0FBSyxhQUFhO0FBQUE7QUFBQTtBQUFBLE1BR3ZDLGFBQWMsR0FBRztBQUFBLFFBQ2YsSUFBSSxLQUFLLFNBQVMsWUFBWTtBQUFBLFVBQzVCLElBQUksS0FBSyxNQUFNLElBQUksU0FBUyxHQUFHO0FBQUEsWUFDN0IsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLDBEQUEwRCxDQUFDO0FBQUEsVUFDNUY7QUFBQSxVQUNBLEtBQUssTUFBTSxVQUFVLE1BQU0sS0FBSyxNQUFNO0FBQUEsVUFDdEMsS0FBSyxNQUFNLE1BQU07QUFBQSxVQUNqQixPQUFPLEtBQUssS0FBSyxLQUFLLFlBQVk7QUFBQSxRQUNwQyxFQUFPLFNBQUksUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQzdCLEtBQUssUUFBUTtBQUFBLFFBQ2YsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHFCQUFxQixDQUFDO0FBQUE7QUFBQTtBQUFBLE1BR3pELFlBQWEsR0FBRztBQUFBLFFBQ2QsSUFBSSxLQUFLLE1BQU0sSUFBSSxTQUFTLEtBQUssUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQ25ELEtBQUssUUFBUTtBQUFBLFFBQ2YsRUFBTyxTQUFJLEtBQUssTUFBTSxJQUFJLFdBQVcsS0FBSyxLQUFLLFNBQVMsWUFBWTtBQUFBLFVBQ2xFLEtBQUssTUFBTSxVQUFVLE1BQU0sS0FBSyxNQUFNO0FBQUEsVUFDdEMsS0FBSyxNQUFNLE1BQU07QUFBQSxVQUNqQixPQUFPLEtBQUssS0FBSyxLQUFLLFlBQVk7QUFBQSxRQUNwQyxFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUscUJBQXFCLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHekQsWUFBYSxHQUFHO0FBQUEsUUFDZCxJQUFJLFFBQVEsS0FBSyxJQUFJLEdBQUc7QUFBQSxVQUN0QixLQUFLLFFBQVE7QUFBQSxVQUNiLElBQUksS0FBSyxNQUFNLElBQUksV0FBVyxHQUFHO0FBQUEsWUFDL0IsS0FBSyxNQUFNLFVBQVUsTUFBTSxLQUFLLE1BQU07QUFBQSxZQUN0QyxLQUFLLE1BQU0sTUFBTTtBQUFBLFlBQ2pCLE9BQU8sS0FBSyxLQUFLLEtBQUssdUJBQXVCO0FBQUEsVUFDL0M7QUFBQSxRQUNGLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxxQkFBcUIsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUl6RCxpQkFBa0IsR0FBRztBQUFBLFFBRW5CLElBQUksS0FBSyxTQUFTLFlBQVk7QUFBQSxVQUM1QixJQUFJLEtBQUssTUFBTSxJQUFJLFNBQVMsR0FBRztBQUFBLFlBQzdCLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSwwREFBMEQsQ0FBQztBQUFBLFVBQzVGO0FBQUEsVUFDQSxLQUFLLE1BQU0sU0FBUyxLQUFLLE1BQU07QUFBQSxVQUMvQixLQUFLLE1BQU0sTUFBTTtBQUFBLFVBQ2pCLE9BQU8sS0FBSyxLQUFLLEtBQUssZ0JBQWdCO0FBQUEsUUFDeEMsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGlCQUFpQixDQUFDO0FBQUE7QUFBQTtBQUFBLE1BR3JELGdCQUFpQixHQUFHO0FBQUEsUUFDbEIsSUFBSSxLQUFLLE1BQU0sSUFBSSxTQUFTLEtBQUssUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQ25ELEtBQUssUUFBUTtBQUFBLFFBQ2YsRUFBTyxTQUFJLEtBQUssTUFBTSxJQUFJLFdBQVcsS0FBSyxLQUFLLFNBQVMsWUFBWTtBQUFBLFVBQ2xFLEtBQUssTUFBTSxVQUFVLE1BQU0sS0FBSyxNQUFNO0FBQUEsVUFDdEMsS0FBSyxNQUFNLE1BQU07QUFBQSxVQUNqQixPQUFPLEtBQUssS0FBSyxLQUFLLGdCQUFnQjtBQUFBLFFBQ3hDLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxpQkFBaUIsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUdyRCxnQkFBaUIsR0FBRztBQUFBLFFBQ2xCLElBQUksUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQ3RCLEtBQUssUUFBUTtBQUFBLFVBQ2IsSUFBSSxLQUFLLE1BQU0sSUFBSSxXQUFXLEdBQUc7QUFBQSxZQUMvQixPQUFPLEtBQUssS0FBSyxLQUFLLDBCQUEwQjtBQUFBLFVBQ2xEO0FBQUEsUUFDRixFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsaUJBQWlCLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHckQsMEJBQTJCLEdBQUc7QUFBQSxRQUM1QixLQUFLLE1BQU0sVUFBVSxNQUFNLEtBQUssTUFBTTtBQUFBLFFBQ3RDLElBQUksS0FBSyxTQUFTLGFBQWE7QUFBQSxVQUM3QixLQUFLLE1BQU0sTUFBTTtBQUFBLFVBQ2pCLEtBQUssS0FBSyxLQUFLLHFCQUFxQjtBQUFBLFFBQ3RDLEVBQU87QUFBQSxVQUNMLE9BQU8sS0FBSyxPQUFPLFdBQVcsS0FBSyxNQUFNLE1BQU0sQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUdwRCxxQkFBc0IsR0FBRztBQUFBLFFBQ3ZCLElBQUksUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQ3RCLEtBQUssUUFBUTtBQUFBLFFBQ2YsRUFBTyxTQUFJLEtBQUssWUFBWSxHQUFHO0FBQUEsVUFDN0IsSUFBSSxLQUFLLE1BQU0sSUFBSSxXQUFXO0FBQUEsWUFBRyxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsZ0NBQWdDLENBQUM7QUFBQSxVQUNqRyxPQUFPLEtBQUssVUFBVSxXQUFXLEtBQUssTUFBTSxTQUFTLE1BQU0sS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBLFFBQzVFLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxpRkFBaUYsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUlySCx1QkFBd0IsR0FBRztBQUFBLFFBQ3pCLElBQUksS0FBSyxTQUFTLGFBQWE7QUFBQSxVQUM3QixLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUssS0FBSyxLQUFLLHFCQUFxQjtBQUFBLFFBQ3RDLEVBQU8sU0FBSSxLQUFLLFNBQVMsZUFBZSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQy9ELEtBQUssUUFBUTtBQUFBLFVBQ2IsS0FBSyxLQUFLLEtBQUssaUJBQWlCO0FBQUEsUUFDbEMsRUFBTyxTQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDL0IsS0FBSyxRQUFRO0FBQUEsVUFDYixPQUFPLEtBQUssT0FBTyxlQUFlLEtBQUssTUFBTSxTQUFTLEtBQUssTUFBTSxHQUFHLENBQUM7QUFBQSxRQUN2RSxFQUFPLFNBQUksS0FBSyxZQUFZLEdBQUc7QUFBQSxVQUM3QixPQUFPLEtBQUssVUFBVSxvQkFBb0IsS0FBSyxNQUFNLFNBQVMsS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBLFFBQy9FLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxpRkFBaUYsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUdySCxxQkFBc0IsR0FBRztBQUFBLFFBQ3ZCLElBQUksUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQ3RCLEtBQUssUUFBUTtBQUFBLFFBQ2YsRUFBTyxTQUFJLEtBQUssTUFBTSxJQUFJLFdBQVcsR0FBRztBQUFBLFVBQ3RDLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxnQ0FBZ0MsQ0FBQztBQUFBLFFBQ2xFLEVBQU8sU0FBSSxLQUFLLFNBQVMsZUFBZSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQy9ELEtBQUssUUFBUTtBQUFBLFVBQ2IsS0FBSyxLQUFLLEtBQUssaUJBQWlCO0FBQUEsUUFDbEMsRUFBTyxTQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDL0IsS0FBSyxRQUFRO0FBQUEsVUFDYixPQUFPLEtBQUssT0FBTyxlQUFlLEtBQUssTUFBTSxTQUFTLEtBQUssTUFBTSxHQUFHLENBQUM7QUFBQSxRQUN2RSxFQUFPLFNBQUksS0FBSyxZQUFZLEdBQUc7QUFBQSxVQUM3QixPQUFPLEtBQUssVUFBVSxvQkFBb0IsS0FBSyxNQUFNLFNBQVMsS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBLFFBQy9FLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxpRkFBaUYsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUdySCxpQkFBa0IsR0FBRztBQUFBLFFBQ25CLElBQUksUUFBUSxLQUFLLElBQUksR0FBRztBQUFBLFVBQ3RCLEtBQUssUUFBUTtBQUFBLFVBRWIsSUFBSSxRQUFRLEtBQUssS0FBSyxNQUFNLEdBQUc7QUFBQSxZQUFHLE9BQU8sS0FBSyxLQUFLLEtBQUssZ0JBQWdCO0FBQUEsUUFDMUUsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGtEQUFrRCxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BR3RGLGdCQUFpQixHQUFHO0FBQUEsUUFDbEIsSUFBSSxLQUFLLFNBQVMsWUFBWTtBQUFBLFVBQzVCLEtBQUssUUFBUTtBQUFBLFVBQ2IsS0FBSyxLQUFLLEtBQUssZ0JBQWdCO0FBQUEsUUFDakMsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGtEQUFrRCxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BR3RGLGdCQUFpQixHQUFHO0FBQUEsUUFDbEIsSUFBSSxRQUFRLEtBQUssSUFBSSxHQUFHO0FBQUEsVUFDdEIsS0FBSyxRQUFRO0FBQUEsVUFDYixJQUFJLFFBQVEsS0FBSyxLQUFLLE1BQU0sR0FBRztBQUFBLFlBQUcsT0FBTyxLQUFLLE9BQU8sZUFBZSxLQUFLLE1BQU0sU0FBUyxLQUFLLE1BQU0sR0FBRyxDQUFDO0FBQUEsUUFDekcsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLGtEQUFrRCxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BS3RGLFlBQWEsR0FBRztBQUFBLFFBRWQsSUFBSSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ3hCLEtBQUssUUFBUTtBQUFBLFVBQ2IsT0FBTyxLQUFLLEtBQUssS0FBSyxXQUFXO0FBQUEsUUFDbkMsRUFBTyxTQUFJLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDL0IsS0FBSyxRQUFRO0FBQUEsVUFDYixPQUFPLEtBQUssS0FBSyxLQUFLLFlBQVk7QUFBQSxRQUNwQztBQUFBO0FBQUEsTUFFRixXQUFZLEdBQUc7QUFBQSxRQUNiLElBQUksS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUN4QixLQUFLLFFBQVE7QUFBQSxVQUNiLE9BQU8sS0FBSyxLQUFLLEtBQUssV0FBVztBQUFBLFFBQ25DLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSx5Q0FBeUMsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUc3RSxXQUFZLEdBQUc7QUFBQSxRQUNiLElBQUksS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUN4QixLQUFLLFFBQVE7QUFBQSxVQUNiLE9BQU8sS0FBSyxLQUFLLEtBQUssV0FBVztBQUFBLFFBQ25DLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSx5Q0FBeUMsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUc3RSxXQUFZLEdBQUc7QUFBQSxRQUNiLElBQUksS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUN4QixPQUFPLEtBQUssT0FBTyxJQUFJO0FBQUEsUUFDekIsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHlDQUF5QyxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BSTdFLFlBQWEsR0FBRztBQUFBLFFBQ2QsSUFBSSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ3hCLEtBQUssUUFBUTtBQUFBLFVBQ2IsT0FBTyxLQUFLLEtBQUssS0FBSyxZQUFZO0FBQUEsUUFDcEMsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHlDQUF5QyxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BSTdFLFlBQWEsR0FBRztBQUFBLFFBQ2QsSUFBSSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ3hCLEtBQUssUUFBUTtBQUFBLFVBQ2IsT0FBTyxLQUFLLEtBQUssS0FBSyxZQUFZO0FBQUEsUUFDcEMsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHlDQUF5QyxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BSTdFLFlBQWEsR0FBRztBQUFBLFFBQ2QsSUFBSSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ3hCLEtBQUssUUFBUTtBQUFBLFVBQ2IsT0FBTyxLQUFLLEtBQUssS0FBSyxZQUFZO0FBQUEsUUFDcEMsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHlDQUF5QyxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BSTdFLFlBQWEsR0FBRztBQUFBLFFBQ2QsSUFBSSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ3hCLE9BQU8sS0FBSyxPQUFPLEtBQUs7QUFBQSxRQUMxQixFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUseUNBQXlDLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFLN0UsZUFBZ0IsR0FBRztBQUFBLFFBQ2pCLElBQUksS0FBSyxTQUFTLFdBQVcsS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUNqRyxPQUFPO0FBQUEsUUFDVCxFQUFPLFNBQUksS0FBSyxTQUFTLE9BQU8sS0FBSztBQUFBLFVBQ25DLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSwyQkFBMkIsQ0FBQztBQUFBLFFBQzdELEVBQU8sU0FBSSxLQUFLLFNBQVMsVUFBVTtBQUFBLFVBQ2pDLE9BQU8sS0FBSyxLQUFLLEtBQUssWUFBWTtBQUFBLFFBQ3BDLEVBQU8sU0FBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQ2xDLE9BQU8sS0FBSyxPQUFPLEtBQUssTUFBTSxhQUFhLFdBQVcsQ0FBQztBQUFBLFFBQ3pELEVBQU87QUFBQSxVQUNMLE9BQU8sS0FBSyxRQUFRLEtBQUssWUFBWSxLQUFLLHFCQUFxQjtBQUFBO0FBQUE7QUFBQSxNQUduRSxxQkFBc0IsQ0FBQyxPQUFPO0FBQUEsUUFDNUIsSUFBSSxLQUFLLE1BQU0sV0FBVztBQUFBLFVBQ3hCLE1BQU0sV0FBVyxLQUFLLE1BQU0sVUFBVTtBQUFBLFVBQ3RDLE1BQU0sWUFBWSxTQUFTLEtBQUs7QUFBQSxVQUNoQyxJQUFJLGFBQWEsV0FBVztBQUFBLFlBQzFCLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSxvREFBb0QsZ0JBQWdCLFdBQVcsQ0FBQztBQUFBLFVBQ2pIO0FBQUEsUUFDRixFQUFPO0FBQUEsVUFDTCxLQUFLLE1BQU0sWUFBWSxXQUFXLFNBQVMsS0FBSyxDQUFDO0FBQUE7QUFBQSxRQUVuRCxJQUFJLFFBQVEsS0FBSyxLQUFLLFVBQVUsS0FBSyxHQUFHO0FBQUEsVUFFdEMsS0FBSyxNQUFNLFVBQVUsS0FBSyxNQUFNLFFBQVEsQ0FBQztBQUFBLFFBQzNDLEVBQU87QUFBQSxVQUNMLEtBQUssTUFBTSxVQUFVLEtBQUssS0FBSztBQUFBO0FBQUEsUUFFakMsT0FBTyxLQUFLLEtBQUssS0FBSyxtQkFBbUI7QUFBQTtBQUFBLE1BRTNDLG1CQUFvQixHQUFHO0FBQUEsUUFDckIsSUFBSSxLQUFLLFNBQVMsV0FBVyxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQ2pHLE9BQU87QUFBQSxRQUNULEVBQU8sU0FBSSxLQUFLLFNBQVMsVUFBVTtBQUFBLFVBQ2pDLE9BQU8sS0FBSyxLQUFLLEtBQUssWUFBWTtBQUFBLFFBQ3BDLEVBQU8sU0FBSSxLQUFLLFNBQVMsWUFBWTtBQUFBLFVBQ25DLE9BQU8sS0FBSyxLQUFLLEtBQUssZUFBZTtBQUFBLFFBQ3ZDLEVBQU8sU0FBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQ2xDLE9BQU8sS0FBSyxLQUFLLEtBQUssZUFBZTtBQUFBLFFBQ3ZDLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSx3RUFBd0UsQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUs1RyxnQkFBaUIsR0FBRztBQUFBLFFBQ2xCLElBQUksS0FBSyxTQUFTLFdBQVcsS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUNqRCxPQUFPO0FBQUEsUUFDVCxFQUFPLFNBQUksS0FBSyxTQUFTLE9BQU8sT0FBTyxLQUFLLFNBQVMsWUFBWSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsUUFBUTtBQUFBLFVBQzdHLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSwyQkFBMkIsQ0FBQztBQUFBLFFBQzdELEVBQU8sU0FBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQ2xDLE9BQU8sS0FBSyxPQUFPLEtBQUssTUFBTSxlQUFlLFlBQVksQ0FBQztBQUFBLFFBQzVELEVBQU87QUFBQSxVQUNMLEtBQUssS0FBSyxNQUFNO0FBQUEsWUFBYSxLQUFLLE1BQU0sY0FBYyxZQUFZO0FBQUEsVUFDbEUsT0FBTyxLQUFLLFFBQVEsS0FBSyxhQUFhLEtBQUssc0JBQXNCO0FBQUE7QUFBQTtBQUFBLE1BR3JFLHNCQUF1QixDQUFDLElBQUk7QUFBQSxRQUMxQixJQUFJLFNBQVMsS0FBSyxNQUFNO0FBQUEsUUFDeEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxJQUFJO0FBQUEsUUFDMUIsU0FBUyxNQUFNLEdBQUcsS0FBSztBQUFBLFVBQ3JCLElBQUksT0FBTyxRQUFRLEVBQUUsT0FBTyxRQUFRLE9BQU8sR0FBRyxLQUFLLE9BQU8sSUFBSSxhQUFhO0FBQUEsWUFDekUsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLDZCQUE2QixDQUFDO0FBQUEsVUFDL0Q7QUFBQSxVQUNBLFNBQVMsT0FBTyxNQUFNLE9BQU8sT0FBTyxNQUFNO0FBQUEsUUFDNUM7QUFBQSxRQUNBLElBQUksT0FBTyxRQUFRLFFBQVEsR0FBRztBQUFBLFVBQzVCLE1BQU0sS0FBSyxNQUFNLElBQUksVUFBVSw2QkFBNkIsQ0FBQztBQUFBLFFBQy9EO0FBQUEsUUFDQSxJQUFJLFVBQVUsR0FBRyxLQUFLLEtBQUssUUFBUSxHQUFHLEtBQUssR0FBRztBQUFBLFVBQzVDLE9BQU8sWUFBWSxHQUFHLE1BQU0sUUFBUTtBQUFBLFFBQ3RDLEVBQU87QUFBQSxVQUNMLE9BQU8sWUFBWSxHQUFHO0FBQUE7QUFBQSxRQUV4QixPQUFPLEtBQUssS0FBSyxLQUFLLG9CQUFvQjtBQUFBO0FBQUEsTUFFNUMsb0JBQXFCLEdBQUc7QUFBQSxRQUN0QixJQUFJLEtBQUssU0FBUyxXQUFXLEtBQUssU0FBUyxRQUFRO0FBQUEsVUFDakQsT0FBTztBQUFBLFFBQ1QsRUFBTyxTQUFJLEtBQUssU0FBUyxPQUFPLE9BQU8sS0FBSyxTQUFTLFlBQVksS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLFFBQVE7QUFBQSxVQUM3RyxNQUFNLEtBQUssTUFBTSxJQUFJLFVBQVUsMkJBQTJCLENBQUM7QUFBQSxRQUM3RCxFQUFPLFNBQUksS0FBSyxTQUFTLFlBQVk7QUFBQSxVQUNuQyxPQUFPLEtBQUssS0FBSyxLQUFLLGdCQUFnQjtBQUFBLFFBQ3hDLEVBQU8sU0FBSSxLQUFLLFNBQVMsV0FBVztBQUFBLFVBQ2xDLE9BQU8sS0FBSyxLQUFLLEtBQUssZ0JBQWdCO0FBQUEsUUFDeEMsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxVQUFVLHdFQUF3RSxDQUFDO0FBQUE7QUFBQTtBQUFBLElBRzlHO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQTs7OztFQ2gyQ1QsT0FBTyxVQUFVO0FBQUEsRUFFakIsU0FBUyxXQUFZLENBQUMsS0FBSyxLQUFLO0FBQUEsSUFFOUIsSUFBSSxJQUFJLE9BQU8sUUFBUSxJQUFJLFFBQVE7QUFBQSxNQUFNLE9BQU87QUFBQSxJQUNoRCxJQUFJLE1BQU0sSUFBSTtBQUFBLElBQ2QsT0FBTyxXQUFXLElBQUksT0FBTyxVQUFVLElBQUksTUFBTSxVQUFVLElBQUk7QUFBQTtBQUFBLElBRy9ELElBQUksT0FBTyxJQUFJLE9BQU87QUFBQSxNQUNwQixNQUFNLFFBQVEsSUFBSSxNQUFNLElBQUk7QUFBQSxNQUM1QixNQUFNLGVBQWUsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRTtBQUFBLE1BQ2xFLElBQUksY0FBYztBQUFBLE1BQ2xCLE9BQU8sWUFBWSxTQUFTO0FBQUEsUUFBYyxlQUFlO0FBQUEsTUFDekQsU0FBUyxLQUFLLEtBQUssSUFBSSxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUcsS0FBSyxLQUFLLElBQUksTUFBTSxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSTtBQUFBLFFBQ3hGLElBQUksVUFBVSxPQUFPLEtBQUssQ0FBQztBQUFBLFFBQzNCLElBQUksUUFBUSxTQUFTO0FBQUEsVUFBYyxVQUFVLE1BQU07QUFBQSxRQUNuRCxJQUFJLElBQUksU0FBUyxJQUFJO0FBQUEsVUFDbkIsT0FBTyxVQUFVLE9BQU8sTUFBTSxNQUFNO0FBQUE7QUFBQSxVQUNwQyxPQUFPLGNBQWM7QUFBQSxVQUNyQixTQUFTLEtBQUssRUFBRyxLQUFLLElBQUksT0FBTyxJQUFJO0FBQUEsWUFDbkMsT0FBTztBQUFBLFVBQ1Q7QUFBQSxVQUNBLE9BQU87QUFBQTtBQUFBLFFBQ1QsRUFBTztBQUFBLFVBQ0wsT0FBTyxVQUFVLE9BQU8sTUFBTSxNQUFNO0FBQUE7QUFBQTtBQUFBLE1BRXhDO0FBQUEsSUFDRjtBQUFBLElBQ0EsSUFBSSxVQUFVLE1BQU07QUFBQTtBQUFBLElBQ3BCLE9BQU87QUFBQTtBQUFBOzs7O0VDOUJULE9BQU8sVUFBVTtBQUFBLEVBRWpCLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUVOLFNBQVMsV0FBWSxDQUFDLEtBQUs7QUFBQSxJQUN6QixJQUFJLE9BQU8sVUFBVSxPQUFPLE9BQU8sU0FBUyxHQUFHLEdBQUc7QUFBQSxNQUNoRCxNQUFNLElBQUksU0FBUyxNQUFNO0FBQUEsSUFDM0I7QUFBQSxJQUNBLE1BQU0sU0FBUyxJQUFJO0FBQUEsSUFDbkIsSUFBSTtBQUFBLE1BQ0YsT0FBTyxNQUFNLEdBQUc7QUFBQSxNQUNoQixPQUFPLE9BQU8sT0FBTztBQUFBLE1BQ3JCLE9BQU8sS0FBSztBQUFBLE1BQ1osTUFBTSxZQUFZLEtBQUssR0FBRztBQUFBO0FBQUE7QUFBQTs7OztFQ2Q5QixPQUFPLFVBQVU7QUFBQSxFQUVqQixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFFTixTQUFTLFVBQVcsQ0FBQyxLQUFLLE1BQU07QUFBQSxJQUM5QixLQUFLO0FBQUEsTUFBTSxPQUFPLENBQUM7QUFBQSxJQUNuQixNQUFNLFFBQVE7QUFBQSxJQUNkLE1BQU0sWUFBWSxLQUFLLGFBQWE7QUFBQSxJQUNwQyxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQUEsTUFDdEMsYUFBYSxnQkFBZ0IsT0FBTyxXQUFXLFNBQVMsTUFBTTtBQUFBLEtBQy9EO0FBQUEsSUFDRCxTQUFTLGNBQWUsQ0FBQyxRQUFPLFlBQVcsU0FBUyxRQUFRO0FBQUEsTUFDMUQsSUFBSSxVQUFTLElBQUksUUFBUTtBQUFBLFFBQ3ZCLElBQUk7QUFBQSxVQUNGLE9BQU8sUUFBUSxPQUFPLE9BQU8sQ0FBQztBQUFBLFVBQzlCLE9BQU8sS0FBSztBQUFBLFVBQ1osT0FBTyxPQUFPLFlBQVksS0FBSyxHQUFHLENBQUM7QUFBQTtBQUFBLE1BRXZDO0FBQUEsTUFDQSxJQUFJO0FBQUEsUUFDRixPQUFPLE1BQU0sSUFBSSxNQUFNLFFBQU8sU0FBUSxVQUFTLENBQUM7QUFBQSxRQUNoRCxhQUFhLGdCQUFnQixTQUFRLFlBQVcsWUFBVyxTQUFTLE1BQU07QUFBQSxRQUMxRSxPQUFPLEtBQUs7QUFBQSxRQUNaLE9BQU8sWUFBWSxLQUFLLEdBQUcsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0VDekJsQyxPQUFPLFVBQVU7QUFBQSxFQUVqQixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFFTixTQUFTLFdBQVksQ0FBQyxLQUFLO0FBQUEsSUFDekIsSUFBSSxLQUFLO0FBQUEsTUFDUCxPQUFPLGNBQWMsR0FBRztBQUFBLElBQzFCLEVBQU87QUFBQSxNQUNMLE9BQU8sZUFBZSxHQUFHO0FBQUE7QUFBQTtBQUFBLEVBSTdCLFNBQVMsYUFBYyxDQUFDLEtBQUs7QUFBQSxJQUMzQixNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLElBQUksWUFBWSxNQUFNO0FBQUEsSUFDdEIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFBQSxNQUN0QyxJQUFJO0FBQUEsTUFDSixJQUFJLFFBQVE7QUFBQSxNQUNaLElBQUksVUFBVTtBQUFBLE1BQ2QsU0FBUyxNQUFPLEdBQUc7QUFBQSxRQUNqQixRQUFRO0FBQUEsUUFDUixJQUFJO0FBQUEsVUFBVTtBQUFBLFFBQ2QsSUFBSTtBQUFBLFVBQ0YsUUFBUSxPQUFPLE9BQU8sQ0FBQztBQUFBLFVBQ3ZCLE9BQU8sS0FBSztBQUFBLFVBQ1osT0FBTyxHQUFHO0FBQUE7QUFBQTtBQUFBLE1BR2QsU0FBUyxLQUFNLENBQUMsS0FBSztBQUFBLFFBQ25CLFVBQVU7QUFBQSxRQUNWLE9BQU8sR0FBRztBQUFBO0FBQUEsTUFFWixJQUFJLEtBQUssT0FBTyxNQUFNO0FBQUEsTUFDdEIsSUFBSSxLQUFLLFNBQVMsS0FBSztBQUFBLE1BQ3ZCLFNBQVM7QUFBQSxNQUVULFNBQVMsUUFBUyxHQUFHO0FBQUEsUUFDbkIsV0FBVztBQUFBLFFBQ1gsSUFBSTtBQUFBLFFBQ0osUUFBUSxPQUFPLElBQUksS0FBSyxPQUFPLE1BQU07QUFBQSxVQUNuQyxJQUFJO0FBQUEsWUFDRixPQUFPLE1BQU0sSUFBSTtBQUFBLFlBQ2pCLE9BQU8sS0FBSztBQUFBLFlBQ1osT0FBTyxNQUFNLEdBQUc7QUFBQTtBQUFBLFFBRXBCO0FBQUEsUUFDQSxXQUFXO0FBQUEsUUFFWCxJQUFJO0FBQUEsVUFBTyxPQUFPLE9BQU87QUFBQSxRQUV6QixJQUFJO0FBQUEsVUFBUztBQUFBLFFBQ2IsSUFBSSxLQUFLLFlBQVksUUFBUTtBQUFBO0FBQUEsS0FFaEM7QUFBQTtBQUFBLEVBR0gsU0FBUyxjQUFlLEdBQUc7QUFBQSxJQUN6QixNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sSUFBSSxPQUFPLFVBQVU7QUFBQSxNQUMxQixZQUFZO0FBQUEsTUFDWixTQUFVLENBQUMsT0FBTyxVQUFVLElBQUk7QUFBQSxRQUM5QixJQUFJO0FBQUEsVUFDRixPQUFPLE1BQU0sTUFBTSxTQUFTLFFBQVEsQ0FBQztBQUFBLFVBQ3JDLE9BQU8sS0FBSztBQUFBLFVBQ1osS0FBSyxLQUFLLFNBQVMsR0FBRztBQUFBO0FBQUEsUUFFeEIsR0FBRztBQUFBO0FBQUEsTUFFTCxLQUFNLENBQUMsSUFBSTtBQUFBLFFBQ1QsSUFBSTtBQUFBLFVBQ0YsS0FBSyxLQUFLLE9BQU8sT0FBTyxDQUFDO0FBQUEsVUFDekIsT0FBTyxLQUFLO0FBQUEsVUFDWixLQUFLLEtBQUssU0FBUyxHQUFHO0FBQUE7QUFBQSxRQUV4QixHQUFHO0FBQUE7QUFBQSxJQUVQLENBQUM7QUFBQTtBQUFBOzs7O0VDN0VILE9BQU87QUFBQSxFQUNQLE9BQU8sUUFBUTtBQUFBLEVBQ2YsT0FBTyxRQUFRO0FBQUEsRUFDZixPQUFPLFFBQVE7QUFBQTs7OztFQ0hmLE9BQU8sVUFBVTtBQUFBLEVBQ2pCLE9BQU8sUUFBUSxRQUFRO0FBQUEsRUFFdkIsU0FBUyxTQUFVLENBQUMsS0FBSztBQUFBLElBQ3ZCLElBQUksUUFBUTtBQUFBLE1BQU0sTUFBTSxVQUFVLE1BQU07QUFBQSxJQUN4QyxJQUFJLFFBQWM7QUFBQSxNQUFJLE1BQU0sVUFBVSxXQUFXO0FBQUEsSUFDakQsSUFBSSxPQUFPLFFBQVE7QUFBQSxNQUFVLE1BQU0sVUFBVSxPQUFPLEdBQUc7QUFBQSxJQUV2RCxJQUFJLE9BQU8sSUFBSSxXQUFXO0FBQUEsTUFBWSxNQUFNLElBQUksT0FBTztBQUFBLElBQ3ZELElBQUksT0FBTztBQUFBLE1BQU0sT0FBTztBQUFBLElBQ3hCLE1BQU0sT0FBTyxTQUFTLEdBQUc7QUFBQSxJQUN6QixJQUFJLFNBQVM7QUFBQSxNQUFTLE1BQU0sVUFBVSxJQUFJO0FBQUEsSUFDMUMsT0FBTyxnQkFBZ0IsSUFBSSxJQUFJLEdBQUc7QUFBQTtBQUFBLEVBR3BDLFNBQVMsU0FBVSxDQUFDLE1BQU07QUFBQSxJQUN4QixPQUFPLElBQUksTUFBTSxxQ0FBcUMsSUFBSTtBQUFBO0FBQUEsRUFHNUQsU0FBUyxpQkFBa0IsR0FBRztBQUFBLElBQzVCLE9BQU8sSUFBSSxNQUFNLHFDQUFxQztBQUFBO0FBQUEsRUFHeEQsU0FBUyxhQUFjLENBQUMsS0FBSztBQUFBLElBQzNCLE9BQU8sT0FBTyxLQUFLLEdBQUcsRUFBRSxPQUFPLFNBQU8sU0FBUyxJQUFJLElBQUksQ0FBQztBQUFBO0FBQUEsRUFFMUQsU0FBUyxjQUFlLENBQUMsS0FBSztBQUFBLElBQzVCLE9BQU8sT0FBTyxLQUFLLEdBQUcsRUFBRSxPQUFPLFVBQVEsU0FBUyxJQUFJLElBQUksQ0FBQztBQUFBO0FBQUEsRUFHM0QsU0FBUyxNQUFPLENBQUMsS0FBSztBQUFBLElBQ3BCLElBQUksT0FBTyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxPQUFPLFVBQVUsZUFBZSxLQUFLLEtBQUssV0FBVyxJQUFJLEdBQUUsY0FBYyxVQUFTLElBQUksQ0FBQztBQUFBLElBQzVILFNBQVMsUUFBUSxPQUFPLEtBQUssR0FBRyxHQUFHO0FBQUEsTUFDakMsSUFBSSxJQUFJLFNBQVMsT0FBTyxJQUFJLE1BQU0sV0FBVyxnQkFBZ0IsaUJBQWlCLElBQUksUUFBUTtBQUFBLFFBQ3hGLEtBQUssUUFBUSxJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2hDLEVBQU87QUFBQSxRQUNMLEtBQUssUUFBUSxJQUFJO0FBQUE7QUFBQSxJQUVyQjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHVCxTQUFTLGVBQWdCLENBQUMsUUFBUSxRQUFRLEtBQUs7QUFBQSxJQUM3QyxNQUFNLE9BQU8sR0FBRztBQUFBLElBQ2hCLElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLGFBQWEsY0FBYyxHQUFHO0FBQUEsSUFDOUIsY0FBYyxlQUFlLEdBQUc7QUFBQSxJQUNoQyxJQUFJLFNBQVMsQ0FBQztBQUFBLElBQ2QsSUFBSSxlQUFlLFVBQVU7QUFBQSxJQUM3QixXQUFXLFFBQVEsU0FBTztBQUFBLE1BQ3hCLElBQUksT0FBTyxTQUFTLElBQUksSUFBSTtBQUFBLE1BQzVCLElBQUksU0FBUyxlQUFlLFNBQVMsUUFBUTtBQUFBLFFBQzNDLE9BQU8sS0FBSyxlQUFlLGFBQWEsR0FBRyxJQUFJLFFBQVEsbUJBQW1CLElBQUksTUFBTSxJQUFJLENBQUM7QUFBQSxNQUMzRjtBQUFBLEtBQ0Q7QUFBQSxJQUNELElBQUksT0FBTyxTQUFTO0FBQUEsTUFBRyxPQUFPLEtBQUssRUFBRTtBQUFBLElBQ3JDLElBQUksZ0JBQWdCLFVBQVUsV0FBVyxTQUFTLElBQUksU0FBUyxPQUFPO0FBQUEsSUFDdEUsWUFBWSxRQUFRLFNBQU87QUFBQSxNQUN6QixPQUFPLEtBQUssaUJBQWlCLFFBQVEsZUFBZSxLQUFLLElBQUksSUFBSSxDQUFDO0FBQUEsS0FDbkU7QUFBQSxJQUNELE9BQU8sT0FBTyxLQUFLO0FBQUEsQ0FBSTtBQUFBO0FBQUEsRUFHekIsU0FBUyxRQUFTLENBQUMsT0FBTztBQUFBLElBQ3hCLFFBQVEsU0FBUyxLQUFLO0FBQUEsV0FDZjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU87QUFBQSxXQUNKO0FBQUEsUUFDSCxPQUFPLE1BQU0sV0FBVyxLQUFLLFNBQVMsTUFBTSxFQUFFLE1BQU07QUFBQSxXQUNqRDtBQUFBLFFBQ0gsT0FBTyxPQUFPLEtBQUssS0FBSyxFQUFFLFdBQVc7QUFBQTtBQUFBLFFBR3JDLE9BQU87QUFBQTtBQUFBO0FBQUEsRUFJYixTQUFTLFFBQVMsQ0FBQyxPQUFPO0FBQUEsSUFDeEIsSUFBSSxVQUFVLFdBQVc7QUFBQSxNQUN2QixPQUFPO0FBQUEsSUFDVCxFQUFPLFNBQUksVUFBVSxNQUFNO0FBQUEsTUFDekIsT0FBTztBQUFBLElBRVQsRUFBTyxTQUFJLE9BQU8sVUFBVSxZQUFhLE9BQU8sVUFBVSxLQUFLLE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxHQUFJO0FBQUEsTUFDMUYsT0FBTztBQUFBLElBQ1QsRUFBTyxTQUFJLE9BQU8sVUFBVSxVQUFVO0FBQUEsTUFDcEMsT0FBTztBQUFBLElBQ1QsRUFBTyxTQUFJLE9BQU8sVUFBVSxXQUFXO0FBQUEsTUFDckMsT0FBTztBQUFBLElBQ1QsRUFBTyxTQUFJLE9BQU8sVUFBVSxVQUFVO0FBQUEsTUFDcEMsT0FBTztBQUFBLElBQ1QsRUFBTyxTQUFJLGlCQUFpQixPQUFPO0FBQUEsTUFDakMsT0FBTyxNQUFNLEtBQUssSUFBSSxjQUFjO0FBQUEsSUFDdEMsRUFBTyxTQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFBQSxNQUMvQixPQUFPO0FBQUEsSUFDVCxFQUFPO0FBQUEsTUFDTCxPQUFPO0FBQUE7QUFBQTtBQUFBLEVBSVgsU0FBUyxZQUFhLENBQUMsS0FBSztBQUFBLElBQzFCLElBQUksU0FBUyxPQUFPLEdBQUc7QUFBQSxJQUN2QixJQUFJLG1CQUFtQixLQUFLLE1BQU0sR0FBRztBQUFBLE1BQ25DLE9BQU87QUFBQSxJQUNULEVBQU87QUFBQSxNQUNMLE9BQU8scUJBQXFCLE1BQU07QUFBQTtBQUFBO0FBQUEsRUFJdEMsU0FBUyxvQkFBcUIsQ0FBQyxLQUFLO0FBQUEsSUFDbEMsT0FBTyxNQUFNLGFBQWEsR0FBRyxFQUFFLFFBQVEsTUFBTSxNQUFLLElBQUk7QUFBQTtBQUFBLEVBR3hELFNBQVMsc0JBQXVCLENBQUMsS0FBSztBQUFBLElBQ3BDLE9BQU8sTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUdyQixTQUFTLE1BQU8sQ0FBQyxLQUFLLEtBQUs7QUFBQSxJQUN6QixPQUFPLElBQUksU0FBUztBQUFBLE1BQUssTUFBTSxNQUFNO0FBQUEsSUFDckMsT0FBTztBQUFBO0FBQUEsRUFHVCxTQUFTLFlBQWEsQ0FBQyxLQUFLO0FBQUEsSUFDMUIsT0FBTyxJQUFJLFFBQVEsT0FBTyxNQUFNLEVBQzdCLFFBQVEsU0FBUyxLQUFLLEVBQ3RCLFFBQVEsT0FBTyxLQUFLLEVBQ3BCLFFBQVEsT0FBTyxLQUFLLEVBQ3BCLFFBQVEsT0FBTyxLQUFLLEVBQ3BCLFFBQVEsT0FBTyxLQUFLLEVBRXBCLFFBQVEsMkJBQTJCLE9BQUssUUFBUSxPQUFPLEdBQUcsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQUE7QUFBQSxFQUk3RixTQUFTLHdCQUF5QixDQUFDLEtBQUs7QUFBQSxJQUN0QyxJQUFJLFVBQVUsSUFBSSxNQUFNLElBQUksRUFBRSxJQUFJLFVBQU87QUFBQSxNQUN2QyxPQUFPLGFBQWEsSUFBRyxFQUFFLFFBQVEsWUFBWSxNQUFLO0FBQUEsS0FDbkQsRUFBRSxLQUFLO0FBQUEsQ0FBSTtBQUFBLElBQ1osSUFBSSxRQUFRLE1BQU0sRUFBRSxNQUFNO0FBQUEsTUFBSyxXQUFXO0FBQUEsSUFDMUMsT0FBTztBQUFBLElBQVUsVUFBVTtBQUFBO0FBQUEsRUFHN0IsU0FBUyxrQkFBbUIsQ0FBQyxPQUFPLGFBQWE7QUFBQSxJQUMvQyxJQUFJLE9BQU8sU0FBUyxLQUFLO0FBQUEsSUFDekIsSUFBSSxTQUFTLFVBQVU7QUFBQSxNQUNyQixJQUFJLGVBQWUsS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLFFBQ25DLE9BQU87QUFBQSxNQUNULEVBQU8sVUFBSyxnQkFBZ0IsS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssR0FBRztBQUFBLFFBQzFELE9BQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTyxnQkFBZ0IsT0FBTyxJQUFJO0FBQUE7QUFBQSxFQUdwQyxTQUFTLGVBQWdCLENBQUMsT0FBTyxNQUFNO0FBQUEsSUFFckMsS0FBSztBQUFBLE1BQU0sT0FBTyxTQUFTLEtBQUs7QUFBQSxJQUNoQyxRQUFRO0FBQUEsV0FDRDtBQUFBLFFBQ0gsT0FBTyx5QkFBeUIsS0FBSztBQUFBLFdBQ2xDO0FBQUEsUUFDSCxPQUFPLHFCQUFxQixLQUFLO0FBQUEsV0FDOUI7QUFBQSxRQUNILE9BQU8sdUJBQXVCLEtBQUs7QUFBQSxXQUNoQztBQUFBLFFBQ0gsT0FBTyxpQkFBaUIsS0FBSztBQUFBLFdBQzFCO0FBQUEsUUFDSCxPQUFPLGVBQWUsS0FBSztBQUFBLFdBQ3hCO0FBQUEsUUFDSCxPQUFPLGlCQUFpQixLQUFLO0FBQUEsV0FDMUI7QUFBQSxRQUNILE9BQU8sa0JBQWtCLEtBQUs7QUFBQSxXQUMzQjtBQUFBLFFBQ0gsT0FBTyxxQkFBcUIsTUFBTSxPQUFPLE9BQUssU0FBUyxDQUFDLE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBTSxlQUFlLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUFBLFdBQzFIO0FBQUEsUUFDSCxPQUFPLHFCQUFxQixLQUFLO0FBQUE7QUFBQSxRQUdqQyxNQUFNLFVBQVUsSUFBSTtBQUFBO0FBQUE7QUFBQSxFQUkxQixTQUFTLGdCQUFpQixDQUFDLE9BQU87QUFBQSxJQUVoQyxPQUFPLE9BQU8sS0FBSyxFQUFFLFFBQVEseUJBQXlCLEdBQUc7QUFBQTtBQUFBLEVBRzNELFNBQVMsY0FBZSxDQUFDLE9BQU87QUFBQSxJQUM5QixJQUFJLFVBQVUsVUFBVTtBQUFBLE1BQ3RCLE9BQU87QUFBQSxJQUNULEVBQU8sU0FBSSxVQUFVLFdBQVc7QUFBQSxNQUM5QixPQUFPO0FBQUEsSUFDVCxFQUFPLFNBQUksT0FBTyxHQUFHLE9BQU8sR0FBRyxHQUFHO0FBQUEsTUFDaEMsT0FBTztBQUFBLElBQ1QsRUFBTyxTQUFJLE9BQU8sR0FBRyxPQUFPLEVBQUUsR0FBRztBQUFBLE1BQy9CLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLFNBQVMsT0FBTyxLQUFLLEVBQUUsTUFBTSxHQUFHO0FBQUEsSUFDcEMsSUFBSSxNQUFNLE9BQU87QUFBQSxJQUNqQixJQUFJLE1BQU0sT0FBTyxNQUFNO0FBQUEsSUFDdkIsT0FBTyxpQkFBaUIsR0FBRyxJQUFJLE1BQU07QUFBQTtBQUFBLEVBR3ZDLFNBQVMsZ0JBQWlCLENBQUMsT0FBTztBQUFBLElBQ2hDLE9BQU8sT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUdyQixTQUFTLGlCQUFrQixDQUFDLE9BQU87QUFBQSxJQUNqQyxPQUFPLE1BQU0sWUFBWTtBQUFBO0FBQUEsRUFHM0IsU0FBUyxRQUFTLENBQUMsTUFBTTtBQUFBLElBQ3ZCLE9BQU8sU0FBUyxXQUFXLFNBQVM7QUFBQTtBQUFBLEVBRXRDLFNBQVMsU0FBVSxDQUFDLFFBQVE7QUFBQSxJQUMxQixJQUFJLGNBQWMsU0FBUyxPQUFPLEVBQUU7QUFBQSxJQUNwQyxJQUFJLE9BQU8sTUFBTSxPQUFLLFNBQVMsQ0FBQyxNQUFNLFdBQVc7QUFBQSxNQUFHLE9BQU87QUFBQSxJQUUzRCxJQUFJLE9BQU8sTUFBTSxPQUFLLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUFBLE1BQUcsT0FBTztBQUFBLElBQ3JELE9BQU87QUFBQTtBQUFBLEVBRVQsU0FBUyxhQUFjLENBQUMsUUFBUTtBQUFBLElBQzlCLE1BQU0sT0FBTyxVQUFVLE1BQU07QUFBQSxJQUM3QixJQUFJLFNBQVMsU0FBUztBQUFBLE1BQ3BCLE1BQU0sa0JBQWtCO0FBQUEsSUFDMUI7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBR1QsU0FBUyxvQkFBcUIsQ0FBQyxRQUFRO0FBQUEsSUFDckMsU0FBUyxPQUFPLE1BQU07QUFBQSxJQUN0QixNQUFNLE9BQU8sY0FBYyxNQUFNO0FBQUEsSUFDakMsSUFBSSxTQUFTO0FBQUEsSUFDYixJQUFJLGNBQWMsT0FBTyxJQUFJLE9BQUssZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQUEsSUFDMUQsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFLFNBQVMsTUFBTSxLQUFLLEtBQUssV0FBVyxHQUFHO0FBQUEsTUFDaEUsVUFBVTtBQUFBLE1BQVMsWUFBWSxLQUFLO0FBQUEsR0FBTyxJQUFJO0FBQUE7QUFBQSxJQUNqRCxFQUFPO0FBQUEsTUFDTCxVQUFVLE1BQU0sWUFBWSxLQUFLLElBQUksS0FBSyxZQUFZLFNBQVMsSUFBSSxNQUFNO0FBQUE7QUFBQSxJQUUzRSxPQUFPLFNBQVM7QUFBQTtBQUFBLEVBR2xCLFNBQVMsb0JBQXFCLENBQUMsT0FBTztBQUFBLElBQ3BDLFFBQVEsT0FBTyxLQUFLO0FBQUEsSUFDcEIsSUFBSSxTQUFTLENBQUM7QUFBQSxJQUNkLE9BQU8sS0FBSyxLQUFLLEVBQUUsUUFBUSxTQUFPO0FBQUEsTUFDaEMsT0FBTyxLQUFLLGFBQWEsR0FBRyxJQUFJLFFBQVEsbUJBQW1CLE1BQU0sTUFBTSxLQUFLLENBQUM7QUFBQSxLQUM5RTtBQUFBLElBQ0QsT0FBTyxPQUFPLE9BQU8sS0FBSyxJQUFJLEtBQUssT0FBTyxTQUFTLElBQUksTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUdyRSxTQUFTLGdCQUFpQixDQUFDLFFBQVEsUUFBUSxLQUFLLE9BQU87QUFBQSxJQUNyRCxJQUFJLFlBQVksU0FBUyxLQUFLO0FBQUEsSUFFOUIsSUFBSSxjQUFjLFNBQVM7QUFBQSxNQUN6QixPQUFPLHVCQUF1QixRQUFRLFFBQVEsS0FBSyxLQUFLO0FBQUEsSUFDMUQsRUFBTyxTQUFJLGNBQWMsU0FBUztBQUFBLE1BQ2hDLE9BQU8sc0JBQXNCLFFBQVEsUUFBUSxLQUFLLEtBQUs7QUFBQSxJQUN6RCxFQUFPO0FBQUEsTUFDTCxNQUFNLFVBQVUsU0FBUztBQUFBO0FBQUE7QUFBQSxFQUk3QixTQUFTLHNCQUF1QixDQUFDLFFBQVEsUUFBUSxLQUFLLFFBQVE7QUFBQSxJQUM1RCxTQUFTLE9BQU8sTUFBTTtBQUFBLElBQ3RCLGNBQWMsTUFBTTtBQUFBLElBQ3BCLElBQUksaUJBQWlCLFNBQVMsT0FBTyxFQUFFO0FBQUEsSUFFdkMsSUFBSSxtQkFBbUI7QUFBQSxNQUFTLE1BQU0sVUFBVSxjQUFjO0FBQUEsSUFDOUQsSUFBSSxVQUFVLFNBQVMsYUFBYSxHQUFHO0FBQUEsSUFDdkMsSUFBSSxTQUFTO0FBQUEsSUFDYixPQUFPLFFBQVEsV0FBUztBQUFBLE1BQ3RCLElBQUksT0FBTyxTQUFTO0FBQUEsUUFBRyxVQUFVO0FBQUE7QUFBQSxNQUNqQyxVQUFVLFNBQVMsT0FBTyxVQUFVO0FBQUE7QUFBQSxNQUNwQyxVQUFVLGdCQUFnQixVQUFVLEtBQUssUUFBUSxLQUFLO0FBQUEsS0FDdkQ7QUFBQSxJQUNELE9BQU87QUFBQTtBQUFBLEVBR1QsU0FBUyxxQkFBc0IsQ0FBQyxRQUFRLFFBQVEsS0FBSyxPQUFPO0FBQUEsSUFDMUQsSUFBSSxVQUFVLFNBQVMsYUFBYSxHQUFHO0FBQUEsSUFDdkMsSUFBSSxTQUFTO0FBQUEsSUFDYixJQUFJLGNBQWMsS0FBSyxFQUFFLFNBQVMsR0FBRztBQUFBLE1BQ25DLFVBQVUsU0FBUyxNQUFNLFVBQVU7QUFBQTtBQUFBLElBQ3JDO0FBQUEsSUFDQSxPQUFPLFNBQVMsZ0JBQWdCLFVBQVUsS0FBSyxRQUFRLEtBQUs7QUFBQTtBQUFBOzs7O0VDclN0RDtBQUFBLEVBQ0E7QUFBQTs7OztFQ0RSLE9BQU8sVUFBVTtBQUFBLEVBQ2pCLFNBQVMsUUFBUSxDQUFDLEdBQUcsR0FBRyxLQUFLO0FBQUEsSUFDM0IsSUFBSSxhQUFhO0FBQUEsTUFBUSxJQUFJLFdBQVcsR0FBRyxHQUFHO0FBQUEsSUFDOUMsSUFBSSxhQUFhO0FBQUEsTUFBUSxJQUFJLFdBQVcsR0FBRyxHQUFHO0FBQUEsSUFFOUMsSUFBSSxJQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUc7QUFBQSxJQUV2QixPQUFPLEtBQUs7QUFBQSxNQUNWLE9BQU8sRUFBRTtBQUFBLE1BQ1QsS0FBSyxFQUFFO0FBQUEsTUFDUCxLQUFLLElBQUksTUFBTSxHQUFHLEVBQUUsRUFBRTtBQUFBLE1BQ3RCLE1BQU0sSUFBSSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO0FBQUEsTUFDckMsTUFBTSxJQUFJLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTTtBQUFBLElBQ2pDO0FBQUE7QUFBQSxFQUdGLFNBQVMsVUFBVSxDQUFDLEtBQUssS0FBSztBQUFBLElBQzVCLElBQUksSUFBSSxJQUFJLE1BQU0sR0FBRztBQUFBLElBQ3JCLE9BQU8sSUFBSSxFQUFFLEtBQUs7QUFBQTtBQUFBLEVBR3BCLFNBQVMsUUFBUTtBQUFBLEVBQ2pCLFNBQVMsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLO0FBQUEsSUFDeEIsSUFBSSxNQUFNLEtBQUssTUFBTSxPQUFPO0FBQUEsSUFDNUIsSUFBSSxLQUFLLElBQUksUUFBUSxDQUFDO0FBQUEsSUFDdEIsSUFBSSxLQUFLLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztBQUFBLElBQzlCLElBQUksSUFBSTtBQUFBLElBRVIsSUFBSSxNQUFNLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDckIsSUFBRyxNQUFJLEdBQUc7QUFBQSxRQUNSLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFBQSxNQUNoQjtBQUFBLE1BQ0EsT0FBTyxDQUFDO0FBQUEsTUFDUixPQUFPLElBQUk7QUFBQSxNQUVYLE9BQU8sS0FBSyxNQUFNLFFBQVE7QUFBQSxRQUN4QixJQUFJLEtBQUssSUFBSTtBQUFBLFVBQ1gsS0FBSyxLQUFLLENBQUM7QUFBQSxVQUNYLEtBQUssSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQUEsUUFDM0IsRUFBTyxTQUFJLEtBQUssVUFBVSxHQUFHO0FBQUEsVUFDM0IsU0FBUyxDQUFFLEtBQUssSUFBSSxHQUFHLEVBQUc7QUFBQSxRQUM1QixFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssSUFBSTtBQUFBLFVBQ2YsSUFBSSxNQUFNLE1BQU07QUFBQSxZQUNkLE9BQU87QUFBQSxZQUNQLFFBQVE7QUFBQSxVQUNWO0FBQUEsVUFFQSxLQUFLLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztBQUFBO0FBQUEsUUFHM0IsSUFBSSxLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUs7QUFBQSxNQUNoQztBQUFBLE1BRUEsSUFBSSxLQUFLLFFBQVE7QUFBQSxRQUNmLFNBQVMsQ0FBRSxNQUFNLEtBQU07QUFBQSxNQUN6QjtBQUFBLElBQ0Y7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBOzs7O0VDNURULElBQUk7QUFBQSxFQUVKLE9BQU8sVUFBVTtBQUFBLEVBRWpCLElBQUksV0FBVyxjQUFVLEtBQUssT0FBTyxJQUFFO0FBQUEsRUFDdkMsSUFBSSxVQUFVLGFBQVMsS0FBSyxPQUFPLElBQUU7QUFBQSxFQUNyQyxJQUFJLFdBQVcsY0FBVSxLQUFLLE9BQU8sSUFBRTtBQUFBLEVBQ3ZDLElBQUksV0FBVyxjQUFVLEtBQUssT0FBTyxJQUFFO0FBQUEsRUFDdkMsSUFBSSxZQUFZLGVBQVcsS0FBSyxPQUFPLElBQUU7QUFBQSxFQUV6QyxTQUFTLE9BQU8sQ0FBQyxLQUFLO0FBQUEsSUFDcEIsT0FBTyxTQUFTLEtBQUssRUFBRSxLQUFLLE1BQ3hCLFNBQVMsS0FBSyxFQUFFLElBQ2hCLElBQUksV0FBVyxDQUFDO0FBQUE7QUFBQSxFQUd0QixTQUFTLFlBQVksQ0FBQyxLQUFLO0FBQUEsSUFDekIsT0FBTyxJQUFJLE1BQU0sTUFBTSxFQUFFLEtBQUssUUFBUSxFQUMzQixNQUFNLEtBQUssRUFBRSxLQUFLLE9BQU8sRUFDekIsTUFBTSxLQUFLLEVBQUUsS0FBSyxRQUFRLEVBQzFCLE1BQU0sS0FBSyxFQUFFLEtBQUssUUFBUSxFQUMxQixNQUFNLEtBQUssRUFBRSxLQUFLLFNBQVM7QUFBQTtBQUFBLEVBR3hDLFNBQVMsY0FBYyxDQUFDLEtBQUs7QUFBQSxJQUMzQixPQUFPLElBQUksTUFBTSxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQ3pCLE1BQU0sT0FBTyxFQUFFLEtBQUssR0FBRyxFQUN2QixNQUFNLFFBQVEsRUFBRSxLQUFLLEdBQUcsRUFDeEIsTUFBTSxRQUFRLEVBQUUsS0FBSyxHQUFHLEVBQ3hCLE1BQU0sU0FBUyxFQUFFLEtBQUssR0FBRztBQUFBO0FBQUEsRUFPdEMsU0FBUyxlQUFlLENBQUMsS0FBSztBQUFBLElBQzVCLEtBQUs7QUFBQSxNQUNILE9BQU8sQ0FBQyxFQUFFO0FBQUEsSUFFWixJQUFJLFFBQVEsQ0FBQztBQUFBLElBQ2IsSUFBSSxJQUFJLFNBQVMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUU5QixLQUFLO0FBQUEsTUFDSCxPQUFPLElBQUksTUFBTSxHQUFHO0FBQUEsSUFFdEIsSUFBSSxNQUFNLEVBQUU7QUFBQSxJQUNaLElBQUksT0FBTyxFQUFFO0FBQUEsSUFDYixJQUFJLE9BQU8sRUFBRTtBQUFBLElBQ2IsSUFBSSxJQUFJLElBQUksTUFBTSxHQUFHO0FBQUEsSUFFckIsRUFBRSxFQUFFLFNBQU8sTUFBTSxNQUFNLE9BQU87QUFBQSxJQUM5QixJQUFJLFlBQVksZ0JBQWdCLElBQUk7QUFBQSxJQUNwQyxJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2YsRUFBRSxFQUFFLFNBQU8sTUFBTSxVQUFVLE1BQU07QUFBQSxNQUNqQyxFQUFFLEtBQUssTUFBTSxHQUFHLFNBQVM7QUFBQSxJQUMzQjtBQUFBLElBRUEsTUFBTSxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFFekIsT0FBTztBQUFBO0FBQUEsRUFHVCxTQUFTLFNBQVMsQ0FBQyxLQUFLO0FBQUEsSUFDdEIsS0FBSztBQUFBLE1BQ0gsT0FBTyxDQUFDO0FBQUEsSUFRVixJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsTUFBTSxNQUFNO0FBQUEsTUFDN0IsTUFBTSxXQUFXLElBQUksT0FBTyxDQUFDO0FBQUEsSUFDL0I7QUFBQSxJQUVBLE9BQU8sT0FBTyxhQUFhLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSSxjQUFjO0FBQUE7QUFBQSxFQUczRCxTQUFTLE9BQU8sQ0FBQyxLQUFLO0FBQUEsSUFDcEIsT0FBTyxNQUFNLE1BQU07QUFBQTtBQUFBLEVBRXJCLFNBQVMsUUFBUSxDQUFDLElBQUk7QUFBQSxJQUNwQixPQUFPLFNBQVMsS0FBSyxFQUFFO0FBQUE7QUFBQSxFQUd6QixTQUFTLEdBQUcsQ0FBQyxHQUFHLEdBQUc7QUFBQSxJQUNqQixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBRWQsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHO0FBQUEsSUFDakIsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUdkLFNBQVMsTUFBTSxDQUFDLEtBQUssT0FBTztBQUFBLElBQzFCLElBQUksYUFBYSxDQUFDO0FBQUEsSUFFbEIsSUFBSSxJQUFJLFNBQVMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUM5QixLQUFLO0FBQUEsTUFBRyxPQUFPLENBQUMsR0FBRztBQUFBLElBR25CLElBQUksTUFBTSxFQUFFO0FBQUEsSUFDWixJQUFJLE9BQU8sRUFBRSxLQUFLLFNBQ2QsT0FBTyxFQUFFLE1BQU0sS0FBSyxJQUNwQixDQUFDLEVBQUU7QUFBQSxJQUVQLElBQUksTUFBTSxLQUFLLEVBQUUsR0FBRyxHQUFHO0FBQUEsTUFDckIsU0FBUyxJQUFJLEVBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUFBLFFBQ3BDLElBQUksWUFBWSxNQUFLLE1BQU0sRUFBRSxPQUFPLE1BQU0sS0FBSztBQUFBLFFBQy9DLFdBQVcsS0FBSyxTQUFTO0FBQUEsTUFDM0I7QUFBQSxJQUNGLEVBQU87QUFBQSxNQUNMLElBQUksb0JBQW9CLGlDQUFpQyxLQUFLLEVBQUUsSUFBSTtBQUFBLE1BQ3BFLElBQUksa0JBQWtCLHVDQUF1QyxLQUFLLEVBQUUsSUFBSTtBQUFBLE1BQ3hFLElBQUksYUFBYSxxQkFBcUI7QUFBQSxNQUN0QyxJQUFJLFlBQVksRUFBRSxLQUFLLFFBQVEsR0FBRyxLQUFLO0FBQUEsTUFDdkMsS0FBSyxlQUFlLFdBQVc7QUFBQSxRQUU3QixJQUFJLEVBQUUsS0FBSyxNQUFNLE9BQU8sR0FBRztBQUFBLFVBQ3pCLE1BQU0sRUFBRSxNQUFNLE1BQU0sRUFBRSxPQUFPLFdBQVcsRUFBRTtBQUFBLFVBQzFDLE9BQU8sT0FBTyxHQUFHO0FBQUEsUUFDbkI7QUFBQSxRQUNBLE9BQU8sQ0FBQyxHQUFHO0FBQUEsTUFDYjtBQUFBLE1BRUEsSUFBSTtBQUFBLE1BQ0osSUFBSSxZQUFZO0FBQUEsUUFDZCxJQUFJLEVBQUUsS0FBSyxNQUFNLE1BQU07QUFBQSxNQUN6QixFQUFPO0FBQUEsUUFDTCxJQUFJLGdCQUFnQixFQUFFLElBQUk7QUFBQSxRQUMxQixJQUFJLEVBQUUsV0FBVyxHQUFHO0FBQUEsVUFFbEIsSUFBSSxPQUFPLEVBQUUsSUFBSSxLQUFLLEVBQUUsSUFBSSxPQUFPO0FBQUEsVUFDbkMsSUFBSSxFQUFFLFdBQVcsR0FBRztBQUFBLFlBQ2xCLE9BQU8sS0FBSyxJQUFJLFFBQVEsQ0FBQyxHQUFHO0FBQUEsY0FDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLO0FBQUEsYUFDdkI7QUFBQSxVQUNIO0FBQUEsUUFDRjtBQUFBO0FBQUEsTUFLRixJQUFJO0FBQUEsTUFFSixJQUFJLFlBQVk7QUFBQSxRQUNkLElBQUksSUFBSSxRQUFRLEVBQUUsRUFBRTtBQUFBLFFBQ3BCLElBQUksSUFBSSxRQUFRLEVBQUUsRUFBRTtBQUFBLFFBQ3BCLElBQUksUUFBUSxLQUFLLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLE1BQU07QUFBQSxRQUM3QyxJQUFJLE9BQU8sRUFBRSxVQUFVLElBQ25CLEtBQUssSUFBSSxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQ3RCO0FBQUEsUUFDSixJQUFJLE9BQU87QUFBQSxRQUNYLElBQUksVUFBVSxJQUFJO0FBQUEsUUFDbEIsSUFBSSxTQUFTO0FBQUEsVUFDWCxRQUFRO0FBQUEsVUFDUixPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsSUFBSSxNQUFNLEVBQUUsS0FBSyxRQUFRO0FBQUEsUUFFekIsSUFBSSxDQUFDO0FBQUEsUUFFTCxTQUFTLElBQUksRUFBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEtBQUssTUFBTTtBQUFBLFVBQ3JDLElBQUk7QUFBQSxVQUNKLElBQUksaUJBQWlCO0FBQUEsWUFDbkIsSUFBSSxPQUFPLGFBQWEsQ0FBQztBQUFBLFlBQ3pCLElBQUksTUFBTTtBQUFBLGNBQ1IsSUFBSTtBQUFBLFVBQ1IsRUFBTztBQUFBLFlBQ0wsSUFBSSxPQUFPLENBQUM7QUFBQSxZQUNaLElBQUksS0FBSztBQUFBLGNBQ1AsSUFBSSxPQUFPLFFBQVEsRUFBRTtBQUFBLGNBQ3JCLElBQUksT0FBTyxHQUFHO0FBQUEsZ0JBQ1osSUFBSSxJQUFJLElBQUksTUFBTSxPQUFPLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQSxnQkFDcEMsSUFBSSxJQUFJO0FBQUEsa0JBQ04sSUFBSSxNQUFNLElBQUksRUFBRSxNQUFNLENBQUM7QUFBQSxnQkFFdkI7QUFBQSxzQkFBSSxJQUFJO0FBQUEsY0FDWjtBQUFBLFlBQ0Y7QUFBQTtBQUFBLFVBRUYsRUFBRSxLQUFLLENBQUM7QUFBQSxRQUNWO0FBQUEsTUFDRixFQUFPO0FBQUEsUUFDTCxJQUFJLENBQUM7QUFBQSxRQUVMLFNBQVMsSUFBSSxFQUFHLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxVQUNqQyxFQUFFLEtBQUssTUFBTSxHQUFHLE9BQU8sRUFBRSxJQUFJLEtBQUssQ0FBQztBQUFBLFFBQ3JDO0FBQUE7QUFBQSxNQUdGLFNBQVMsSUFBSSxFQUFHLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxRQUNqQyxTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQUEsVUFDcEMsSUFBSSxZQUFZLE1BQU0sRUFBRSxLQUFLLEtBQUs7QUFBQSxVQUNsQyxLQUFLLFNBQVMsY0FBYztBQUFBLFlBQzFCLFdBQVcsS0FBSyxTQUFTO0FBQUEsUUFDN0I7QUFBQSxNQUNGO0FBQUE7QUFBQSxJQUdGLE9BQU87QUFBQTtBQUFBOzs7O0VDdE1ELHVCQUFlLFFBQVMsQ0FBQyxJQUFJO0FBQUEsSUFDbkMsT0FBTyxPQUFPLGVBQWUsUUFBUyxJQUFJLE1BQU07QUFBQSxNQUM5QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsT0FBTztBQUFBLFFBQVksR0FBRyxNQUFNLE1BQU0sSUFBSTtBQUFBLE1BQy9EO0FBQUEsUUFDSCxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUFBLFVBQ3RDLEtBQUssS0FBSyxDQUFDLEtBQUssUUFBUyxPQUFPLE9BQVEsT0FBTyxHQUFHLElBQUksUUFBUSxHQUFHLENBQUM7QUFBQSxVQUNsRSxHQUFHLE1BQU0sTUFBTSxJQUFJO0FBQUEsU0FDcEI7QUFBQTtBQUFBLE9BRUYsUUFBUSxFQUFFLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFBQTtBQUFBLEVBR3ZCLHNCQUFjLFFBQVMsQ0FBQyxJQUFJO0FBQUEsSUFDbEMsT0FBTyxPQUFPLGVBQWUsUUFBUyxJQUFJLE1BQU07QUFBQSxNQUM5QyxNQUFNLEtBQUssS0FBSyxLQUFLLFNBQVM7QUFBQSxNQUM5QixJQUFJLE9BQU8sT0FBTztBQUFBLFFBQVksT0FBTyxHQUFHLE1BQU0sTUFBTSxJQUFJO0FBQUEsTUFDbkQ7QUFBQSxRQUNILEtBQUssSUFBSTtBQUFBLFFBQ1QsR0FBRyxNQUFNLE1BQU0sSUFBSSxFQUFFLEtBQUssT0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUU7QUFBQTtBQUFBLE9BRS9DLFFBQVEsRUFBRSxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQUE7QUFBQTs7OztFQ3RCL0IsSUFBSTtBQUFBLEVBRUosSUFBSSxVQUFVLFFBQVE7QUFBQSxFQUN0QixJQUFJLE1BQU07QUFBQSxFQUVWLElBQUksV0FBVyxRQUFRLElBQUksd0JBQXdCLFFBQVE7QUFBQSxFQUUzRCxRQUFRLE1BQU0sUUFBUSxHQUFHO0FBQUEsSUFDdkIsS0FBSztBQUFBLE1BQ0gsTUFBTSxRQUFRLEtBQUssT0FBTztBQUFBLElBQzVCLE9BQU87QUFBQTtBQUFBLEVBRVQsSUFBSTtBQUFBLElBQ0YsUUFBUSxJQUFJO0FBQUEsSUFDWixPQUFPLElBQUk7QUFBQSxFQUdiLElBQUksT0FBTyxRQUFRLFVBQVUsWUFBWTtBQUFBLElBQ25DLFFBQVEsUUFBUTtBQUFBLElBQ3BCLFFBQVEsUUFBUSxRQUFTLENBQUMsR0FBRztBQUFBLE1BQzNCLE1BQU07QUFBQSxNQUNOLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFBQTtBQUFBLElBRXZCLElBQUksT0FBTztBQUFBLE1BQWdCLE9BQU8sZUFBZSxRQUFRLE9BQU8sS0FBSztBQUFBLEVBQ3ZFO0FBQUEsRUFOTTtBQUFBLEVBUU4sT0FBTyxVQUFVO0FBQUEsRUFFakIsU0FBUyxLQUFNLENBQUMsSUFBSTtBQUFBLElBS2xCLElBQUksVUFBVSxlQUFlLFdBQVcsS0FDcEMsUUFBUSxRQUFRLE1BQU0sd0JBQXdCLEdBQUc7QUFBQSxNQUNuRCxZQUFZLEVBQUU7QUFBQSxJQUNoQjtBQUFBLElBR0EsS0FBSyxHQUFHLFNBQVM7QUFBQSxNQUNmLGFBQWEsRUFBRTtBQUFBLElBQ2pCO0FBQUEsSUFPQSxHQUFHLFFBQVEsU0FBUyxHQUFHLEtBQUs7QUFBQSxJQUM1QixHQUFHLFNBQVMsU0FBUyxHQUFHLE1BQU07QUFBQSxJQUM5QixHQUFHLFNBQVMsU0FBUyxHQUFHLE1BQU07QUFBQSxJQUU5QixHQUFHLFFBQVEsU0FBUyxHQUFHLEtBQUs7QUFBQSxJQUM1QixHQUFHLFNBQVMsU0FBUyxHQUFHLE1BQU07QUFBQSxJQUM5QixHQUFHLFNBQVMsU0FBUyxHQUFHLE1BQU07QUFBQSxJQUU5QixHQUFHLFlBQVksYUFBYSxHQUFHLFNBQVM7QUFBQSxJQUN4QyxHQUFHLGFBQWEsYUFBYSxHQUFHLFVBQVU7QUFBQSxJQUMxQyxHQUFHLGFBQWEsYUFBYSxHQUFHLFVBQVU7QUFBQSxJQUUxQyxHQUFHLFlBQVksYUFBYSxHQUFHLFNBQVM7QUFBQSxJQUN4QyxHQUFHLGFBQWEsYUFBYSxHQUFHLFVBQVU7QUFBQSxJQUMxQyxHQUFHLGFBQWEsYUFBYSxHQUFHLFVBQVU7QUFBQSxJQUUxQyxHQUFHLE9BQU8sUUFBUSxHQUFHLElBQUk7QUFBQSxJQUN6QixHQUFHLFFBQVEsUUFBUSxHQUFHLEtBQUs7QUFBQSxJQUMzQixHQUFHLFFBQVEsUUFBUSxHQUFHLEtBQUs7QUFBQSxJQUUzQixHQUFHLFdBQVcsWUFBWSxHQUFHLFFBQVE7QUFBQSxJQUNyQyxHQUFHLFlBQVksWUFBWSxHQUFHLFNBQVM7QUFBQSxJQUN2QyxHQUFHLFlBQVksWUFBWSxHQUFHLFNBQVM7QUFBQSxJQUd2QyxJQUFJLEdBQUcsVUFBVSxHQUFHLFFBQVE7QUFBQSxNQUMxQixHQUFHLFNBQVMsUUFBUyxDQUFDLE9BQU0sTUFBTSxJQUFJO0FBQUEsUUFDcEMsSUFBSTtBQUFBLFVBQUksUUFBUSxTQUFTLEVBQUU7QUFBQTtBQUFBLE1BRTdCLEdBQUcsYUFBYSxRQUFTLEdBQUc7QUFBQSxJQUM5QjtBQUFBLElBQ0EsSUFBSSxHQUFHLFVBQVUsR0FBRyxRQUFRO0FBQUEsTUFDMUIsR0FBRyxTQUFTLFFBQVMsQ0FBQyxPQUFNLEtBQUssS0FBSyxJQUFJO0FBQUEsUUFDeEMsSUFBSTtBQUFBLFVBQUksUUFBUSxTQUFTLEVBQUU7QUFBQTtBQUFBLE1BRTdCLEdBQUcsYUFBYSxRQUFTLEdBQUc7QUFBQSxJQUM5QjtBQUFBLElBV0EsSUFBSSxhQUFhLFNBQVM7QUFBQSxNQUN4QixHQUFHLFNBQVMsT0FBTyxHQUFHLFdBQVcsYUFBYSxHQUFHLFNBQzlDLFFBQVMsQ0FBQyxXQUFXO0FBQUEsUUFDdEIsU0FBUyxNQUFPLENBQUMsTUFBTSxJQUFJLElBQUk7QUFBQSxVQUM3QixJQUFJLFFBQVEsS0FBSyxJQUFJO0FBQUEsVUFDckIsSUFBSSxVQUFVO0FBQUEsVUFDZCxVQUFVLE1BQU0sSUFBSSxTQUFTLEVBQUcsQ0FBQyxJQUFJO0FBQUEsWUFDbkMsSUFBSSxPQUNJLEdBQUcsU0FBUyxZQUFZLEdBQUcsU0FBUyxXQUFXLEdBQUcsU0FBUyxZQUM1RCxLQUFLLElBQUksSUFBSSxRQUFRLE9BQU87QUFBQSxjQUNqQyxXQUFXLFFBQVEsR0FBRztBQUFBLGdCQUNwQixHQUFHLEtBQUssSUFBSSxRQUFTLENBQUMsUUFBUSxJQUFJO0FBQUEsa0JBQ2hDLElBQUksVUFBVSxPQUFPLFNBQVM7QUFBQSxvQkFDNUIsVUFBVSxNQUFNLElBQUksRUFBRTtBQUFBLGtCQUV0QjtBQUFBLHVCQUFHLEVBQUU7QUFBQSxpQkFDUjtBQUFBLGlCQUNBLE9BQU87QUFBQSxjQUNWLElBQUksVUFBVTtBQUFBLGdCQUNaLFdBQVc7QUFBQSxjQUNiO0FBQUEsWUFDRjtBQUFBLFlBQ0EsSUFBSTtBQUFBLGNBQUksR0FBRyxFQUFFO0FBQUEsV0FDZDtBQUFBO0FBQUEsUUFFSCxJQUFJLE9BQU87QUFBQSxVQUFnQixPQUFPLGVBQWUsUUFBUSxTQUFTO0FBQUEsUUFDbEUsT0FBTztBQUFBLFFBQ04sR0FBRyxNQUFNO0FBQUEsSUFDZDtBQUFBLElBR0EsR0FBRyxPQUFPLE9BQU8sR0FBRyxTQUFTLGFBQWEsR0FBRyxPQUMxQyxRQUFTLENBQUMsU0FBUztBQUFBLE1BQ3BCLFNBQVMsSUFBSyxDQUFDLElBQUksUUFBUSxRQUFRLFFBQVEsVUFBVSxXQUFXO0FBQUEsUUFDOUQsSUFBSTtBQUFBLFFBQ0osSUFBSSxhQUFhLE9BQU8sY0FBYyxZQUFZO0FBQUEsVUFDaEQsSUFBSSxhQUFhO0FBQUEsVUFDakIsV0FBVyxRQUFTLENBQUMsSUFBSSxHQUFHLElBQUk7QUFBQSxZQUM5QixJQUFJLE1BQU0sR0FBRyxTQUFTLFlBQVksYUFBYSxJQUFJO0FBQUEsY0FDakQ7QUFBQSxjQUNBLE9BQU8sUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLFFBQVEsUUFBUSxVQUFVLFFBQVE7QUFBQSxZQUN4RTtBQUFBLFlBQ0EsVUFBVSxNQUFNLE1BQU0sU0FBUztBQUFBO0FBQUEsUUFFbkM7QUFBQSxRQUNBLE9BQU8sUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLFFBQVEsUUFBUSxVQUFVLFFBQVE7QUFBQTtBQUFBLE1BSXhFLElBQUksT0FBTztBQUFBLFFBQWdCLE9BQU8sZUFBZSxNQUFNLE9BQU87QUFBQSxNQUM5RCxPQUFPO0FBQUEsTUFDTixHQUFHLElBQUk7QUFBQSxJQUVWLEdBQUcsV0FBVyxPQUFPLEdBQUcsYUFBYSxhQUFhLEdBQUcsV0FDbEQsUUFBUyxDQUFDLGFBQWE7QUFBQSxNQUFFLE9BQU8sUUFBUyxDQUFDLElBQUksUUFBUSxRQUFRLFFBQVEsVUFBVTtBQUFBLFFBQ2pGLElBQUksYUFBYTtBQUFBLFFBQ2pCLE9BQU8sTUFBTTtBQUFBLFVBQ1gsSUFBSTtBQUFBLFlBQ0YsT0FBTyxZQUFZLEtBQUssSUFBSSxJQUFJLFFBQVEsUUFBUSxRQUFRLFFBQVE7QUFBQSxZQUNoRSxPQUFPLElBQUk7QUFBQSxZQUNYLElBQUksR0FBRyxTQUFTLFlBQVksYUFBYSxJQUFJO0FBQUEsY0FDM0M7QUFBQSxjQUNBO0FBQUEsWUFDRjtBQUFBLFlBQ0EsTUFBTTtBQUFBO0FBQUEsUUFFVjtBQUFBO0FBQUEsTUFDRSxHQUFHLFFBQVE7QUFBQSxJQUVmLFNBQVMsV0FBWSxDQUFDLEtBQUk7QUFBQSxNQUN4QixJQUFHLFNBQVMsUUFBUyxDQUFDLE9BQU0sTUFBTSxVQUFVO0FBQUEsUUFDMUMsSUFBRyxLQUFNLE9BQ0EsVUFBVSxXQUFXLFVBQVUsV0FDL0IsTUFDQSxRQUFTLENBQUMsS0FBSyxJQUFJO0FBQUEsVUFDMUIsSUFBSSxLQUFLO0FBQUEsWUFDUCxJQUFJO0FBQUEsY0FBVSxTQUFTLEdBQUc7QUFBQSxZQUMxQjtBQUFBLFVBQ0Y7QUFBQSxVQUdBLElBQUcsT0FBTyxJQUFJLE1BQU0sUUFBUyxDQUFDLE1BQUs7QUFBQSxZQUNqQyxJQUFHLE1BQU0sSUFBSSxRQUFRLENBQUMsT0FBTTtBQUFBLGNBQzFCLElBQUk7QUFBQSxnQkFBVSxTQUFTLFFBQU8sS0FBSTtBQUFBLGFBQ25DO0FBQUEsV0FDRjtBQUFBLFNBQ0Y7QUFBQTtBQUFBLE1BR0gsSUFBRyxhQUFhLFFBQVMsQ0FBQyxPQUFNLE1BQU07QUFBQSxRQUNwQyxJQUFJLEtBQUssSUFBRyxTQUFTLE9BQU0sVUFBVSxXQUFXLFVBQVUsV0FBVyxJQUFJO0FBQUEsUUFJekUsSUFBSSxRQUFRO0FBQUEsUUFDWixJQUFJO0FBQUEsUUFDSixJQUFJO0FBQUEsVUFDRixNQUFNLElBQUcsV0FBVyxJQUFJLElBQUk7QUFBQSxVQUM1QixRQUFRO0FBQUEsa0JBQ1I7QUFBQSxVQUNBLElBQUksT0FBTztBQUFBLFlBQ1QsSUFBSTtBQUFBLGNBQ0YsSUFBRyxVQUFVLEVBQUU7QUFBQSxjQUNmLE9BQU8sSUFBSTtBQUFBLFVBQ2YsRUFBTztBQUFBLFlBQ0wsSUFBRyxVQUFVLEVBQUU7QUFBQTtBQUFBO0FBQUEsUUFHbkIsT0FBTztBQUFBO0FBQUE7QUFBQSxJQUlYLFNBQVMsWUFBYSxDQUFDLEtBQUk7QUFBQSxNQUN6QixJQUFJLFVBQVUsZUFBZSxXQUFXLEtBQUssSUFBRyxTQUFTO0FBQUEsUUFDdkQsSUFBRyxVQUFVLFFBQVMsQ0FBQyxPQUFNLElBQUksSUFBSSxJQUFJO0FBQUEsVUFDdkMsSUFBRyxLQUFLLE9BQU0sVUFBVSxXQUFXLFFBQVMsQ0FBQyxJQUFJLElBQUk7QUFBQSxZQUNuRCxJQUFJLElBQUk7QUFBQSxjQUNOLElBQUk7QUFBQSxnQkFBSSxHQUFHLEVBQUU7QUFBQSxjQUNiO0FBQUEsWUFDRjtBQUFBLFlBQ0EsSUFBRyxRQUFRLElBQUksSUFBSSxJQUFJLFFBQVMsQ0FBQyxLQUFJO0FBQUEsY0FDbkMsSUFBRyxNQUFNLElBQUksUUFBUyxDQUFDLE1BQUs7QUFBQSxnQkFDMUIsSUFBSTtBQUFBLGtCQUFJLEdBQUcsT0FBTSxJQUFHO0FBQUEsZUFDckI7QUFBQSxhQUNGO0FBQUEsV0FDRjtBQUFBO0FBQUEsUUFHSCxJQUFHLGNBQWMsUUFBUyxDQUFDLE9BQU0sSUFBSSxJQUFJO0FBQUEsVUFDdkMsSUFBSSxLQUFLLElBQUcsU0FBUyxPQUFNLFVBQVUsU0FBUztBQUFBLFVBQzlDLElBQUk7QUFBQSxVQUNKLElBQUksUUFBUTtBQUFBLFVBQ1osSUFBSTtBQUFBLFlBQ0YsTUFBTSxJQUFHLFlBQVksSUFBSSxJQUFJLEVBQUU7QUFBQSxZQUMvQixRQUFRO0FBQUEsb0JBQ1I7QUFBQSxZQUNBLElBQUksT0FBTztBQUFBLGNBQ1QsSUFBSTtBQUFBLGdCQUNGLElBQUcsVUFBVSxFQUFFO0FBQUEsZ0JBQ2YsT0FBTyxJQUFJO0FBQUEsWUFDZixFQUFPO0FBQUEsY0FDTCxJQUFHLFVBQVUsRUFBRTtBQUFBO0FBQUE7QUFBQSxVQUduQixPQUFPO0FBQUE7QUFBQSxNQUdYLEVBQU8sU0FBSSxJQUFHLFNBQVM7QUFBQSxRQUNyQixJQUFHLFVBQVUsUUFBUyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUk7QUFBQSxVQUFFLElBQUk7QUFBQSxZQUFJLFFBQVEsU0FBUyxFQUFFO0FBQUE7QUFBQSxRQUNwRSxJQUFHLGNBQWMsUUFBUyxHQUFHO0FBQUEsTUFDL0I7QUFBQTtBQUFBLElBR0YsU0FBUyxRQUFTLENBQUMsTUFBTTtBQUFBLE1BQ3ZCLEtBQUs7QUFBQSxRQUFNLE9BQU87QUFBQSxNQUNsQixPQUFPLFFBQVMsQ0FBQyxRQUFRLE1BQU0sSUFBSTtBQUFBLFFBQ2pDLE9BQU8sS0FBSyxLQUFLLElBQUksUUFBUSxNQUFNLFFBQVMsQ0FBQyxJQUFJO0FBQUEsVUFDL0MsSUFBSSxVQUFVLEVBQUU7QUFBQSxZQUFHLEtBQUs7QUFBQSxVQUN4QixJQUFJO0FBQUEsWUFBSSxHQUFHLE1BQU0sTUFBTSxTQUFTO0FBQUEsU0FDakM7QUFBQTtBQUFBO0FBQUEsSUFJTCxTQUFTLFlBQWEsQ0FBQyxNQUFNO0FBQUEsTUFDM0IsS0FBSztBQUFBLFFBQU0sT0FBTztBQUFBLE1BQ2xCLE9BQU8sUUFBUyxDQUFDLFFBQVEsTUFBTTtBQUFBLFFBQzdCLElBQUk7QUFBQSxVQUNGLE9BQU8sS0FBSyxLQUFLLElBQUksUUFBUSxJQUFJO0FBQUEsVUFDakMsT0FBTyxJQUFJO0FBQUEsVUFDWCxLQUFLLFVBQVUsRUFBRTtBQUFBLFlBQUcsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTWhDLFNBQVMsUUFBUyxDQUFDLE1BQU07QUFBQSxNQUN2QixLQUFLO0FBQUEsUUFBTSxPQUFPO0FBQUEsTUFDbEIsT0FBTyxRQUFTLENBQUMsUUFBUSxLQUFLLEtBQUssSUFBSTtBQUFBLFFBQ3JDLE9BQU8sS0FBSyxLQUFLLElBQUksUUFBUSxLQUFLLEtBQUssUUFBUyxDQUFDLElBQUk7QUFBQSxVQUNuRCxJQUFJLFVBQVUsRUFBRTtBQUFBLFlBQUcsS0FBSztBQUFBLFVBQ3hCLElBQUk7QUFBQSxZQUFJLEdBQUcsTUFBTSxNQUFNLFNBQVM7QUFBQSxTQUNqQztBQUFBO0FBQUE7QUFBQSxJQUlMLFNBQVMsWUFBYSxDQUFDLE1BQU07QUFBQSxNQUMzQixLQUFLO0FBQUEsUUFBTSxPQUFPO0FBQUEsTUFDbEIsT0FBTyxRQUFTLENBQUMsUUFBUSxLQUFLLEtBQUs7QUFBQSxRQUNqQyxJQUFJO0FBQUEsVUFDRixPQUFPLEtBQUssS0FBSyxJQUFJLFFBQVEsS0FBSyxHQUFHO0FBQUEsVUFDckMsT0FBTyxJQUFJO0FBQUEsVUFDWCxLQUFLLFVBQVUsRUFBRTtBQUFBLFlBQUcsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS2hDLFNBQVMsT0FBUSxDQUFDLE1BQU07QUFBQSxNQUN0QixLQUFLO0FBQUEsUUFBTSxPQUFPO0FBQUEsTUFHbEIsT0FBTyxRQUFTLENBQUMsUUFBUSxTQUFTLElBQUk7QUFBQSxRQUNwQyxJQUFJLE9BQU8sWUFBWSxZQUFZO0FBQUEsVUFDakMsS0FBSztBQUFBLFVBQ0wsVUFBVTtBQUFBLFFBQ1o7QUFBQSxRQUNBLFNBQVMsUUFBUyxDQUFDLElBQUksT0FBTztBQUFBLFVBQzVCLElBQUksT0FBTztBQUFBLFlBQ1QsSUFBSSxNQUFNLE1BQU07QUFBQSxjQUFHLE1BQU0sT0FBTztBQUFBLFlBQ2hDLElBQUksTUFBTSxNQUFNO0FBQUEsY0FBRyxNQUFNLE9BQU87QUFBQSxVQUNsQztBQUFBLFVBQ0EsSUFBSTtBQUFBLFlBQUksR0FBRyxNQUFNLE1BQU0sU0FBUztBQUFBO0FBQUEsUUFFbEMsT0FBTyxVQUFVLEtBQUssS0FBSyxJQUFJLFFBQVEsU0FBUyxRQUFRLElBQ3BELEtBQUssS0FBSyxJQUFJLFFBQVEsUUFBUTtBQUFBO0FBQUE7QUFBQSxJQUl0QyxTQUFTLFdBQVksQ0FBQyxNQUFNO0FBQUEsTUFDMUIsS0FBSztBQUFBLFFBQU0sT0FBTztBQUFBLE1BR2xCLE9BQU8sUUFBUyxDQUFDLFFBQVEsU0FBUztBQUFBLFFBQ2hDLElBQUksUUFBUSxVQUFVLEtBQUssS0FBSyxJQUFJLFFBQVEsT0FBTyxJQUMvQyxLQUFLLEtBQUssSUFBSSxNQUFNO0FBQUEsUUFDeEIsSUFBSSxPQUFPO0FBQUEsVUFDVCxJQUFJLE1BQU0sTUFBTTtBQUFBLFlBQUcsTUFBTSxPQUFPO0FBQUEsVUFDaEMsSUFBSSxNQUFNLE1BQU07QUFBQSxZQUFHLE1BQU0sT0FBTztBQUFBLFFBQ2xDO0FBQUEsUUFDQSxPQUFPO0FBQUE7QUFBQTtBQUFBLElBZ0JYLFNBQVMsU0FBVSxDQUFDLElBQUk7QUFBQSxNQUN0QixLQUFLO0FBQUEsUUFDSCxPQUFPO0FBQUEsTUFFVCxJQUFJLEdBQUcsU0FBUztBQUFBLFFBQ2QsT0FBTztBQUFBLE1BRVQsSUFBSSxXQUFXLFFBQVEsVUFBVSxRQUFRLE9BQU8sTUFBTTtBQUFBLE1BQ3RELElBQUksU0FBUztBQUFBLFFBQ1gsSUFBSSxHQUFHLFNBQVMsWUFBWSxHQUFHLFNBQVM7QUFBQSxVQUN0QyxPQUFPO0FBQUEsTUFDWDtBQUFBLE1BRUEsT0FBTztBQUFBO0FBQUE7QUFBQTs7OztFQ2hXWCxJQUFJLDhCQUEyQjtBQUFBLEVBRS9CLE9BQU8sVUFBVTtBQUFBLEVBRWpCLFNBQVMsTUFBTyxDQUFDLElBQUk7QUFBQSxJQUNuQixPQUFPO0FBQUEsTUFDTDtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsSUFFQSxTQUFTLFVBQVcsQ0FBQyxPQUFNLFNBQVM7QUFBQSxNQUNsQyxNQUFNLGdCQUFnQjtBQUFBLFFBQWEsT0FBTyxJQUFJLFdBQVcsT0FBTSxPQUFPO0FBQUEsTUFFdEUsUUFBTyxLQUFLLElBQUk7QUFBQSxNQUVoQixJQUFJLE9BQU87QUFBQSxNQUVYLEtBQUssT0FBTztBQUFBLE1BQ1osS0FBSyxLQUFLO0FBQUEsTUFDVixLQUFLLFdBQVc7QUFBQSxNQUNoQixLQUFLLFNBQVM7QUFBQSxNQUVkLEtBQUssUUFBUTtBQUFBLE1BQ2IsS0FBSyxPQUFPO0FBQUEsTUFDWixLQUFLLGFBQWEsS0FBSztBQUFBLE1BRXZCLFVBQVUsV0FBVyxDQUFDO0FBQUEsTUFHdEIsSUFBSSxPQUFPLE9BQU8sS0FBSyxPQUFPO0FBQUEsTUFDOUIsU0FBUyxRQUFRLEdBQUcsU0FBUyxLQUFLLE9BQVEsUUFBUSxRQUFRLFNBQVM7QUFBQSxRQUNqRSxJQUFJLE1BQU0sS0FBSztBQUFBLFFBQ2YsS0FBSyxPQUFPLFFBQVE7QUFBQSxNQUN0QjtBQUFBLE1BRUEsSUFBSSxLQUFLO0FBQUEsUUFBVSxLQUFLLFlBQVksS0FBSyxRQUFRO0FBQUEsTUFFakQsSUFBSSxLQUFLLFVBQVUsV0FBVztBQUFBLFFBQzVCLElBQWlCLE9BQU8sS0FBSyxVQUF6QixVQUFnQztBQUFBLFVBQ2xDLE1BQU0sVUFBVSx3QkFBd0I7QUFBQSxRQUMxQztBQUFBLFFBQ0EsSUFBSSxLQUFLLFFBQVEsV0FBVztBQUFBLFVBQzFCLEtBQUssTUFBTTtBQUFBLFFBQ2IsRUFBTyxTQUFpQixPQUFPLEtBQUssUUFBekIsVUFBOEI7QUFBQSxVQUN2QyxNQUFNLFVBQVUsc0JBQXNCO0FBQUEsUUFDeEM7QUFBQSxRQUVBLElBQUksS0FBSyxRQUFRLEtBQUssS0FBSztBQUFBLFVBQ3pCLE1BQU0sSUFBSSxNQUFNLHNCQUFzQjtBQUFBLFFBQ3hDO0FBQUEsUUFFQSxLQUFLLE1BQU0sS0FBSztBQUFBLE1BQ2xCO0FBQUEsTUFFQSxJQUFJLEtBQUssT0FBTyxNQUFNO0FBQUEsUUFDcEIsUUFBUSxTQUFTLFFBQVEsR0FBRztBQUFBLFVBQzFCLEtBQUssTUFBTTtBQUFBLFNBQ1o7QUFBQSxRQUNEO0FBQUEsTUFDRjtBQUFBLE1BRUEsR0FBRyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxNQUFNLFFBQVMsQ0FBQyxLQUFLLElBQUk7QUFBQSxRQUMzRCxJQUFJLEtBQUs7QUFBQSxVQUNQLEtBQUssS0FBSyxTQUFTLEdBQUc7QUFBQSxVQUN0QixLQUFLLFdBQVc7QUFBQSxVQUNoQjtBQUFBLFFBQ0Y7QUFBQSxRQUVBLEtBQUssS0FBSztBQUFBLFFBQ1YsS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUFBLFFBQ3BCLEtBQUssTUFBTTtBQUFBLE9BQ1o7QUFBQTtBQUFBLElBR0gsU0FBUyxXQUFZLENBQUMsT0FBTSxTQUFTO0FBQUEsTUFDbkMsTUFBTSxnQkFBZ0I7QUFBQSxRQUFjLE9BQU8sSUFBSSxZQUFZLE9BQU0sT0FBTztBQUFBLE1BRXhFLFFBQU8sS0FBSyxJQUFJO0FBQUEsTUFFaEIsS0FBSyxPQUFPO0FBQUEsTUFDWixLQUFLLEtBQUs7QUFBQSxNQUNWLEtBQUssV0FBVztBQUFBLE1BRWhCLEtBQUssUUFBUTtBQUFBLE1BQ2IsS0FBSyxXQUFXO0FBQUEsTUFDaEIsS0FBSyxPQUFPO0FBQUEsTUFDWixLQUFLLGVBQWU7QUFBQSxNQUVwQixVQUFVLFdBQVcsQ0FBQztBQUFBLE1BR3RCLElBQUksT0FBTyxPQUFPLEtBQUssT0FBTztBQUFBLE1BQzlCLFNBQVMsUUFBUSxHQUFHLFNBQVMsS0FBSyxPQUFRLFFBQVEsUUFBUSxTQUFTO0FBQUEsUUFDakUsSUFBSSxNQUFNLEtBQUs7QUFBQSxRQUNmLEtBQUssT0FBTyxRQUFRO0FBQUEsTUFDdEI7QUFBQSxNQUVBLElBQUksS0FBSyxVQUFVLFdBQVc7QUFBQSxRQUM1QixJQUFpQixPQUFPLEtBQUssVUFBekIsVUFBZ0M7QUFBQSxVQUNsQyxNQUFNLFVBQVUsd0JBQXdCO0FBQUEsUUFDMUM7QUFBQSxRQUNBLElBQUksS0FBSyxRQUFRLEdBQUc7QUFBQSxVQUNsQixNQUFNLElBQUksTUFBTSx1QkFBdUI7QUFBQSxRQUN6QztBQUFBLFFBRUEsS0FBSyxNQUFNLEtBQUs7QUFBQSxNQUNsQjtBQUFBLE1BRUEsS0FBSyxPQUFPO0FBQUEsTUFDWixLQUFLLFNBQVMsQ0FBQztBQUFBLE1BRWYsSUFBSSxLQUFLLE9BQU8sTUFBTTtBQUFBLFFBQ3BCLEtBQUssUUFBUSxHQUFHO0FBQUEsUUFDaEIsS0FBSyxPQUFPLEtBQUssQ0FBQyxLQUFLLE9BQU8sS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBQUEsUUFDMUUsS0FBSyxNQUFNO0FBQUEsTUFDYjtBQUFBO0FBQUE7QUFBQTs7OztFQ2pISixPQUFPLFVBQVU7QUFBQSxFQUVqQixJQUFJLGlCQUFpQixPQUFPLGtCQUFrQixRQUFTLENBQUMsS0FBSztBQUFBLElBQzNELE9BQU8sSUFBSTtBQUFBO0FBQUEsRUFHYixTQUFTLEtBQU0sQ0FBQyxLQUFLO0FBQUEsSUFDbkIsSUFBSSxRQUFRLFFBQVEsT0FBTyxRQUFRO0FBQUEsTUFDakMsT0FBTztBQUFBLElBRVQsSUFBSSxlQUFlO0FBQUEsTUFDakIsSUFBSSxPQUFPLEVBQUUsV0FBVyxlQUFlLEdBQUcsRUFBRTtBQUFBLElBRTVDO0FBQUEsVUFBSSxPQUFPLE9BQU8sT0FBTyxJQUFJO0FBQUEsSUFFL0IsT0FBTyxvQkFBb0IsR0FBRyxFQUFFLFFBQVEsUUFBUyxDQUFDLEtBQUs7QUFBQSxNQUNyRCxPQUFPLGVBQWUsTUFBTSxLQUFLLE9BQU8seUJBQXlCLEtBQUssR0FBRyxDQUFDO0FBQUEsS0FDM0U7QUFBQSxJQUVELE9BQU87QUFBQTtBQUFBOzs7O0VDckJULElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLElBQUk7QUFBQSxFQUdKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUdKLElBQUksT0FBTyxXQUFXLGNBQWMsT0FBTyxPQUFPLFFBQVEsWUFBWTtBQUFBLElBQ3BFLGdCQUFnQixPQUFPLElBQUksbUJBQW1CO0FBQUEsSUFFOUMsaUJBQWlCLE9BQU8sSUFBSSxzQkFBc0I7QUFBQSxFQUNwRCxFQUFPO0FBQUEsSUFDTCxnQkFBZ0I7QUFBQSxJQUNoQixpQkFBaUI7QUFBQTtBQUFBLEVBR25CLFNBQVMsSUFBSyxHQUFHO0FBQUEsRUFFakIsU0FBUyxZQUFZLENBQUMsU0FBUyxRQUFPO0FBQUEsSUFDcEMsT0FBTyxlQUFlLFNBQVMsZUFBZTtBQUFBLE1BQzVDLEtBQUssUUFBUSxHQUFHO0FBQUEsUUFDZCxPQUFPO0FBQUE7QUFBQSxJQUVYLENBQUM7QUFBQTtBQUFBLEVBR0gsSUFBSSxRQUFRO0FBQUEsRUFDWixJQUFJLEtBQUs7QUFBQSxJQUNQLFFBQVEsS0FBSyxTQUFTLE1BQU07QUFBQSxFQUN6QixTQUFJLFlBQVksS0FBSyxRQUFRLElBQUksY0FBYyxFQUFFO0FBQUEsSUFDcEQsUUFBUSxRQUFRLEdBQUc7QUFBQSxNQUNqQixJQUFJLElBQUksS0FBSyxPQUFPLE1BQU0sTUFBTSxTQUFTO0FBQUEsTUFDekMsSUFBSSxXQUFXLEVBQUUsTUFBTSxJQUFJLEVBQUUsS0FBSztBQUFBLE9BQVU7QUFBQSxNQUM1QyxRQUFRLE1BQU0sQ0FBQztBQUFBO0FBQUEsRUFJbkIsS0FBSyxHQUFHLGdCQUFnQjtBQUFBLElBRWxCLFFBQVEsT0FBTyxrQkFBa0IsQ0FBQztBQUFBLElBQ3RDLGFBQWEsSUFBSSxLQUFLO0FBQUEsSUFNdEIsR0FBRyxRQUFTLFFBQVMsQ0FBQyxVQUFVO0FBQUEsTUFDOUIsU0FBUyxLQUFNLENBQUMsSUFBSSxJQUFJO0FBQUEsUUFDdEIsT0FBTyxTQUFTLEtBQUssSUFBSSxJQUFJLFFBQVMsQ0FBQyxLQUFLO0FBQUEsVUFFMUMsS0FBSyxLQUFLO0FBQUEsWUFDUixXQUFXO0FBQUEsVUFDYjtBQUFBLFVBRUEsSUFBSSxPQUFPLE9BQU87QUFBQSxZQUNoQixHQUFHLE1BQU0sTUFBTSxTQUFTO0FBQUEsU0FDM0I7QUFBQTtBQUFBLE1BR0gsT0FBTyxlQUFlLE9BQU8sZ0JBQWdCO0FBQUEsUUFDM0MsT0FBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLE1BQ0QsT0FBTztBQUFBLE1BQ04sR0FBRyxLQUFLO0FBQUEsSUFFWCxHQUFHLFlBQWEsUUFBUyxDQUFDLGNBQWM7QUFBQSxNQUN0QyxTQUFTLFNBQVUsQ0FBQyxJQUFJO0FBQUEsUUFFdEIsYUFBYSxNQUFNLElBQUksU0FBUztBQUFBLFFBQ2hDLFdBQVc7QUFBQTtBQUFBLE1BR2IsT0FBTyxlQUFlLFdBQVcsZ0JBQWdCO0FBQUEsUUFDL0MsT0FBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLE1BQ0QsT0FBTztBQUFBLE1BQ04sR0FBRyxTQUFTO0FBQUEsSUFFZixJQUFJLFlBQVksS0FBSyxRQUFRLElBQUksY0FBYyxFQUFFLEdBQUc7QUFBQSxNQUNsRCxRQUFRLEdBQUcsUUFBUSxRQUFRLEdBQUc7QUFBQSxRQUM1QixNQUFNLEdBQUcsY0FBYztBQUFBLDRCQUNMLE1BQU0sR0FBRyxlQUFlLFFBQVEsQ0FBQztBQUFBLE9BQ3BEO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFBQSxFQTdDTTtBQUFBLEVBK0NOLEtBQUssT0FBTyxnQkFBZ0I7QUFBQSxJQUMxQixhQUFhLFFBQVEsR0FBRyxjQUFjO0FBQUEsRUFDeEM7QUFBQSxFQUVBLE9BQU8sVUFBVSxNQUFNLE1BQU0sRUFBRSxDQUFDO0FBQUEsRUFDaEMsSUFBSSxRQUFRLElBQUksa0NBQWtDLEdBQUcsV0FBVztBQUFBLElBQzVELE9BQU8sVUFBVSxNQUFNLEVBQUU7QUFBQSxJQUN6QixHQUFHLFlBQVk7QUFBQSxFQUNuQjtBQUFBLEVBRUEsU0FBUyxLQUFNLENBQUMsS0FBSTtBQUFBLElBRWxCLFVBQVUsR0FBRTtBQUFBLElBQ1osSUFBRyxjQUFjO0FBQUEsSUFFakIsSUFBRyxtQkFBbUI7QUFBQSxJQUN0QixJQUFHLG9CQUFvQjtBQUFBLElBQ3ZCLElBQUksY0FBYyxJQUFHO0FBQUEsSUFDckIsSUFBRyxXQUFXO0FBQUEsSUFDZCxTQUFTLFFBQVMsQ0FBQyxPQUFNLFNBQVMsSUFBSTtBQUFBLE1BQ3BDLElBQUksT0FBTyxZQUFZO0FBQUEsUUFDckIsS0FBSyxTQUFTLFVBQVU7QUFBQSxNQUUxQixPQUFPLFlBQVksT0FBTSxTQUFTLEVBQUU7QUFBQSxNQUVwQyxTQUFTLFdBQVksQ0FBQyxPQUFNLFVBQVMsS0FBSSxXQUFXO0FBQUEsUUFDbEQsT0FBTyxZQUFZLE9BQU0sVUFBUyxRQUFTLENBQUMsS0FBSztBQUFBLFVBQy9DLElBQUksUUFBUSxJQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVM7QUFBQSxZQUNoRCxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU0sVUFBUyxHQUFFLEdBQUcsS0FBSyxhQUFhLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7QUFBQSxVQUNqRjtBQUFBLFlBQ0gsSUFBSSxPQUFPLFFBQU87QUFBQSxjQUNoQixJQUFHLE1BQU0sTUFBTSxTQUFTO0FBQUE7QUFBQSxTQUU3QjtBQUFBO0FBQUE7QUFBQSxJQUlMLElBQUksZUFBZSxJQUFHO0FBQUEsSUFDdEIsSUFBRyxZQUFZO0FBQUEsSUFDZixTQUFTLFNBQVUsQ0FBQyxPQUFNLE1BQU0sU0FBUyxJQUFJO0FBQUEsTUFDM0MsSUFBSSxPQUFPLFlBQVk7QUFBQSxRQUNyQixLQUFLLFNBQVMsVUFBVTtBQUFBLE1BRTFCLE9BQU8sYUFBYSxPQUFNLE1BQU0sU0FBUyxFQUFFO0FBQUEsTUFFM0MsU0FBUyxZQUFhLENBQUMsT0FBTSxPQUFNLFVBQVMsS0FBSSxXQUFXO0FBQUEsUUFDekQsT0FBTyxhQUFhLE9BQU0sT0FBTSxVQUFTLFFBQVMsQ0FBQyxLQUFLO0FBQUEsVUFDdEQsSUFBSSxRQUFRLElBQUksU0FBUyxZQUFZLElBQUksU0FBUztBQUFBLFlBQ2hELFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTSxPQUFNLFVBQVMsR0FBRSxHQUFHLEtBQUssYUFBYSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQUEsVUFDeEY7QUFBQSxZQUNILElBQUksT0FBTyxRQUFPO0FBQUEsY0FDaEIsSUFBRyxNQUFNLE1BQU0sU0FBUztBQUFBO0FBQUEsU0FFN0I7QUFBQTtBQUFBO0FBQUEsSUFJTCxJQUFJLGdCQUFnQixJQUFHO0FBQUEsSUFDdkIsSUFBSTtBQUFBLE1BQ0YsSUFBRyxhQUFhO0FBQUEsSUFDbEIsU0FBUyxVQUFXLENBQUMsT0FBTSxNQUFNLFNBQVMsSUFBSTtBQUFBLE1BQzVDLElBQUksT0FBTyxZQUFZO0FBQUEsUUFDckIsS0FBSyxTQUFTLFVBQVU7QUFBQSxNQUUxQixPQUFPLGNBQWMsT0FBTSxNQUFNLFNBQVMsRUFBRTtBQUFBLE1BRTVDLFNBQVMsYUFBYyxDQUFDLE9BQU0sT0FBTSxVQUFTLEtBQUksV0FBVztBQUFBLFFBQzFELE9BQU8sY0FBYyxPQUFNLE9BQU0sVUFBUyxRQUFTLENBQUMsS0FBSztBQUFBLFVBQ3ZELElBQUksUUFBUSxJQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVM7QUFBQSxZQUNoRCxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU0sT0FBTSxVQUFTLEdBQUUsR0FBRyxLQUFLLGFBQWEsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUFBLFVBQ3pGO0FBQUEsWUFDSCxJQUFJLE9BQU8sUUFBTztBQUFBLGNBQ2hCLElBQUcsTUFBTSxNQUFNLFNBQVM7QUFBQTtBQUFBLFNBRTdCO0FBQUE7QUFBQTtBQUFBLElBSUwsSUFBSSxjQUFjLElBQUc7QUFBQSxJQUNyQixJQUFJO0FBQUEsTUFDRixJQUFHLFdBQVc7QUFBQSxJQUNoQixTQUFTLFFBQVMsQ0FBQyxLQUFLLE1BQU0sT0FBTyxJQUFJO0FBQUEsTUFDdkMsSUFBSSxPQUFPLFVBQVUsWUFBWTtBQUFBLFFBQy9CLEtBQUs7QUFBQSxRQUNMLFFBQVE7QUFBQSxNQUNWO0FBQUEsTUFDQSxPQUFPLFlBQVksS0FBSyxNQUFNLE9BQU8sRUFBRTtBQUFBLE1BRXZDLFNBQVMsV0FBWSxDQUFDLE1BQUssT0FBTSxRQUFPLEtBQUksV0FBVztBQUFBLFFBQ3JELE9BQU8sWUFBWSxNQUFLLE9BQU0sUUFBTyxRQUFTLENBQUMsS0FBSztBQUFBLFVBQ2xELElBQUksUUFBUSxJQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVM7QUFBQSxZQUNoRCxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQUssT0FBTSxRQUFPLEdBQUUsR0FBRyxLQUFLLGFBQWEsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUFBLFVBQ3BGO0FBQUEsWUFDSCxJQUFJLE9BQU8sUUFBTztBQUFBLGNBQ2hCLElBQUcsTUFBTSxNQUFNLFNBQVM7QUFBQTtBQUFBLFNBRTdCO0FBQUE7QUFBQTtBQUFBLElBSUwsSUFBSSxhQUFhLElBQUc7QUFBQSxJQUNwQixJQUFHLFVBQVU7QUFBQSxJQUNiLElBQUksMEJBQTBCO0FBQUEsSUFDOUIsU0FBUyxRQUFRLENBQUMsT0FBTSxTQUFTLElBQUk7QUFBQSxNQUNuQyxJQUFJLE9BQU8sWUFBWTtBQUFBLFFBQ3JCLEtBQUssU0FBUyxVQUFVO0FBQUEsTUFFMUIsSUFBSSxhQUFhLHdCQUF3QixLQUFLLFFBQVEsT0FBTyxJQUN6RCxTQUFTLFVBQVcsQ0FBQyxPQUFNLFVBQVMsS0FBSSxXQUFXO0FBQUEsUUFDbkQsT0FBTyxXQUFXLE9BQU0sbUJBQ3RCLE9BQU0sVUFBUyxLQUFJLFNBQ3JCLENBQUM7QUFBQSxVQUVELFNBQVMsVUFBVyxDQUFDLE9BQU0sVUFBUyxLQUFJLFdBQVc7QUFBQSxRQUNuRCxPQUFPLFdBQVcsT0FBTSxVQUFTLG1CQUMvQixPQUFNLFVBQVMsS0FBSSxTQUNyQixDQUFDO0FBQUE7QUFBQSxNQUdMLE9BQU8sV0FBVyxPQUFNLFNBQVMsRUFBRTtBQUFBLE1BRW5DLFNBQVMsa0JBQW1CLENBQUMsT0FBTSxVQUFTLEtBQUksV0FBVztBQUFBLFFBQ3pELE9BQU8sUUFBUyxDQUFDLEtBQUssT0FBTztBQUFBLFVBQzNCLElBQUksUUFBUSxJQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVM7QUFBQSxZQUNoRCxRQUFRO0FBQUEsY0FDTjtBQUFBLGNBQ0EsQ0FBQyxPQUFNLFVBQVMsR0FBRTtBQUFBLGNBQ2xCO0FBQUEsY0FDQSxhQUFhLEtBQUssSUFBSTtBQUFBLGNBQ3RCLEtBQUssSUFBSTtBQUFBLFlBQ1gsQ0FBQztBQUFBLFVBQ0U7QUFBQSxZQUNILElBQUksU0FBUyxNQUFNO0FBQUEsY0FDakIsTUFBTSxLQUFLO0FBQUEsWUFFYixJQUFJLE9BQU8sUUFBTztBQUFBLGNBQ2hCLElBQUcsS0FBSyxNQUFNLEtBQUssS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFNbEMsSUFBSSxRQUFRLFFBQVEsT0FBTyxHQUFHLENBQUMsTUFBTSxRQUFRO0FBQUEsTUFDM0MsSUFBSSxhQUFhLE9BQU8sR0FBRTtBQUFBLE1BQzFCLGFBQWEsV0FBVztBQUFBLE1BQ3hCLGNBQWMsV0FBVztBQUFBLElBQzNCO0FBQUEsSUFFQSxJQUFJLGdCQUFnQixJQUFHO0FBQUEsSUFDdkIsSUFBSSxlQUFlO0FBQUEsTUFDakIsV0FBVyxZQUFZLE9BQU8sT0FBTyxjQUFjLFNBQVM7QUFBQSxNQUM1RCxXQUFXLFVBQVUsT0FBTztBQUFBLElBQzlCO0FBQUEsSUFFQSxJQUFJLGlCQUFpQixJQUFHO0FBQUEsSUFDeEIsSUFBSSxnQkFBZ0I7QUFBQSxNQUNsQixZQUFZLFlBQVksT0FBTyxPQUFPLGVBQWUsU0FBUztBQUFBLE1BQzlELFlBQVksVUFBVSxPQUFPO0FBQUEsSUFDL0I7QUFBQSxJQUVBLE9BQU8sZUFBZSxLQUFJLGNBQWM7QUFBQSxNQUN0QyxLQUFLLFFBQVMsR0FBRztBQUFBLFFBQ2YsT0FBTztBQUFBO0FBQUEsTUFFVCxLQUFLLFFBQVMsQ0FBQyxLQUFLO0FBQUEsUUFDbEIsYUFBYTtBQUFBO0FBQUEsTUFFZixZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDaEIsQ0FBQztBQUFBLElBQ0QsT0FBTyxlQUFlLEtBQUksZUFBZTtBQUFBLE1BQ3ZDLEtBQUssUUFBUyxHQUFHO0FBQUEsUUFDZixPQUFPO0FBQUE7QUFBQSxNQUVULEtBQUssUUFBUyxDQUFDLEtBQUs7QUFBQSxRQUNsQixjQUFjO0FBQUE7QUFBQSxNQUVoQixZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDaEIsQ0FBQztBQUFBLElBR0QsSUFBSSxpQkFBaUI7QUFBQSxJQUNyQixPQUFPLGVBQWUsS0FBSSxrQkFBa0I7QUFBQSxNQUMxQyxLQUFLLFFBQVMsR0FBRztBQUFBLFFBQ2YsT0FBTztBQUFBO0FBQUEsTUFFVCxLQUFLLFFBQVMsQ0FBQyxLQUFLO0FBQUEsUUFDbEIsaUJBQWlCO0FBQUE7QUFBQSxNQUVuQixZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDaEIsQ0FBQztBQUFBLElBQ0QsSUFBSSxrQkFBa0I7QUFBQSxJQUN0QixPQUFPLGVBQWUsS0FBSSxtQkFBbUI7QUFBQSxNQUMzQyxLQUFLLFFBQVMsR0FBRztBQUFBLFFBQ2YsT0FBTztBQUFBO0FBQUEsTUFFVCxLQUFLLFFBQVMsQ0FBQyxLQUFLO0FBQUEsUUFDbEIsa0JBQWtCO0FBQUE7QUFBQSxNQUVwQixZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDaEIsQ0FBQztBQUFBLElBRUQsU0FBUyxVQUFXLENBQUMsT0FBTSxTQUFTO0FBQUEsTUFDbEMsSUFBSSxnQkFBZ0I7QUFBQSxRQUNsQixPQUFPLGNBQWMsTUFBTSxNQUFNLFNBQVMsR0FBRztBQUFBLE1BRTdDO0FBQUEsZUFBTyxXQUFXLE1BQU0sT0FBTyxPQUFPLFdBQVcsU0FBUyxHQUFHLFNBQVM7QUFBQTtBQUFBLElBRzFFLFNBQVMsZUFBZ0IsR0FBRztBQUFBLE1BQzFCLElBQUksT0FBTztBQUFBLE1BQ1gsS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssTUFBTSxRQUFTLENBQUMsS0FBSyxJQUFJO0FBQUEsUUFDeEQsSUFBSSxLQUFLO0FBQUEsVUFDUCxJQUFJLEtBQUs7QUFBQSxZQUNQLEtBQUssUUFBUTtBQUFBLFVBRWYsS0FBSyxLQUFLLFNBQVMsR0FBRztBQUFBLFFBQ3hCLEVBQU87QUFBQSxVQUNMLEtBQUssS0FBSztBQUFBLFVBQ1YsS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUFBLFVBQ3BCLEtBQUssS0FBSztBQUFBO0FBQUEsT0FFYjtBQUFBO0FBQUEsSUFHSCxTQUFTLFdBQVksQ0FBQyxPQUFNLFNBQVM7QUFBQSxNQUNuQyxJQUFJLGdCQUFnQjtBQUFBLFFBQ2xCLE9BQU8sZUFBZSxNQUFNLE1BQU0sU0FBUyxHQUFHO0FBQUEsTUFFOUM7QUFBQSxlQUFPLFlBQVksTUFBTSxPQUFPLE9BQU8sWUFBWSxTQUFTLEdBQUcsU0FBUztBQUFBO0FBQUEsSUFHNUUsU0FBUyxnQkFBaUIsR0FBRztBQUFBLE1BQzNCLElBQUksT0FBTztBQUFBLE1BQ1gsS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssTUFBTSxRQUFTLENBQUMsS0FBSyxJQUFJO0FBQUEsUUFDeEQsSUFBSSxLQUFLO0FBQUEsVUFDUCxLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUssS0FBSyxTQUFTLEdBQUc7QUFBQSxRQUN4QixFQUFPO0FBQUEsVUFDTCxLQUFLLEtBQUs7QUFBQSxVQUNWLEtBQUssS0FBSyxRQUFRLEVBQUU7QUFBQTtBQUFBLE9BRXZCO0FBQUE7QUFBQSxJQUdILFNBQVMsZ0JBQWlCLENBQUMsT0FBTSxTQUFTO0FBQUEsTUFDeEMsT0FBTyxJQUFJLElBQUcsV0FBVyxPQUFNLE9BQU87QUFBQTtBQUFBLElBR3hDLFNBQVMsaUJBQWtCLENBQUMsT0FBTSxTQUFTO0FBQUEsTUFDekMsT0FBTyxJQUFJLElBQUcsWUFBWSxPQUFNLE9BQU87QUFBQTtBQUFBLElBR3pDLElBQUksVUFBVSxJQUFHO0FBQUEsSUFDakIsSUFBRyxPQUFPO0FBQUEsSUFDVixTQUFTLElBQUssQ0FBQyxPQUFNLE9BQU8sTUFBTSxJQUFJO0FBQUEsTUFDcEMsSUFBSSxPQUFPLFNBQVM7QUFBQSxRQUNsQixLQUFLLE1BQU0sT0FBTztBQUFBLE1BRXBCLE9BQU8sUUFBUSxPQUFNLE9BQU8sTUFBTSxFQUFFO0FBQUEsTUFFcEMsU0FBUyxPQUFRLENBQUMsT0FBTSxRQUFPLE9BQU0sS0FBSSxXQUFXO0FBQUEsUUFDbEQsT0FBTyxRQUFRLE9BQU0sUUFBTyxPQUFNLFFBQVMsQ0FBQyxLQUFLLElBQUk7QUFBQSxVQUNuRCxJQUFJLFFBQVEsSUFBSSxTQUFTLFlBQVksSUFBSSxTQUFTO0FBQUEsWUFDaEQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFNLFFBQU8sT0FBTSxHQUFFLEdBQUcsS0FBSyxhQUFhLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7QUFBQSxVQUNqRjtBQUFBLFlBQ0gsSUFBSSxPQUFPLFFBQU87QUFBQSxjQUNoQixJQUFHLE1BQU0sTUFBTSxTQUFTO0FBQUE7QUFBQSxTQUU3QjtBQUFBO0FBQUE7QUFBQSxJQUlMLE9BQU87QUFBQTtBQUFBLEVBR1QsU0FBUyxPQUFRLENBQUMsTUFBTTtBQUFBLElBQ3RCLE1BQU0sV0FBVyxLQUFLLEdBQUcsTUFBTSxLQUFLLEVBQUU7QUFBQSxJQUN0QyxHQUFHLGVBQWUsS0FBSyxJQUFJO0FBQUEsSUFDM0IsTUFBTTtBQUFBO0FBQUEsRUFJUixJQUFJO0FBQUEsRUFLSixTQUFTLFVBQVcsR0FBRztBQUFBLElBQ3JCLElBQUksTUFBTSxLQUFLLElBQUk7QUFBQSxJQUNuQixTQUFTLElBQUksRUFBRyxJQUFJLEdBQUcsZUFBZSxVQUFVLEdBQUc7QUFBQSxNQUdqRCxJQUFJLEdBQUcsZUFBZSxHQUFHLFNBQVMsR0FBRztBQUFBLFFBQ25DLEdBQUcsZUFBZSxHQUFHLEtBQUs7QUFBQSxRQUMxQixHQUFHLGVBQWUsR0FBRyxLQUFLO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsSUFFQSxNQUFNO0FBQUE7QUFBQSxFQUdSLFNBQVMsS0FBTSxHQUFHO0FBQUEsSUFFaEIsYUFBYSxVQUFVO0FBQUEsSUFDdkIsYUFBYTtBQUFBLElBRWIsSUFBSSxHQUFHLGVBQWUsV0FBVztBQUFBLE1BQy9CO0FBQUEsSUFFRixJQUFJLE9BQU8sR0FBRyxlQUFlLE1BQU07QUFBQSxJQUNuQyxJQUFJLEtBQUssS0FBSztBQUFBLElBQ2QsSUFBSSxPQUFPLEtBQUs7QUFBQSxJQUVoQixJQUFJLE1BQU0sS0FBSztBQUFBLElBQ2YsSUFBSSxZQUFZLEtBQUs7QUFBQSxJQUNyQixJQUFJLFdBQVcsS0FBSztBQUFBLElBSXBCLElBQUksY0FBYyxXQUFXO0FBQUEsTUFDM0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJO0FBQUEsTUFDNUIsR0FBRyxNQUFNLE1BQU0sSUFBSTtBQUFBLElBQ3JCLEVBQU8sU0FBSSxLQUFLLElBQUksSUFBSSxhQUFhLE9BQU87QUFBQSxNQUUxQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUk7QUFBQSxNQUM5QixJQUFJLEtBQUssS0FBSyxJQUFJO0FBQUEsTUFDbEIsSUFBSSxPQUFPLE9BQU87QUFBQSxRQUNoQixHQUFHLEtBQUssTUFBTSxHQUFHO0FBQUEsSUFDckIsRUFBTztBQUFBLE1BRUwsSUFBSSxlQUFlLEtBQUssSUFBSSxJQUFJO0FBQUEsTUFHaEMsSUFBSSxhQUFhLEtBQUssSUFBSSxXQUFXLFdBQVcsQ0FBQztBQUFBLE1BR2pELElBQUksZUFBZSxLQUFLLElBQUksYUFBYSxLQUFLLEdBQUc7QUFBQSxNQUVqRCxJQUFJLGdCQUFnQixjQUFjO0FBQUEsUUFDaEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJO0FBQUEsUUFDNUIsR0FBRyxNQUFNLE1BQU0sS0FBSyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7QUFBQSxNQUN6QyxFQUFPO0FBQUEsUUFHTCxHQUFHLGVBQWUsS0FBSyxJQUFJO0FBQUE7QUFBQTtBQUFBLElBSy9CLElBQUksZUFBZSxXQUFXO0FBQUEsTUFDNUIsYUFBYSxXQUFXLE9BQU8sQ0FBQztBQUFBLElBQ2xDO0FBQUE7QUFBQTs7OztFQzNiRixJQUFNLDJCQUE0QjtBQUFBLEVBQ2xDLElBQU07QUFBQSxFQUVOLElBQU0sTUFBTTtBQUFBLElBQ1Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixFQUFFLE9BQU8sU0FBTztBQUFBLElBTWQsT0FBTyxPQUFPLEdBQUcsU0FBUztBQUFBLEdBQzNCO0FBQUEsRUFHRCxPQUFPLE9BQU8sU0FBUyxFQUFFO0FBQUEsRUFHekIsSUFBSSxRQUFRLFlBQVU7QUFBQSxJQUNwQixRQUFRLFVBQVUsRUFBRSxHQUFHLE9BQU87QUFBQSxHQUMvQjtBQUFBLEVBSU8saUJBQVMsUUFBUyxDQUFDLFVBQVUsVUFBVTtBQUFBLElBQzdDLElBQUksT0FBTyxhQUFhLFlBQVk7QUFBQSxNQUNsQyxPQUFPLEdBQUcsT0FBTyxVQUFVLFFBQVE7QUFBQSxJQUNyQztBQUFBLElBQ0EsT0FBTyxJQUFJLFFBQVEsYUFBVztBQUFBLE1BQzVCLE9BQU8sR0FBRyxPQUFPLFVBQVUsT0FBTztBQUFBLEtBQ25DO0FBQUE7QUFBQSxFQUtLLGVBQU8sUUFBUyxDQUFDLElBQUksUUFBUSxRQUFRLFFBQVEsVUFBVSxVQUFVO0FBQUEsSUFDdkUsSUFBSSxPQUFPLGFBQWEsWUFBWTtBQUFBLE1BQ2xDLE9BQU8sR0FBRyxLQUFLLElBQUksUUFBUSxRQUFRLFFBQVEsVUFBVSxRQUFRO0FBQUEsSUFDL0Q7QUFBQSxJQUNBLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQUEsTUFDdEMsR0FBRyxLQUFLLElBQUksUUFBUSxRQUFRLFFBQVEsVUFBVSxDQUFDLEtBQUssV0FBVyxZQUFXO0FBQUEsUUFDeEUsSUFBSTtBQUFBLFVBQUssT0FBTyxPQUFPLEdBQUc7QUFBQSxRQUMxQixRQUFRLEVBQUUsV0FBVyxnQkFBTyxDQUFDO0FBQUEsT0FDOUI7QUFBQSxLQUNGO0FBQUE7QUFBQSxFQVFLLGdCQUFRLFFBQVMsQ0FBQyxJQUFJLFdBQVcsTUFBTTtBQUFBLElBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxPQUFPLFlBQVk7QUFBQSxNQUMvQyxPQUFPLEdBQUcsTUFBTSxJQUFJLFFBQVEsR0FBRyxJQUFJO0FBQUEsSUFDckM7QUFBQSxJQUVBLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQUEsTUFDdEMsR0FBRyxNQUFNLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLGNBQWMsWUFBVztBQUFBLFFBQzNELElBQUk7QUFBQSxVQUFLLE9BQU8sT0FBTyxHQUFHO0FBQUEsUUFDMUIsUUFBUSxFQUFFLGNBQWMsZ0JBQU8sQ0FBQztBQUFBLE9BQ2pDO0FBQUEsS0FDRjtBQUFBO0FBQUEsRUFNSyxnQkFBUSxRQUFTLENBQUMsSUFBSSxZQUFZLE1BQU07QUFBQSxJQUM5QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsT0FBTyxZQUFZO0FBQUEsTUFDL0MsT0FBTyxHQUFHLE1BQU0sSUFBSSxTQUFTLEdBQUcsSUFBSTtBQUFBLElBQ3RDO0FBQUEsSUFFQSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUFBLE1BQ3RDLEdBQUcsTUFBTSxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxXQUFXLGFBQVk7QUFBQSxRQUMxRCxJQUFJO0FBQUEsVUFBSyxPQUFPLE9BQU8sR0FBRztBQUFBLFFBQzFCLFFBQVEsRUFBRSxXQUFXLGtCQUFRLENBQUM7QUFBQSxPQUMvQjtBQUFBLEtBQ0Y7QUFBQTtBQUFBLEVBTUssaUJBQVMsUUFBUyxDQUFDLElBQUksWUFBWSxNQUFNO0FBQUEsSUFDL0MsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLE9BQU8sWUFBWTtBQUFBLE1BQy9DLE9BQU8sR0FBRyxPQUFPLElBQUksU0FBUyxHQUFHLElBQUk7QUFBQSxJQUN2QztBQUFBLElBRUEsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFBQSxNQUN0QyxHQUFHLE9BQU8sSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssY0FBYyxhQUFZO0FBQUEsUUFDOUQsSUFBSTtBQUFBLFVBQUssT0FBTyxPQUFPLEdBQUc7QUFBQSxRQUMxQixRQUFRLEVBQUUsY0FBYyxrQkFBUSxDQUFDO0FBQUEsT0FDbEM7QUFBQSxLQUNGO0FBQUE7QUFBQSxFQUlILElBQUksT0FBTyxHQUFHLFNBQVMsV0FBVyxZQUFZO0FBQUEsSUFDcEMsaUJBQVMsU0FBUyxFQUFFLEdBQUcsU0FBUyxNQUFNO0FBQUEsRUFDaEQsRUFBTztBQUFBLElBQ0wsUUFBUSxZQUNOLHFFQUNBLFdBQVcsbUJBQ2I7QUFBQTtBQUFBOzs7O0VDMUlGLElBQU07QUFBQSxFQUlTLG9CQUFZLFNBQVMsU0FBVSxDQUFDLEtBQUs7QUFBQSxJQUNsRCxJQUFJLFFBQVEsYUFBYSxTQUFTO0FBQUEsTUFDaEMsTUFBTSw4QkFBOEIsWUFBWSxLQUFLLElBQUksUUFBUSxNQUFLLE1BQU0sR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQUEsTUFFMUYsSUFBSSw2QkFBNkI7QUFBQSxRQUMvQixNQUFNLFFBQVEsSUFBSSxNQUFNLHFDQUFxQyxLQUFLO0FBQUEsUUFDbEUsTUFBTSxPQUFPO0FBQUEsUUFDYixNQUFNO0FBQUEsTUFDUjtBQUFBLElBQ0Y7QUFBQTtBQUFBOzs7O0VDbEJGLElBQU07QUFBQSxFQUNOLE1BQVE7QUFBQSxFQUVSLElBQU0sVUFBVSxhQUFXO0FBQUEsSUFDekIsTUFBTSxZQUFXLEVBQUUsTUFBTSxJQUFNO0FBQUEsSUFDL0IsSUFBSSxPQUFPLFlBQVk7QUFBQSxNQUFVLE9BQU87QUFBQSxJQUN4QyxPQUFRLEtBQUssY0FBYSxRQUFRLEVBQUc7QUFBQTtBQUFBLEVBR3hCLGtCQUFVLE9BQU8sS0FBSyxZQUFZO0FBQUEsSUFDL0MsVUFBVSxHQUFHO0FBQUEsSUFFYixPQUFPLEdBQUcsTUFBTSxLQUFLO0FBQUEsTUFDbkIsTUFBTSxRQUFRLE9BQU87QUFBQSxNQUNyQixXQUFXO0FBQUEsSUFDYixDQUFDO0FBQUE7QUFBQSxFQUdZLHNCQUFjLENBQUMsS0FBSyxZQUFZO0FBQUEsSUFDN0MsVUFBVSxHQUFHO0FBQUEsSUFFYixPQUFPLEdBQUcsVUFBVSxLQUFLO0FBQUEsTUFDdkIsTUFBTSxRQUFRLE9BQU87QUFBQSxNQUNyQixXQUFXO0FBQUEsSUFDYixDQUFDO0FBQUE7QUFBQTs7OztFQ3hCSCxJQUFNLDJCQUE0QjtBQUFBLEVBQ2xDLE1BQVEsU0FBUyxVQUFVO0FBQUEsRUFDM0IsSUFBTSxVQUFVLEVBQUUsUUFBUTtBQUFBLEVBRTFCLE9BQU8sVUFBVTtBQUFBLElBQ2YsUUFBUTtBQUFBLElBQ1IsWUFBWTtBQUFBLElBRVosUUFBUTtBQUFBLElBQ1IsWUFBWTtBQUFBLElBQ1osV0FBVztBQUFBLElBQ1gsZUFBZTtBQUFBLEVBQ2pCO0FBQUE7Ozs7RUNaQSxJQUFNLDJCQUE0QjtBQUFBLEVBQ2xDLElBQU07QUFBQSxFQUVOLFNBQVMsVUFBVyxDQUFDLE9BQU07QUFBQSxJQUN6QixPQUFPLEdBQUcsT0FBTyxLQUFJLEVBQUUsS0FBSyxNQUFNLElBQUksRUFBRSxNQUFNLE1BQU0sS0FBSztBQUFBO0FBQUEsRUFHM0QsT0FBTyxVQUFVO0FBQUEsSUFDZixZQUFZLEVBQUUsVUFBVTtBQUFBLElBQ3hCLGdCQUFnQixHQUFHO0FBQUEsRUFDckI7QUFBQTs7OztFQ1RBLElBQU07QUFBQSxFQUNOLElBQU0sMkJBQTRCO0FBQUEsRUFFbEMsZUFBZSxZQUFhLENBQUMsT0FBTSxPQUFPLE9BQU87QUFBQSxJQUUvQyxNQUFNLEtBQUssTUFBTSxHQUFHLEtBQUssT0FBTSxJQUFJO0FBQUEsSUFFbkMsSUFBSSxXQUFXO0FBQUEsSUFFZixJQUFJO0FBQUEsTUFDRixNQUFNLEdBQUcsUUFBUSxJQUFJLE9BQU8sS0FBSztBQUFBLGNBQ2pDO0FBQUEsTUFDQSxJQUFJO0FBQUEsUUFDRixNQUFNLEdBQUcsTUFBTSxFQUFFO0FBQUEsUUFDakIsT0FBTyxHQUFHO0FBQUEsUUFDVixXQUFXO0FBQUE7QUFBQTtBQUFBLElBSWYsSUFBSSxVQUFVO0FBQUEsTUFDWixNQUFNO0FBQUEsSUFDUjtBQUFBO0FBQUEsRUFHRixTQUFTLGdCQUFpQixDQUFDLE9BQU0sT0FBTyxPQUFPO0FBQUEsSUFDN0MsTUFBTSxLQUFLLEdBQUcsU0FBUyxPQUFNLElBQUk7QUFBQSxJQUNqQyxHQUFHLFlBQVksSUFBSSxPQUFPLEtBQUs7QUFBQSxJQUMvQixPQUFPLEdBQUcsVUFBVSxFQUFFO0FBQUE7QUFBQSxFQUd4QixPQUFPLFVBQVU7QUFBQSxJQUNmLGNBQWMsRUFBRSxZQUFZO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQUE7Ozs7RUNqQ0EsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTSwyQkFBNEI7QUFBQSxFQUVsQyxTQUFTLFFBQVMsQ0FBQyxLQUFLLE1BQU0sTUFBTTtBQUFBLElBQ2xDLE1BQU0sV0FBVyxLQUFLLGNBQ2xCLENBQUMsU0FBUyxHQUFHLEtBQUssTUFBTSxFQUFFLFFBQVEsS0FBSyxDQUFDLElBQ3hDLENBQUMsU0FBUyxHQUFHLE1BQU0sTUFBTSxFQUFFLFFBQVEsS0FBSyxDQUFDO0FBQUEsSUFDN0MsT0FBTyxRQUFRLElBQUk7QUFBQSxNQUNqQixTQUFTLEdBQUc7QUFBQSxNQUNaLFNBQVMsSUFBSSxFQUFFLE1BQU0sU0FBTztBQUFBLFFBQzFCLElBQUksSUFBSSxTQUFTO0FBQUEsVUFBVSxPQUFPO0FBQUEsUUFDbEMsTUFBTTtBQUFBLE9BQ1A7QUFBQSxJQUNILENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxlQUFlLEVBQUUsU0FBUyxTQUFTLEVBQUU7QUFBQTtBQUFBLEVBRzFELFNBQVMsWUFBYSxDQUFDLEtBQUssTUFBTSxNQUFNO0FBQUEsSUFDdEMsSUFBSTtBQUFBLElBQ0osTUFBTSxXQUFXLEtBQUssY0FDbEIsQ0FBQyxTQUFTLEdBQUcsU0FBUyxNQUFNLEVBQUUsUUFBUSxLQUFLLENBQUMsSUFDNUMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUSxLQUFLLENBQUM7QUFBQSxJQUNqRCxNQUFNLFVBQVUsU0FBUyxHQUFHO0FBQUEsSUFDNUIsSUFBSTtBQUFBLE1BQ0YsV0FBVyxTQUFTLElBQUk7QUFBQSxNQUN4QixPQUFPLEtBQUs7QUFBQSxNQUNaLElBQUksSUFBSSxTQUFTO0FBQUEsUUFBVSxPQUFPLEVBQUUsU0FBUyxVQUFVLEtBQUs7QUFBQSxNQUM1RCxNQUFNO0FBQUE7QUFBQSxJQUVSLE9BQU8sRUFBRSxTQUFTLFNBQVM7QUFBQTtBQUFBLEVBRzdCLGVBQWUsVUFBVyxDQUFDLEtBQUssTUFBTSxVQUFVLE1BQU07QUFBQSxJQUNwRCxRQUFRLFNBQVMsYUFBYSxNQUFNLFNBQVMsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUM1RCxJQUFJLFVBQVU7QUFBQSxNQUNaLElBQUksYUFBYSxTQUFTLFFBQVEsR0FBRztBQUFBLFFBQ25DLE1BQU0sY0FBYyxNQUFLLFNBQVMsR0FBRztBQUFBLFFBQ3JDLE1BQU0sZUFBZSxNQUFLLFNBQVMsSUFBSTtBQUFBLFFBQ3ZDLElBQUksYUFBYSxVQUNmLGdCQUFnQixnQkFDaEIsWUFBWSxZQUFZLE1BQU0sYUFBYSxZQUFZLEdBQUc7QUFBQSxVQUMxRCxPQUFPLEVBQUUsU0FBUyxVQUFVLGdCQUFnQixLQUFLO0FBQUEsUUFDbkQ7QUFBQSxRQUNBLE1BQU0sSUFBSSxNQUFNLDhDQUE4QztBQUFBLE1BQ2hFO0FBQUEsTUFDQSxJQUFJLFFBQVEsWUFBWSxNQUFNLFNBQVMsWUFBWSxHQUFHO0FBQUEsUUFDcEQsTUFBTSxJQUFJLE1BQU0sbUNBQW1DLHlCQUF5QixPQUFPO0FBQUEsTUFDckY7QUFBQSxNQUNBLEtBQUssUUFBUSxZQUFZLEtBQUssU0FBUyxZQUFZLEdBQUc7QUFBQSxRQUNwRCxNQUFNLElBQUksTUFBTSwrQkFBK0IsNkJBQTZCLE9BQU87QUFBQSxNQUNyRjtBQUFBLElBQ0Y7QUFBQSxJQUVBLElBQUksUUFBUSxZQUFZLEtBQUssWUFBWSxLQUFLLElBQUksR0FBRztBQUFBLE1BQ25ELE1BQU0sSUFBSSxNQUFNLE9BQU8sS0FBSyxNQUFNLFFBQVEsQ0FBQztBQUFBLElBQzdDO0FBQUEsSUFFQSxPQUFPLEVBQUUsU0FBUyxTQUFTO0FBQUE7QUFBQSxFQUc3QixTQUFTLGNBQWUsQ0FBQyxLQUFLLE1BQU0sVUFBVSxNQUFNO0FBQUEsSUFDbEQsUUFBUSxTQUFTLGFBQWEsYUFBYSxLQUFLLE1BQU0sSUFBSTtBQUFBLElBRTFELElBQUksVUFBVTtBQUFBLE1BQ1osSUFBSSxhQUFhLFNBQVMsUUFBUSxHQUFHO0FBQUEsUUFDbkMsTUFBTSxjQUFjLE1BQUssU0FBUyxHQUFHO0FBQUEsUUFDckMsTUFBTSxlQUFlLE1BQUssU0FBUyxJQUFJO0FBQUEsUUFDdkMsSUFBSSxhQUFhLFVBQ2YsZ0JBQWdCLGdCQUNoQixZQUFZLFlBQVksTUFBTSxhQUFhLFlBQVksR0FBRztBQUFBLFVBQzFELE9BQU8sRUFBRSxTQUFTLFVBQVUsZ0JBQWdCLEtBQUs7QUFBQSxRQUNuRDtBQUFBLFFBQ0EsTUFBTSxJQUFJLE1BQU0sOENBQThDO0FBQUEsTUFDaEU7QUFBQSxNQUNBLElBQUksUUFBUSxZQUFZLE1BQU0sU0FBUyxZQUFZLEdBQUc7QUFBQSxRQUNwRCxNQUFNLElBQUksTUFBTSxtQ0FBbUMseUJBQXlCLE9BQU87QUFBQSxNQUNyRjtBQUFBLE1BQ0EsS0FBSyxRQUFRLFlBQVksS0FBSyxTQUFTLFlBQVksR0FBRztBQUFBLFFBQ3BELE1BQU0sSUFBSSxNQUFNLCtCQUErQiw2QkFBNkIsT0FBTztBQUFBLE1BQ3JGO0FBQUEsSUFDRjtBQUFBLElBRUEsSUFBSSxRQUFRLFlBQVksS0FBSyxZQUFZLEtBQUssSUFBSSxHQUFHO0FBQUEsTUFDbkQsTUFBTSxJQUFJLE1BQU0sT0FBTyxLQUFLLE1BQU0sUUFBUSxDQUFDO0FBQUEsSUFDN0M7QUFBQSxJQUNBLE9BQU8sRUFBRSxTQUFTLFNBQVM7QUFBQTtBQUFBLEVBTzdCLGVBQWUsZ0JBQWlCLENBQUMsS0FBSyxTQUFTLE1BQU0sVUFBVTtBQUFBLElBQzdELE1BQU0sWUFBWSxNQUFLLFFBQVEsTUFBSyxRQUFRLEdBQUcsQ0FBQztBQUFBLElBQ2hELE1BQU0sYUFBYSxNQUFLLFFBQVEsTUFBSyxRQUFRLElBQUksQ0FBQztBQUFBLElBQ2xELElBQUksZUFBZSxhQUFhLGVBQWUsTUFBSyxNQUFNLFVBQVUsRUFBRTtBQUFBLE1BQU07QUFBQSxJQUU1RSxJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsTUFDRixXQUFXLE1BQU0sR0FBRyxLQUFLLFlBQVksRUFBRSxRQUFRLEtBQUssQ0FBQztBQUFBLE1BQ3JELE9BQU8sS0FBSztBQUFBLE1BQ1osSUFBSSxJQUFJLFNBQVM7QUFBQSxRQUFVO0FBQUEsTUFDM0IsTUFBTTtBQUFBO0FBQUEsSUFHUixJQUFJLGFBQWEsU0FBUyxRQUFRLEdBQUc7QUFBQSxNQUNuQyxNQUFNLElBQUksTUFBTSxPQUFPLEtBQUssTUFBTSxRQUFRLENBQUM7QUFBQSxJQUM3QztBQUFBLElBRUEsT0FBTyxpQkFBaUIsS0FBSyxTQUFTLFlBQVksUUFBUTtBQUFBO0FBQUEsRUFHNUQsU0FBUyxvQkFBcUIsQ0FBQyxLQUFLLFNBQVMsTUFBTSxVQUFVO0FBQUEsSUFDM0QsTUFBTSxZQUFZLE1BQUssUUFBUSxNQUFLLFFBQVEsR0FBRyxDQUFDO0FBQUEsSUFDaEQsTUFBTSxhQUFhLE1BQUssUUFBUSxNQUFLLFFBQVEsSUFBSSxDQUFDO0FBQUEsSUFDbEQsSUFBSSxlQUFlLGFBQWEsZUFBZSxNQUFLLE1BQU0sVUFBVSxFQUFFO0FBQUEsTUFBTTtBQUFBLElBQzVFLElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxNQUNGLFdBQVcsR0FBRyxTQUFTLFlBQVksRUFBRSxRQUFRLEtBQUssQ0FBQztBQUFBLE1BQ25ELE9BQU8sS0FBSztBQUFBLE1BQ1osSUFBSSxJQUFJLFNBQVM7QUFBQSxRQUFVO0FBQUEsTUFDM0IsTUFBTTtBQUFBO0FBQUEsSUFFUixJQUFJLGFBQWEsU0FBUyxRQUFRLEdBQUc7QUFBQSxNQUNuQyxNQUFNLElBQUksTUFBTSxPQUFPLEtBQUssTUFBTSxRQUFRLENBQUM7QUFBQSxJQUM3QztBQUFBLElBQ0EsT0FBTyxxQkFBcUIsS0FBSyxTQUFTLFlBQVksUUFBUTtBQUFBO0FBQUEsRUFHaEUsU0FBUyxZQUFhLENBQUMsU0FBUyxVQUFVO0FBQUEsSUFDeEMsT0FBTyxTQUFTLE9BQU8sU0FBUyxPQUFPLFNBQVMsUUFBUSxRQUFRLE9BQU8sU0FBUyxRQUFRLFFBQVE7QUFBQTtBQUFBLEVBS2xHLFNBQVMsV0FBWSxDQUFDLEtBQUssTUFBTTtBQUFBLElBQy9CLE1BQU0sU0FBUyxNQUFLLFFBQVEsR0FBRyxFQUFFLE1BQU0sTUFBSyxHQUFHLEVBQUUsT0FBTyxPQUFLLENBQUM7QUFBQSxJQUM5RCxNQUFNLFVBQVUsTUFBSyxRQUFRLElBQUksRUFBRSxNQUFNLE1BQUssR0FBRyxFQUFFLE9BQU8sT0FBSyxDQUFDO0FBQUEsSUFDaEUsT0FBTyxPQUFPLE1BQU0sQ0FBQyxLQUFLLE1BQU0sUUFBUSxPQUFPLEdBQUc7QUFBQTtBQUFBLEVBR3BELFNBQVMsTUFBTyxDQUFDLEtBQUssTUFBTSxVQUFVO0FBQUEsSUFDcEMsT0FBTyxVQUFVLGFBQWEsc0NBQXNDO0FBQUE7QUFBQSxFQUd0RSxPQUFPLFVBQVU7QUFBQSxJQUVmLFlBQVksRUFBRSxVQUFVO0FBQUEsSUFDeEI7QUFBQSxJQUVBLGtCQUFrQixFQUFFLGdCQUFnQjtBQUFBLElBQ3BDO0FBQUEsSUFFQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQUE7Ozs7RUMzSkEsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sTUFBUTtBQUFBLEVBQ1IsTUFBUTtBQUFBLEVBQ1IsTUFBUTtBQUFBLEVBQ1IsSUFBTTtBQUFBLEVBRU4sZUFBZSxJQUFLLENBQUMsS0FBSyxNQUFNLE9BQU8sQ0FBQyxHQUFHO0FBQUEsSUFDekMsSUFBSSxPQUFPLFNBQVMsWUFBWTtBQUFBLE1BQzlCLE9BQU8sRUFBRSxRQUFRLEtBQUs7QUFBQSxJQUN4QjtBQUFBLElBRUEsS0FBSyxVQUFVLGFBQWEsU0FBUyxLQUFLLFVBQVU7QUFBQSxJQUNwRCxLQUFLLFlBQVksZUFBZSxTQUFTLEtBQUssWUFBWSxLQUFLO0FBQUEsSUFHL0QsSUFBSSxLQUFLLHNCQUFzQixRQUFRLFNBQVMsUUFBUTtBQUFBLE1BQ3RELFFBQVEsWUFDTjtBQUFBO0FBQUEsSUFDQSxrRUFDQSxXQUFXLG1CQUNiO0FBQUEsSUFDRjtBQUFBLElBRUEsUUFBUSxTQUFTLGFBQWEsTUFBTSxLQUFLLFdBQVcsS0FBSyxNQUFNLFFBQVEsSUFBSTtBQUFBLElBRTNFLE1BQU0sS0FBSyxpQkFBaUIsS0FBSyxTQUFTLE1BQU0sTUFBTTtBQUFBLElBRXRELE1BQU0sVUFBVSxNQUFNLFVBQVUsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUUvQyxLQUFLO0FBQUEsTUFBUztBQUFBLElBR2QsTUFBTSxhQUFhLE1BQUssUUFBUSxJQUFJO0FBQUEsSUFDcEMsTUFBTSxZQUFZLE1BQU0sV0FBVyxVQUFVO0FBQUEsSUFDN0MsS0FBSyxXQUFXO0FBQUEsTUFDZCxNQUFNLE9BQU8sVUFBVTtBQUFBLElBQ3pCO0FBQUEsSUFFQSxNQUFNLHVCQUF1QixVQUFVLEtBQUssTUFBTSxJQUFJO0FBQUE7QUFBQSxFQUd4RCxlQUFlLFNBQVUsQ0FBQyxLQUFLLE1BQU0sTUFBTTtBQUFBLElBQ3pDLEtBQUssS0FBSztBQUFBLE1BQVEsT0FBTztBQUFBLElBQ3pCLE9BQU8sS0FBSyxPQUFPLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFHOUIsZUFBZSxzQkFBdUIsQ0FBQyxVQUFVLEtBQUssTUFBTSxNQUFNO0FBQUEsSUFDaEUsTUFBTSxTQUFTLEtBQUssY0FBYyxHQUFHLE9BQU8sR0FBRztBQUFBLElBQy9DLE1BQU0sVUFBVSxNQUFNLE9BQU8sR0FBRztBQUFBLElBRWhDLElBQUksUUFBUSxZQUFZO0FBQUEsTUFBRyxPQUFPLE1BQU0sU0FBUyxVQUFVLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFFMUUsSUFDRSxRQUFRLE9BQU8sS0FDZixRQUFRLGtCQUFrQixLQUMxQixRQUFRLGNBQWM7QUFBQSxNQUN0QixPQUFPLE9BQU8sU0FBUyxVQUFVLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFFbEQsSUFBSSxRQUFRLGVBQWU7QUFBQSxNQUFHLE9BQU8sT0FBTyxVQUFVLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFDckUsSUFBSSxRQUFRLFNBQVM7QUFBQSxNQUFHLE1BQU0sSUFBSSxNQUFNLDhCQUE4QixLQUFLO0FBQUEsSUFDM0UsSUFBSSxRQUFRLE9BQU87QUFBQSxNQUFHLE1BQU0sSUFBSSxNQUFNLDRCQUE0QixLQUFLO0FBQUEsSUFDdkUsTUFBTSxJQUFJLE1BQU0saUJBQWlCLEtBQUs7QUFBQTtBQUFBLEVBR3hDLGVBQWUsTUFBTyxDQUFDLFNBQVMsVUFBVSxLQUFLLE1BQU0sTUFBTTtBQUFBLElBQ3pELEtBQUs7QUFBQSxNQUFVLE9BQU8sU0FBUyxTQUFTLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFFdkQsSUFBSSxLQUFLLFdBQVc7QUFBQSxNQUNsQixNQUFNLEdBQUcsT0FBTyxJQUFJO0FBQUEsTUFDcEIsT0FBTyxTQUFTLFNBQVMsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUMxQztBQUFBLElBQ0EsSUFBSSxLQUFLLGNBQWM7QUFBQSxNQUNyQixNQUFNLElBQUksTUFBTSxJQUFJLHNCQUFzQjtBQUFBLElBQzVDO0FBQUE7QUFBQSxFQUdGLGVBQWUsUUFBUyxDQUFDLFNBQVMsS0FBSyxNQUFNLE1BQU07QUFBQSxJQUNqRCxNQUFNLEdBQUcsU0FBUyxLQUFLLElBQUk7QUFBQSxJQUMzQixJQUFJLEtBQUssb0JBQW9CO0FBQUEsTUFJM0IsSUFBSSxrQkFBa0IsUUFBUSxJQUFJLEdBQUc7QUFBQSxRQUNuQyxNQUFNLGlCQUFpQixNQUFNLFFBQVEsSUFBSTtBQUFBLE1BQzNDO0FBQUEsTUFPQSxNQUFNLGlCQUFpQixNQUFNLEdBQUcsS0FBSyxHQUFHO0FBQUEsTUFDeEMsTUFBTSxhQUFhLE1BQU0sZUFBZSxPQUFPLGVBQWUsS0FBSztBQUFBLElBQ3JFO0FBQUEsSUFFQSxPQUFPLEdBQUcsTUFBTSxNQUFNLFFBQVEsSUFBSTtBQUFBO0FBQUEsRUFHcEMsU0FBUyxpQkFBa0IsQ0FBQyxTQUFTO0FBQUEsSUFDbkMsUUFBUSxVQUFVLFNBQVc7QUFBQTtBQUFBLEVBRy9CLFNBQVMsZ0JBQWlCLENBQUMsTUFBTSxTQUFTO0FBQUEsSUFDeEMsT0FBTyxHQUFHLE1BQU0sTUFBTSxVQUFVLEdBQUs7QUFBQTtBQUFBLEVBR3ZDLGVBQWUsS0FBTSxDQUFDLFNBQVMsVUFBVSxLQUFLLE1BQU0sTUFBTTtBQUFBLElBRXhELEtBQUssVUFBVTtBQUFBLE1BQ2IsTUFBTSxHQUFHLE1BQU0sSUFBSTtBQUFBLElBQ3JCO0FBQUEsSUFFQSxNQUFNLFdBQVcsQ0FBQztBQUFBLElBR2xCLGlCQUFpQixRQUFRLE1BQU0sR0FBRyxRQUFRLEdBQUcsR0FBRztBQUFBLE1BQzlDLE1BQU0sVUFBVSxNQUFLLEtBQUssS0FBSyxLQUFLLElBQUk7QUFBQSxNQUN4QyxNQUFNLFdBQVcsTUFBSyxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUEsTUFFMUMsU0FBUyxLQUNQLFVBQVUsU0FBUyxVQUFVLElBQUksRUFBRSxLQUFLLGFBQVc7QUFBQSxRQUNqRCxJQUFJLFNBQVM7QUFBQSxVQUVYLE9BQU8sS0FBSyxXQUFXLFNBQVMsVUFBVSxRQUFRLElBQUksRUFBRSxLQUFLLEdBQUcsMEJBQWU7QUFBQSxZQUc3RSxPQUFPLHVCQUF1QixXQUFVLFNBQVMsVUFBVSxJQUFJO0FBQUEsV0FDaEU7QUFBQSxRQUNIO0FBQUEsT0FDRCxDQUNIO0FBQUEsSUFDRjtBQUFBLElBRUEsTUFBTSxRQUFRLElBQUksUUFBUTtBQUFBLElBRTFCLEtBQUssVUFBVTtBQUFBLE1BQ2IsTUFBTSxHQUFHLE1BQU0sTUFBTSxRQUFRLElBQUk7QUFBQSxJQUNuQztBQUFBO0FBQUEsRUFHRixlQUFlLE1BQU8sQ0FBQyxVQUFVLEtBQUssTUFBTSxNQUFNO0FBQUEsSUFDaEQsSUFBSSxjQUFjLE1BQU0sR0FBRyxTQUFTLEdBQUc7QUFBQSxJQUN2QyxJQUFJLEtBQUssYUFBYTtBQUFBLE1BQ3BCLGNBQWMsTUFBSyxRQUFRLFFBQVEsSUFBSSxHQUFHLFdBQVc7QUFBQSxJQUN2RDtBQUFBLElBQ0EsS0FBSyxVQUFVO0FBQUEsTUFDYixPQUFPLEdBQUcsUUFBUSxhQUFhLElBQUk7QUFBQSxJQUNyQztBQUFBLElBRUEsSUFBSSxlQUFlO0FBQUEsSUFDbkIsSUFBSTtBQUFBLE1BQ0YsZUFBZSxNQUFNLEdBQUcsU0FBUyxJQUFJO0FBQUEsTUFDckMsT0FBTyxHQUFHO0FBQUEsTUFJVixJQUFJLEVBQUUsU0FBUyxZQUFZLEVBQUUsU0FBUztBQUFBLFFBQVcsT0FBTyxHQUFHLFFBQVEsYUFBYSxJQUFJO0FBQUEsTUFDcEYsTUFBTTtBQUFBO0FBQUEsSUFFUixJQUFJLEtBQUssYUFBYTtBQUFBLE1BQ3BCLGVBQWUsTUFBSyxRQUFRLFFBQVEsSUFBSSxHQUFHLFlBQVk7QUFBQSxJQUN6RDtBQUFBLElBQ0EsSUFBSSxLQUFLLFlBQVksYUFBYSxZQUFZLEdBQUc7QUFBQSxNQUMvQyxNQUFNLElBQUksTUFBTSxnQkFBZ0IsOENBQThDLGdCQUFnQjtBQUFBLElBQ2hHO0FBQUEsSUFLQSxJQUFJLEtBQUssWUFBWSxjQUFjLFdBQVcsR0FBRztBQUFBLE1BQy9DLE1BQU0sSUFBSSxNQUFNLHFCQUFxQix1QkFBdUIsZUFBZTtBQUFBLElBQzdFO0FBQUEsSUFHQSxNQUFNLEdBQUcsT0FBTyxJQUFJO0FBQUEsSUFDcEIsT0FBTyxHQUFHLFFBQVEsYUFBYSxJQUFJO0FBQUE7QUFBQSxFQUdyQyxPQUFPLFVBQVU7QUFBQTs7OztFQ25MakIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTSw4QkFBa0M7QUFBQSxFQUN4QyxJQUFNLG9DQUE2QztBQUFBLEVBQ25ELElBQU07QUFBQSxFQUVOLFNBQVMsUUFBUyxDQUFDLEtBQUssTUFBTSxNQUFNO0FBQUEsSUFDbEMsSUFBSSxPQUFPLFNBQVMsWUFBWTtBQUFBLE1BQzlCLE9BQU8sRUFBRSxRQUFRLEtBQUs7QUFBQSxJQUN4QjtBQUFBLElBRUEsT0FBTyxRQUFRLENBQUM7QUFBQSxJQUNoQixLQUFLLFVBQVUsYUFBYSxTQUFTLEtBQUssVUFBVTtBQUFBLElBQ3BELEtBQUssWUFBWSxlQUFlLFNBQVMsS0FBSyxZQUFZLEtBQUs7QUFBQSxJQUcvRCxJQUFJLEtBQUssc0JBQXNCLFFBQVEsU0FBUyxRQUFRO0FBQUEsTUFDdEQsUUFBUSxZQUNOO0FBQUE7QUFBQSxJQUNBLGtFQUNBLFdBQVcsbUJBQ2I7QUFBQSxJQUNGO0FBQUEsSUFFQSxRQUFRLFNBQVMsYUFBYSxLQUFLLGVBQWUsS0FBSyxNQUFNLFFBQVEsSUFBSTtBQUFBLElBQ3pFLEtBQUsscUJBQXFCLEtBQUssU0FBUyxNQUFNLE1BQU07QUFBQSxJQUNwRCxJQUFJLEtBQUssV0FBVyxLQUFLLE9BQU8sS0FBSyxJQUFJO0FBQUEsTUFBRztBQUFBLElBQzVDLE1BQU0sYUFBYSxNQUFLLFFBQVEsSUFBSTtBQUFBLElBQ3BDLEtBQUssR0FBRyxXQUFXLFVBQVU7QUFBQSxNQUFHLFdBQVcsVUFBVTtBQUFBLElBQ3JELE9BQU8sU0FBUyxVQUFVLEtBQUssTUFBTSxJQUFJO0FBQUE7QUFBQSxFQUczQyxTQUFTLFFBQVMsQ0FBQyxVQUFVLEtBQUssTUFBTSxNQUFNO0FBQUEsSUFDNUMsTUFBTSxXQUFXLEtBQUssY0FBYyxHQUFHLFdBQVcsR0FBRztBQUFBLElBQ3JELE1BQU0sVUFBVSxTQUFTLEdBQUc7QUFBQSxJQUU1QixJQUFJLFFBQVEsWUFBWTtBQUFBLE1BQUcsT0FBTyxNQUFNLFNBQVMsVUFBVSxLQUFLLE1BQU0sSUFBSTtBQUFBLElBQ3JFLFNBQUksUUFBUSxPQUFPLEtBQ2YsUUFBUSxrQkFBa0IsS0FDMUIsUUFBUSxjQUFjO0FBQUEsTUFBRyxPQUFPLE9BQU8sU0FBUyxVQUFVLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFDN0UsU0FBSSxRQUFRLGVBQWU7QUFBQSxNQUFHLE9BQU8sT0FBTyxVQUFVLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFDckUsU0FBSSxRQUFRLFNBQVM7QUFBQSxNQUFHLE1BQU0sSUFBSSxNQUFNLDhCQUE4QixLQUFLO0FBQUEsSUFDM0UsU0FBSSxRQUFRLE9BQU87QUFBQSxNQUFHLE1BQU0sSUFBSSxNQUFNLDRCQUE0QixLQUFLO0FBQUEsSUFDNUUsTUFBTSxJQUFJLE1BQU0saUJBQWlCLEtBQUs7QUFBQTtBQUFBLEVBR3hDLFNBQVMsTUFBTyxDQUFDLFNBQVMsVUFBVSxLQUFLLE1BQU0sTUFBTTtBQUFBLElBQ25ELEtBQUs7QUFBQSxNQUFVLE9BQU8sU0FBUyxTQUFTLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFDdkQsT0FBTyxZQUFZLFNBQVMsS0FBSyxNQUFNLElBQUk7QUFBQTtBQUFBLEVBRzdDLFNBQVMsV0FBWSxDQUFDLFNBQVMsS0FBSyxNQUFNLE1BQU07QUFBQSxJQUM5QyxJQUFJLEtBQUssV0FBVztBQUFBLE1BQ2xCLEdBQUcsV0FBVyxJQUFJO0FBQUEsTUFDbEIsT0FBTyxTQUFTLFNBQVMsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUMxQyxFQUFPLFNBQUksS0FBSyxjQUFjO0FBQUEsTUFDNUIsTUFBTSxJQUFJLE1BQU0sSUFBSSxzQkFBc0I7QUFBQSxJQUM1QztBQUFBO0FBQUEsRUFHRixTQUFTLFFBQVMsQ0FBQyxTQUFTLEtBQUssTUFBTSxNQUFNO0FBQUEsSUFDM0MsR0FBRyxhQUFhLEtBQUssSUFBSTtBQUFBLElBQ3pCLElBQUksS0FBSztBQUFBLE1BQW9CLGlCQUFpQixRQUFRLE1BQU0sS0FBSyxJQUFJO0FBQUEsSUFDckUsT0FBTyxZQUFZLE1BQU0sUUFBUSxJQUFJO0FBQUE7QUFBQSxFQUd2QyxTQUFTLGdCQUFpQixDQUFDLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFJN0MsSUFBSSxrQkFBa0IsT0FBTztBQUFBLE1BQUcsaUJBQWlCLE1BQU0sT0FBTztBQUFBLElBQzlELE9BQU8sa0JBQWtCLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFHcEMsU0FBUyxpQkFBa0IsQ0FBQyxTQUFTO0FBQUEsSUFDbkMsUUFBUSxVQUFVLFNBQVc7QUFBQTtBQUFBLEVBRy9CLFNBQVMsZ0JBQWlCLENBQUMsTUFBTSxTQUFTO0FBQUEsSUFDeEMsT0FBTyxZQUFZLE1BQU0sVUFBVSxHQUFLO0FBQUE7QUFBQSxFQUcxQyxTQUFTLFdBQVksQ0FBQyxNQUFNLFNBQVM7QUFBQSxJQUNuQyxPQUFPLEdBQUcsVUFBVSxNQUFNLE9BQU87QUFBQTtBQUFBLEVBR25DLFNBQVMsaUJBQWtCLENBQUMsS0FBSyxNQUFNO0FBQUEsSUFJckMsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLEdBQUc7QUFBQSxJQUN0QyxPQUFPLGlCQUFpQixNQUFNLGVBQWUsT0FBTyxlQUFlLEtBQUs7QUFBQTtBQUFBLEVBRzFFLFNBQVMsS0FBTSxDQUFDLFNBQVMsVUFBVSxLQUFLLE1BQU0sTUFBTTtBQUFBLElBQ2xELEtBQUs7QUFBQSxNQUFVLE9BQU8sYUFBYSxRQUFRLE1BQU0sS0FBSyxNQUFNLElBQUk7QUFBQSxJQUNoRSxPQUFPLFFBQVEsS0FBSyxNQUFNLElBQUk7QUFBQTtBQUFBLEVBR2hDLFNBQVMsWUFBYSxDQUFDLFNBQVMsS0FBSyxNQUFNLE1BQU07QUFBQSxJQUMvQyxHQUFHLFVBQVUsSUFBSTtBQUFBLElBQ2pCLFFBQVEsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUN2QixPQUFPLFlBQVksTUFBTSxPQUFPO0FBQUE7QUFBQSxFQUdsQyxTQUFTLE9BQVEsQ0FBQyxLQUFLLE1BQU0sTUFBTTtBQUFBLElBQ2pDLE1BQU0sTUFBTSxHQUFHLFlBQVksR0FBRztBQUFBLElBRTlCLElBQUk7QUFBQSxNQUNGLElBQUk7QUFBQSxNQUVKLFFBQVEsU0FBUyxJQUFJLFNBQVMsT0FBTyxNQUFNO0FBQUEsUUFDekMsWUFBWSxPQUFPLE1BQU0sS0FBSyxNQUFNLElBQUk7QUFBQSxNQUMxQztBQUFBLGNBQ0E7QUFBQSxNQUNBLElBQUksVUFBVTtBQUFBO0FBQUE7QUFBQSxFQUlsQixTQUFTLFdBQVksQ0FBQyxNQUFNLEtBQUssTUFBTSxNQUFNO0FBQUEsSUFDM0MsTUFBTSxVQUFVLE1BQUssS0FBSyxLQUFLLElBQUk7QUFBQSxJQUNuQyxNQUFNLFdBQVcsTUFBSyxLQUFLLE1BQU0sSUFBSTtBQUFBLElBQ3JDLElBQUksS0FBSyxXQUFXLEtBQUssT0FBTyxTQUFTLFFBQVE7QUFBQSxNQUFHO0FBQUEsSUFDcEQsUUFBUSxhQUFhLEtBQUssZUFBZSxTQUFTLFVBQVUsUUFBUSxJQUFJO0FBQUEsSUFDeEUsT0FBTyxTQUFTLFVBQVUsU0FBUyxVQUFVLElBQUk7QUFBQTtBQUFBLEVBR25ELFNBQVMsTUFBTyxDQUFDLFVBQVUsS0FBSyxNQUFNLE1BQU07QUFBQSxJQUMxQyxJQUFJLGNBQWMsR0FBRyxhQUFhLEdBQUc7QUFBQSxJQUNyQyxJQUFJLEtBQUssYUFBYTtBQUFBLE1BQ3BCLGNBQWMsTUFBSyxRQUFRLFFBQVEsSUFBSSxHQUFHLFdBQVc7QUFBQSxJQUN2RDtBQUFBLElBRUEsS0FBSyxVQUFVO0FBQUEsTUFDYixPQUFPLEdBQUcsWUFBWSxhQUFhLElBQUk7QUFBQSxJQUN6QyxFQUFPO0FBQUEsTUFDTCxJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsUUFDRixlQUFlLEdBQUcsYUFBYSxJQUFJO0FBQUEsUUFDbkMsT0FBTyxLQUFLO0FBQUEsUUFJWixJQUFJLElBQUksU0FBUyxZQUFZLElBQUksU0FBUztBQUFBLFVBQVcsT0FBTyxHQUFHLFlBQVksYUFBYSxJQUFJO0FBQUEsUUFDNUYsTUFBTTtBQUFBO0FBQUEsTUFFUixJQUFJLEtBQUssYUFBYTtBQUFBLFFBQ3BCLGVBQWUsTUFBSyxRQUFRLFFBQVEsSUFBSSxHQUFHLFlBQVk7QUFBQSxNQUN6RDtBQUFBLE1BQ0EsSUFBSSxLQUFLLFlBQVksYUFBYSxZQUFZLEdBQUc7QUFBQSxRQUMvQyxNQUFNLElBQUksTUFBTSxnQkFBZ0IsOENBQThDLGdCQUFnQjtBQUFBLE1BQ2hHO0FBQUEsTUFLQSxJQUFJLEtBQUssWUFBWSxjQUFjLFdBQVcsR0FBRztBQUFBLFFBQy9DLE1BQU0sSUFBSSxNQUFNLHFCQUFxQix1QkFBdUIsZUFBZTtBQUFBLE1BQzdFO0FBQUEsTUFDQSxPQUFPLFNBQVMsYUFBYSxJQUFJO0FBQUE7QUFBQTtBQUFBLEVBSXJDLFNBQVMsUUFBUyxDQUFDLGFBQWEsTUFBTTtBQUFBLElBQ3BDLEdBQUcsV0FBVyxJQUFJO0FBQUEsSUFDbEIsT0FBTyxHQUFHLFlBQVksYUFBYSxJQUFJO0FBQUE7QUFBQSxFQUd6QyxPQUFPLFVBQVU7QUFBQTs7OztFQ3hLakIsSUFBTSwyQkFBNEI7QUFBQSxFQUNsQyxPQUFPLFVBQVU7QUFBQSxJQUNmLE1BQU0sZ0JBQW1CO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQUE7Ozs7RUNKQSxJQUFNO0FBQUEsRUFDTixJQUFNLDJCQUE0QjtBQUFBLEVBRWxDLFNBQVMsTUFBTyxDQUFDLE9BQU0sVUFBVTtBQUFBLElBQy9CLEdBQUcsR0FBRyxPQUFNLEVBQUUsV0FBVyxNQUFNLE9BQU8sS0FBSyxHQUFHLFFBQVE7QUFBQTtBQUFBLEVBR3hELFNBQVMsVUFBVyxDQUFDLE9BQU07QUFBQSxJQUN6QixHQUFHLE9BQU8sT0FBTSxFQUFFLFdBQVcsTUFBTSxPQUFPLEtBQUssQ0FBQztBQUFBO0FBQUEsRUFHbEQsT0FBTyxVQUFVO0FBQUEsSUFDZixRQUFRLEVBQUUsTUFBTTtBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUFBOzs7O0VDZEEsSUFBTSwyQkFBNEI7QUFBQSxFQUNsQyxJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFFTixJQUFNLFdBQVcsRUFBRSxlQUFlLFFBQVMsQ0FBQyxLQUFLO0FBQUEsSUFDL0MsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLE1BQ0YsUUFBUSxNQUFNLEdBQUcsUUFBUSxHQUFHO0FBQUEsTUFDNUIsTUFBTTtBQUFBLE1BQ04sT0FBTyxNQUFNLE9BQU8sR0FBRztBQUFBO0FBQUEsSUFHekIsT0FBTyxRQUFRLElBQUksTUFBTSxJQUFJLFVBQVEsT0FBTyxPQUFPLE1BQUssS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7QUFBQSxHQUMxRTtBQUFBLEVBRUQsU0FBUyxZQUFhLENBQUMsS0FBSztBQUFBLElBQzFCLElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxNQUNGLFFBQVEsR0FBRyxZQUFZLEdBQUc7QUFBQSxNQUMxQixNQUFNO0FBQUEsTUFDTixPQUFPLE1BQU0sV0FBVyxHQUFHO0FBQUE7QUFBQSxJQUc3QixNQUFNLFFBQVEsVUFBUTtBQUFBLE1BQ3BCLE9BQU8sTUFBSyxLQUFLLEtBQUssSUFBSTtBQUFBLE1BQzFCLE9BQU8sV0FBVyxJQUFJO0FBQUEsS0FDdkI7QUFBQTtBQUFBLEVBR0gsT0FBTyxVQUFVO0FBQUEsSUFDZjtBQUFBLElBQ0EsY0FBYztBQUFBLElBQ2Q7QUFBQSxJQUNBLFVBQVU7QUFBQSxFQUNaO0FBQUE7Ozs7RUNwQ0EsSUFBTSwyQkFBNEI7QUFBQSxFQUNsQyxJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFFTixlQUFlLFVBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDL0IsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLE1BQ0YsUUFBUSxNQUFNLEdBQUcsS0FBSyxJQUFJO0FBQUEsTUFDMUIsTUFBTTtBQUFBLElBQ1IsSUFBSSxTQUFTLE1BQU0sT0FBTztBQUFBLE1BQUc7QUFBQSxJQUU3QixNQUFNLE1BQU0sTUFBSyxRQUFRLElBQUk7QUFBQSxJQUU3QixJQUFJLFdBQVc7QUFBQSxJQUNmLElBQUk7QUFBQSxNQUNGLFdBQVcsTUFBTSxHQUFHLEtBQUssR0FBRztBQUFBLE1BQzVCLE9BQU8sS0FBSztBQUFBLE1BRVosSUFBSSxJQUFJLFNBQVMsVUFBVTtBQUFBLFFBQ3pCLE1BQU0sTUFBTSxPQUFPLEdBQUc7QUFBQSxRQUN0QixNQUFNLEdBQUcsVUFBVSxNQUFNLEVBQUU7QUFBQSxRQUMzQjtBQUFBLE1BQ0YsRUFBTztBQUFBLFFBQ0wsTUFBTTtBQUFBO0FBQUE7QUFBQSxJQUlWLElBQUksU0FBUyxZQUFZLEdBQUc7QUFBQSxNQUMxQixNQUFNLEdBQUcsVUFBVSxNQUFNLEVBQUU7QUFBQSxJQUM3QixFQUFPO0FBQUEsTUFHTCxNQUFNLEdBQUcsUUFBUSxHQUFHO0FBQUE7QUFBQTtBQUFBLEVBSXhCLFNBQVMsY0FBZSxDQUFDLE1BQU07QUFBQSxJQUM3QixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsTUFDRixRQUFRLEdBQUcsU0FBUyxJQUFJO0FBQUEsTUFDeEIsTUFBTTtBQUFBLElBQ1IsSUFBSSxTQUFTLE1BQU0sT0FBTztBQUFBLE1BQUc7QUFBQSxJQUU3QixNQUFNLE1BQU0sTUFBSyxRQUFRLElBQUk7QUFBQSxJQUM3QixJQUFJO0FBQUEsTUFDRixLQUFLLEdBQUcsU0FBUyxHQUFHLEVBQUUsWUFBWSxHQUFHO0FBQUEsUUFHbkMsR0FBRyxZQUFZLEdBQUc7QUFBQSxNQUNwQjtBQUFBLE1BQ0EsT0FBTyxLQUFLO0FBQUEsTUFFWixJQUFJLE9BQU8sSUFBSSxTQUFTO0FBQUEsUUFBVSxNQUFNLFdBQVcsR0FBRztBQUFBLE1BQ2pEO0FBQUEsY0FBTTtBQUFBO0FBQUEsSUFHYixHQUFHLGNBQWMsTUFBTSxFQUFFO0FBQUE7QUFBQSxFQUczQixPQUFPLFVBQVU7QUFBQSxJQUNmLFlBQVksRUFBRSxVQUFVO0FBQUEsSUFDeEI7QUFBQSxFQUNGO0FBQUE7Ozs7RUMvREEsSUFBTSwyQkFBNEI7QUFBQSxFQUNsQyxJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixNQUFRO0FBQUEsRUFDUixNQUFRO0FBQUEsRUFFUixlQUFlLFVBQVcsQ0FBQyxTQUFTLFNBQVM7QUFBQSxJQUMzQyxJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsTUFDRixVQUFVLE1BQU0sR0FBRyxNQUFNLE9BQU87QUFBQSxNQUNoQyxNQUFNO0FBQUEsSUFJUixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsTUFDRixVQUFVLE1BQU0sR0FBRyxNQUFNLE9BQU87QUFBQSxNQUNoQyxPQUFPLEtBQUs7QUFBQSxNQUNaLElBQUksVUFBVSxJQUFJLFFBQVEsUUFBUSxTQUFTLFlBQVk7QUFBQSxNQUN2RCxNQUFNO0FBQUE7QUFBQSxJQUdSLElBQUksV0FBVyxhQUFhLFNBQVMsT0FBTztBQUFBLE1BQUc7QUFBQSxJQUUvQyxNQUFNLE1BQU0sTUFBSyxRQUFRLE9BQU87QUFBQSxJQUVoQyxNQUFNLFlBQVksTUFBTSxXQUFXLEdBQUc7QUFBQSxJQUV0QyxLQUFLLFdBQVc7QUFBQSxNQUNkLE1BQU0sTUFBTSxPQUFPLEdBQUc7QUFBQSxJQUN4QjtBQUFBLElBRUEsTUFBTSxHQUFHLEtBQUssU0FBUyxPQUFPO0FBQUE7QUFBQSxFQUdoQyxTQUFTLGNBQWUsQ0FBQyxTQUFTLFNBQVM7QUFBQSxJQUN6QyxJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsTUFDRixVQUFVLEdBQUcsVUFBVSxPQUFPO0FBQUEsTUFDOUIsTUFBTTtBQUFBLElBRVIsSUFBSTtBQUFBLE1BQ0YsTUFBTSxVQUFVLEdBQUcsVUFBVSxPQUFPO0FBQUEsTUFDcEMsSUFBSSxXQUFXLGFBQWEsU0FBUyxPQUFPO0FBQUEsUUFBRztBQUFBLE1BQy9DLE9BQU8sS0FBSztBQUFBLE1BQ1osSUFBSSxVQUFVLElBQUksUUFBUSxRQUFRLFNBQVMsWUFBWTtBQUFBLE1BQ3ZELE1BQU07QUFBQTtBQUFBLElBR1IsTUFBTSxNQUFNLE1BQUssUUFBUSxPQUFPO0FBQUEsSUFDaEMsTUFBTSxZQUFZLEdBQUcsV0FBVyxHQUFHO0FBQUEsSUFDbkMsSUFBSTtBQUFBLE1BQVcsT0FBTyxHQUFHLFNBQVMsU0FBUyxPQUFPO0FBQUEsSUFDbEQsTUFBTSxXQUFXLEdBQUc7QUFBQSxJQUVwQixPQUFPLEdBQUcsU0FBUyxTQUFTLE9BQU87QUFBQTtBQUFBLEVBR3JDLE9BQU8sVUFBVTtBQUFBLElBQ2YsWUFBWSxFQUFFLFVBQVU7QUFBQSxJQUN4QjtBQUFBLEVBQ0Y7QUFBQTs7OztFQzdEQSxJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixNQUFRO0FBQUEsRUFFUixJQUFNLDJCQUE0QjtBQUFBLEVBd0JsQyxlQUFlLFlBQWEsQ0FBQyxTQUFTLFNBQVM7QUFBQSxJQUM3QyxJQUFJLE1BQUssV0FBVyxPQUFPLEdBQUc7QUFBQSxNQUM1QixJQUFJO0FBQUEsUUFDRixNQUFNLEdBQUcsTUFBTSxPQUFPO0FBQUEsUUFDdEIsT0FBTyxLQUFLO0FBQUEsUUFDWixJQUFJLFVBQVUsSUFBSSxRQUFRLFFBQVEsU0FBUyxlQUFlO0FBQUEsUUFDMUQsTUFBTTtBQUFBO0FBQUEsTUFHUixPQUFPO0FBQUEsUUFDTCxPQUFPO0FBQUEsUUFDUCxPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxJQUVBLE1BQU0sU0FBUyxNQUFLLFFBQVEsT0FBTztBQUFBLElBQ25DLE1BQU0sZ0JBQWdCLE1BQUssS0FBSyxRQUFRLE9BQU87QUFBQSxJQUUvQyxNQUFNLFNBQVMsTUFBTSxXQUFXLGFBQWE7QUFBQSxJQUM3QyxJQUFJLFFBQVE7QUFBQSxNQUNWLE9BQU87QUFBQSxRQUNMLE9BQU87QUFBQSxRQUNQLE9BQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLElBRUEsSUFBSTtBQUFBLE1BQ0YsTUFBTSxHQUFHLE1BQU0sT0FBTztBQUFBLE1BQ3RCLE9BQU8sS0FBSztBQUFBLE1BQ1osSUFBSSxVQUFVLElBQUksUUFBUSxRQUFRLFNBQVMsZUFBZTtBQUFBLE1BQzFELE1BQU07QUFBQTtBQUFBLElBR1IsT0FBTztBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsT0FBTyxNQUFLLFNBQVMsUUFBUSxPQUFPO0FBQUEsSUFDdEM7QUFBQTtBQUFBLEVBR0YsU0FBUyxnQkFBaUIsQ0FBQyxTQUFTLFNBQVM7QUFBQSxJQUMzQyxJQUFJLE1BQUssV0FBVyxPQUFPLEdBQUc7QUFBQSxNQUM1QixNQUFNLFVBQVMsR0FBRyxXQUFXLE9BQU87QUFBQSxNQUNwQyxLQUFLO0FBQUEsUUFBUSxNQUFNLElBQUksTUFBTSxpQ0FBaUM7QUFBQSxNQUM5RCxPQUFPO0FBQUEsUUFDTCxPQUFPO0FBQUEsUUFDUCxPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxJQUVBLE1BQU0sU0FBUyxNQUFLLFFBQVEsT0FBTztBQUFBLElBQ25DLE1BQU0sZ0JBQWdCLE1BQUssS0FBSyxRQUFRLE9BQU87QUFBQSxJQUMvQyxNQUFNLFNBQVMsR0FBRyxXQUFXLGFBQWE7QUFBQSxJQUMxQyxJQUFJLFFBQVE7QUFBQSxNQUNWLE9BQU87QUFBQSxRQUNMLE9BQU87QUFBQSxRQUNQLE9BQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLElBRUEsTUFBTSxZQUFZLEdBQUcsV0FBVyxPQUFPO0FBQUEsSUFDdkMsS0FBSztBQUFBLE1BQVcsTUFBTSxJQUFJLE1BQU0saUNBQWlDO0FBQUEsSUFDakUsT0FBTztBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsT0FBTyxNQUFLLFNBQVMsUUFBUSxPQUFPO0FBQUEsSUFDdEM7QUFBQTtBQUFBLEVBR0YsT0FBTyxVQUFVO0FBQUEsSUFDZixjQUFjLEVBQUUsWUFBWTtBQUFBLElBQzVCO0FBQUEsRUFDRjtBQUFBOzs7O0VDbEdBLElBQU07QUFBQSxFQUNOLElBQU0sMkJBQTRCO0FBQUEsRUFFbEMsZUFBZSxXQUFZLENBQUMsU0FBUyxNQUFNO0FBQUEsSUFDekMsSUFBSTtBQUFBLE1BQU0sT0FBTztBQUFBLElBRWpCLElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxNQUNGLFFBQVEsTUFBTSxHQUFHLE1BQU0sT0FBTztBQUFBLE1BQzlCLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQTtBQUFBLElBR1QsT0FBUSxTQUFTLE1BQU0sWUFBWSxJQUFLLFFBQVE7QUFBQTtBQUFBLEVBR2xELFNBQVMsZUFBZ0IsQ0FBQyxTQUFTLE1BQU07QUFBQSxJQUN2QyxJQUFJO0FBQUEsTUFBTSxPQUFPO0FBQUEsSUFFakIsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLE1BQ0YsUUFBUSxHQUFHLFVBQVUsT0FBTztBQUFBLE1BQzVCLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQTtBQUFBLElBRVQsT0FBUSxTQUFTLE1BQU0sWUFBWSxJQUFLLFFBQVE7QUFBQTtBQUFBLEVBR2xELE9BQU8sVUFBVTtBQUFBLElBQ2YsYUFBYSxFQUFFLFdBQVc7QUFBQSxJQUMxQjtBQUFBLEVBQ0Y7QUFBQTs7OztFQy9CQSxJQUFNLDJCQUE0QjtBQUFBLEVBQ2xDLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUVOLE1BQVEsUUFBUTtBQUFBLEVBRWhCLE1BQVEsY0FBYztBQUFBLEVBQ3RCLE1BQVEsYUFBYTtBQUFBLEVBRXJCLE1BQVE7QUFBQSxFQUVSLE1BQVE7QUFBQSxFQUVSLGVBQWUsYUFBYyxDQUFDLFNBQVMsU0FBUyxNQUFNO0FBQUEsSUFDcEQsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLE1BQ0YsUUFBUSxNQUFNLEdBQUcsTUFBTSxPQUFPO0FBQUEsTUFDOUIsTUFBTTtBQUFBLElBRVIsSUFBSSxTQUFTLE1BQU0sZUFBZSxHQUFHO0FBQUEsTUFDbkMsT0FBTyxTQUFTLFdBQVcsTUFBTSxRQUFRLElBQUk7QUFBQSxRQUMzQyxHQUFHLEtBQUssT0FBTztBQUFBLFFBQ2YsR0FBRyxLQUFLLE9BQU87QUFBQSxNQUNqQixDQUFDO0FBQUEsTUFFRCxJQUFJLGFBQWEsU0FBUyxPQUFPO0FBQUEsUUFBRztBQUFBLElBQ3RDO0FBQUEsSUFFQSxNQUFNLFdBQVcsTUFBTSxhQUFhLFNBQVMsT0FBTztBQUFBLElBQ3BELFVBQVUsU0FBUztBQUFBLElBQ25CLE1BQU0sU0FBUyxNQUFNLFlBQVksU0FBUyxPQUFPLElBQUk7QUFBQSxJQUNyRCxNQUFNLE1BQU0sTUFBSyxRQUFRLE9BQU87QUFBQSxJQUVoQyxLQUFNLE1BQU0sV0FBVyxHQUFHLEdBQUk7QUFBQSxNQUM1QixNQUFNLE9BQU8sR0FBRztBQUFBLElBQ2xCO0FBQUEsSUFFQSxPQUFPLEdBQUcsUUFBUSxTQUFTLFNBQVMsTUFBTTtBQUFBO0FBQUEsRUFHNUMsU0FBUyxpQkFBa0IsQ0FBQyxTQUFTLFNBQVMsTUFBTTtBQUFBLElBQ2xELElBQUk7QUFBQSxJQUNKLElBQUk7QUFBQSxNQUNGLFFBQVEsR0FBRyxVQUFVLE9BQU87QUFBQSxNQUM1QixNQUFNO0FBQUEsSUFDUixJQUFJLFNBQVMsTUFBTSxlQUFlLEdBQUc7QUFBQSxNQUNuQyxNQUFNLFVBQVUsR0FBRyxTQUFTLE9BQU87QUFBQSxNQUNuQyxNQUFNLFVBQVUsR0FBRyxTQUFTLE9BQU87QUFBQSxNQUNuQyxJQUFJLGFBQWEsU0FBUyxPQUFPO0FBQUEsUUFBRztBQUFBLElBQ3RDO0FBQUEsSUFFQSxNQUFNLFdBQVcsaUJBQWlCLFNBQVMsT0FBTztBQUFBLElBQ2xELFVBQVUsU0FBUztBQUFBLElBQ25CLE9BQU8sZ0JBQWdCLFNBQVMsT0FBTyxJQUFJO0FBQUEsSUFDM0MsTUFBTSxNQUFNLE1BQUssUUFBUSxPQUFPO0FBQUEsSUFDaEMsTUFBTSxTQUFTLEdBQUcsV0FBVyxHQUFHO0FBQUEsSUFDaEMsSUFBSTtBQUFBLE1BQVEsT0FBTyxHQUFHLFlBQVksU0FBUyxTQUFTLElBQUk7QUFBQSxJQUN4RCxXQUFXLEdBQUc7QUFBQSxJQUNkLE9BQU8sR0FBRyxZQUFZLFNBQVMsU0FBUyxJQUFJO0FBQUE7QUFBQSxFQUc5QyxPQUFPLFVBQVU7QUFBQSxJQUNmLGVBQWUsRUFBRSxhQUFhO0FBQUEsSUFDOUI7QUFBQSxFQUNGO0FBQUE7Ozs7RUNoRUEsTUFBUSxZQUFZO0FBQUEsRUFDcEIsTUFBUSxZQUFZO0FBQUEsRUFDcEIsTUFBUSxlQUFlO0FBQUEsRUFFdkIsT0FBTyxVQUFVO0FBQUEsSUFFZjtBQUFBLElBQ0E7QUFBQSxJQUNBLFlBQVk7QUFBQSxJQUNaLGdCQUFnQjtBQUFBLElBRWhCO0FBQUEsSUFDQTtBQUFBLElBQ0EsWUFBWTtBQUFBLElBQ1osZ0JBQWdCO0FBQUEsSUFFaEI7QUFBQSxJQUNBO0FBQUEsSUFDQSxlQUFlO0FBQUEsSUFDZixtQkFBbUI7QUFBQSxFQUNyQjtBQUFBOzs7O0VDdEJBLFNBQVMsU0FBVSxDQUFDLE9BQU8sTUFBTTtBQUFBLEdBQU0sV0FBVyxNQUFNLFdBQVcsTUFBTSxXQUFXLENBQUMsR0FBRztBQUFBLElBQ3RGLE1BQU0sT0FBTSxXQUFXLE1BQU07QUFBQSxJQUM3QixNQUFNLE1BQU0sS0FBSyxVQUFVLEtBQUssVUFBVSxNQUFNO0FBQUEsSUFFaEQsT0FBTyxJQUFJLFFBQVEsT0FBTyxHQUFHLElBQUk7QUFBQTtBQUFBLEVBR25DLFNBQVMsUUFBUyxDQUFDLFNBQVM7QUFBQSxJQUUxQixJQUFJLE9BQU8sU0FBUyxPQUFPO0FBQUEsTUFBRyxVQUFVLFFBQVEsU0FBUyxNQUFNO0FBQUEsSUFDL0QsT0FBTyxRQUFRLFFBQVEsV0FBVyxFQUFFO0FBQUE7QUFBQSxFQUd0QyxPQUFPLFVBQVUsRUFBRSxXQUFXLFNBQVM7QUFBQTs7OztFQ2J2QyxJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTyxHQUFHO0FBQUEsSUFDVjtBQUFBO0FBQUEsRUFFRixJQUFNO0FBQUEsRUFDTixNQUFRLFdBQVc7QUFBQSxFQUVuQixlQUFlLFNBQVUsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxHQUFHO0FBQUEsSUFDNUMsSUFBSSxPQUFPLFlBQVksVUFBVTtBQUFBLE1BQy9CLFVBQVUsRUFBRSxVQUFVLFFBQVE7QUFBQSxJQUNoQztBQUFBLElBRUEsTUFBTSxLQUFLLFFBQVEsTUFBTTtBQUFBLElBRXpCLE1BQU0sY0FBYyxZQUFZLFVBQVUsUUFBUSxTQUFTO0FBQUEsSUFFM0QsSUFBSSxPQUFPLE1BQU0sYUFBYSxhQUFhLEdBQUcsUUFBUSxFQUFFLE1BQU0sT0FBTztBQUFBLElBRXJFLE9BQU8sU0FBUyxJQUFJO0FBQUEsSUFFcEIsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLE1BQ0YsTUFBTSxLQUFLLE1BQU0sTUFBTSxVQUFVLFFBQVEsVUFBVSxJQUFJO0FBQUEsTUFDdkQsT0FBTyxLQUFLO0FBQUEsTUFDWixJQUFJLGFBQWE7QUFBQSxRQUNmLElBQUksVUFBVSxHQUFHLFNBQVMsSUFBSTtBQUFBLFFBQzlCLE1BQU07QUFBQSxNQUNSLEVBQU87QUFBQSxRQUNMLE9BQU87QUFBQTtBQUFBO0FBQUEsSUFJWCxPQUFPO0FBQUE7QUFBQSxFQUdULElBQU0sV0FBVyxhQUFhLFlBQVksU0FBUztBQUFBLEVBRW5ELFNBQVMsWUFBYSxDQUFDLE1BQU0sVUFBVSxDQUFDLEdBQUc7QUFBQSxJQUN6QyxJQUFJLE9BQU8sWUFBWSxVQUFVO0FBQUEsTUFDL0IsVUFBVSxFQUFFLFVBQVUsUUFBUTtBQUFBLElBQ2hDO0FBQUEsSUFFQSxNQUFNLEtBQUssUUFBUSxNQUFNO0FBQUEsSUFFekIsTUFBTSxjQUFjLFlBQVksVUFBVSxRQUFRLFNBQVM7QUFBQSxJQUUzRCxJQUFJO0FBQUEsTUFDRixJQUFJLFVBQVUsR0FBRyxhQUFhLE1BQU0sT0FBTztBQUFBLE1BQzNDLFVBQVUsU0FBUyxPQUFPO0FBQUEsTUFDMUIsT0FBTyxLQUFLLE1BQU0sU0FBUyxRQUFRLE9BQU87QUFBQSxNQUMxQyxPQUFPLEtBQUs7QUFBQSxNQUNaLElBQUksYUFBYTtBQUFBLFFBQ2YsSUFBSSxVQUFVLEdBQUcsU0FBUyxJQUFJO0FBQUEsUUFDOUIsTUFBTTtBQUFBLE1BQ1IsRUFBTztBQUFBLFFBQ0wsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2IsZUFBZSxVQUFXLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxHQUFHO0FBQUEsSUFDbEQsTUFBTSxLQUFLLFFBQVEsTUFBTTtBQUFBLElBRXpCLE1BQU0sTUFBTSxVQUFVLEtBQUssT0FBTztBQUFBLElBRWxDLE1BQU0sYUFBYSxhQUFhLEdBQUcsU0FBUyxFQUFFLE1BQU0sS0FBSyxPQUFPO0FBQUE7QUFBQSxFQUdsRSxJQUFNLFlBQVksYUFBYSxZQUFZLFVBQVU7QUFBQSxFQUVyRCxTQUFTLGFBQWMsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLEdBQUc7QUFBQSxJQUMvQyxNQUFNLEtBQUssUUFBUSxNQUFNO0FBQUEsSUFFekIsTUFBTSxNQUFNLFVBQVUsS0FBSyxPQUFPO0FBQUEsSUFFbEMsT0FBTyxHQUFHLGNBQWMsTUFBTSxLQUFLLE9BQU87QUFBQTtBQUFBLEVBRzVDLElBQU0sV0FBVztBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPLFVBQVU7QUFBQTs7OztFQ3JGakIsSUFBTTtBQUFBLEVBRU4sT0FBTyxVQUFVO0FBQUEsSUFFZixVQUFVLFNBQVM7QUFBQSxJQUNuQixjQUFjLFNBQVM7QUFBQSxJQUN2QixXQUFXLFNBQVM7QUFBQSxJQUNwQixlQUFlLFNBQVM7QUFBQSxFQUMxQjtBQUFBOzs7O0VDUkEsSUFBTSwyQkFBNEI7QUFBQSxFQUNsQyxJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNLG1DQUF1QztBQUFBLEVBRTdDLGVBQWUsVUFBVyxDQUFDLE1BQU0sTUFBTSxXQUFXLFNBQVM7QUFBQSxJQUN6RCxNQUFNLE1BQU0sTUFBSyxRQUFRLElBQUk7QUFBQSxJQUU3QixLQUFNLE1BQU0sV0FBVyxHQUFHLEdBQUk7QUFBQSxNQUM1QixNQUFNLE1BQU0sT0FBTyxHQUFHO0FBQUEsSUFDeEI7QUFBQSxJQUVBLE9BQU8sR0FBRyxVQUFVLE1BQU0sTUFBTSxRQUFRO0FBQUE7QUFBQSxFQUcxQyxTQUFTLGNBQWUsQ0FBQyxTQUFTLE1BQU07QUFBQSxJQUN0QyxNQUFNLE1BQU0sTUFBSyxRQUFRLElBQUk7QUFBQSxJQUM3QixLQUFLLEdBQUcsV0FBVyxHQUFHLEdBQUc7QUFBQSxNQUN2QixNQUFNLFdBQVcsR0FBRztBQUFBLElBQ3RCO0FBQUEsSUFFQSxHQUFHLGNBQWMsTUFBTSxHQUFHLElBQUk7QUFBQTtBQUFBLEVBR2hDLE9BQU8sVUFBVTtBQUFBLElBQ2YsWUFBWSxFQUFFLFVBQVU7QUFBQSxJQUN4QjtBQUFBLEVBQ0Y7QUFBQTs7OztFQzVCQSxNQUFRO0FBQUEsRUFDUixNQUFRO0FBQUEsRUFFUixlQUFlLFVBQVcsQ0FBQyxNQUFNLE1BQU0sVUFBVSxDQUFDLEdBQUc7QUFBQSxJQUNuRCxNQUFNLE1BQU0sVUFBVSxNQUFNLE9BQU87QUFBQSxJQUVuQyxNQUFNLFdBQVcsTUFBTSxLQUFLLE9BQU87QUFBQTtBQUFBLEVBR3JDLE9BQU8sVUFBVTtBQUFBOzs7O0VDVGpCLE1BQVE7QUFBQSxFQUNSLE1BQVE7QUFBQSxFQUVSLFNBQVMsY0FBZSxDQUFDLE1BQU0sTUFBTSxTQUFTO0FBQUEsSUFDNUMsTUFBTSxNQUFNLFVBQVUsTUFBTSxPQUFPO0FBQUEsSUFFbkMsZUFBZSxNQUFNLEtBQUssT0FBTztBQUFBO0FBQUEsRUFHbkMsT0FBTyxVQUFVO0FBQUE7Ozs7RUNUakIsSUFBTSwyQkFBNEI7QUFBQSxFQUNsQyxJQUFNO0FBQUEsRUFFTixTQUFTLGFBQWEsdUJBQTBCO0FBQUEsRUFDaEQsU0FBUztBQUFBLEVBRVQsU0FBUyxhQUFhLFNBQVM7QUFBQSxFQUMvQixTQUFTLGlCQUFpQixTQUFTO0FBQUEsRUFDbkMsU0FBUyxZQUFZLFNBQVM7QUFBQSxFQUM5QixTQUFTLGdCQUFnQixTQUFTO0FBQUEsRUFDbEMsU0FBUyxXQUFXLFNBQVM7QUFBQSxFQUM3QixTQUFTLGVBQWUsU0FBUztBQUFBLEVBRWpDLE9BQU8sVUFBVTtBQUFBOzs7O0VDYmpCLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLE1BQVE7QUFBQSxFQUNSLE1BQVE7QUFBQSxFQUNSLE1BQVE7QUFBQSxFQUNSLE1BQVE7QUFBQSxFQUNSLElBQU07QUFBQSxFQUVOLGVBQWUsSUFBSyxDQUFDLEtBQUssTUFBTSxPQUFPLENBQUMsR0FBRztBQUFBLElBQ3pDLE1BQU0sWUFBWSxLQUFLLGFBQWEsS0FBSyxXQUFXO0FBQUEsSUFFcEQsUUFBUSxTQUFTLGlCQUFpQixVQUFVLE1BQU0sS0FBSyxXQUFXLEtBQUssTUFBTSxRQUFRLElBQUk7QUFBQSxJQUV6RixNQUFNLEtBQUssaUJBQWlCLEtBQUssU0FBUyxNQUFNLE1BQU07QUFBQSxJQUd0RCxNQUFNLGFBQWEsTUFBSyxRQUFRLElBQUk7QUFBQSxJQUNwQyxNQUFNLG1CQUFtQixNQUFLLE1BQU0sVUFBVTtBQUFBLElBQzlDLElBQUksaUJBQWlCLFNBQVMsWUFBWTtBQUFBLE1BQ3hDLE1BQU0sT0FBTyxVQUFVO0FBQUEsSUFDekI7QUFBQSxJQUVBLE9BQU8sU0FBUyxLQUFLLE1BQU0sV0FBVyxjQUFjO0FBQUE7QUFBQSxFQUd0RCxlQUFlLFFBQVMsQ0FBQyxLQUFLLE1BQU0sV0FBVyxnQkFBZ0I7QUFBQSxJQUM3RCxLQUFLLGdCQUFnQjtBQUFBLE1BQ25CLElBQUksV0FBVztBQUFBLFFBQ2IsTUFBTSxPQUFPLElBQUk7QUFBQSxNQUNuQixFQUFPLFNBQUksTUFBTSxXQUFXLElBQUksR0FBRztBQUFBLFFBQ2pDLE1BQU0sSUFBSSxNQUFNLHNCQUFzQjtBQUFBLE1BQ3hDO0FBQUEsSUFDRjtBQUFBLElBRUEsSUFBSTtBQUFBLE1BRUYsTUFBTSxHQUFHLE9BQU8sS0FBSyxJQUFJO0FBQUEsTUFDekIsT0FBTyxLQUFLO0FBQUEsTUFDWixJQUFJLElBQUksU0FBUyxTQUFTO0FBQUEsUUFDeEIsTUFBTTtBQUFBLE1BQ1I7QUFBQSxNQUNBLE1BQU0saUJBQWlCLEtBQUssTUFBTSxTQUFTO0FBQUE7QUFBQTtBQUFBLEVBSS9DLGVBQWUsZ0JBQWlCLENBQUMsS0FBSyxNQUFNLFdBQVc7QUFBQSxJQUNyRCxNQUFNLE9BQU87QUFBQSxNQUNYO0FBQUEsTUFDQSxjQUFjO0FBQUEsTUFDZCxvQkFBb0I7QUFBQSxJQUN0QjtBQUFBLElBRUEsTUFBTSxLQUFLLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFDMUIsT0FBTyxPQUFPLEdBQUc7QUFBQTtBQUFBLEVBR25CLE9BQU8sVUFBVTtBQUFBOzs7O0VDeERqQixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNLDJCQUE4QjtBQUFBLEVBQ3BDLElBQU0sOEJBQWtDO0FBQUEsRUFDeEMsSUFBTSw4QkFBa0M7QUFBQSxFQUN4QyxJQUFNO0FBQUEsRUFFTixTQUFTLFFBQVMsQ0FBQyxLQUFLLE1BQU0sTUFBTTtBQUFBLElBQ2xDLE9BQU8sUUFBUSxDQUFDO0FBQUEsSUFDaEIsTUFBTSxZQUFZLEtBQUssYUFBYSxLQUFLLFdBQVc7QUFBQSxJQUVwRCxRQUFRLFNBQVMsaUJBQWlCLFVBQVUsS0FBSyxlQUFlLEtBQUssTUFBTSxRQUFRLElBQUk7QUFBQSxJQUN2RixLQUFLLHFCQUFxQixLQUFLLFNBQVMsTUFBTSxNQUFNO0FBQUEsSUFDcEQsS0FBSyxhQUFhLElBQUk7QUFBQSxNQUFHLFdBQVcsTUFBSyxRQUFRLElBQUksQ0FBQztBQUFBLElBQ3RELE9BQU8sU0FBUyxLQUFLLE1BQU0sV0FBVyxjQUFjO0FBQUE7QUFBQSxFQUd0RCxTQUFTLFlBQWEsQ0FBQyxNQUFNO0FBQUEsSUFDM0IsTUFBTSxTQUFTLE1BQUssUUFBUSxJQUFJO0FBQUEsSUFDaEMsTUFBTSxhQUFhLE1BQUssTUFBTSxNQUFNO0FBQUEsSUFDcEMsT0FBTyxXQUFXLFNBQVM7QUFBQTtBQUFBLEVBRzdCLFNBQVMsUUFBUyxDQUFDLEtBQUssTUFBTSxXQUFXLGdCQUFnQjtBQUFBLElBQ3ZELElBQUk7QUFBQSxNQUFnQixPQUFPLE9BQU8sS0FBSyxNQUFNLFNBQVM7QUFBQSxJQUN0RCxJQUFJLFdBQVc7QUFBQSxNQUNiLFdBQVcsSUFBSTtBQUFBLE1BQ2YsT0FBTyxPQUFPLEtBQUssTUFBTSxTQUFTO0FBQUEsSUFDcEM7QUFBQSxJQUNBLElBQUksR0FBRyxXQUFXLElBQUk7QUFBQSxNQUFHLE1BQU0sSUFBSSxNQUFNLHNCQUFzQjtBQUFBLElBQy9ELE9BQU8sT0FBTyxLQUFLLE1BQU0sU0FBUztBQUFBO0FBQUEsRUFHcEMsU0FBUyxNQUFPLENBQUMsS0FBSyxNQUFNLFdBQVc7QUFBQSxJQUNyQyxJQUFJO0FBQUEsTUFDRixHQUFHLFdBQVcsS0FBSyxJQUFJO0FBQUEsTUFDdkIsT0FBTyxLQUFLO0FBQUEsTUFDWixJQUFJLElBQUksU0FBUztBQUFBLFFBQVMsTUFBTTtBQUFBLE1BQ2hDLE9BQU8saUJBQWlCLEtBQUssTUFBTSxTQUFTO0FBQUE7QUFBQTtBQUFBLEVBSWhELFNBQVMsZ0JBQWlCLENBQUMsS0FBSyxNQUFNLFdBQVc7QUFBQSxJQUMvQyxNQUFNLE9BQU87QUFBQSxNQUNYO0FBQUEsTUFDQSxjQUFjO0FBQUEsTUFDZCxvQkFBb0I7QUFBQSxJQUN0QjtBQUFBLElBQ0EsU0FBUyxLQUFLLE1BQU0sSUFBSTtBQUFBLElBQ3hCLE9BQU8sV0FBVyxHQUFHO0FBQUE7QUFBQSxFQUd2QixPQUFPLFVBQVU7QUFBQTs7OztFQ3BEakIsSUFBTSwyQkFBNEI7QUFBQSxFQUNsQyxPQUFPLFVBQVU7QUFBQSxJQUNmLE1BQU0sZ0JBQW1CO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQUE7Ozs7RUNKQSxPQUFPLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBYWpCO0FBQUE7OztBQ2ZBO0FBQ0EsaUJBQVM7QUFDVCxnQkFBUyxhQUFLO0FBQ2Qsb0NBQXFCO0FBQ3JCO0FBRUE7OztBQ05BOzs7QUNBQSxJQUFNLHFCQUFxQixPQUFPO0FBQzNCLElBQU0scUJBQXFCLENBQUMsWUFBWTtBQUFBLEVBQzNDLElBQUksT0FBTyxZQUFZLFVBQVU7QUFBQSxJQUM3QixNQUFNLElBQUksVUFBVSxpQkFBaUI7QUFBQSxFQUN6QztBQUFBLEVBQ0EsSUFBSSxRQUFRLFNBQVMsb0JBQW9CO0FBQUEsSUFDckMsTUFBTSxJQUFJLFVBQVUscUJBQXFCO0FBQUEsRUFDN0M7QUFBQTs7O0FDSkosSUFBTSxlQUFlO0FBQUEsRUFDakIsYUFBYSxDQUFDLHdCQUF3QixJQUFJO0FBQUEsRUFDMUMsYUFBYSxDQUFDLGlCQUFpQixJQUFJO0FBQUEsRUFDbkMsYUFBYSxDQUFDLFFBQVEsV0FBVyxNQUFNLEtBQUs7QUFBQSxFQUM1QyxhQUFhLENBQUMsY0FBYyxJQUFJO0FBQUEsRUFDaEMsYUFBYSxDQUFDLFdBQVcsSUFBSTtBQUFBLEVBQzdCLGFBQWEsQ0FBQyxXQUFXLElBQUk7QUFBQSxFQUM3QixhQUFhLENBQUMsZ0JBQWdCLE1BQU0sSUFBSTtBQUFBLEVBQ3hDLGFBQWEsQ0FBQyxXQUFXLElBQUk7QUFBQSxFQUM3QixhQUFhLENBQUMsVUFBVSxJQUFJO0FBQUEsRUFDNUIsYUFBYSxDQUFDLFVBQVUsSUFBSTtBQUFBLEVBQzVCLGFBQWEsQ0FBQyx5QkFBeUIsSUFBSTtBQUFBLEVBQzNDLGFBQWEsQ0FBQyxXQUFXLElBQUk7QUFBQSxFQUM3QixZQUFZLENBQUMsK0JBQStCLElBQUk7QUFBQSxFQUNoRCxjQUFjLENBQUMsYUFBYSxLQUFLO0FBQ3JDO0FBR0EsSUFBTSxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsYUFBYSxNQUFNO0FBRXhELElBQU0sZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLDRCQUE0QixNQUFNO0FBRXhFLElBQU0saUJBQWlCLENBQUMsV0FBVyxPQUFPLEtBQUssRUFBRTtBQU8xQyxJQUFNLGFBQWEsQ0FBQyxNQUFNLGFBQWE7QUFBQSxFQUMxQyxNQUFNLE1BQU07QUFBQSxFQUVaLElBQUksS0FBSyxPQUFPLEdBQUcsTUFBTSxLQUFLO0FBQUEsSUFDMUIsTUFBTSxJQUFJLE1BQU0sMkJBQTJCO0FBQUEsRUFDL0M7QUFBQSxFQUVBLE1BQU0sU0FBUyxDQUFDO0FBQUEsRUFDaEIsTUFBTSxPQUFPLENBQUM7QUFBQSxFQUNkLElBQUksSUFBSSxNQUFNO0FBQUEsRUFDZCxJQUFJLFdBQVc7QUFBQSxFQUNmLElBQUksUUFBUTtBQUFBLEVBQ1osSUFBSSxXQUFXO0FBQUEsRUFDZixJQUFJLFNBQVM7QUFBQSxFQUNiLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBSSxhQUFhO0FBQUEsRUFDakI7QUFBQSxJQUFPLE9BQU8sSUFBSSxLQUFLLFFBQVE7QUFBQSxNQUMzQixNQUFNLElBQUksS0FBSyxPQUFPLENBQUM7QUFBQSxNQUN2QixLQUFLLE1BQU0sT0FBTyxNQUFNLFFBQVEsTUFBTSxNQUFNLEdBQUc7QUFBQSxRQUMzQyxTQUFTO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsTUFDQSxJQUFJLE1BQU0sT0FBTyxhQUFhLFVBQVU7QUFBQSxRQUNwQyxTQUFTLElBQUk7QUFBQSxRQUNiO0FBQUEsTUFDSjtBQUFBLE1BQ0EsV0FBVztBQUFBLE1BQ1gsSUFBSSxNQUFNLE1BQU07QUFBQSxRQUNaLEtBQUssVUFBVTtBQUFBLFVBQ1gsV0FBVztBQUFBLFVBQ1g7QUFBQSxVQUNBO0FBQUEsUUFDSjtBQUFBLE1BRUo7QUFBQSxNQUNBLElBQUksTUFBTSxRQUFRLFVBQVU7QUFBQSxRQUV4QixZQUFZLE1BQU0sTUFBTSxHQUFHLFNBQVMsT0FBTyxRQUFRLFlBQVksR0FBRztBQUFBLFVBQzlELElBQUksS0FBSyxXQUFXLEtBQUssQ0FBQyxHQUFHO0FBQUEsWUFFekIsSUFBSSxZQUFZO0FBQUEsY0FDWixPQUFPLENBQUMsTUFBTSxPQUFPLEtBQUssU0FBUyxLQUFLLElBQUk7QUFBQSxZQUNoRDtBQUFBLFlBQ0EsS0FBSyxJQUFJO0FBQUEsWUFDVCxJQUFJO0FBQUEsY0FDQSxLQUFLLEtBQUssSUFBSTtBQUFBLFlBRWQ7QUFBQSxxQkFBTyxLQUFLLElBQUk7QUFBQSxZQUNwQixRQUFRLFNBQVM7QUFBQSxZQUNqQjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLE1BRUEsV0FBVztBQUFBLE1BQ1gsSUFBSSxZQUFZO0FBQUEsUUFHWixJQUFJLElBQUksWUFBWTtBQUFBLFVBQ2hCLE9BQU8sS0FBSyxZQUFZLFVBQVUsSUFBSSxNQUFNLFlBQVksQ0FBQyxDQUFDO0FBQUEsUUFDOUQsRUFDSyxTQUFJLE1BQU0sWUFBWTtBQUFBLFVBQ3ZCLE9BQU8sS0FBSyxZQUFZLENBQUMsQ0FBQztBQUFBLFFBQzlCO0FBQUEsUUFDQSxhQUFhO0FBQUEsUUFDYjtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsTUFHQSxJQUFJLEtBQUssV0FBVyxNQUFNLElBQUksQ0FBQyxHQUFHO0FBQUEsUUFDOUIsT0FBTyxLQUFLLFlBQVksSUFBSSxHQUFHLENBQUM7QUFBQSxRQUNoQyxLQUFLO0FBQUEsUUFDTDtBQUFBLE1BQ0o7QUFBQSxNQUNBLElBQUksS0FBSyxXQUFXLEtBQUssSUFBSSxDQUFDLEdBQUc7QUFBQSxRQUM3QixhQUFhO0FBQUEsUUFDYixLQUFLO0FBQUEsUUFDTDtBQUFBLE1BQ0o7QUFBQSxNQUVBLE9BQU8sS0FBSyxZQUFZLENBQUMsQ0FBQztBQUFBLE1BQzFCO0FBQUEsSUFDSjtBQUFBLEVBQ0EsSUFBSSxTQUFTLEdBQUc7QUFBQSxJQUdaLE9BQU8sQ0FBQyxJQUFJLE9BQU8sR0FBRyxLQUFLO0FBQUEsRUFDL0I7QUFBQSxFQUdBLEtBQUssT0FBTyxXQUFXLEtBQUssUUFBUTtBQUFBLElBQ2hDLE9BQU8sQ0FBQyxNQUFNLE9BQU8sS0FBSyxTQUFTLEtBQUssSUFBSTtBQUFBLEVBQ2hEO0FBQUEsRUFLQSxJQUFJLEtBQUssV0FBVyxLQUNoQixPQUFPLFdBQVcsS0FDbEIsU0FBUyxLQUFLLE9BQU8sRUFBRSxNQUN0QixRQUFRO0FBQUEsSUFDVCxNQUFNLElBQUksT0FBTyxHQUFHLFdBQVcsSUFBSSxPQUFPLEdBQUcsTUFBTSxFQUFFLElBQUksT0FBTztBQUFBLElBQ2hFLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxPQUFPLFNBQVMsS0FBSyxLQUFLO0FBQUEsRUFDdkQ7QUFBQSxFQUNBLE1BQU0sVUFBVSxPQUFPLFNBQVMsTUFBTSxNQUFNLGVBQWUsTUFBTSxJQUFJO0FBQUEsRUFDckUsTUFBTSxRQUFRLE9BQU8sU0FBUyxLQUFLLE9BQU8sZUFBZSxJQUFJLElBQUk7QUFBQSxFQUNqRSxNQUFNLE9BQU8sT0FBTyxVQUFVLEtBQUssU0FDN0IsTUFBTSxVQUFVLE1BQU0sUUFBUSxNQUM5QixPQUFPLFNBQ0gsVUFDQTtBQUFBLEVBQ1YsT0FBTyxDQUFDLE1BQU0sT0FBTyxTQUFTLEtBQUssSUFBSTtBQUFBOzs7QUNuSXBDLElBQU0sV0FBVyxDQUFDLEtBQUssdUJBQXVCLFVBQVcsQ0FBQyxNQUFNO0FBQUEsRUFDbkUsT0FBTyx1QkFDRCxFQUFFLFFBQVEsa0JBQWtCLElBQUksSUFDaEMsRUFBRSxRQUFRLDZCQUE2QixNQUFNLEVBQUUsUUFBUSxjQUFjLElBQUk7QUFBQTs7O0FDZG5GLElBQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsQ0FBQztBQUMvQyxJQUFNLGdCQUFnQixDQUFDLE1BQU0sTUFBTSxJQUFJLENBQUM7QUFLeEMsSUFBTSxtQkFBbUI7QUFDekIsSUFBTSxhQUFhO0FBSW5CLElBQU0sa0JBQWtCLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO0FBRTFDLElBQU0sV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztBQUNwQyxJQUFNLGFBQWEsSUFBSSxJQUFJLGlCQUFpQjtBQUM1QyxJQUFNLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSw0QkFBNEIsTUFBTTtBQUV4RSxJQUFNLFFBQVE7QUFFZCxJQUFNLE9BQU8sUUFBUTtBQUdyQixJQUFNLGNBQWMsUUFBUTtBQUFBO0FBR3JCLE1BQU0sSUFBSTtBQUFBLEVBQ2I7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsU0FBUztBQUFBLEVBQ1QsU0FBUyxDQUFDO0FBQUEsRUFDVjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxjQUFjO0FBQUEsRUFDZDtBQUFBLEVBQ0E7QUFBQSxFQUdBLFlBQVk7QUFBQSxFQUNaLFdBQVcsQ0FBQyxNQUFNLFFBQVEsVUFBVSxDQUFDLEdBQUc7QUFBQSxJQUNwQyxLQUFLLE9BQU87QUFBQSxJQUVaLElBQUk7QUFBQSxNQUNBLEtBQUssWUFBWTtBQUFBLElBQ3JCLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxRQUFRLEtBQUssVUFBVSxLQUFLLFFBQVEsUUFBUTtBQUFBLElBQ2pELEtBQUssV0FBVyxLQUFLLFVBQVUsT0FBTyxVQUFVLEtBQUssTUFBTTtBQUFBLElBQzNELEtBQUssUUFBUSxLQUFLLFVBQVUsT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNO0FBQUEsSUFDbkQsSUFBSSxTQUFTLFFBQVEsS0FBSyxNQUFNO0FBQUEsTUFDNUIsS0FBSyxNQUFNLEtBQUssSUFBSTtBQUFBLElBQ3hCLEtBQUssZUFBZSxLQUFLLFVBQVUsS0FBSyxRQUFRLE9BQU8sU0FBUztBQUFBO0FBQUEsTUFFaEUsUUFBUSxHQUFHO0FBQUEsSUFFWCxJQUFJLEtBQUssY0FBYztBQUFBLE1BQ25CLE9BQU8sS0FBSztBQUFBLElBRWhCLFdBQVcsS0FBSyxLQUFLLFFBQVE7QUFBQSxNQUN6QixJQUFJLE9BQU8sTUFBTTtBQUFBLFFBQ2I7QUFBQSxNQUNKLElBQUksRUFBRSxRQUFRLEVBQUU7QUFBQSxRQUNaLE9BQVEsS0FBSyxZQUFZO0FBQUEsSUFDakM7QUFBQSxJQUVBLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFHaEIsUUFBUSxHQUFHO0FBQUEsSUFDUCxJQUFJLEtBQUssY0FBYztBQUFBLE1BQ25CLE9BQU8sS0FBSztBQUFBLElBQ2hCLEtBQUssS0FBSyxNQUFNO0FBQUEsTUFDWixPQUFRLEtBQUssWUFBWSxLQUFLLE9BQU8sSUFBSSxPQUFLLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQUEsSUFDcEUsRUFDSztBQUFBLE1BQ0QsT0FBUSxLQUFLLFlBQ1QsS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLElBQUksT0FBSyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJO0FBQUE7QUFBQTtBQUFBLEVBRzFFLFNBQVMsR0FBRztBQUFBLElBRVIsSUFBSSxTQUFTLEtBQUs7QUFBQSxNQUNkLE1BQU0sSUFBSSxNQUFNLDBCQUEwQjtBQUFBLElBQzlDLElBQUksS0FBSztBQUFBLE1BQ0wsT0FBTztBQUFBLElBR1gsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLGNBQWM7QUFBQSxJQUNuQixJQUFJO0FBQUEsSUFDSixPQUFRLElBQUksS0FBSyxNQUFNLElBQUksR0FBSTtBQUFBLE1BQzNCLElBQUksRUFBRSxTQUFTO0FBQUEsUUFDWDtBQUFBLE1BRUosSUFBSSxJQUFJO0FBQUEsTUFDUixJQUFJLEtBQUssRUFBRTtBQUFBLE1BQ1gsT0FBTyxJQUFJO0FBQUEsUUFDUCxTQUFTLElBQUksRUFBRSxlQUFlLEdBQUksR0FBRyxRQUFRLElBQUksR0FBRyxPQUFPLFFBQVEsS0FBSztBQUFBLFVBQ3BFLFdBQVcsUUFBUSxFQUFFLFFBQVE7QUFBQSxZQUV6QixJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsY0FDMUIsTUFBTSxJQUFJLE1BQU0sOEJBQThCO0FBQUEsWUFDbEQ7QUFBQSxZQUVBLEtBQUssT0FBTyxHQUFHLE9BQU8sRUFBRTtBQUFBLFVBQzVCO0FBQUEsUUFDSjtBQUFBLFFBQ0EsSUFBSTtBQUFBLFFBQ0osS0FBSyxFQUFFO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBRVgsSUFBSSxJQUFJLE9BQU87QUFBQSxJQUNYLFdBQVcsS0FBSyxPQUFPO0FBQUEsTUFDbkIsSUFBSSxNQUFNO0FBQUEsUUFDTjtBQUFBLE1BRUosSUFBSSxPQUFPLE1BQU0sY0FBYyxhQUFhLE9BQU8sRUFBRSxZQUFZLE9BQU87QUFBQSxRQUNwRSxNQUFNLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUFBLE1BQ3hDO0FBQUEsTUFFQSxLQUFLLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDdEI7QUFBQTtBQUFBLEVBRUosTUFBTSxHQUFHO0FBQUEsSUFDTCxNQUFNLE1BQU0sS0FBSyxTQUFTLE9BQ3BCLEtBQUssT0FBTyxNQUFNLEVBQUUsSUFBSSxPQUFNLE9BQU8sTUFBTSxXQUFXLElBQUksRUFBRSxPQUFPLENBQUUsSUFDckUsQ0FBQyxLQUFLLE1BQU0sR0FBRyxLQUFLLE9BQU8sSUFBSSxPQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFBQSxJQUNyRCxJQUFJLEtBQUssUUFBUSxNQUFNLEtBQUs7QUFBQSxNQUN4QixJQUFJLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDbEIsSUFBSSxLQUFLLE1BQU0sTUFDVixTQUFTLEtBQUssU0FDVixLQUFLLE1BQU0sZUFBZSxLQUFLLFNBQVMsU0FBUyxNQUFPO0FBQUEsTUFDN0QsSUFBSSxLQUFLLENBQUMsQ0FBQztBQUFBLElBQ2Y7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBRVgsT0FBTyxHQUFHO0FBQUEsSUFDTixJQUFJLEtBQUssVUFBVTtBQUFBLE1BQ2YsT0FBTztBQUFBLElBRVgsS0FBSyxLQUFLLFNBQVMsUUFBUTtBQUFBLE1BQ3ZCLE9BQU87QUFBQSxJQUNYLElBQUksS0FBSyxpQkFBaUI7QUFBQSxNQUN0QixPQUFPO0FBQUEsSUFFWCxNQUFNLElBQUksS0FBSztBQUFBLElBQ2YsU0FBUyxJQUFJLEVBQUcsSUFBSSxLQUFLLGNBQWMsS0FBSztBQUFBLE1BQ3hDLE1BQU0sS0FBSyxFQUFFLE9BQU87QUFBQSxNQUNwQixNQUFNLGNBQWMsT0FBTyxHQUFHLFNBQVMsTUFBTTtBQUFBLFFBQ3pDLE9BQU87QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFFWCxLQUFLLEdBQUc7QUFBQSxJQUNKLElBQUksS0FBSyxVQUFVO0FBQUEsTUFDZixPQUFPO0FBQUEsSUFDWCxJQUFJLEtBQUssU0FBUyxTQUFTO0FBQUEsTUFDdkIsT0FBTztBQUFBLElBQ1gsS0FBSyxLQUFLLFNBQVMsTUFBTTtBQUFBLE1BQ3JCLE9BQU87QUFBQSxJQUNYLEtBQUssS0FBSztBQUFBLE1BQ04sT0FBTyxLQUFLLFNBQVMsTUFBTTtBQUFBLElBRy9CLE1BQU0sS0FBSyxLQUFLLFVBQVUsS0FBSyxRQUFRLE9BQU8sU0FBUztBQUFBLElBRXZELE9BQU8sS0FBSyxpQkFBaUIsS0FBSztBQUFBO0FBQUEsRUFFdEMsTUFBTSxDQUFDLE1BQU07QUFBQSxJQUNULElBQUksT0FBTyxTQUFTO0FBQUEsTUFDaEIsS0FBSyxLQUFLLElBQUk7QUFBQSxJQUVkO0FBQUEsV0FBSyxLQUFLLEtBQUssTUFBTSxJQUFJLENBQUM7QUFBQTtBQUFBLEVBRWxDLEtBQUssQ0FBQyxRQUFRO0FBQUEsSUFDVixNQUFNLElBQUksSUFBSSxJQUFJLEtBQUssTUFBTSxNQUFNO0FBQUEsSUFDbkMsV0FBVyxLQUFLLEtBQUssUUFBUTtBQUFBLE1BQ3pCLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFDZDtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsU0FFSixTQUFTLENBQUMsS0FBSyxLQUFLLEtBQUssS0FBSztBQUFBLElBQ2pDLElBQUksV0FBVztBQUFBLElBQ2YsSUFBSSxVQUFVO0FBQUEsSUFDZCxJQUFJLGFBQWE7QUFBQSxJQUNqQixJQUFJLFdBQVc7QUFBQSxJQUNmLElBQUksSUFBSSxTQUFTLE1BQU07QUFBQSxNQUVuQixJQUFJLEtBQUk7QUFBQSxNQUNSLElBQUksT0FBTTtBQUFBLE1BQ1YsT0FBTyxLQUFJLElBQUksUUFBUTtBQUFBLFFBQ25CLE1BQU0sSUFBSSxJQUFJLE9BQU8sSUFBRztBQUFBLFFBR3hCLElBQUksWUFBWSxNQUFNLE1BQU07QUFBQSxVQUN4QixZQUFZO0FBQUEsVUFDWixRQUFPO0FBQUEsVUFDUDtBQUFBLFFBQ0o7QUFBQSxRQUNBLElBQUksU0FBUztBQUFBLFVBQ1QsSUFBSSxPQUFNLGFBQWEsR0FBRztBQUFBLFlBQ3RCLElBQUksTUFBTSxPQUFPLE1BQU0sS0FBSztBQUFBLGNBQ3hCLFdBQVc7QUFBQSxZQUNmO0FBQUEsVUFDSixFQUNLLFNBQUksTUFBTSxTQUFTLE9BQU0sYUFBYSxLQUFLLFdBQVc7QUFBQSxZQUN2RCxVQUFVO0FBQUEsVUFDZDtBQUFBLFVBQ0EsUUFBTztBQUFBLFVBQ1A7QUFBQSxRQUNKLEVBQ0ssU0FBSSxNQUFNLEtBQUs7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixhQUFhO0FBQUEsVUFDYixXQUFXO0FBQUEsVUFDWCxRQUFPO0FBQUEsVUFDUDtBQUFBLFFBQ0o7QUFBQSxRQUNBLEtBQUssSUFBSSxTQUFTLGNBQWMsQ0FBQyxLQUFLLElBQUksT0FBTyxFQUFDLE1BQU0sS0FBSztBQUFBLFVBQ3pELElBQUksS0FBSyxJQUFHO0FBQUEsVUFDWixPQUFNO0FBQUEsVUFDTixNQUFNLE1BQU0sSUFBSSxJQUFJLEdBQUcsR0FBRztBQUFBLFVBQzFCLEtBQUksSUFBSSxVQUFVLEtBQUssS0FBSyxJQUFHLEdBQUc7QUFBQSxVQUNsQyxJQUFJLEtBQUssR0FBRztBQUFBLFVBQ1o7QUFBQSxRQUNKO0FBQUEsUUFDQSxRQUFPO0FBQUEsTUFDWDtBQUFBLE1BQ0EsSUFBSSxLQUFLLElBQUc7QUFBQSxNQUNaLE9BQU87QUFBQSxJQUNYO0FBQUEsSUFHQSxJQUFJLElBQUksTUFBTTtBQUFBLElBQ2QsSUFBSSxPQUFPLElBQUksSUFBSSxNQUFNLEdBQUc7QUFBQSxJQUM1QixNQUFNLFFBQVEsQ0FBQztBQUFBLElBQ2YsSUFBSSxNQUFNO0FBQUEsSUFDVixPQUFPLElBQUksSUFBSSxRQUFRO0FBQUEsTUFDbkIsTUFBTSxJQUFJLElBQUksT0FBTyxHQUFHO0FBQUEsTUFHeEIsSUFBSSxZQUFZLE1BQU0sTUFBTTtBQUFBLFFBQ3hCLFlBQVk7QUFBQSxRQUNaLE9BQU87QUFBQSxRQUNQO0FBQUEsTUFDSjtBQUFBLE1BQ0EsSUFBSSxTQUFTO0FBQUEsUUFDVCxJQUFJLE1BQU0sYUFBYSxHQUFHO0FBQUEsVUFDdEIsSUFBSSxNQUFNLE9BQU8sTUFBTSxLQUFLO0FBQUEsWUFDeEIsV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKLEVBQ0ssU0FBSSxNQUFNLFNBQVMsTUFBTSxhQUFhLEtBQUssV0FBVztBQUFBLFVBQ3ZELFVBQVU7QUFBQSxRQUNkO0FBQUEsUUFDQSxPQUFPO0FBQUEsUUFDUDtBQUFBLE1BQ0osRUFDSyxTQUFJLE1BQU0sS0FBSztBQUFBLFFBQ2hCLFVBQVU7QUFBQSxRQUNWLGFBQWE7QUFBQSxRQUNiLFdBQVc7QUFBQSxRQUNYLE9BQU87QUFBQSxRQUNQO0FBQUEsTUFDSjtBQUFBLE1BQ0EsSUFBSSxjQUFjLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUs7QUFBQSxRQUMzQyxLQUFLLEtBQUssR0FBRztBQUFBLFFBQ2IsTUFBTTtBQUFBLFFBQ04sTUFBTSxNQUFNLElBQUksSUFBSSxHQUFHLElBQUk7QUFBQSxRQUMzQixLQUFLLEtBQUssR0FBRztBQUFBLFFBQ2IsSUFBSSxJQUFJLFVBQVUsS0FBSyxLQUFLLEdBQUcsR0FBRztBQUFBLFFBQ2xDO0FBQUEsTUFDSjtBQUFBLE1BQ0EsSUFBSSxNQUFNLEtBQUs7QUFBQSxRQUNYLEtBQUssS0FBSyxHQUFHO0FBQUEsUUFDYixNQUFNO0FBQUEsUUFDTixNQUFNLEtBQUssSUFBSTtBQUFBLFFBQ2YsT0FBTyxJQUFJLElBQUksTUFBTSxHQUFHO0FBQUEsUUFDeEI7QUFBQSxNQUNKO0FBQUEsTUFDQSxJQUFJLE1BQU0sS0FBSztBQUFBLFFBQ1gsSUFBSSxRQUFRLE1BQU0sSUFBSSxPQUFPLFdBQVcsR0FBRztBQUFBLFVBQ3ZDLElBQUksWUFBWTtBQUFBLFFBQ3BCO0FBQUEsUUFDQSxLQUFLLEtBQUssR0FBRztBQUFBLFFBQ2IsTUFBTTtBQUFBLFFBQ04sSUFBSSxLQUFLLEdBQUcsT0FBTyxJQUFJO0FBQUEsUUFDdkIsT0FBTztBQUFBLE1BQ1g7QUFBQSxNQUNBLE9BQU87QUFBQSxJQUNYO0FBQUEsSUFJQSxJQUFJLE9BQU87QUFBQSxJQUNYLElBQUksWUFBWTtBQUFBLElBQ2hCLElBQUksU0FBUyxDQUFDLElBQUksVUFBVSxNQUFNLENBQUMsQ0FBQztBQUFBLElBQ3BDLE9BQU87QUFBQTtBQUFBLFNBRUosUUFBUSxDQUFDLFNBQVMsVUFBVSxDQUFDLEdBQUc7QUFBQSxJQUNuQyxNQUFNLE1BQU0sSUFBSSxJQUFJLE1BQU0sV0FBVyxPQUFPO0FBQUEsSUFDNUMsSUFBSSxVQUFVLFNBQVMsS0FBSyxHQUFHLE9BQU87QUFBQSxJQUN0QyxPQUFPO0FBQUE7QUFBQSxFQUlYLFdBQVcsR0FBRztBQUFBLElBR1YsSUFBSSxTQUFTLEtBQUs7QUFBQSxNQUNkLE9BQU8sS0FBSyxNQUFNLFlBQVk7QUFBQSxJQUVsQyxNQUFNLE9BQU8sS0FBSyxTQUFTO0FBQUEsSUFDM0IsT0FBTyxJQUFJLE1BQU0sVUFBVSxTQUFTLEtBQUssZUFBZTtBQUFBLElBSXhELE1BQU0sV0FBVyxZQUNiLEtBQUssYUFDSixLQUFLLFNBQVMsV0FDVixLQUFLLFNBQVMsbUJBQ2YsS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZO0FBQUEsSUFDaEQsS0FBSyxVQUFVO0FBQUEsTUFDWCxPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsTUFBTSxTQUFTLEtBQUssU0FBUyxTQUFTLE1BQU0sT0FBTyxRQUFRLE1BQU07QUFBQSxJQUNqRSxPQUFPLE9BQU8sT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPLEtBQUssR0FBRztBQUFBLE1BQy9DLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxJQUNYLENBQUM7QUFBQTtBQUFBLE1BRUQsT0FBTyxHQUFHO0FBQUEsSUFDVixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBdUVoQixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3JCLE1BQU0sTUFBTSxjQUFjLEtBQUssU0FBUztBQUFBLElBQ3hDLElBQUksS0FBSyxVQUFVO0FBQUEsTUFDZixLQUFLLFVBQVU7QUFBQSxJQUNuQixLQUFLLEtBQUssTUFBTTtBQUFBLE1BQ1osTUFBTSxVQUFVLEtBQUssUUFBUSxLQUFLLEtBQUssTUFBTTtBQUFBLE1BQzdDLE1BQU0sTUFBTSxLQUFLLE9BQ1osSUFBSSxPQUFLO0FBQUEsUUFDVixPQUFPLElBQUksR0FBRyxVQUFVLFNBQVMsT0FBTyxNQUFNLFdBQ3hDLElBQUksV0FBVyxHQUFHLEtBQUssV0FBVyxPQUFPLElBQ3pDLEVBQUUsZUFBZSxRQUFRO0FBQUEsUUFDL0IsS0FBSyxZQUFZLEtBQUssYUFBYTtBQUFBLFFBQ25DLEtBQUssU0FBUyxLQUFLLFVBQVU7QUFBQSxRQUM3QixPQUFPO0FBQUEsT0FDVixFQUNJLEtBQUssRUFBRTtBQUFBLE1BQ1osSUFBSSxTQUFRO0FBQUEsTUFDWixJQUFJLEtBQUssUUFBUSxHQUFHO0FBQUEsUUFDaEIsSUFBSSxPQUFPLEtBQUssT0FBTyxPQUFPLFVBQVU7QUFBQSxVQUtwQyxNQUFNLGlCQUFpQixLQUFLLE9BQU8sV0FBVyxLQUFLLFNBQVMsSUFBSSxLQUFLLE9BQU8sRUFBRTtBQUFBLFVBQzlFLEtBQUssZ0JBQWdCO0FBQUEsWUFDakIsTUFBTSxNQUFNO0FBQUEsWUFHWixNQUFNLGFBRUwsT0FBTyxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxLQUV4QixJQUFJLFdBQVcsS0FBSyxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxDQUFDLEtBRTlDLElBQUksV0FBVyxRQUFRLEtBQUssSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLENBQUM7QUFBQSxZQUd0RCxNQUFNLGFBQWEsUUFBUSxZQUFZLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxDQUFDO0FBQUEsWUFDNUQsU0FBUSxhQUFhLG1CQUFtQixZQUFZLGFBQWE7QUFBQSxVQUNyRTtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsTUFFQSxJQUFJLE1BQU07QUFBQSxNQUNWLElBQUksS0FBSyxNQUFNLEtBQ1gsS0FBSyxNQUFNLGVBQ1gsS0FBSyxTQUFTLFNBQVMsS0FBSztBQUFBLFFBQzVCLE1BQU07QUFBQSxNQUNWO0FBQUEsTUFDQSxNQUFNLFNBQVEsU0FBUSxNQUFNO0FBQUEsTUFDNUIsT0FBTztBQUFBLFFBQ0g7QUFBQSxRQUNBLFNBQVMsR0FBRztBQUFBLFFBQ1gsS0FBSyxjQUFjLEtBQUs7QUFBQSxRQUN6QixLQUFLO0FBQUEsTUFDVDtBQUFBLElBQ0o7QUFBQSxJQUlBLE1BQU0sV0FBVyxLQUFLLFNBQVMsT0FBTyxLQUFLLFNBQVM7QUFBQSxJQUVwRCxNQUFNLFFBQVEsS0FBSyxTQUFTLE1BQU0sY0FBYztBQUFBLElBQ2hELElBQUksT0FBTyxLQUFLLGVBQWUsR0FBRztBQUFBLElBQ2xDLElBQUksS0FBSyxRQUFRLEtBQUssS0FBSyxNQUFNLE1BQU0sUUFBUSxLQUFLLFNBQVMsS0FBSztBQUFBLE1BRzlELE1BQU0sSUFBSSxLQUFLLFNBQVM7QUFBQSxNQUN4QixLQUFLLFNBQVMsQ0FBQyxDQUFDO0FBQUEsTUFDaEIsS0FBSyxPQUFPO0FBQUEsTUFDWixLQUFLLFlBQVk7QUFBQSxNQUNqQixPQUFPLENBQUMsR0FBRyxTQUFTLEtBQUssU0FBUyxDQUFDLEdBQUcsT0FBTyxLQUFLO0FBQUEsSUFDdEQ7QUFBQSxJQUVBLElBQUksa0JBQWtCLFlBQVksWUFBWSxRQUFRLGFBQ2hELEtBQ0EsS0FBSyxlQUFlLElBQUk7QUFBQSxJQUM5QixJQUFJLG1CQUFtQixNQUFNO0FBQUEsTUFDekIsaUJBQWlCO0FBQUEsSUFDckI7QUFBQSxJQUNBLElBQUksZ0JBQWdCO0FBQUEsTUFDaEIsT0FBTyxNQUFNLFdBQVc7QUFBQSxJQUM1QjtBQUFBLElBRUEsSUFBSSxRQUFRO0FBQUEsSUFDWixJQUFJLEtBQUssU0FBUyxPQUFPLEtBQUssV0FBVztBQUFBLE1BQ3JDLFNBQVMsS0FBSyxRQUFRLE1BQU0sTUFBTSxhQUFhLE1BQU07QUFBQSxJQUN6RCxFQUNLO0FBQUEsTUFDRCxNQUFNLFFBQVEsS0FBSyxTQUFTLE1BRXBCLFFBQ0ssS0FBSyxRQUFRLE1BQU0sUUFBUSxXQUFXLGFBQWEsTUFDcEQsT0FDQSxNQUNOLEtBQUssU0FBUyxNQUNWLE1BQ0EsS0FBSyxTQUFTLE1BQ1YsT0FDQSxLQUFLLFNBQVMsT0FBTyxpQkFDakIsTUFDQSxLQUFLLFNBQVMsT0FBTyxpQkFDakIsT0FDQSxJQUFJLEtBQUs7QUFBQSxNQUMvQixRQUFRLFFBQVEsT0FBTztBQUFBO0FBQUEsSUFFM0IsT0FBTztBQUFBLE1BQ0g7QUFBQSxNQUNBLFNBQVMsSUFBSTtBQUFBLE1BQ1osS0FBSyxjQUFjLEtBQUs7QUFBQSxNQUN6QixLQUFLO0FBQUEsSUFDVDtBQUFBO0FBQUEsRUFFSixjQUFjLENBQUMsS0FBSztBQUFBLElBQ2hCLE9BQU8sS0FBSyxPQUNQLElBQUksT0FBSztBQUFBLE1BR1YsSUFBSSxPQUFPLE1BQU0sVUFBVTtBQUFBLFFBQ3ZCLE1BQU0sSUFBSSxNQUFNLDhCQUE4QjtBQUFBLE1BQ2xEO0FBQUEsTUFHQSxPQUFPLElBQUksR0FBRyxXQUFXLFNBQVMsRUFBRSxlQUFlLEdBQUc7QUFBQSxNQUN0RCxLQUFLLFNBQVMsS0FBSyxVQUFVO0FBQUEsTUFDN0IsT0FBTztBQUFBLEtBQ1YsRUFDSSxPQUFPLFNBQU8sS0FBSyxRQUFRLEtBQUssS0FBSyxNQUFNLFFBQVEsQ0FBQyxFQUNwRCxLQUFLLEdBQUc7QUFBQTtBQUFBLFNBRVYsVUFBVSxDQUFDLE1BQU0sVUFBVSxVQUFVLE9BQU87QUFBQSxJQUMvQyxJQUFJLFdBQVc7QUFBQSxJQUNmLElBQUksS0FBSztBQUFBLElBQ1QsSUFBSSxRQUFRO0FBQUEsSUFDWixTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQUEsTUFDbEMsTUFBTSxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQUEsTUFDdkIsSUFBSSxVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxPQUFPLFdBQVcsSUFBSSxDQUFDLElBQUksT0FBTyxNQUFNO0FBQUEsUUFDeEM7QUFBQSxNQUNKO0FBQUEsTUFDQSxJQUFJLE1BQU0sTUFBTTtBQUFBLFFBQ1osSUFBSSxNQUFNLEtBQUssU0FBUyxHQUFHO0FBQUEsVUFDdkIsTUFBTTtBQUFBLFFBQ1YsRUFDSztBQUFBLFVBQ0QsV0FBVztBQUFBO0FBQUEsUUFFZjtBQUFBLE1BQ0o7QUFBQSxNQUNBLElBQUksTUFBTSxLQUFLO0FBQUEsUUFDWCxPQUFPLEtBQUssV0FBVyxVQUFVLFNBQVMsV0FBVyxNQUFNLENBQUM7QUFBQSxRQUM1RCxJQUFJLFVBQVU7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLFFBQVEsU0FBUztBQUFBLFVBQ2pCLEtBQUssV0FBVztBQUFBLFVBQ2hCLFdBQVcsWUFBWTtBQUFBLFVBQ3ZCO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxNQUNBLElBQUksTUFBTSxLQUFLO0FBQUEsUUFDWCxJQUFJLFdBQVcsU0FBUztBQUFBLFVBQ3BCLE1BQU07QUFBQSxRQUVOO0FBQUEsZ0JBQU07QUFBQSxRQUNWLFdBQVc7QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUFBLE1BQ0EsSUFBSSxNQUFNLEtBQUs7QUFBQSxRQUNYLE1BQU07QUFBQSxRQUNOLFdBQVc7QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUFBLE1BQ0EsTUFBTSxhQUFhLENBQUM7QUFBQSxJQUN4QjtBQUFBLElBQ0EsT0FBTyxDQUFDLElBQUksU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLO0FBQUE7QUFFckQ7OztBQ2prQk8sSUFBTSxTQUFTLENBQUMsS0FBSyx1QkFBdUIsVUFBVyxDQUFDLE1BQU07QUFBQSxFQUlqRSxPQUFPLHVCQUNELEVBQUUsUUFBUSxjQUFjLE1BQU0sSUFDOUIsRUFBRSxRQUFRLGdCQUFnQixNQUFNO0FBQUE7OztBTFZuQyxJQUFNLFlBQVksQ0FBQyxHQUFHLFNBQVMsVUFBVSxDQUFDLE1BQU07QUFBQSxFQUNuRCxtQkFBbUIsT0FBTztBQUFBLEVBRTFCLEtBQUssUUFBUSxhQUFhLFFBQVEsT0FBTyxDQUFDLE1BQU0sS0FBSztBQUFBLElBQ2pELE9BQU87QUFBQSxFQUNYO0FBQUEsRUFDQSxPQUFPLElBQUksVUFBVSxTQUFTLE9BQU8sRUFBRSxNQUFNLENBQUM7QUFBQTtBQUdsRCxJQUFNLGVBQWU7QUFDckIsSUFBTSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFdBQVcsR0FBRyxLQUFLLEVBQUUsU0FBUyxHQUFHO0FBQzNFLElBQU0sb0JBQW9CLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUc7QUFDeEQsSUFBTSx1QkFBdUIsQ0FBQyxRQUFRO0FBQUEsRUFDbEMsTUFBTSxJQUFJLFlBQVk7QUFBQSxFQUN0QixPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsR0FBRyxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsR0FBRztBQUFBO0FBRXBFLElBQU0sMEJBQTBCLENBQUMsUUFBUTtBQUFBLEVBQ3JDLE1BQU0sSUFBSSxZQUFZO0FBQUEsRUFDdEIsT0FBTyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxHQUFHO0FBQUE7QUFFOUMsSUFBTSxnQkFBZ0I7QUFDdEIsSUFBTSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsV0FBVyxHQUFHLEtBQUssRUFBRSxTQUFTLEdBQUc7QUFDbkUsSUFBTSxxQkFBcUIsQ0FBQyxNQUFNLE1BQU0sT0FBTyxNQUFNLFFBQVEsRUFBRSxTQUFTLEdBQUc7QUFDM0UsSUFBTSxZQUFZO0FBQ2xCLElBQU0sY0FBYyxDQUFDLE1BQU0sTUFBTSxPQUFPLE1BQU0sUUFBUSxFQUFFLFdBQVcsR0FBRztBQUN0RSxJQUFNLFNBQVM7QUFDZixJQUFNLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxNQUFNLEVBQUUsV0FBVyxHQUFHO0FBQzNELElBQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLEtBQUssTUFBTSxPQUFPLE1BQU07QUFDaEUsSUFBTSxXQUFXO0FBQ2pCLElBQU0sbUJBQW1CLEVBQUUsSUFBSSxNQUFNLFFBQVE7QUFBQSxFQUN6QyxNQUFNLFFBQVEsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO0FBQUEsRUFDbEMsS0FBSztBQUFBLElBQ0QsT0FBTztBQUFBLEVBQ1gsTUFBTSxJQUFJLFlBQVk7QUFBQSxFQUN0QixPQUFPLENBQUMsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEdBQUc7QUFBQTtBQUUxRCxJQUFNLHNCQUFzQixFQUFFLElBQUksTUFBTSxRQUFRO0FBQUEsRUFDNUMsTUFBTSxRQUFRLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztBQUFBLEVBQ3JDLEtBQUs7QUFBQSxJQUNELE9BQU87QUFBQSxFQUNYLE1BQU0sSUFBSSxZQUFZO0FBQUEsRUFDdEIsT0FBTyxDQUFDLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxHQUFHO0FBQUE7QUFFMUQsSUFBTSxnQkFBZ0IsRUFBRSxJQUFJLE1BQU0sUUFBUTtBQUFBLEVBQ3RDLE1BQU0sUUFBUSxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7QUFBQSxFQUNyQyxRQUFRLE1BQU0sUUFBUSxDQUFDLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUc7QUFBQTtBQUUzRCxJQUFNLGFBQWEsRUFBRSxJQUFJLE1BQU0sUUFBUTtBQUFBLEVBQ25DLE1BQU0sUUFBUSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7QUFBQSxFQUNsQyxRQUFRLE1BQU0sUUFBUSxDQUFDLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUc7QUFBQTtBQUUzRCxJQUFNLGtCQUFrQixFQUFFLFFBQVE7QUFBQSxFQUM5QixNQUFNLE1BQU0sR0FBRztBQUFBLEVBQ2YsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLFFBQVEsRUFBRSxXQUFXLEdBQUc7QUFBQTtBQUV2RCxJQUFNLHFCQUFxQixFQUFFLFFBQVE7QUFBQSxFQUNqQyxNQUFNLE1BQU0sR0FBRztBQUFBLEVBQ2YsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLE9BQU8sTUFBTSxPQUFPLE1BQU07QUFBQTtBQUd6RCxJQUFNLGtCQUFtQixPQUFPLFlBQVksWUFBWSxVQUNqRCxPQUFPLFFBQVEsUUFBUSxZQUN0QixRQUFRLE9BQ1IsUUFBUSxJQUFJLGtDQUNaLFFBQVEsV0FDVjtBQUNOLElBQU0sT0FBTztBQUFBLEVBQ1QsT0FBTyxFQUFFLEtBQUssS0FBSztBQUFBLEVBQ25CLE9BQU8sRUFBRSxLQUFLLElBQUk7QUFDdEI7QUFFTyxJQUFNLE1BQU0sb0JBQW9CLFVBQVUsS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNO0FBQzdFLFVBQVUsTUFBTTtBQUNULElBQU0sV0FBVyxPQUFPLGFBQWE7QUFDNUMsVUFBVSxXQUFXO0FBR3JCLElBQU0sU0FBUTtBQUVkLElBQU0sUUFBTyxTQUFRO0FBSXJCLElBQU0sYUFBYTtBQUduQixJQUFNLGVBQWU7QUFDZCxJQUFNLFNBQVMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsU0FBUyxPQUFPO0FBQ3JGLFVBQVUsU0FBUztBQUNuQixJQUFNLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLE9BQU8sT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFDLElBQU0sV0FBVyxDQUFDLFFBQVE7QUFBQSxFQUM3QixLQUFLLE9BQU8sT0FBTyxRQUFRLGFBQWEsT0FBTyxLQUFLLEdBQUcsRUFBRSxRQUFRO0FBQUEsSUFDN0QsT0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLE1BQU0sT0FBTztBQUFBLEVBQ2IsTUFBTSxJQUFJLENBQUMsR0FBRyxTQUFTLFVBQVUsQ0FBQyxNQUFNLEtBQUssR0FBRyxTQUFTLElBQUksS0FBSyxPQUFPLENBQUM7QUFBQSxFQUMxRSxPQUFPLE9BQU8sT0FBTyxHQUFHO0FBQUEsSUFDcEIsV0FBVyxNQUFNLGtCQUFrQixLQUFLLFVBQVU7QUFBQSxNQUM5QyxXQUFXLENBQUMsU0FBUyxVQUFVLENBQUMsR0FBRztBQUFBLFFBQy9CLE1BQU0sU0FBUyxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQUE7QUFBQSxhQUU3QixRQUFRLENBQUMsU0FBUztBQUFBLFFBQ3JCLE9BQU8sS0FBSyxTQUFTLElBQUksS0FBSyxPQUFPLENBQUMsRUFBRTtBQUFBO0FBQUEsSUFFaEQ7QUFBQSxJQUNBLEtBQUssTUFBTSxhQUFZLEtBQUssSUFBSTtBQUFBLE1BRTVCLFdBQVcsQ0FBQyxNQUFNLFFBQVEsVUFBVSxDQUFDLEdBQUc7QUFBQSxRQUNwQyxNQUFNLE1BQU0sUUFBUSxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQUE7QUFBQSxhQUdsQyxRQUFRLENBQUMsU0FBUyxVQUFVLENBQUMsR0FBRztBQUFBLFFBQ25DLE9BQU8sS0FBSyxJQUFJLFNBQVMsU0FBUyxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQUE7QUFBQSxJQUUzRDtBQUFBLElBQ0EsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUcsSUFBSSxLQUFLLE9BQU8sQ0FBQztBQUFBLElBQ2pFLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEtBQUssT0FBTyxHQUFHLElBQUksS0FBSyxPQUFPLENBQUM7QUFBQSxJQUM3RCxRQUFRLENBQUMsU0FBUyxVQUFVLENBQUMsTUFBTSxLQUFLLE9BQU8sU0FBUyxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQUEsSUFDekUsVUFBVSxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksS0FBSyxPQUFPLENBQUM7QUFBQSxJQUN0RCxRQUFRLENBQUMsU0FBUyxVQUFVLENBQUMsTUFBTSxLQUFLLE9BQU8sU0FBUyxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQUEsSUFDekUsYUFBYSxDQUFDLFNBQVMsVUFBVSxDQUFDLE1BQU0sS0FBSyxZQUFZLFNBQVMsSUFBSSxLQUFLLE9BQU8sQ0FBQztBQUFBLElBQ25GLE9BQU8sQ0FBQyxNQUFNLFNBQVMsVUFBVSxDQUFDLE1BQU0sS0FBSyxNQUFNLE1BQU0sU0FBUyxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQUEsSUFDbkYsS0FBSyxLQUFLO0FBQUEsSUFDVjtBQUFBLEVBQ0osQ0FBQztBQUFBO0FBRUwsVUFBVSxXQUFXO0FBV2QsSUFBTSxjQUFjLENBQUMsU0FBUyxVQUFVLENBQUMsTUFBTTtBQUFBLEVBQ2xELG1CQUFtQixPQUFPO0FBQUEsRUFHMUIsSUFBSSxRQUFRLFlBQVksbUJBQW1CLEtBQUssT0FBTyxHQUFHO0FBQUEsSUFFdEQsT0FBTyxDQUFDLE9BQU87QUFBQSxFQUNuQjtBQUFBLEVBQ0EsT0FBTywrQkFBTyxPQUFPO0FBQUE7QUFFekIsVUFBVSxjQUFjO0FBWWpCLElBQU0sU0FBUyxDQUFDLFNBQVMsVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLFNBQVMsT0FBTyxFQUFFLE9BQU87QUFDeEYsVUFBVSxTQUFTO0FBQ1osSUFBTSxRQUFRLENBQUMsTUFBTSxTQUFTLFVBQVUsQ0FBQyxNQUFNO0FBQUEsRUFDbEQsTUFBTSxLQUFLLElBQUksVUFBVSxTQUFTLE9BQU87QUFBQSxFQUN6QyxPQUFPLEtBQUssT0FBTyxPQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFBQSxFQUNuQyxJQUFJLEdBQUcsUUFBUSxXQUFXLEtBQUssUUFBUTtBQUFBLElBQ25DLEtBQUssS0FBSyxPQUFPO0FBQUEsRUFDckI7QUFBQSxFQUNBLE9BQU87QUFBQTtBQUVYLFVBQVUsUUFBUTtBQUVsQixJQUFNLFlBQVk7QUFDbEIsSUFBTSxnQkFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLDRCQUE0QixNQUFNO0FBQUE7QUFDakUsTUFBTSxVQUFVO0FBQUEsRUFDbkI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxXQUFXLENBQUMsU0FBUyxVQUFVLENBQUMsR0FBRztBQUFBLElBQy9CLG1CQUFtQixPQUFPO0FBQUEsSUFDMUIsVUFBVSxXQUFXLENBQUM7QUFBQSxJQUN0QixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxXQUFXLFFBQVEsWUFBWTtBQUFBLElBQ3BDLEtBQUssWUFBWSxLQUFLLGFBQWE7QUFBQSxJQUNuQyxLQUFLLHlCQUNDLFFBQVEsd0JBQXdCLFFBQVEsdUJBQXVCO0FBQUEsSUFDckUsSUFBSSxLQUFLLHNCQUFzQjtBQUFBLE1BQzNCLEtBQUssVUFBVSxLQUFLLFFBQVEsUUFBUSxPQUFPLEdBQUc7QUFBQSxJQUNsRDtBQUFBLElBQ0EsS0FBSyw0QkFBNEIsUUFBUTtBQUFBLElBQ3pDLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLGFBQWEsUUFBUTtBQUFBLElBQzFCLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLEtBQUssV0FBVyxLQUFLLFFBQVE7QUFBQSxJQUM3QixLQUFLLHFCQUNELFFBQVEsdUJBQXVCLFlBQ3pCLFFBQVEsd0JBQ0wsS0FBSyxhQUFhLEtBQUs7QUFBQSxJQUNwQyxLQUFLLFVBQVUsQ0FBQztBQUFBLElBQ2hCLEtBQUssWUFBWSxDQUFDO0FBQUEsSUFDbEIsS0FBSyxNQUFNLENBQUM7QUFBQSxJQUVaLEtBQUssS0FBSztBQUFBO0FBQUEsRUFFZCxRQUFRLEdBQUc7QUFBQSxJQUNQLElBQUksS0FBSyxRQUFRLGlCQUFpQixLQUFLLElBQUksU0FBUyxHQUFHO0FBQUEsTUFDbkQsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLFdBQVcsV0FBVyxLQUFLLEtBQUs7QUFBQSxNQUM1QixXQUFXLFFBQVEsU0FBUztBQUFBLFFBQ3hCLElBQUksT0FBTyxTQUFTO0FBQUEsVUFDaEIsT0FBTztBQUFBLE1BQ2Y7QUFBQSxJQUNKO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUVYLEtBQUssSUFBSSxHQUFHO0FBQUEsRUFDWixJQUFJLEdBQUc7QUFBQSxJQUNILE1BQU0sVUFBVSxLQUFLO0FBQUEsSUFDckIsTUFBTSxVQUFVLEtBQUs7QUFBQSxJQUVyQixLQUFLLFFBQVEsYUFBYSxRQUFRLE9BQU8sQ0FBQyxNQUFNLEtBQUs7QUFBQSxNQUNqRCxLQUFLLFVBQVU7QUFBQSxNQUNmO0FBQUEsSUFDSjtBQUFBLElBQ0EsS0FBSyxTQUFTO0FBQUEsTUFDVixLQUFLLFFBQVE7QUFBQSxNQUNiO0FBQUEsSUFDSjtBQUFBLElBRUEsS0FBSyxZQUFZO0FBQUEsSUFFakIsS0FBSyxVQUFVLENBQUMsR0FBRyxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQztBQUFBLElBQzlDLElBQUksUUFBUSxPQUFPO0FBQUEsTUFDZixLQUFLLFFBQVEsSUFBSSxTQUFTLFFBQVEsTUFBTSxHQUFHLElBQUk7QUFBQSxJQUNuRDtBQUFBLElBQ0EsS0FBSyxNQUFNLEtBQUssU0FBUyxLQUFLLE9BQU87QUFBQSxJQVVyQyxNQUFNLGVBQWUsS0FBSyxRQUFRLElBQUksT0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDO0FBQUEsSUFDN0QsS0FBSyxZQUFZLEtBQUssV0FBVyxZQUFZO0FBQUEsSUFDN0MsS0FBSyxNQUFNLEtBQUssU0FBUyxLQUFLLFNBQVM7QUFBQSxJQUV2QyxJQUFJLE1BQU0sS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTztBQUFBLE1BQ3ZDLElBQUksS0FBSyxhQUFhLEtBQUssb0JBQW9CO0FBQUEsUUFFM0MsTUFBTSxRQUFRLEVBQUUsT0FBTyxNQUNuQixFQUFFLE9BQU8sT0FDUixFQUFFLE9BQU8sUUFBUSxVQUFVLEtBQUssRUFBRSxFQUFFLE9BQ3BDLFVBQVUsS0FBSyxFQUFFLEVBQUU7QUFBQSxRQUN4QixNQUFNLFVBQVUsV0FBVyxLQUFLLEVBQUUsRUFBRTtBQUFBLFFBQ3BDLElBQUksT0FBTztBQUFBLFVBQ1AsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLFFBQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQUEsUUFDckUsRUFDSyxTQUFJLFNBQVM7QUFBQSxVQUNkLE9BQU8sQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksUUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFBQSxRQUN6RDtBQUFBLE1BQ0o7QUFBQSxNQUNBLE9BQU8sRUFBRSxJQUFJLFFBQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztBQUFBLEtBQ3BDO0FBQUEsSUFDRCxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7QUFBQSxJQUU1QixLQUFLLE1BQU0sSUFBSSxPQUFPLE9BQUssRUFBRSxRQUFRLEtBQUssTUFBTSxFQUFFO0FBQUEsSUFFbEQsSUFBSSxLQUFLLFdBQVc7QUFBQSxNQUNoQixTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxRQUN0QyxNQUFNLElBQUksS0FBSyxJQUFJO0FBQUEsUUFDbkIsSUFBSSxFQUFFLE9BQU8sTUFDVCxFQUFFLE9BQU8sTUFDVCxLQUFLLFVBQVUsR0FBRyxPQUFPLE9BQ3pCLE9BQU8sRUFBRSxPQUFPLFlBQ2hCLFlBQVksS0FBSyxFQUFFLEVBQUUsR0FBRztBQUFBLFVBQ3hCLEVBQUUsS0FBSztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLElBQ0EsS0FBSyxNQUFNLEtBQUssU0FBUyxLQUFLLEdBQUc7QUFBQTtBQUFBLEVBT3JDLFVBQVUsQ0FBQyxXQUFXO0FBQUEsSUFFbEIsSUFBSSxLQUFLLFFBQVEsWUFBWTtBQUFBLE1BQ3pCLFNBQVMsSUFBSSxFQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7QUFBQSxRQUN2QyxTQUFTLElBQUksRUFBRyxJQUFJLFVBQVUsR0FBRyxRQUFRLEtBQUs7QUFBQSxVQUMxQyxJQUFJLFVBQVUsR0FBRyxPQUFPLE1BQU07QUFBQSxZQUMxQixVQUFVLEdBQUcsS0FBSztBQUFBLFVBQ3RCO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsSUFDQSxRQUFRLG9CQUFvQixNQUFNLEtBQUs7QUFBQSxJQUN2QyxJQUFJLHFCQUFxQixHQUFHO0FBQUEsTUFFeEIsWUFBWSxLQUFLLHFCQUFxQixTQUFTO0FBQUEsTUFDL0MsWUFBWSxLQUFLLHNCQUFzQixTQUFTO0FBQUEsSUFDcEQsRUFDSyxTQUFJLHFCQUFxQixHQUFHO0FBQUEsTUFFN0IsWUFBWSxLQUFLLGlCQUFpQixTQUFTO0FBQUEsSUFDL0MsRUFDSztBQUFBLE1BRUQsWUFBWSxLQUFLLDBCQUEwQixTQUFTO0FBQUE7QUFBQSxJQUV4RCxPQUFPO0FBQUE7QUFBQSxFQUdYLHlCQUF5QixDQUFDLFdBQVc7QUFBQSxJQUNqQyxPQUFPLFVBQVUsSUFBSSxXQUFTO0FBQUEsTUFDMUIsSUFBSSxLQUFLO0FBQUEsTUFDVCxRQUFlLEtBQUssTUFBTSxRQUFRLE1BQU0sS0FBSyxDQUFDLE9BQXZDLElBQTJDO0FBQUEsUUFDOUMsSUFBSSxJQUFJO0FBQUEsUUFDUixPQUFPLE1BQU0sSUFBSSxPQUFPLE1BQU07QUFBQSxVQUMxQjtBQUFBLFFBQ0o7QUFBQSxRQUNBLElBQUksTUFBTSxJQUFJO0FBQUEsVUFDVixNQUFNLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFBQSxRQUMzQjtBQUFBLE1BQ0o7QUFBQSxNQUNBLE9BQU87QUFBQSxLQUNWO0FBQUE7QUFBQSxFQUdMLGdCQUFnQixDQUFDLFdBQVc7QUFBQSxJQUN4QixPQUFPLFVBQVUsSUFBSSxXQUFTO0FBQUEsTUFDMUIsUUFBUSxNQUFNLE9BQU8sQ0FBQyxLQUFLLFNBQVM7QUFBQSxRQUNoQyxNQUFNLE9BQU8sSUFBSSxJQUFJLFNBQVM7QUFBQSxRQUM5QixJQUFJLFNBQVMsUUFBUSxTQUFTLE1BQU07QUFBQSxVQUNoQyxPQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsSUFBSSxTQUFTLE1BQU07QUFBQSxVQUNmLElBQUksUUFBUSxTQUFTLFFBQVEsU0FBUyxPQUFPLFNBQVMsTUFBTTtBQUFBLFlBQ3hELElBQUksSUFBSTtBQUFBLFlBQ1IsT0FBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQUEsUUFDQSxJQUFJLEtBQUssSUFBSTtBQUFBLFFBQ2IsT0FBTztBQUFBLFNBQ1IsQ0FBQyxDQUFDO0FBQUEsTUFDTCxPQUFPLE1BQU0sV0FBVyxJQUFJLENBQUMsRUFBRSxJQUFJO0FBQUEsS0FDdEM7QUFBQTtBQUFBLEVBRUwsb0JBQW9CLENBQUMsT0FBTztBQUFBLElBQ3hCLEtBQUssTUFBTSxRQUFRLEtBQUssR0FBRztBQUFBLE1BQ3ZCLFFBQVEsS0FBSyxXQUFXLEtBQUs7QUFBQSxJQUNqQztBQUFBLElBQ0EsSUFBSSxlQUFlO0FBQUEsSUFDbkIsR0FBRztBQUFBLE1BQ0MsZUFBZTtBQUFBLE1BRWYsS0FBSyxLQUFLLHlCQUF5QjtBQUFBLFFBQy9CLFNBQVMsSUFBSSxFQUFHLElBQUksTUFBTSxTQUFTLEdBQUcsS0FBSztBQUFBLFVBQ3ZDLE1BQU0sSUFBSSxNQUFNO0FBQUEsVUFFaEIsSUFBSSxNQUFNLEtBQUssTUFBTSxNQUFNLE1BQU0sT0FBTztBQUFBLFlBQ3BDO0FBQUEsVUFDSixJQUFJLE1BQU0sT0FBTyxNQUFNLElBQUk7QUFBQSxZQUN2QixlQUFlO0FBQUEsWUFDZixNQUFNLE9BQU8sR0FBRyxDQUFDO0FBQUEsWUFDakI7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLFFBQ0EsSUFBSSxNQUFNLE9BQU8sT0FDYixNQUFNLFdBQVcsTUFDaEIsTUFBTSxPQUFPLE9BQU8sTUFBTSxPQUFPLEtBQUs7QUFBQSxVQUN2QyxlQUFlO0FBQUEsVUFDZixNQUFNLElBQUk7QUFBQSxRQUNkO0FBQUEsTUFDSjtBQUFBLE1BRUEsSUFBSSxLQUFLO0FBQUEsTUFDVCxRQUFlLEtBQUssTUFBTSxRQUFRLE1BQU0sS0FBSyxDQUFDLE9BQXZDLElBQTJDO0FBQUEsUUFDOUMsTUFBTSxJQUFJLE1BQU0sS0FBSztBQUFBLFFBQ3JCLElBQUksS0FBSyxNQUFNLE9BQU8sTUFBTSxRQUFRLE1BQU0sTUFBTTtBQUFBLFVBQzVDLGVBQWU7QUFBQSxVQUNmLE1BQU0sT0FBTyxLQUFLLEdBQUcsQ0FBQztBQUFBLFVBQ3RCLE1BQU07QUFBQSxRQUNWO0FBQUEsTUFDSjtBQUFBLElBQ0osU0FBUztBQUFBLElBQ1QsT0FBTyxNQUFNLFdBQVcsSUFBSSxDQUFDLEVBQUUsSUFBSTtBQUFBO0FBQUEsRUFvQnZDLG9CQUFvQixDQUFDLFdBQVc7QUFBQSxJQUM1QixJQUFJLGVBQWU7QUFBQSxJQUNuQixHQUFHO0FBQUEsTUFDQyxlQUFlO0FBQUEsTUFFZixTQUFTLFNBQVMsV0FBVztBQUFBLFFBQ3pCLElBQUksS0FBSztBQUFBLFFBQ1QsUUFBZSxLQUFLLE1BQU0sUUFBUSxNQUFNLEtBQUssQ0FBQyxPQUF2QyxJQUEyQztBQUFBLFVBQzlDLElBQUksTUFBTTtBQUFBLFVBQ1YsT0FBTyxNQUFNLE1BQU0sT0FBTyxNQUFNO0FBQUEsWUFFNUI7QUFBQSxVQUNKO0FBQUEsVUFHQSxJQUFJLE1BQU0sSUFBSTtBQUFBLFlBQ1YsTUFBTSxPQUFPLEtBQUssR0FBRyxNQUFNLEVBQUU7QUFBQSxVQUNqQztBQUFBLFVBQ0EsSUFBSSxPQUFPLE1BQU0sS0FBSztBQUFBLFVBQ3RCLE1BQU0sSUFBSSxNQUFNLEtBQUs7QUFBQSxVQUNyQixNQUFNLEtBQUssTUFBTSxLQUFLO0FBQUEsVUFDdEIsSUFBSSxTQUFTO0FBQUEsWUFDVDtBQUFBLFVBQ0osS0FBSyxLQUNELE1BQU0sT0FDTixNQUFNLFNBQ0wsTUFDRCxPQUFPLE9BQ1AsT0FBTyxNQUFNO0FBQUEsWUFDYjtBQUFBLFVBQ0o7QUFBQSxVQUNBLGVBQWU7QUFBQSxVQUVmLE1BQU0sT0FBTyxJQUFJLENBQUM7QUFBQSxVQUNsQixNQUFNLFFBQVEsTUFBTSxNQUFNLENBQUM7QUFBQSxVQUMzQixNQUFNLE1BQU07QUFBQSxVQUNaLFVBQVUsS0FBSyxLQUFLO0FBQUEsVUFDcEI7QUFBQSxRQUNKO0FBQUEsUUFFQSxLQUFLLEtBQUsseUJBQXlCO0FBQUEsVUFDL0IsU0FBUyxJQUFJLEVBQUcsSUFBSSxNQUFNLFNBQVMsR0FBRyxLQUFLO0FBQUEsWUFDdkMsTUFBTSxJQUFJLE1BQU07QUFBQSxZQUVoQixJQUFJLE1BQU0sS0FBSyxNQUFNLE1BQU0sTUFBTSxPQUFPO0FBQUEsY0FDcEM7QUFBQSxZQUNKLElBQUksTUFBTSxPQUFPLE1BQU0sSUFBSTtBQUFBLGNBQ3ZCLGVBQWU7QUFBQSxjQUNmLE1BQU0sT0FBTyxHQUFHLENBQUM7QUFBQSxjQUNqQjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsVUFDQSxJQUFJLE1BQU0sT0FBTyxPQUNiLE1BQU0sV0FBVyxNQUNoQixNQUFNLE9BQU8sT0FBTyxNQUFNLE9BQU8sS0FBSztBQUFBLFlBQ3ZDLGVBQWU7QUFBQSxZQUNmLE1BQU0sSUFBSTtBQUFBLFVBQ2Q7QUFBQSxRQUNKO0FBQUEsUUFFQSxJQUFJLEtBQUs7QUFBQSxRQUNULFFBQWUsS0FBSyxNQUFNLFFBQVEsTUFBTSxLQUFLLENBQUMsT0FBdkMsSUFBMkM7QUFBQSxVQUM5QyxNQUFNLElBQUksTUFBTSxLQUFLO0FBQUEsVUFDckIsSUFBSSxLQUFLLE1BQU0sT0FBTyxNQUFNLFFBQVEsTUFBTSxNQUFNO0FBQUEsWUFDNUMsZUFBZTtBQUFBLFlBQ2YsTUFBTSxVQUFVLE9BQU8sS0FBSyxNQUFNLEtBQUssT0FBTztBQUFBLFlBQzlDLE1BQU0sUUFBUSxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7QUFBQSxZQUNqQyxNQUFNLE9BQU8sS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLO0FBQUEsWUFDaEMsSUFBSSxNQUFNLFdBQVc7QUFBQSxjQUNqQixNQUFNLEtBQUssRUFBRTtBQUFBLFlBQ2pCLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKLFNBQVM7QUFBQSxJQUNULE9BQU87QUFBQTtBQUFBLEVBU1gscUJBQXFCLENBQUMsV0FBVztBQUFBLElBQzdCLFNBQVMsSUFBSSxFQUFHLElBQUksVUFBVSxTQUFTLEdBQUcsS0FBSztBQUFBLE1BQzNDLFNBQVMsSUFBSSxJQUFJLEVBQUcsSUFBSSxVQUFVLFFBQVEsS0FBSztBQUFBLFFBQzNDLE1BQU0sVUFBVSxLQUFLLFdBQVcsVUFBVSxJQUFJLFVBQVUsS0FBSyxLQUFLLHVCQUF1QjtBQUFBLFFBQ3pGLElBQUksU0FBUztBQUFBLFVBQ1QsVUFBVSxLQUFLLENBQUM7QUFBQSxVQUNoQixVQUFVLEtBQUs7QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsSUFDQSxPQUFPLFVBQVUsT0FBTyxRQUFNLEdBQUcsTUFBTTtBQUFBO0FBQUEsRUFFM0MsVUFBVSxDQUFDLEdBQUcsR0FBRyxlQUFlLE9BQU87QUFBQSxJQUNuQyxJQUFJLEtBQUs7QUFBQSxJQUNULElBQUksS0FBSztBQUFBLElBQ1QsSUFBSSxTQUFTLENBQUM7QUFBQSxJQUNkLElBQUksUUFBUTtBQUFBLElBQ1osT0FBTyxLQUFLLEVBQUUsVUFBVSxLQUFLLEVBQUUsUUFBUTtBQUFBLE1BQ25DLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSztBQUFBLFFBQ2pCLE9BQU8sS0FBSyxVQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRztBQUFBLFFBQ3pDO0FBQUEsUUFDQTtBQUFBLE1BQ0osRUFDSyxTQUFJLGdCQUFnQixFQUFFLFFBQVEsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLElBQUk7QUFBQSxRQUM1RCxPQUFPLEtBQUssRUFBRSxHQUFHO0FBQUEsUUFDakI7QUFBQSxNQUNKLEVBQ0ssU0FBSSxnQkFBZ0IsRUFBRSxRQUFRLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxJQUFJO0FBQUEsUUFDNUQsT0FBTyxLQUFLLEVBQUUsR0FBRztBQUFBLFFBQ2pCO0FBQUEsTUFDSixFQUNLLFNBQUksRUFBRSxRQUFRLE9BQ2YsRUFBRSxRQUNELEtBQUssUUFBUSxRQUFRLEVBQUUsSUFBSSxXQUFXLEdBQUcsTUFDMUMsRUFBRSxRQUFRLE1BQU07QUFBQSxRQUNoQixJQUFJLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxRQUNYLFFBQVE7QUFBQSxRQUNSLE9BQU8sS0FBSyxFQUFFLEdBQUc7QUFBQSxRQUNqQjtBQUFBLFFBQ0E7QUFBQSxNQUNKLEVBQ0ssU0FBSSxFQUFFLFFBQVEsT0FDZixFQUFFLFFBQ0QsS0FBSyxRQUFRLFFBQVEsRUFBRSxJQUFJLFdBQVcsR0FBRyxNQUMxQyxFQUFFLFFBQVEsTUFBTTtBQUFBLFFBQ2hCLElBQUksVUFBVTtBQUFBLFVBQ1YsT0FBTztBQUFBLFFBQ1gsUUFBUTtBQUFBLFFBQ1IsT0FBTyxLQUFLLEVBQUUsR0FBRztBQUFBLFFBQ2pCO0FBQUEsUUFDQTtBQUFBLE1BQ0osRUFDSztBQUFBLFFBQ0QsT0FBTztBQUFBO0FBQUEsSUFFZjtBQUFBLElBR0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVO0FBQUE7QUFBQSxFQUVwQyxXQUFXLEdBQUc7QUFBQSxJQUNWLElBQUksS0FBSztBQUFBLE1BQ0w7QUFBQSxJQUNKLE1BQU0sVUFBVSxLQUFLO0FBQUEsSUFDckIsSUFBSSxTQUFTO0FBQUEsSUFDYixJQUFJLGVBQWU7QUFBQSxJQUNuQixTQUFTLElBQUksRUFBRyxJQUFJLFFBQVEsVUFBVSxRQUFRLE9BQU8sQ0FBQyxNQUFNLEtBQUssS0FBSztBQUFBLE1BQ2xFLFVBQVU7QUFBQSxNQUNWO0FBQUEsSUFDSjtBQUFBLElBQ0EsSUFBSTtBQUFBLE1BQ0EsS0FBSyxVQUFVLFFBQVEsTUFBTSxZQUFZO0FBQUEsSUFDN0MsS0FBSyxTQUFTO0FBQUE7QUFBQSxFQU9sQixRQUFRLENBQUMsTUFBTSxTQUFTLFVBQVUsT0FBTztBQUFBLElBQ3JDLE1BQU0sVUFBVSxLQUFLO0FBQUEsSUFJckIsSUFBSSxLQUFLLFdBQVc7QUFBQSxNQUNoQixNQUFNLFlBQVksT0FBTyxLQUFLLE9BQU8sWUFBWSxZQUFZLEtBQUssS0FBSyxFQUFFO0FBQUEsTUFDekUsTUFBTSxXQUFXLGFBQ2IsS0FBSyxPQUFPLE1BQ1osS0FBSyxPQUFPLE1BQ1osS0FBSyxPQUFPLE9BQ1osWUFBWSxLQUFLLEtBQUssRUFBRTtBQUFBLE1BQzVCLE1BQU0sZUFBZSxPQUFPLFFBQVEsT0FBTyxZQUFZLFlBQVksS0FBSyxRQUFRLEVBQUU7QUFBQSxNQUNsRixNQUFNLGNBQWMsZ0JBQ2hCLFFBQVEsT0FBTyxNQUNmLFFBQVEsT0FBTyxNQUNmLFFBQVEsT0FBTyxPQUNmLE9BQU8sUUFBUSxPQUFPLFlBQ3RCLFlBQVksS0FBSyxRQUFRLEVBQUU7QUFBQSxNQUMvQixNQUFNLE1BQU0sVUFBVSxJQUFJLFlBQVksSUFBSTtBQUFBLE1BQzFDLE1BQU0sTUFBTSxhQUFhLElBQUksZUFBZSxJQUFJO0FBQUEsTUFDaEQsSUFBSSxPQUFPLFFBQVEsWUFBWSxPQUFPLFFBQVEsVUFBVTtBQUFBLFFBQ3BELE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxNQUFNLFFBQVEsSUFBSTtBQUFBLFFBQ3pDLElBQUksR0FBRyxZQUFZLE1BQU0sR0FBRyxZQUFZLEdBQUc7QUFBQSxVQUN2QyxRQUFRLE9BQU87QUFBQSxVQUNmLElBQUksTUFBTSxLQUFLO0FBQUEsWUFDWCxVQUFVLFFBQVEsTUFBTSxHQUFHO0FBQUEsVUFDL0IsRUFDSyxTQUFJLE1BQU0sS0FBSztBQUFBLFlBQ2hCLE9BQU8sS0FBSyxNQUFNLEdBQUc7QUFBQSxVQUN6QjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLElBR0EsUUFBUSxvQkFBb0IsTUFBTSxLQUFLO0FBQUEsSUFDdkMsSUFBSSxxQkFBcUIsR0FBRztBQUFBLE1BQ3hCLE9BQU8sS0FBSyxxQkFBcUIsSUFBSTtBQUFBLElBQ3pDO0FBQUEsSUFDQSxLQUFLLE1BQU0sWUFBWSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFBQSxJQUM5QyxLQUFLLE1BQU0sWUFBWSxLQUFLLFFBQVEsUUFBUSxNQUFNO0FBQUEsSUFDbEQsU0FBUyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssS0FBSyxRQUFRLEtBQUssUUFBUSxPQUFRLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxNQUFNO0FBQUEsTUFDNUYsS0FBSyxNQUFNLGVBQWU7QUFBQSxNQUMxQixJQUFJLElBQUksUUFBUTtBQUFBLE1BQ2hCLElBQUksSUFBSSxLQUFLO0FBQUEsTUFDYixLQUFLLE1BQU0sU0FBUyxHQUFHLENBQUM7QUFBQSxNQUl4QixJQUFJLE1BQU0sT0FBTztBQUFBLFFBQ2IsT0FBTztBQUFBLE1BQ1g7QUFBQSxNQUVBLElBQUksTUFBTSxVQUFVO0FBQUEsUUFDaEIsS0FBSyxNQUFNLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQUEsUUF1QnRDLElBQUksS0FBSztBQUFBLFFBQ1QsSUFBSSxLQUFLLEtBQUs7QUFBQSxRQUNkLElBQUksT0FBTyxJQUFJO0FBQUEsVUFDWCxLQUFLLE1BQU0sZUFBZTtBQUFBLFVBTzFCLE1BQU8sS0FBSyxJQUFJLE1BQU07QUFBQSxZQUNsQixJQUFJLEtBQUssUUFBUSxPQUNiLEtBQUssUUFBUSxTQUNYLFFBQVEsT0FBTyxLQUFLLElBQUksT0FBTyxDQUFDLE1BQU07QUFBQSxjQUN4QyxPQUFPO0FBQUEsVUFDZjtBQUFBLFVBQ0EsT0FBTztBQUFBLFFBQ1g7QUFBQSxRQUVBLE9BQU8sS0FBSyxJQUFJO0FBQUEsVUFDWixJQUFJLFlBQVksS0FBSztBQUFBLFVBQ3JCLEtBQUssTUFBTTtBQUFBLGlCQUFvQixNQUFNLElBQUksU0FBUyxJQUFJLFNBQVM7QUFBQSxVQUUvRCxJQUFJLEtBQUssU0FBUyxLQUFLLE1BQU0sRUFBRSxHQUFHLFFBQVEsTUFBTSxFQUFFLEdBQUcsT0FBTyxHQUFHO0FBQUEsWUFDM0QsS0FBSyxNQUFNLHlCQUF5QixJQUFJLElBQUksU0FBUztBQUFBLFlBRXJELE9BQU87QUFBQSxVQUNYLEVBQ0s7QUFBQSxZQUdELElBQUksY0FBYyxPQUNkLGNBQWMsU0FDWixRQUFRLE9BQU8sVUFBVSxPQUFPLENBQUMsTUFBTSxLQUFNO0FBQUEsY0FDL0MsS0FBSyxNQUFNLGlCQUFpQixNQUFNLElBQUksU0FBUyxFQUFFO0FBQUEsY0FDakQ7QUFBQSxZQUNKO0FBQUEsWUFFQSxLQUFLLE1BQU0sMENBQTBDO0FBQUEsWUFDckQ7QUFBQTtBQUFBLFFBRVI7QUFBQSxRQUlBLElBQUksU0FBUztBQUFBLFVBRVQsS0FBSyxNQUFNO0FBQUEseUJBQTRCLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFBQSxVQUM1RCxJQUFJLE9BQU8sSUFBSTtBQUFBLFlBQ1gsT0FBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQUEsUUFFQSxPQUFPO0FBQUEsTUFDWDtBQUFBLE1BSUEsSUFBSTtBQUFBLE1BQ0osSUFBSSxPQUFPLE1BQU0sVUFBVTtBQUFBLFFBQ3ZCLE1BQU0sTUFBTTtBQUFBLFFBQ1osS0FBSyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsR0FBRztBQUFBLE1BQ3hDLEVBQ0s7QUFBQSxRQUNELE1BQU0sRUFBRSxLQUFLLENBQUM7QUFBQSxRQUNkLEtBQUssTUFBTSxpQkFBaUIsR0FBRyxHQUFHLEdBQUc7QUFBQTtBQUFBLE1BRXpDLEtBQUs7QUFBQSxRQUNELE9BQU87QUFBQSxJQUNmO0FBQUEsSUFZQSxJQUFJLE9BQU8sTUFBTSxPQUFPLElBQUk7QUFBQSxNQUd4QixPQUFPO0FBQUEsSUFDWCxFQUNLLFNBQUksT0FBTyxJQUFJO0FBQUEsTUFJaEIsT0FBTztBQUFBLElBQ1gsRUFDSyxTQUFJLE9BQU8sSUFBSTtBQUFBLE1BS2hCLE9BQU8sT0FBTyxLQUFLLEtBQUssS0FBSyxRQUFRO0FBQUEsSUFFekMsRUFDSztBQUFBLE1BRUQsTUFBTSxJQUFJLE1BQU0sTUFBTTtBQUFBO0FBQUE7QUFBQSxFQUk5QixXQUFXLEdBQUc7QUFBQSxJQUNWLE9BQU8sWUFBWSxLQUFLLFNBQVMsS0FBSyxPQUFPO0FBQUE7QUFBQSxFQUVqRCxLQUFLLENBQUMsU0FBUztBQUFBLElBQ1gsbUJBQW1CLE9BQU87QUFBQSxJQUMxQixNQUFNLFVBQVUsS0FBSztBQUFBLElBRXJCLElBQUksWUFBWTtBQUFBLE1BQ1osT0FBTztBQUFBLElBQ1gsSUFBSSxZQUFZO0FBQUEsTUFDWixPQUFPO0FBQUEsSUFHWCxJQUFJO0FBQUEsSUFDSixJQUFJLFdBQVc7QUFBQSxJQUNmLElBQUssSUFBSSxRQUFRLE1BQU0sTUFBTSxHQUFJO0FBQUEsTUFDN0IsV0FBVyxRQUFRLE1BQU0sY0FBYztBQUFBLElBQzNDLEVBQ0ssU0FBSyxJQUFJLFFBQVEsTUFBTSxZQUFZLEdBQUk7QUFBQSxNQUN4QyxZQUFZLFFBQVEsU0FDZCxRQUFRLE1BQ0osMEJBQ0EsdUJBQ0osUUFBUSxNQUNKLG9CQUNBLGdCQUFnQixFQUFFLEVBQUU7QUFBQSxJQUNsQyxFQUNLLFNBQUssSUFBSSxRQUFRLE1BQU0sUUFBUSxHQUFJO0FBQUEsTUFDcEMsWUFBWSxRQUFRLFNBQ2QsUUFBUSxNQUNKLHNCQUNBLG1CQUNKLFFBQVEsTUFDSixnQkFDQSxZQUFZLENBQUM7QUFBQSxJQUMzQixFQUNLLFNBQUssSUFBSSxRQUFRLE1BQU0sYUFBYSxHQUFJO0FBQUEsTUFDekMsV0FBVyxRQUFRLE1BQU0scUJBQXFCO0FBQUEsSUFDbEQsRUFDSyxTQUFLLElBQUksUUFBUSxNQUFNLFNBQVMsR0FBSTtBQUFBLE1BQ3JDLFdBQVc7QUFBQSxJQUNmO0FBQUEsSUFDQSxNQUFNLEtBQUssSUFBSSxTQUFTLFNBQVMsS0FBSyxPQUFPLEVBQUUsWUFBWTtBQUFBLElBQzNELElBQUksWUFBWSxPQUFPLE9BQU8sVUFBVTtBQUFBLE1BRXBDLFFBQVEsZUFBZSxJQUFJLFFBQVEsRUFBRSxPQUFPLFNBQVMsQ0FBQztBQUFBLElBQzFEO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUVYLE1BQU0sR0FBRztBQUFBLElBQ0wsSUFBSSxLQUFLLFVBQVUsS0FBSyxXQUFXO0FBQUEsTUFDL0IsT0FBTyxLQUFLO0FBQUEsSUFPaEIsTUFBTSxNQUFNLEtBQUs7QUFBQSxJQUNqQixLQUFLLElBQUksUUFBUTtBQUFBLE1BQ2IsS0FBSyxTQUFTO0FBQUEsTUFDZCxPQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUFBLElBQ0EsTUFBTSxVQUFVLEtBQUs7QUFBQSxJQUNyQixNQUFNLFVBQVUsUUFBUSxhQUNsQixRQUNBLFFBQVEsTUFDSixhQUNBO0FBQUEsSUFDVixNQUFNLFFBQVEsSUFBSSxJQUFJLFFBQVEsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFBQSxJQU9qRCxJQUFJLEtBQUssSUFDSixJQUFJLGFBQVc7QUFBQSxNQUNoQixNQUFNLEtBQUssUUFBUSxJQUFJLE9BQUs7QUFBQSxRQUN4QixJQUFJLGFBQWEsUUFBUTtBQUFBLFVBQ3JCLFdBQVcsS0FBSyxFQUFFLE1BQU0sTUFBTSxFQUFFO0FBQUEsWUFDNUIsTUFBTSxJQUFJLENBQUM7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsT0FBTyxPQUFPLE1BQU0sV0FDZCxjQUFhLENBQUMsSUFDZCxNQUFNLFdBQ0YsV0FDQSxFQUFFO0FBQUEsT0FDZjtBQUFBLE1BQ0QsR0FBRyxRQUFRLENBQUMsR0FBRyxNQUFNO0FBQUEsUUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSTtBQUFBLFFBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUk7QUFBQSxRQUNwQixJQUFJLE1BQU0sWUFBWSxTQUFTLFVBQVU7QUFBQSxVQUNyQztBQUFBLFFBQ0o7QUFBQSxRQUNBLElBQUksU0FBUyxXQUFXO0FBQUEsVUFDcEIsSUFBSSxTQUFTLGFBQWEsU0FBUyxVQUFVO0FBQUEsWUFDekMsR0FBRyxJQUFJLEtBQUssWUFBWSxVQUFVLFVBQVU7QUFBQSxVQUNoRCxFQUNLO0FBQUEsWUFDRCxHQUFHLEtBQUs7QUFBQTtBQUFBLFFBRWhCLEVBQ0ssU0FBSSxTQUFTLFdBQVc7QUFBQSxVQUN6QixHQUFHLElBQUksS0FBSyxPQUFPLFlBQVksVUFBVTtBQUFBLFFBQzdDLEVBQ0ssU0FBSSxTQUFTLFVBQVU7QUFBQSxVQUN4QixHQUFHLElBQUksS0FBSyxPQUFPLGVBQWUsVUFBVSxTQUFTO0FBQUEsVUFDckQsR0FBRyxJQUFJLEtBQUs7QUFBQSxRQUNoQjtBQUFBLE9BQ0g7QUFBQSxNQUNELE9BQU8sR0FBRyxPQUFPLE9BQUssTUFBTSxRQUFRLEVBQUUsS0FBSyxHQUFHO0FBQUEsS0FDakQsRUFDSSxLQUFLLEdBQUc7QUFBQSxJQUdiLE9BQU8sTUFBTSxTQUFTLElBQUksU0FBUyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFBQSxJQUc3RCxLQUFLLE1BQU0sT0FBTyxLQUFLLFFBQVE7QUFBQSxJQUUvQixJQUFJLEtBQUs7QUFBQSxNQUNMLEtBQUssU0FBUyxLQUFLO0FBQUEsSUFDdkIsSUFBSTtBQUFBLE1BQ0EsS0FBSyxTQUFTLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFBQSxNQUdwRCxPQUFPLElBQUk7QUFBQSxNQUVQLEtBQUssU0FBUztBQUFBO0FBQUEsSUFHbEIsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUVoQixVQUFVLENBQUMsR0FBRztBQUFBLElBS1YsSUFBSSxLQUFLLHlCQUF5QjtBQUFBLE1BQzlCLE9BQU8sRUFBRSxNQUFNLEdBQUc7QUFBQSxJQUN0QixFQUNLLFNBQUksS0FBSyxhQUFhLGNBQWMsS0FBSyxDQUFDLEdBQUc7QUFBQSxNQUU5QyxPQUFPLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFBQSxJQUNqQyxFQUNLO0FBQUEsTUFDRCxPQUFPLEVBQUUsTUFBTSxLQUFLO0FBQUE7QUFBQTtBQUFBLEVBRzVCLEtBQUssQ0FBQyxHQUFHLFVBQVUsS0FBSyxTQUFTO0FBQUEsSUFDN0IsS0FBSyxNQUFNLFNBQVMsR0FBRyxLQUFLLE9BQU87QUFBQSxJQUduQyxJQUFJLEtBQUssU0FBUztBQUFBLE1BQ2QsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLElBQUksS0FBSyxPQUFPO0FBQUEsTUFDWixPQUFPLE1BQU07QUFBQSxJQUNqQjtBQUFBLElBQ0EsSUFBSSxNQUFNLE9BQU8sU0FBUztBQUFBLE1BQ3RCLE9BQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxNQUFNLFVBQVUsS0FBSztBQUFBLElBRXJCLElBQUksS0FBSyxXQUFXO0FBQUEsTUFDaEIsSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFLEtBQUssR0FBRztBQUFBLElBQzlCO0FBQUEsSUFFQSxNQUFNLEtBQUssS0FBSyxXQUFXLENBQUM7QUFBQSxJQUM1QixLQUFLLE1BQU0sS0FBSyxTQUFTLFNBQVMsRUFBRTtBQUFBLElBS3BDLE1BQU0sTUFBTSxLQUFLO0FBQUEsSUFDakIsS0FBSyxNQUFNLEtBQUssU0FBUyxPQUFPLEdBQUc7QUFBQSxJQUVuQyxJQUFJLFdBQVcsR0FBRyxHQUFHLFNBQVM7QUFBQSxJQUM5QixLQUFLLFVBQVU7QUFBQSxNQUNYLFNBQVMsSUFBSSxHQUFHLFNBQVMsR0FBSSxZQUFZLEtBQUssR0FBRyxLQUFLO0FBQUEsUUFDbEQsV0FBVyxHQUFHO0FBQUEsTUFDbEI7QUFBQSxJQUNKO0FBQUEsSUFDQSxTQUFTLElBQUksRUFBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQUEsTUFDakMsTUFBTSxVQUFVLElBQUk7QUFBQSxNQUNwQixJQUFJLE9BQU87QUFBQSxNQUNYLElBQUksUUFBUSxhQUFhLFFBQVEsV0FBVyxHQUFHO0FBQUEsUUFDM0MsT0FBTyxDQUFDLFFBQVE7QUFBQSxNQUNwQjtBQUFBLE1BQ0EsTUFBTSxNQUFNLEtBQUssU0FBUyxNQUFNLFNBQVMsT0FBTztBQUFBLE1BQ2hELElBQUksS0FBSztBQUFBLFFBQ0wsSUFBSSxRQUFRLFlBQVk7QUFBQSxVQUNwQixPQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsUUFBUSxLQUFLO0FBQUEsTUFDakI7QUFBQSxJQUNKO0FBQUEsSUFHQSxJQUFJLFFBQVEsWUFBWTtBQUFBLE1BQ3BCLE9BQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxPQUFPLEtBQUs7QUFBQTtBQUFBLFNBRVQsUUFBUSxDQUFDLEtBQUs7QUFBQSxJQUNqQixPQUFPLFVBQVUsU0FBUyxHQUFHLEVBQUU7QUFBQTtBQUV2QztBQU1BLFVBQVUsTUFBTTtBQUNoQixVQUFVLFlBQVk7QUFDdEIsVUFBVSxTQUFTO0FBQ25CLFVBQVUsV0FBVzs7O0FNdCtCckIsMEJBQVM7OztBQ0VULElBQU0sT0FBTyxPQUFPLGdCQUFnQixZQUNoQyxlQUNBLE9BQU8sWUFBWSxRQUFRLGFBQ3pCLGNBQ0E7QUFDTixJQUFNLFNBQVMsSUFBSTtBQUVuQixJQUFNLFVBQVcsT0FBTyxZQUFZLGNBQWMsVUFBVSxVQUFVLENBQUM7QUFFdkUsSUFBTSxjQUFjLENBQUMsS0FBSyxNQUFNLE1BQU0sT0FBTztBQUFBLEVBQ3pDLE9BQU8sUUFBUSxnQkFBZ0IsYUFDekIsUUFBUSxZQUFZLEtBQUssTUFBTSxNQUFNLEVBQUUsSUFDdkMsUUFBUSxNQUFNLElBQUksU0FBUyxTQUFTLEtBQUs7QUFBQTtBQUVuRCxJQUFJLEtBQUssV0FBVztBQUNwQixJQUFJLEtBQUssV0FBVztBQUVwQixJQUFJLE9BQU8sT0FBTyxhQUFhO0FBQUEsRUFFM0IsS0FBSyxNQUFNLFlBQVk7QUFBQSxJQUNuQjtBQUFBLElBQ0EsV0FBVyxDQUFDO0FBQUEsSUFDWjtBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1YsZ0JBQWdCLENBQUMsR0FBRyxJQUFJO0FBQUEsTUFDcEIsS0FBSyxTQUFTLEtBQUssRUFBRTtBQUFBO0FBQUEsRUFFN0I7QUFBQSxFQUVBLEtBQUssTUFBTSxnQkFBZ0I7QUFBQSxJQUN2QixXQUFXLEdBQUc7QUFBQSxNQUNWLGVBQWU7QUFBQTtBQUFBLElBRW5CLFNBQVMsSUFBSTtBQUFBLElBQ2IsS0FBSyxDQUFDLFFBQVE7QUFBQSxNQUNWLElBQUksS0FBSyxPQUFPO0FBQUEsUUFDWjtBQUFBLE1BRUosS0FBSyxPQUFPLFNBQVM7QUFBQSxNQUVyQixLQUFLLE9BQU8sVUFBVTtBQUFBLE1BRXRCLFdBQVcsTUFBTSxLQUFLLE9BQU8sVUFBVTtBQUFBLFFBQ25DLEdBQUcsTUFBTTtBQUFBLE1BQ2I7QUFBQSxNQUNBLEtBQUssT0FBTyxVQUFVLE1BQU07QUFBQTtBQUFBLEVBRXBDO0FBQUEsRUFDQSxJQUFJLHlCQUF5QixRQUFRLEtBQUssZ0NBQWdDO0FBQUEsRUFDMUUsTUFBTSxpQkFBaUIsTUFBTTtBQUFBLElBQ3pCLEtBQUs7QUFBQSxNQUNEO0FBQUEsSUFDSix5QkFBeUI7QUFBQSxJQUN6QixZQUFZLDJEQUNSLHdEQUNBLDREQUNBLGdFQUNBLHNFQUNBLHNFQUNBLHVFQUF1RSx1QkFBdUIsV0FBVyxjQUFjO0FBQUE7QUFFbkk7QUFFQSxJQUFNLGFBQWEsQ0FBQyxVQUFVLE9BQU8sSUFBSSxJQUFJO0FBQzdDLElBQU0sT0FBTyxPQUFPLE1BQU07QUFDMUIsSUFBTSxXQUFXLENBQUMsTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssU0FBUyxDQUFDO0FBVXZFLElBQU0sZUFBZSxDQUFDLFNBQVMsU0FBUyxHQUFHLElBQ3JDLE9BQ0EsT0FBTyxLQUFLLElBQUksR0FBRyxDQUFDLElBQ2hCLGFBQ0EsT0FBTyxLQUFLLElBQUksR0FBRyxFQUFFLElBQ2pCLGNBQ0EsT0FBTyxLQUFLLElBQUksR0FBRyxFQUFFLElBQ2pCLGNBQ0EsT0FBTyxPQUFPLG1CQUNWLFlBQ0E7QUFBQTtBQUV0QixNQUFNLGtCQUFrQixNQUFNO0FBQUEsRUFDMUIsV0FBVyxDQUFDLE1BQU07QUFBQSxJQUNkLE1BQU0sSUFBSTtBQUFBLElBQ1YsS0FBSyxLQUFLLENBQUM7QUFBQTtBQUVuQjtBQUFBO0FBQ0EsTUFBTSxNQUFNO0FBQUEsRUFDUjtBQUFBLEVBQ0E7QUFBQSxTQUVPLGdCQUFnQjtBQUFBLFNBQ2hCLE1BQU0sQ0FBQyxLQUFLO0FBQUEsSUFDZixNQUFNLFVBQVUsYUFBYSxHQUFHO0FBQUEsSUFDaEMsS0FBSztBQUFBLE1BQ0QsT0FBTyxDQUFDO0FBQUEsSUFDWixNQUFNLGdCQUFnQjtBQUFBLElBQ3RCLE1BQU0sSUFBSSxJQUFJLE1BQU0sS0FBSyxPQUFPO0FBQUEsSUFDaEMsTUFBTSxnQkFBZ0I7QUFBQSxJQUN0QixPQUFPO0FBQUE7QUFBQSxFQUVYLFdBQVcsQ0FBQyxLQUFLLFNBQVM7QUFBQSxJQUV0QixLQUFLLE1BQU0sZUFBZTtBQUFBLE1BQ3RCLE1BQU0sSUFBSSxVQUFVLHlDQUF5QztBQUFBLElBQ2pFO0FBQUEsSUFFQSxLQUFLLE9BQU8sSUFBSSxRQUFRLEdBQUc7QUFBQSxJQUMzQixLQUFLLFNBQVM7QUFBQTtBQUFBLEVBRWxCLElBQUksQ0FBQyxHQUFHO0FBQUEsSUFDSixLQUFLLEtBQUssS0FBSyxZQUFZO0FBQUE7QUFBQSxFQUUvQixHQUFHLEdBQUc7QUFBQSxJQUNGLE9BQU8sS0FBSyxLQUFLLEVBQUUsS0FBSztBQUFBO0FBRWhDO0FBQUE7QUFnQk8sTUFBTSxTQUFTO0FBQUEsRUFFbEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUlBO0FBQUEsRUFJQTtBQUFBLEVBSUE7QUFBQSxFQUlBO0FBQUEsRUFJQTtBQUFBLEVBSUE7QUFBQSxFQUlBO0FBQUEsRUFJQTtBQUFBLEVBSUE7QUFBQSxFQUlBO0FBQUEsRUFJQTtBQUFBLEVBSUE7QUFBQSxFQUlBO0FBQUEsRUFJQTtBQUFBLEVBSUE7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxTQVVPLHFCQUFxQixDQUFDLEdBQUc7QUFBQSxJQUM1QixPQUFPO0FBQUEsTUFFSCxRQUFRLEVBQUU7QUFBQSxNQUNWLE1BQU0sRUFBRTtBQUFBLE1BQ1IsT0FBTyxFQUFFO0FBQUEsTUFDVCxRQUFRLEVBQUU7QUFBQSxNQUNWLFNBQVMsRUFBRTtBQUFBLE1BQ1gsU0FBUyxFQUFFO0FBQUEsTUFDWCxNQUFNLEVBQUU7QUFBQSxNQUNSLE1BQU0sRUFBRTtBQUFBLFVBQ0osSUFBSSxHQUFHO0FBQUEsUUFDUCxPQUFPLEVBQUU7QUFBQTtBQUFBLFVBRVQsSUFBSSxHQUFHO0FBQUEsUUFDUCxPQUFPLEVBQUU7QUFBQTtBQUFBLE1BRWIsTUFBTSxFQUFFO0FBQUEsTUFFUixtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUM7QUFBQSxNQUNoRCxpQkFBaUIsQ0FBQyxHQUFHLE9BQU8sU0FBUyxZQUFZLEVBQUUsaUJBQWlCLEdBQUcsT0FBTyxTQUFTLE9BQU87QUFBQSxNQUM5RixZQUFZLENBQUMsVUFBVSxFQUFFLFlBQVksS0FBSztBQUFBLE1BQzFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxPQUFPO0FBQUEsTUFDeEMsVUFBVSxDQUFDLFlBQVksRUFBRSxVQUFVLE9BQU87QUFBQSxNQUMxQyxTQUFTLENBQUMsVUFBVSxFQUFFLFNBQVMsS0FBSztBQUFBLElBQ3hDO0FBQUE7QUFBQSxNQU1BLEdBQUcsR0FBRztBQUFBLElBQ04sT0FBTyxLQUFLO0FBQUE7QUFBQSxNQUtaLE9BQU8sR0FBRztBQUFBLElBQ1YsT0FBTyxLQUFLO0FBQUE7QUFBQSxNQUtaLGNBQWMsR0FBRztBQUFBLElBQ2pCLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFLWixJQUFJLEdBQUc7QUFBQSxJQUNQLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFLWixXQUFXLEdBQUc7QUFBQSxJQUNkLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFFWixVQUFVLEdBQUc7QUFBQSxJQUNiLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFLWixPQUFPLEdBQUc7QUFBQSxJQUNWLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFLWixRQUFRLEdBQUc7QUFBQSxJQUNYLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFLWixZQUFZLEdBQUc7QUFBQSxJQUNmLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFaEIsV0FBVyxDQUFDLFNBQVM7QUFBQSxJQUNqQixRQUFRLE1BQU0sR0FBRyxLQUFLLGdCQUFnQixHQUFHLGNBQWMsZ0JBQWdCLGdCQUFnQixZQUFZLFNBQVMsVUFBVSxjQUFjLGdCQUFnQixhQUFhLFVBQVUsR0FBRyxlQUFlLEdBQUcsaUJBQWlCLGFBQWEsWUFBWSwwQkFBMEIsb0JBQW9CLDRCQUE0Qix3QkFBd0IscUJBQXNCO0FBQUEsSUFDbFcsSUFBSSxRQUFRLE1BQU0sU0FBUyxHQUFHLEdBQUc7QUFBQSxNQUM3QixNQUFNLElBQUksVUFBVSwwQ0FBMEM7QUFBQSxJQUNsRTtBQUFBLElBQ0EsTUFBTSxZQUFZLE1BQU0sYUFBYSxHQUFHLElBQUk7QUFBQSxJQUM1QyxLQUFLLFdBQVc7QUFBQSxNQUNaLE1BQU0sSUFBSSxNQUFNLHdCQUF3QixHQUFHO0FBQUEsSUFDL0M7QUFBQSxJQUNBLEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxXQUFXO0FBQUEsSUFDaEIsS0FBSyxlQUFlLGdCQUFnQixLQUFLO0FBQUEsSUFDekMsS0FBSyxrQkFBa0I7QUFBQSxJQUN2QixJQUFJLEtBQUssaUJBQWlCO0FBQUEsTUFDdEIsS0FBSyxLQUFLLGFBQWEsS0FBSyxjQUFjO0FBQUEsUUFDdEMsTUFBTSxJQUFJLFVBQVUsb0VBQW9FO0FBQUEsTUFDNUY7QUFBQSxNQUNBLElBQUksT0FBTyxLQUFLLG9CQUFvQixZQUFZO0FBQUEsUUFDNUMsTUFBTSxJQUFJLFVBQVUscUNBQXFDO0FBQUEsTUFDN0Q7QUFBQSxJQUNKO0FBQUEsSUFDQSxJQUFJLGVBQWUsYUFDZixPQUFPLGVBQWUsWUFBWTtBQUFBLE1BQ2xDLE1BQU0sSUFBSSxVQUFVLDBDQUEwQztBQUFBLElBQ2xFO0FBQUEsSUFDQSxLQUFLLGNBQWM7QUFBQSxJQUNuQixJQUFJLGdCQUFnQixhQUNoQixPQUFPLGdCQUFnQixZQUFZO0FBQUEsTUFDbkMsTUFBTSxJQUFJLFVBQVUsNkNBQTZDO0FBQUEsSUFDckU7QUFBQSxJQUNBLEtBQUssZUFBZTtBQUFBLElBQ3BCLEtBQUssb0JBQW9CO0FBQUEsSUFDekIsS0FBSyxVQUFVLElBQUk7QUFBQSxJQUNuQixLQUFLLFdBQVcsSUFBSSxNQUFNLEdBQUcsRUFBRSxLQUFLLFNBQVM7QUFBQSxJQUM3QyxLQUFLLFdBQVcsSUFBSSxNQUFNLEdBQUcsRUFBRSxLQUFLLFNBQVM7QUFBQSxJQUM3QyxLQUFLLFFBQVEsSUFBSSxVQUFVLEdBQUc7QUFBQSxJQUM5QixLQUFLLFFBQVEsSUFBSSxVQUFVLEdBQUc7QUFBQSxJQUM5QixLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxRQUFRLE1BQU0sT0FBTyxHQUFHO0FBQUEsSUFDN0IsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLGtCQUFrQjtBQUFBLElBQ3ZCLElBQUksT0FBTyxZQUFZLFlBQVk7QUFBQSxNQUMvQixLQUFLLFdBQVc7QUFBQSxJQUNwQjtBQUFBLElBQ0EsSUFBSSxPQUFPLGFBQWEsWUFBWTtBQUFBLE1BQ2hDLEtBQUssWUFBWTtBQUFBLElBQ3JCO0FBQUEsSUFDQSxJQUFJLE9BQU8saUJBQWlCLFlBQVk7QUFBQSxNQUNwQyxLQUFLLGdCQUFnQjtBQUFBLE1BQ3JCLEtBQUssWUFBWSxDQUFDO0FBQUEsSUFDdEIsRUFDSztBQUFBLE1BQ0QsS0FBSyxnQkFBZ0I7QUFBQSxNQUNyQixLQUFLLFlBQVk7QUFBQTtBQUFBLElBRXJCLEtBQUssZ0JBQWdCLEtBQUs7QUFBQSxJQUMxQixLQUFLLGlCQUFpQixLQUFLO0FBQUEsSUFDM0IsS0FBSyxxQkFBcUIsS0FBSztBQUFBLElBQy9CLEtBQUssbUJBQW1CO0FBQUEsSUFDeEIsS0FBSyxnQkFBZ0I7QUFBQSxJQUNyQixLQUFLLDZCQUE2QjtBQUFBLElBQ2xDLEtBQUssK0JBQStCO0FBQUEsSUFDcEMsS0FBSywyQkFBMkI7QUFBQSxJQUNoQyxLQUFLLHFCQUFxQjtBQUFBLElBRTFCLElBQUksS0FBSyxpQkFBaUIsR0FBRztBQUFBLE1BQ3pCLElBQUksS0FBSyxhQUFhLEdBQUc7QUFBQSxRQUNyQixLQUFLLFNBQVMsS0FBSyxRQUFRLEdBQUc7QUFBQSxVQUMxQixNQUFNLElBQUksVUFBVSxpREFBaUQ7QUFBQSxRQUN6RTtBQUFBLE1BQ0o7QUFBQSxNQUNBLEtBQUssU0FBUyxLQUFLLFlBQVksR0FBRztBQUFBLFFBQzlCLE1BQU0sSUFBSSxVQUFVLHNEQUFzRDtBQUFBLE1BQzlFO0FBQUEsTUFDQSxLQUFLLHdCQUF3QjtBQUFBLElBQ2pDO0FBQUEsSUFDQSxLQUFLLGVBQWU7QUFBQSxJQUNwQixLQUFLLHVCQUF1QjtBQUFBLElBQzVCLEtBQUssbUJBQW1CO0FBQUEsSUFDeEIsS0FBSyxtQkFBbUI7QUFBQSxJQUN4QixLQUFLLGdCQUNELFNBQVMsYUFBYSxLQUFLLGtCQUFrQixJQUN2QyxnQkFDQTtBQUFBLElBQ1YsS0FBSyxpQkFBaUI7QUFBQSxJQUN0QixLQUFLLE1BQU0sT0FBTztBQUFBLElBQ2xCLElBQUksS0FBSyxLQUFLO0FBQUEsTUFDVixLQUFLLFNBQVMsS0FBSyxHQUFHLEdBQUc7QUFBQSxRQUNyQixNQUFNLElBQUksVUFBVSw2Q0FBNkM7QUFBQSxNQUNyRTtBQUFBLE1BQ0EsS0FBSyx1QkFBdUI7QUFBQSxJQUNoQztBQUFBLElBRUEsSUFBSSxLQUFLLFNBQVMsS0FBSyxLQUFLLFFBQVEsS0FBSyxLQUFLLGFBQWEsR0FBRztBQUFBLE1BQzFELE1BQU0sSUFBSSxVQUFVLGtEQUFrRDtBQUFBLElBQzFFO0FBQUEsSUFDQSxLQUFLLEtBQUssaUJBQWlCLEtBQUssU0FBUyxLQUFLLFVBQVU7QUFBQSxNQUNwRCxNQUFNLE9BQU87QUFBQSxNQUNiLElBQUksV0FBVyxJQUFJLEdBQUc7QUFBQSxRQUNsQixPQUFPLElBQUksSUFBSTtBQUFBLFFBQ2YsTUFBTSxNQUFNLDJEQUNSO0FBQUEsUUFDSixZQUFZLEtBQUsseUJBQXlCLE1BQU0sUUFBUTtBQUFBLE1BQzVEO0FBQUEsSUFDSjtBQUFBO0FBQUEsRUFNSixlQUFlLENBQUMsS0FBSztBQUFBLElBQ2pCLE9BQU8sS0FBSyxRQUFRLElBQUksR0FBRyxJQUFJLFdBQVc7QUFBQTtBQUFBLEVBRTlDLHNCQUFzQixHQUFHO0FBQUEsSUFDckIsTUFBTSxPQUFPLElBQUksVUFBVSxLQUFLLElBQUk7QUFBQSxJQUNwQyxNQUFNLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBSTtBQUFBLElBQ3RDLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLGNBQWMsQ0FBQyxPQUFPLEtBQUssUUFBUSxLQUFLLElBQUksTUFBTTtBQUFBLE1BQ25ELE9BQU8sU0FBUyxRQUFRLElBQUksUUFBUTtBQUFBLE1BQ3BDLEtBQUssU0FBUztBQUFBLE1BQ2QsSUFBSSxRQUFRLEtBQUssS0FBSyxjQUFjO0FBQUEsUUFDaEMsTUFBTSxJQUFJLFdBQVcsTUFBTTtBQUFBLFVBQ3ZCLElBQUksS0FBSyxTQUFTLEtBQUssR0FBRztBQUFBLFlBQ3RCLEtBQUssUUFBUSxLQUFLLFNBQVMsUUFBUSxRQUFRO0FBQUEsVUFDL0M7QUFBQSxXQUNELE1BQU0sQ0FBQztBQUFBLFFBR1YsSUFBSSxFQUFFLE9BQU87QUFBQSxVQUNULEVBQUUsTUFBTTtBQUFBLFFBQ1o7QUFBQSxNQUVKO0FBQUE7QUFBQSxJQUVKLEtBQUssaUJBQWlCLFdBQVM7QUFBQSxNQUMzQixPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksS0FBSyxJQUFJLElBQUk7QUFBQTtBQUFBLElBRXJELEtBQUssYUFBYSxDQUFDLFFBQVEsVUFBVTtBQUFBLE1BQ2pDLElBQUksS0FBSyxRQUFRO0FBQUEsUUFDYixNQUFNLE1BQU0sS0FBSztBQUFBLFFBQ2pCLE1BQU0sUUFBUSxPQUFPO0FBQUEsUUFFckIsS0FBSyxRQUFRO0FBQUEsVUFDVDtBQUFBLFFBQ0osT0FBTyxNQUFNO0FBQUEsUUFDYixPQUFPLFFBQVE7QUFBQSxRQUNmLE9BQU8sTUFBTSxhQUFhLE9BQU87QUFBQSxRQUNqQyxNQUFNLE1BQU0sT0FBTyxNQUFNO0FBQUEsUUFDekIsT0FBTyxlQUFlLE1BQU07QUFBQSxNQUNoQztBQUFBO0FBQUEsSUFJSixJQUFJLFlBQVk7QUFBQSxJQUNoQixNQUFNLFNBQVMsTUFBTTtBQUFBLE1BQ2pCLE1BQU0sSUFBSSxLQUFLLElBQUk7QUFBQSxNQUNuQixJQUFJLEtBQUssZ0JBQWdCLEdBQUc7QUFBQSxRQUN4QixZQUFZO0FBQUEsUUFDWixNQUFNLElBQUksV0FBVyxNQUFPLFlBQVksR0FBSSxLQUFLLGFBQWE7QUFBQSxRQUc5RCxJQUFJLEVBQUUsT0FBTztBQUFBLFVBQ1QsRUFBRSxNQUFNO0FBQUEsUUFDWjtBQUFBLE1BRUo7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBRVgsS0FBSyxrQkFBa0IsU0FBTztBQUFBLE1BQzFCLE1BQU0sUUFBUSxLQUFLLFFBQVEsSUFBSSxHQUFHO0FBQUEsTUFDbEMsSUFBSSxVQUFVLFdBQVc7QUFBQSxRQUNyQixPQUFPO0FBQUEsTUFDWDtBQUFBLE1BQ0EsTUFBTSxNQUFNLEtBQUs7QUFBQSxNQUNqQixNQUFNLFFBQVEsT0FBTztBQUFBLE1BQ3JCLEtBQUssUUFBUSxPQUFPO0FBQUEsUUFDaEIsT0FBTztBQUFBLE1BQ1g7QUFBQSxNQUNBLE1BQU0sT0FBTyxhQUFhLE9BQU8sS0FBSztBQUFBLE1BQ3RDLE9BQU8sTUFBTTtBQUFBO0FBQUEsSUFFakIsS0FBSyxXQUFXLFdBQVM7QUFBQSxNQUNyQixNQUFNLElBQUksT0FBTztBQUFBLE1BQ2pCLE1BQU0sSUFBSSxLQUFLO0FBQUEsTUFDZixTQUFTLE9BQU8sTUFBTSxhQUFhLE9BQU8sS0FBSyxJQUFJO0FBQUE7QUFBQTtBQUFBLEVBSTNELGlCQUFpQixNQUFNO0FBQUEsRUFDdkIsYUFBYSxNQUFNO0FBQUEsRUFDbkIsY0FBYyxNQUFNO0FBQUEsRUFFcEIsV0FBVyxNQUFNO0FBQUEsRUFDakIsdUJBQXVCLEdBQUc7QUFBQSxJQUN0QixNQUFNLFFBQVEsSUFBSSxVQUFVLEtBQUssSUFBSTtBQUFBLElBQ3JDLEtBQUssa0JBQWtCO0FBQUEsSUFDdkIsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLGtCQUFrQixXQUFTO0FBQUEsTUFDNUIsS0FBSyxtQkFBbUIsTUFBTTtBQUFBLE1BQzlCLE1BQU0sU0FBUztBQUFBO0FBQUEsSUFFbkIsS0FBSyxlQUFlLENBQUMsR0FBRyxHQUFHLE1BQU0sb0JBQW9CO0FBQUEsTUFHakQsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEdBQUc7QUFBQSxRQUM1QixPQUFPO0FBQUEsTUFDWDtBQUFBLE1BQ0EsS0FBSyxTQUFTLElBQUksR0FBRztBQUFBLFFBQ2pCLElBQUksaUJBQWlCO0FBQUEsVUFDakIsSUFBSSxPQUFPLG9CQUFvQixZQUFZO0FBQUEsWUFDdkMsTUFBTSxJQUFJLFVBQVUsb0NBQW9DO0FBQUEsVUFDNUQ7QUFBQSxVQUNBLE9BQU8sZ0JBQWdCLEdBQUcsQ0FBQztBQUFBLFVBQzNCLEtBQUssU0FBUyxJQUFJLEdBQUc7QUFBQSxZQUNqQixNQUFNLElBQUksVUFBVSwwREFBMEQ7QUFBQSxVQUNsRjtBQUFBLFFBQ0osRUFDSztBQUFBLFVBQ0QsTUFBTSxJQUFJLFVBQVUsb0RBQ2hCLDJEQUNBLHNCQUFzQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBRVgsS0FBSyxlQUFlLENBQUMsT0FBTyxNQUFNLFdBQVc7QUFBQSxNQUN6QyxNQUFNLFNBQVM7QUFBQSxNQUNmLElBQUksS0FBSyxVQUFVO0FBQUEsUUFDZixNQUFNLFVBQVUsS0FBSyxXQUFXLE1BQU07QUFBQSxRQUN0QyxPQUFPLEtBQUssa0JBQWtCLFNBQVM7QUFBQSxVQUNuQyxLQUFLLE9BQU8sSUFBSTtBQUFBLFFBQ3BCO0FBQUEsTUFDSjtBQUFBLE1BQ0EsS0FBSyxtQkFBbUIsTUFBTTtBQUFBLE1BQzlCLElBQUksUUFBUTtBQUFBLFFBQ1IsT0FBTyxZQUFZO0FBQUEsUUFDbkIsT0FBTyxzQkFBc0IsS0FBSztBQUFBLE1BQ3RDO0FBQUE7QUFBQTtBQUFBLEVBR1Isa0JBQWtCLFFBQU07QUFBQSxFQUN4QixlQUFlLENBQUMsSUFBSSxJQUFJLFFBQVE7QUFBQSxFQUNoQyxlQUFlLENBQUMsSUFBSSxJQUFJLE1BQU0sb0JBQW9CO0FBQUEsSUFDOUMsSUFBSSxRQUFRLGlCQUFpQjtBQUFBLE1BQ3pCLE1BQU0sSUFBSSxVQUFVLGtFQUFrRTtBQUFBLElBQzFGO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxHQUVWLFFBQVEsR0FBRyxhQUFhLEtBQUssZUFBZSxDQUFDLEdBQUc7QUFBQSxJQUM3QyxJQUFJLEtBQUssT0FBTztBQUFBLE1BQ1osU0FBUyxJQUFJLEtBQUssVUFBYztBQUFBLFFBQzVCLEtBQUssS0FBSyxjQUFjLENBQUMsR0FBRztBQUFBLFVBQ3hCO0FBQUEsUUFDSjtBQUFBLFFBQ0EsSUFBSSxlQUFlLEtBQUssU0FBUyxDQUFDLEdBQUc7QUFBQSxVQUNqQyxNQUFNO0FBQUEsUUFDVjtBQUFBLFFBQ0EsSUFBSSxNQUFNLEtBQUssT0FBTztBQUFBLFVBQ2xCO0FBQUEsUUFDSixFQUNLO0FBQUEsVUFDRCxJQUFJLEtBQUssTUFBTTtBQUFBO0FBQUEsTUFFdkI7QUFBQSxJQUNKO0FBQUE7QUFBQSxHQUVILFNBQVMsR0FBRyxhQUFhLEtBQUssZUFBZSxDQUFDLEdBQUc7QUFBQSxJQUM5QyxJQUFJLEtBQUssT0FBTztBQUFBLE1BQ1osU0FBUyxJQUFJLEtBQUssVUFBYztBQUFBLFFBQzVCLEtBQUssS0FBSyxjQUFjLENBQUMsR0FBRztBQUFBLFVBQ3hCO0FBQUEsUUFDSjtBQUFBLFFBQ0EsSUFBSSxlQUFlLEtBQUssU0FBUyxDQUFDLEdBQUc7QUFBQSxVQUNqQyxNQUFNO0FBQUEsUUFDVjtBQUFBLFFBQ0EsSUFBSSxNQUFNLEtBQUssT0FBTztBQUFBLFVBQ2xCO0FBQUEsUUFDSixFQUNLO0FBQUEsVUFDRCxJQUFJLEtBQUssTUFBTTtBQUFBO0FBQUEsTUFFdkI7QUFBQSxJQUNKO0FBQUE7QUFBQSxFQUVKLGFBQWEsQ0FBQyxPQUFPO0FBQUEsSUFDakIsT0FBUSxVQUFVLGFBQ2QsS0FBSyxRQUFRLElBQUksS0FBSyxTQUFTLE1BQU0sTUFBTTtBQUFBO0FBQUEsR0FNbEQsT0FBTyxHQUFHO0FBQUEsSUFDUCxXQUFXLEtBQUssS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUM3QixJQUFJLEtBQUssU0FBUyxPQUFPLGFBQ3JCLEtBQUssU0FBUyxPQUFPLGNBQ3BCLEtBQUssbUJBQW1CLEtBQUssU0FBUyxFQUFFLEdBQUc7QUFBQSxRQUM1QyxNQUFNLENBQUMsS0FBSyxTQUFTLElBQUksS0FBSyxTQUFTLEVBQUU7QUFBQSxNQUM3QztBQUFBLElBQ0o7QUFBQTtBQUFBLEdBUUgsUUFBUSxHQUFHO0FBQUEsSUFDUixXQUFXLEtBQUssS0FBSyxVQUFVLEdBQUc7QUFBQSxNQUM5QixJQUFJLEtBQUssU0FBUyxPQUFPLGFBQ3JCLEtBQUssU0FBUyxPQUFPLGNBQ3BCLEtBQUssbUJBQW1CLEtBQUssU0FBUyxFQUFFLEdBQUc7QUFBQSxRQUM1QyxNQUFNLENBQUMsS0FBSyxTQUFTLElBQUksS0FBSyxTQUFTLEVBQUU7QUFBQSxNQUM3QztBQUFBLElBQ0o7QUFBQTtBQUFBLEdBTUgsSUFBSSxHQUFHO0FBQUEsSUFDSixXQUFXLEtBQUssS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUM3QixNQUFNLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDeEIsSUFBSSxNQUFNLGNBQ0wsS0FBSyxtQkFBbUIsS0FBSyxTQUFTLEVBQUUsR0FBRztBQUFBLFFBQzVDLE1BQU07QUFBQSxNQUNWO0FBQUEsSUFDSjtBQUFBO0FBQUEsR0FRSCxLQUFLLEdBQUc7QUFBQSxJQUNMLFdBQVcsS0FBSyxLQUFLLFVBQVUsR0FBRztBQUFBLE1BQzlCLE1BQU0sSUFBSSxLQUFLLFNBQVM7QUFBQSxNQUN4QixJQUFJLE1BQU0sY0FDTCxLQUFLLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxHQUFHO0FBQUEsUUFDNUMsTUFBTTtBQUFBLE1BQ1Y7QUFBQSxJQUNKO0FBQUE7QUFBQSxHQU1ILE1BQU0sR0FBRztBQUFBLElBQ04sV0FBVyxLQUFLLEtBQUssU0FBUyxHQUFHO0FBQUEsTUFDN0IsTUFBTSxJQUFJLEtBQUssU0FBUztBQUFBLE1BQ3hCLElBQUksTUFBTSxjQUNMLEtBQUssbUJBQW1CLEtBQUssU0FBUyxFQUFFLEdBQUc7QUFBQSxRQUM1QyxNQUFNLEtBQUssU0FBUztBQUFBLE1BQ3hCO0FBQUEsSUFDSjtBQUFBO0FBQUEsR0FRSCxPQUFPLEdBQUc7QUFBQSxJQUNQLFdBQVcsS0FBSyxLQUFLLFVBQVUsR0FBRztBQUFBLE1BQzlCLE1BQU0sSUFBSSxLQUFLLFNBQVM7QUFBQSxNQUN4QixJQUFJLE1BQU0sY0FDTCxLQUFLLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxHQUFHO0FBQUEsUUFDNUMsTUFBTSxLQUFLLFNBQVM7QUFBQSxNQUN4QjtBQUFBLElBQ0o7QUFBQTtBQUFBLEdBTUgsT0FBTyxTQUFTLEdBQUc7QUFBQSxJQUNoQixPQUFPLEtBQUssUUFBUTtBQUFBO0FBQUEsR0FPdkIsT0FBTyxlQUFlO0FBQUEsRUFLdkIsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLEdBQUc7QUFBQSxJQUN0QixXQUFXLEtBQUssS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUM3QixNQUFNLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDeEIsTUFBTSxRQUFRLEtBQUssbUJBQW1CLENBQUMsSUFDakMsRUFBRSx1QkFDRjtBQUFBLE1BQ04sSUFBSSxVQUFVO0FBQUEsUUFDVjtBQUFBLE1BQ0osSUFBSSxHQUFHLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxHQUFHO0FBQUEsUUFDbkMsT0FBTyxLQUFLLElBQUksS0FBSyxTQUFTLElBQUksVUFBVTtBQUFBLE1BQ2hEO0FBQUEsSUFDSjtBQUFBO0FBQUEsRUFhSixPQUFPLENBQUMsSUFBSSxRQUFRLE1BQU07QUFBQSxJQUN0QixXQUFXLEtBQUssS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUM3QixNQUFNLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDeEIsTUFBTSxRQUFRLEtBQUssbUJBQW1CLENBQUMsSUFDakMsRUFBRSx1QkFDRjtBQUFBLE1BQ04sSUFBSSxVQUFVO0FBQUEsUUFDVjtBQUFBLE1BQ0osR0FBRyxLQUFLLE9BQU8sT0FBTyxLQUFLLFNBQVMsSUFBSSxJQUFJO0FBQUEsSUFDaEQ7QUFBQTtBQUFBLEVBTUosUUFBUSxDQUFDLElBQUksUUFBUSxNQUFNO0FBQUEsSUFDdkIsV0FBVyxLQUFLLEtBQUssVUFBVSxHQUFHO0FBQUEsTUFDOUIsTUFBTSxJQUFJLEtBQUssU0FBUztBQUFBLE1BQ3hCLE1BQU0sUUFBUSxLQUFLLG1CQUFtQixDQUFDLElBQ2pDLEVBQUUsdUJBQ0Y7QUFBQSxNQUNOLElBQUksVUFBVTtBQUFBLFFBQ1Y7QUFBQSxNQUNKLEdBQUcsS0FBSyxPQUFPLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSTtBQUFBLElBQ2hEO0FBQUE7QUFBQSxFQU1KLFVBQVUsR0FBRztBQUFBLElBQ1QsSUFBSSxVQUFVO0FBQUEsSUFDZCxXQUFXLEtBQUssS0FBSyxVQUFVLEVBQUUsWUFBWSxLQUFLLENBQUMsR0FBRztBQUFBLE1BQ2xELElBQUksS0FBSyxTQUFTLENBQUMsR0FBRztBQUFBLFFBQ2xCLEtBQUssUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRO0FBQUEsUUFDdkMsVUFBVTtBQUFBLE1BQ2Q7QUFBQSxJQUNKO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQWNYLElBQUksQ0FBQyxLQUFLO0FBQUEsSUFDTixNQUFNLElBQUksS0FBSyxRQUFRLElBQUksR0FBRztBQUFBLElBQzlCLElBQUksTUFBTTtBQUFBLE1BQ047QUFBQSxJQUNKLE1BQU0sSUFBSSxLQUFLLFNBQVM7QUFBQSxJQUN4QixNQUFNLFFBQVEsS0FBSyxtQkFBbUIsQ0FBQyxJQUNqQyxFQUFFLHVCQUNGO0FBQUEsSUFDTixJQUFJLFVBQVU7QUFBQSxNQUNWO0FBQUEsSUFDSixNQUFNLFFBQVEsRUFBRSxNQUFNO0FBQUEsSUFDdEIsSUFBSSxLQUFLLFNBQVMsS0FBSyxTQUFTO0FBQUEsTUFDNUIsTUFBTSxNQUFNLEtBQUssTUFBTTtBQUFBLE1BQ3ZCLE1BQU0sUUFBUSxLQUFLLFFBQVE7QUFBQSxNQUMzQixJQUFJLE9BQU8sT0FBTztBQUFBLFFBQ2QsTUFBTSxTQUFTLE9BQU8sS0FBSyxJQUFJLElBQUk7QUFBQSxRQUNuQyxNQUFNLE1BQU07QUFBQSxRQUNaLE1BQU0sUUFBUSxLQUFLLElBQUk7QUFBQSxNQUMzQjtBQUFBLElBQ0o7QUFBQSxJQUNBLElBQUksS0FBSyxRQUFRO0FBQUEsTUFDYixNQUFNLE9BQU8sS0FBSyxPQUFPO0FBQUEsSUFDN0I7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBZVgsSUFBSSxHQUFHO0FBQUEsSUFDSCxNQUFNLE1BQU0sQ0FBQztBQUFBLElBQ2IsV0FBVyxLQUFLLEtBQUssU0FBUyxFQUFFLFlBQVksS0FBSyxDQUFDLEdBQUc7QUFBQSxNQUNqRCxNQUFNLE1BQU0sS0FBSyxTQUFTO0FBQUEsTUFDMUIsTUFBTSxJQUFJLEtBQUssU0FBUztBQUFBLE1BQ3hCLE1BQU0sUUFBUSxLQUFLLG1CQUFtQixDQUFDLElBQ2pDLEVBQUUsdUJBQ0Y7QUFBQSxNQUNOLElBQUksVUFBVSxhQUFhLFFBQVE7QUFBQSxRQUMvQjtBQUFBLE1BQ0osTUFBTSxRQUFRLEVBQUUsTUFBTTtBQUFBLE1BQ3RCLElBQUksS0FBSyxTQUFTLEtBQUssU0FBUztBQUFBLFFBQzVCLE1BQU0sTUFBTSxLQUFLLE1BQU07QUFBQSxRQUd2QixNQUFNLE1BQU0sS0FBSyxJQUFJLElBQUksS0FBSyxRQUFRO0FBQUEsUUFDdEMsTUFBTSxRQUFRLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxHQUFHO0FBQUEsTUFDN0M7QUFBQSxNQUNBLElBQUksS0FBSyxRQUFRO0FBQUEsUUFDYixNQUFNLE9BQU8sS0FBSyxPQUFPO0FBQUEsTUFDN0I7QUFBQSxNQUNBLElBQUksUUFBUSxDQUFDLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDNUI7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBV1gsSUFBSSxDQUFDLEtBQUs7QUFBQSxJQUNOLEtBQUssTUFBTTtBQUFBLElBQ1gsWUFBWSxLQUFLLFVBQVUsS0FBSztBQUFBLE1BQzVCLElBQUksTUFBTSxPQUFPO0FBQUEsUUFPYixNQUFNLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTTtBQUFBLFFBQy9CLE1BQU0sUUFBUSxLQUFLLElBQUksSUFBSTtBQUFBLE1BQy9CO0FBQUEsTUFDQSxLQUFLLElBQUksS0FBSyxNQUFNLE9BQU8sS0FBSztBQUFBLElBQ3BDO0FBQUE7QUFBQSxFQWdDSixHQUFHLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHO0FBQUEsSUFDdkIsSUFBSSxNQUFNLFdBQVc7QUFBQSxNQUNqQixLQUFLLE9BQU8sQ0FBQztBQUFBLE1BQ2IsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLFFBQVEsTUFBTSxLQUFLLEtBQUssT0FBTyxpQkFBaUIsS0FBSyxnQkFBZ0Isa0JBQWtCLEtBQUssaUJBQWlCLFdBQVk7QUFBQSxJQUN6SCxNQUFNLGNBQWMsS0FBSyxnQkFBZ0I7QUFBQSxJQUN6QyxNQUFNLE9BQU8sS0FBSyxhQUFhLEdBQUcsR0FBRyxXQUFXLFFBQVEsR0FBRyxlQUFlO0FBQUEsSUFHMUUsSUFBSSxLQUFLLGdCQUFnQixPQUFPLEtBQUssY0FBYztBQUFBLE1BQy9DLElBQUksUUFBUTtBQUFBLFFBQ1IsT0FBTyxNQUFNO0FBQUEsUUFDYixPQUFPLHVCQUF1QjtBQUFBLE1BQ2xDO0FBQUEsTUFFQSxLQUFLLFFBQVEsR0FBRyxLQUFLO0FBQUEsTUFDckIsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLElBQUksUUFBUSxLQUFLLFVBQVUsSUFBSSxZQUFZLEtBQUssUUFBUSxJQUFJLENBQUM7QUFBQSxJQUM3RCxJQUFJLFVBQVUsV0FBVztBQUFBLE1BRXJCLFFBQVMsS0FBSyxVQUFVLElBQ2xCLEtBQUssUUFDTCxLQUFLLE1BQU0sV0FBVyxJQUNsQixLQUFLLE1BQU0sSUFBSSxJQUNmLEtBQUssVUFBVSxLQUFLLE9BQ2hCLEtBQUssT0FBTyxLQUFLLElBQ2pCLEtBQUs7QUFBQSxNQUNuQixLQUFLLFNBQVMsU0FBUztBQUFBLE1BQ3ZCLEtBQUssU0FBUyxTQUFTO0FBQUEsTUFDdkIsS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLO0FBQUEsTUFDekIsS0FBSyxNQUFNLEtBQUssU0FBUztBQUFBLE1BQ3pCLEtBQUssTUFBTSxTQUFTLEtBQUs7QUFBQSxNQUN6QixLQUFLLFFBQVE7QUFBQSxNQUNiLEtBQUs7QUFBQSxNQUNMLEtBQUssYUFBYSxPQUFPLE1BQU0sTUFBTTtBQUFBLE1BQ3JDLElBQUk7QUFBQSxRQUNBLE9BQU8sTUFBTTtBQUFBLE1BQ2pCLGNBQWM7QUFBQSxNQUNkLElBQUksS0FBSyxjQUFjO0FBQUEsUUFDbkIsS0FBSyxZQUFZLEdBQUcsR0FBRyxLQUFLO0FBQUEsTUFDaEM7QUFBQSxJQUNKLEVBQ0s7QUFBQSxNQUVELEtBQUssWUFBWSxLQUFLO0FBQUEsTUFDdEIsTUFBTSxTQUFTLEtBQUssU0FBUztBQUFBLE1BQzdCLElBQUksTUFBTSxRQUFRO0FBQUEsUUFDZCxJQUFJLEtBQUssbUJBQW1CLEtBQUssbUJBQW1CLE1BQU0sR0FBRztBQUFBLFVBQ3pELE9BQU8sa0JBQWtCLE1BQU0sSUFBSSxNQUFNLFVBQVUsQ0FBQztBQUFBLFVBQ3BELFFBQVEsc0JBQXNCLE1BQU07QUFBQSxVQUNwQyxJQUFJLE1BQU0sY0FBYyxnQkFBZ0I7QUFBQSxZQUNwQyxJQUFJLEtBQUssYUFBYTtBQUFBLGNBQ2xCLEtBQUssV0FBVyxHQUFHLEdBQUcsS0FBSztBQUFBLFlBQy9CO0FBQUEsWUFDQSxJQUFJLEtBQUssa0JBQWtCO0FBQUEsY0FDdkIsS0FBSyxXQUFXLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQUEsWUFDdEM7QUFBQSxVQUNKO0FBQUEsUUFDSixFQUNLLFVBQUssZ0JBQWdCO0FBQUEsVUFDdEIsSUFBSSxLQUFLLGFBQWE7QUFBQSxZQUNsQixLQUFLLFdBQVcsUUFBUSxHQUFHLEtBQUs7QUFBQSxVQUNwQztBQUFBLFVBQ0EsSUFBSSxLQUFLLGtCQUFrQjtBQUFBLFlBQ3ZCLEtBQUssV0FBVyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztBQUFBLFVBQzNDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsS0FBSyxnQkFBZ0IsS0FBSztBQUFBLFFBQzFCLEtBQUssYUFBYSxPQUFPLE1BQU0sTUFBTTtBQUFBLFFBQ3JDLEtBQUssU0FBUyxTQUFTO0FBQUEsUUFDdkIsSUFBSSxRQUFRO0FBQUEsVUFDUixPQUFPLE1BQU07QUFBQSxVQUNiLE1BQU0sV0FBVyxVQUFVLEtBQUssbUJBQW1CLE1BQU0sSUFDbkQsT0FBTyx1QkFDUDtBQUFBLFVBQ04sSUFBSSxhQUFhO0FBQUEsWUFDYixPQUFPLFdBQVc7QUFBQSxRQUMxQjtBQUFBLE1BQ0osRUFDSyxTQUFJLFFBQVE7QUFBQSxRQUNiLE9BQU8sTUFBTTtBQUFBLE1BQ2pCO0FBQUEsTUFDQSxJQUFJLEtBQUssY0FBYztBQUFBLFFBQ25CLEtBQUssV0FBVyxHQUFHLEdBQUcsTUFBTSxTQUFTLFdBQVcsU0FBUztBQUFBLE1BQzdEO0FBQUE7QUFBQSxJQUVKLElBQUksUUFBUSxNQUFNLEtBQUssT0FBTztBQUFBLE1BQzFCLEtBQUssdUJBQXVCO0FBQUEsSUFDaEM7QUFBQSxJQUNBLElBQUksS0FBSyxPQUFPO0FBQUEsTUFDWixLQUFLLGFBQWE7QUFBQSxRQUNkLEtBQUssWUFBWSxPQUFPLEtBQUssS0FBSztBQUFBLE1BQ3RDO0FBQUEsTUFDQSxJQUFJO0FBQUEsUUFDQSxLQUFLLFdBQVcsUUFBUSxLQUFLO0FBQUEsSUFDckM7QUFBQSxJQUNBLEtBQUssa0JBQWtCLEtBQUssb0JBQW9CLEtBQUssV0FBVztBQUFBLE1BQzVELE1BQU0sS0FBSyxLQUFLO0FBQUEsTUFDaEIsSUFBSTtBQUFBLE1BQ0osT0FBUSxPQUFPLElBQUksTUFBTSxHQUFJO0FBQUEsUUFDekIsS0FBSyxnQkFBZ0IsR0FBRyxJQUFJO0FBQUEsTUFDaEM7QUFBQSxJQUNKO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQU1YLEdBQUcsR0FBRztBQUFBLElBQ0YsSUFBSTtBQUFBLE1BQ0EsT0FBTyxLQUFLLE9BQU87QUFBQSxRQUNmLE1BQU0sTUFBTSxLQUFLLFNBQVMsS0FBSztBQUFBLFFBQy9CLEtBQUssT0FBTyxJQUFJO0FBQUEsUUFDaEIsSUFBSSxLQUFLLG1CQUFtQixHQUFHLEdBQUc7QUFBQSxVQUM5QixJQUFJLElBQUksc0JBQXNCO0FBQUEsWUFDMUIsT0FBTyxJQUFJO0FBQUEsVUFDZjtBQUFBLFFBQ0osRUFDSyxTQUFJLFFBQVEsV0FBVztBQUFBLFVBQ3hCLE9BQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUFBLGNBRUo7QUFBQSxNQUNJLElBQUksS0FBSyxvQkFBb0IsS0FBSyxXQUFXO0FBQUEsUUFDekMsTUFBTSxLQUFLLEtBQUs7QUFBQSxRQUNoQixJQUFJO0FBQUEsUUFDSixPQUFRLE9BQU8sSUFBSSxNQUFNLEdBQUk7QUFBQSxVQUN6QixLQUFLLGdCQUFnQixHQUFHLElBQUk7QUFBQSxRQUNoQztBQUFBLE1BQ0o7QUFBQTtBQUFBO0FBQUEsRUFHUixNQUFNLENBQUMsTUFBTTtBQUFBLElBQ1QsTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUNsQixNQUFNLElBQUksS0FBSyxTQUFTO0FBQUEsSUFDeEIsTUFBTSxJQUFJLEtBQUssU0FBUztBQUFBLElBQ3hCLElBQUksS0FBSyxtQkFBbUIsS0FBSyxtQkFBbUIsQ0FBQyxHQUFHO0FBQUEsTUFDcEQsRUFBRSxrQkFBa0IsTUFBTSxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDbEQsRUFDSyxTQUFJLEtBQUssZUFBZSxLQUFLLGtCQUFrQjtBQUFBLE1BQ2hELElBQUksS0FBSyxhQUFhO0FBQUEsUUFDbEIsS0FBSyxXQUFXLEdBQUcsR0FBRyxPQUFPO0FBQUEsTUFDakM7QUFBQSxNQUNBLElBQUksS0FBSyxrQkFBa0I7QUFBQSxRQUN2QixLQUFLLFdBQVcsS0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7QUFBQSxNQUN4QztBQUFBLElBQ0o7QUFBQSxJQUNBLEtBQUssZ0JBQWdCLElBQUk7QUFBQSxJQUV6QixJQUFJLE1BQU07QUFBQSxNQUNOLEtBQUssU0FBUyxRQUFRO0FBQUEsTUFDdEIsS0FBSyxTQUFTLFFBQVE7QUFBQSxNQUN0QixLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUEsSUFDeEI7QUFBQSxJQUNBLElBQUksS0FBSyxVQUFVLEdBQUc7QUFBQSxNQUNsQixLQUFLLFFBQVEsS0FBSyxRQUFRO0FBQUEsTUFDMUIsS0FBSyxNQUFNLFNBQVM7QUFBQSxJQUN4QixFQUNLO0FBQUEsTUFDRCxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUE7QUFBQSxJQUU1QixLQUFLLFFBQVEsT0FBTyxDQUFDO0FBQUEsSUFDckIsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBO0FBQUEsRUFrQlgsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUc7QUFBQSxJQUNwQixRQUFRLGlCQUFpQixLQUFLLGdCQUFnQixXQUFXO0FBQUEsSUFDekQsTUFBTSxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUM7QUFBQSxJQUNoQyxJQUFJLFVBQVUsV0FBVztBQUFBLE1BQ3JCLE1BQU0sSUFBSSxLQUFLLFNBQVM7QUFBQSxNQUN4QixJQUFJLEtBQUssbUJBQW1CLENBQUMsS0FDekIsRUFBRSx5QkFBeUIsV0FBVztBQUFBLFFBQ3RDLE9BQU87QUFBQSxNQUNYO0FBQUEsTUFDQSxLQUFLLEtBQUssU0FBUyxLQUFLLEdBQUc7QUFBQSxRQUN2QixJQUFJLGdCQUFnQjtBQUFBLFVBQ2hCLEtBQUssZUFBZSxLQUFLO0FBQUEsUUFDN0I7QUFBQSxRQUNBLElBQUksUUFBUTtBQUFBLFVBQ1IsT0FBTyxNQUFNO0FBQUEsVUFDYixLQUFLLFdBQVcsUUFBUSxLQUFLO0FBQUEsUUFDakM7QUFBQSxRQUNBLE9BQU87QUFBQSxNQUNYLEVBQ0ssU0FBSSxRQUFRO0FBQUEsUUFDYixPQUFPLE1BQU07QUFBQSxRQUNiLEtBQUssV0FBVyxRQUFRLEtBQUs7QUFBQSxNQUNqQztBQUFBLElBQ0osRUFDSyxTQUFJLFFBQVE7QUFBQSxNQUNiLE9BQU8sTUFBTTtBQUFBLElBQ2pCO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQVNYLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxHQUFHO0FBQUEsSUFDdEIsUUFBUSxhQUFhLEtBQUssZUFBZTtBQUFBLElBQ3pDLE1BQU0sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDO0FBQUEsSUFDaEMsSUFBSSxVQUFVLGNBQ1IsY0FBYyxLQUFLLFNBQVMsS0FBSyxHQUFJO0FBQUEsTUFDdkM7QUFBQSxJQUNKO0FBQUEsSUFDQSxNQUFNLElBQUksS0FBSyxTQUFTO0FBQUEsSUFFeEIsT0FBTyxLQUFLLG1CQUFtQixDQUFDLElBQUksRUFBRSx1QkFBdUI7QUFBQTtBQUFBLEVBRWpFLGdCQUFnQixDQUFDLEdBQUcsT0FBTyxTQUFTLFNBQVM7QUFBQSxJQUN6QyxNQUFNLElBQUksVUFBVSxZQUFZLFlBQVksS0FBSyxTQUFTO0FBQUEsSUFDMUQsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEdBQUc7QUFBQSxNQUM1QixPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsTUFBTSxLQUFLLElBQUk7QUFBQSxJQUNmLFFBQVEsV0FBVztBQUFBLElBRW5CLFFBQVEsaUJBQWlCLFNBQVMsTUFBTSxHQUFHLE1BQU0sT0FBTyxNQUFNLEdBQUc7QUFBQSxNQUM3RCxRQUFRLEdBQUc7QUFBQSxJQUNmLENBQUM7QUFBQSxJQUNELE1BQU0sWUFBWTtBQUFBLE1BQ2QsUUFBUSxHQUFHO0FBQUEsTUFDWDtBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBQUEsSUFDQSxNQUFNLEtBQUssQ0FBQyxJQUFHLGNBQWMsVUFBVTtBQUFBLE1BQ25DLFFBQVEsWUFBWSxHQUFHO0FBQUEsTUFDdkIsTUFBTSxjQUFjLFFBQVEsb0JBQW9CLE9BQU07QUFBQSxNQUN0RCxJQUFJLFFBQVEsUUFBUTtBQUFBLFFBQ2hCLElBQUksWUFBWSxhQUFhO0FBQUEsVUFDekIsUUFBUSxPQUFPLGVBQWU7QUFBQSxVQUM5QixRQUFRLE9BQU8sYUFBYSxHQUFHLE9BQU87QUFBQSxVQUN0QyxJQUFJO0FBQUEsWUFDQSxRQUFRLE9BQU8sb0JBQW9CO0FBQUEsUUFDM0MsRUFDSztBQUFBLFVBQ0QsUUFBUSxPQUFPLGdCQUFnQjtBQUFBO0FBQUEsTUFFdkM7QUFBQSxNQUNBLElBQUksWUFBWSxnQkFBZ0IsYUFBYTtBQUFBLFFBQ3pDLE9BQU8sVUFBVSxHQUFHLE9BQU8sTUFBTTtBQUFBLE1BQ3JDO0FBQUEsTUFFQSxNQUFNLE1BQUs7QUFBQSxNQUNYLElBQUksS0FBSyxTQUFTLFdBQVcsR0FBRztBQUFBLFFBQzVCLElBQUksT0FBTSxXQUFXO0FBQUEsVUFDakIsSUFBSSxJQUFHLHNCQUFzQjtBQUFBLFlBQ3pCLEtBQUssU0FBUyxTQUFTLElBQUc7QUFBQSxVQUM5QixFQUNLO0FBQUEsWUFDRCxLQUFLLFFBQVEsR0FBRyxPQUFPO0FBQUE7QUFBQSxRQUUvQixFQUNLO0FBQUEsVUFDRCxJQUFJLFFBQVE7QUFBQSxZQUNSLFFBQVEsT0FBTyxlQUFlO0FBQUEsVUFDbEMsS0FBSyxJQUFJLEdBQUcsSUFBRyxVQUFVLE9BQU87QUFBQTtBQUFBLE1BRXhDO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQSxJQUVYLE1BQU0sS0FBSyxDQUFDLE9BQU87QUFBQSxNQUNmLElBQUksUUFBUSxRQUFRO0FBQUEsUUFDaEIsUUFBUSxPQUFPLGdCQUFnQjtBQUFBLFFBQy9CLFFBQVEsT0FBTyxhQUFhO0FBQUEsTUFDaEM7QUFBQSxNQUNBLE9BQU8sVUFBVSxFQUFFO0FBQUE7QUFBQSxJQUV2QixNQUFNLFlBQVksQ0FBQyxPQUFPO0FBQUEsTUFDdEIsUUFBUSxZQUFZLEdBQUc7QUFBQSxNQUN2QixNQUFNLG9CQUFvQixXQUFXLFFBQVE7QUFBQSxNQUM3QyxNQUFNLGFBQWEscUJBQXFCLFFBQVE7QUFBQSxNQUNoRCxNQUFNLFdBQVcsY0FBYyxRQUFRO0FBQUEsTUFDdkMsTUFBTSxNQUFLO0FBQUEsTUFDWCxJQUFJLEtBQUssU0FBUyxXQUFXLEdBQUc7QUFBQSxRQUc1QixNQUFNLE9BQU8sWUFBWSxJQUFHLHlCQUF5QjtBQUFBLFFBQ3JELElBQUksS0FBSztBQUFBLFVBQ0wsS0FBSyxRQUFRLEdBQUcsT0FBTztBQUFBLFFBQzNCLEVBQ0ssVUFBSyxtQkFBbUI7QUFBQSxVQUt6QixLQUFLLFNBQVMsU0FBUyxJQUFHO0FBQUEsUUFDOUI7QUFBQSxNQUNKO0FBQUEsTUFDQSxJQUFJLFlBQVk7QUFBQSxRQUNaLElBQUksUUFBUSxVQUFVLElBQUcseUJBQXlCLFdBQVc7QUFBQSxVQUN6RCxRQUFRLE9BQU8sZ0JBQWdCO0FBQUEsUUFDbkM7QUFBQSxRQUNBLE9BQU8sSUFBRztBQUFBLE1BQ2QsRUFDSyxTQUFJLElBQUcsZUFBZSxLQUFJO0FBQUEsUUFDM0IsTUFBTTtBQUFBLE1BQ1Y7QUFBQTtBQUFBLElBRUosTUFBTSxRQUFRLENBQUMsS0FBSyxRQUFRO0FBQUEsTUFDeEIsTUFBTSxNQUFNLEtBQUssZUFBZSxHQUFHLEdBQUcsU0FBUztBQUFBLE1BQy9DLElBQUksT0FBTyxlQUFlLFNBQVM7QUFBQSxRQUMvQixJQUFJLEtBQUssUUFBSyxJQUFJLE9BQU0sWUFBWSxZQUFZLEVBQUMsR0FBRyxHQUFHO0FBQUEsTUFDM0Q7QUFBQSxNQUlBLEdBQUcsT0FBTyxpQkFBaUIsU0FBUyxNQUFNO0FBQUEsUUFDdEMsS0FBSyxRQUFRLG9CQUNULFFBQVEsd0JBQXdCO0FBQUEsVUFDaEMsSUFBSSxTQUFTO0FBQUEsVUFFYixJQUFJLFFBQVEsd0JBQXdCO0FBQUEsWUFDaEMsTUFBTSxRQUFLLEdBQUcsSUFBRyxJQUFJO0FBQUEsVUFDekI7QUFBQSxRQUNKO0FBQUEsT0FDSDtBQUFBO0FBQUEsSUFFTCxJQUFJLFFBQVE7QUFBQSxNQUNSLFFBQVEsT0FBTyxrQkFBa0I7QUFBQSxJQUNyQyxNQUFNLElBQUksSUFBSSxRQUFRLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRTtBQUFBLElBQ3hDLE1BQU0sS0FBSyxPQUFPLE9BQU8sR0FBRztBQUFBLE1BQ3hCLG1CQUFtQjtBQUFBLE1BQ25CLHNCQUFzQjtBQUFBLE1BQ3RCLFlBQVk7QUFBQSxJQUNoQixDQUFDO0FBQUEsSUFDRCxJQUFJLFVBQVUsV0FBVztBQUFBLE1BRXJCLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxVQUFVLFNBQVMsUUFBUSxVQUFVLENBQUM7QUFBQSxNQUMzRCxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUM7QUFBQSxJQUM5QixFQUNLO0FBQUEsTUFDRCxLQUFLLFNBQVMsU0FBUztBQUFBO0FBQUEsSUFFM0IsT0FBTztBQUFBO0FBQUEsRUFFWCxrQkFBa0IsQ0FBQyxHQUFHO0FBQUEsSUFDbEIsS0FBSyxLQUFLO0FBQUEsTUFDTixPQUFPO0FBQUEsSUFDWCxNQUFNLElBQUk7QUFBQSxJQUNWLFNBQVUsS0FDTixhQUFhLFdBQ2IsRUFBRSxlQUFlLHNCQUFzQixLQUN2QyxFQUFFLDZCQUE2QjtBQUFBO0FBQUEsT0FFakMsTUFBSyxDQUFDLEdBQUcsZUFBZSxDQUFDLEdBQUc7QUFBQSxJQUM5QjtBQUFBLE1BRUEsYUFBYSxLQUFLO0FBQUEsTUFBWSxpQkFBaUIsS0FBSztBQUFBLE1BQWdCLHFCQUFxQixLQUFLO0FBQUEsTUFFOUYsTUFBTSxLQUFLO0FBQUEsTUFBSyxpQkFBaUIsS0FBSztBQUFBLE1BQWdCLE9BQU87QUFBQSxNQUFHLGtCQUFrQixLQUFLO0FBQUEsTUFBaUIsY0FBYyxLQUFLO0FBQUEsTUFFM0gsMkJBQTJCLEtBQUs7QUFBQSxNQUEwQiw2QkFBNkIsS0FBSztBQUFBLE1BQTRCLG1CQUFtQixLQUFLO0FBQUEsTUFBa0IseUJBQXlCLEtBQUs7QUFBQSxNQUF3QjtBQUFBLE1BQVMsZUFBZTtBQUFBLE1BQU87QUFBQSxNQUFRO0FBQUEsUUFBWTtBQUFBLElBQzNRLEtBQUssS0FBSyxpQkFBaUI7QUFBQSxNQUN2QixJQUFJO0FBQUEsUUFDQSxPQUFPLFFBQVE7QUFBQSxNQUNuQixPQUFPLEtBQUssSUFBSSxHQUFHO0FBQUEsUUFDZjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ0w7QUFBQSxJQUNBLE1BQU0sVUFBVTtBQUFBLE1BQ1o7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUFBLElBQ0EsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUM7QUFBQSxJQUM5QixJQUFJLFVBQVUsV0FBVztBQUFBLE1BQ3JCLElBQUk7QUFBQSxRQUNBLE9BQU8sUUFBUTtBQUFBLE1BQ25CLE1BQU0sSUFBSSxLQUFLLGlCQUFpQixHQUFHLE9BQU8sU0FBUyxPQUFPO0FBQUEsTUFDMUQsT0FBUSxFQUFFLGFBQWE7QUFBQSxJQUMzQixFQUNLO0FBQUEsTUFFRCxNQUFNLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDeEIsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEdBQUc7QUFBQSxRQUM1QixNQUFNLFFBQVEsY0FBYyxFQUFFLHlCQUF5QjtBQUFBLFFBQ3ZELElBQUksUUFBUTtBQUFBLFVBQ1IsT0FBTyxRQUFRO0FBQUEsVUFDZixJQUFJO0FBQUEsWUFDQSxPQUFPLGdCQUFnQjtBQUFBLFFBQy9CO0FBQUEsUUFDQSxPQUFPLFFBQVEsRUFBRSx1QkFBd0IsRUFBRSxhQUFhO0FBQUEsTUFDNUQ7QUFBQSxNQUdBLE1BQU0sVUFBVSxLQUFLLFNBQVMsS0FBSztBQUFBLE1BQ25DLEtBQUssaUJBQWlCLFNBQVM7QUFBQSxRQUMzQixJQUFJO0FBQUEsVUFDQSxPQUFPLFFBQVE7QUFBQSxRQUNuQixLQUFLLFlBQVksS0FBSztBQUFBLFFBQ3RCLElBQUksZ0JBQWdCO0FBQUEsVUFDaEIsS0FBSyxlQUFlLEtBQUs7QUFBQSxRQUM3QjtBQUFBLFFBQ0EsSUFBSTtBQUFBLFVBQ0EsS0FBSyxXQUFXLFFBQVEsS0FBSztBQUFBLFFBQ2pDLE9BQU87QUFBQSxNQUNYO0FBQUEsTUFHQSxNQUFNLElBQUksS0FBSyxpQkFBaUIsR0FBRyxPQUFPLFNBQVMsT0FBTztBQUFBLE1BQzFELE1BQU0sV0FBVyxFQUFFLHlCQUF5QjtBQUFBLE1BQzVDLE1BQU0sV0FBVyxZQUFZO0FBQUEsTUFDN0IsSUFBSSxRQUFRO0FBQUEsUUFDUixPQUFPLFFBQVEsVUFBVSxVQUFVO0FBQUEsUUFDbkMsSUFBSSxZQUFZO0FBQUEsVUFDWixPQUFPLGdCQUFnQjtBQUFBLE1BQy9CO0FBQUEsTUFDQSxPQUFPLFdBQVcsRUFBRSx1QkFBd0IsRUFBRSxhQUFhO0FBQUE7QUFBQTtBQUFBLE9BRzdELFdBQVUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHO0FBQUEsSUFDbkMsTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLEdBQUcsWUFBWTtBQUFBLElBQzFDLElBQUksTUFBTTtBQUFBLE1BQ04sTUFBTSxJQUFJLE1BQU0sNEJBQTRCO0FBQUEsSUFDaEQsT0FBTztBQUFBO0FBQUEsRUFFWCxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsR0FBRztBQUFBLElBQ3RCLE1BQU0sYUFBYSxLQUFLO0FBQUEsSUFDeEIsS0FBSyxZQUFZO0FBQUEsTUFDYixNQUFNLElBQUksTUFBTSx1Q0FBdUM7QUFBQSxJQUMzRDtBQUFBLElBQ0EsUUFBUSxTQUFTLGlCQUFpQixZQUFZO0FBQUEsSUFDOUMsTUFBTSxJQUFJLEtBQUssSUFBSSxHQUFHLE9BQU87QUFBQSxJQUM3QixLQUFLLGdCQUFnQixNQUFNO0FBQUEsTUFDdkIsT0FBTztBQUFBLElBQ1gsTUFBTSxLQUFLLFdBQVcsR0FBRyxHQUFHO0FBQUEsTUFDeEI7QUFBQSxNQUNBO0FBQUEsSUFDSixDQUFDO0FBQUEsSUFDRCxLQUFLLElBQUksR0FBRyxJQUFJLE9BQU87QUFBQSxJQUN2QixPQUFPO0FBQUE7QUFBQSxFQVFYLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHO0FBQUEsSUFDcEIsUUFBUSxhQUFhLEtBQUssWUFBWSxpQkFBaUIsS0FBSyxnQkFBZ0IscUJBQXFCLEtBQUssb0JBQW9CLFdBQVk7QUFBQSxJQUN0SSxNQUFNLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQztBQUFBLElBQ2hDLElBQUksVUFBVSxXQUFXO0FBQUEsTUFDckIsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLE1BQzVCLE1BQU0sV0FBVyxLQUFLLG1CQUFtQixLQUFLO0FBQUEsTUFDOUMsSUFBSTtBQUFBLFFBQ0EsS0FBSyxXQUFXLFFBQVEsS0FBSztBQUFBLE1BQ2pDLElBQUksS0FBSyxTQUFTLEtBQUssR0FBRztBQUFBLFFBQ3RCLElBQUk7QUFBQSxVQUNBLE9BQU8sTUFBTTtBQUFBLFFBRWpCLEtBQUssVUFBVTtBQUFBLFVBQ1gsS0FBSyxvQkFBb0I7QUFBQSxZQUNyQixLQUFLLFFBQVEsR0FBRyxRQUFRO0FBQUEsVUFDNUI7QUFBQSxVQUNBLElBQUksVUFBVTtBQUFBLFlBQ1YsT0FBTyxnQkFBZ0I7QUFBQSxVQUMzQixPQUFPLGFBQWEsUUFBUTtBQUFBLFFBQ2hDLEVBQ0s7QUFBQSxVQUNELElBQUksVUFDQSxjQUNBLE1BQU0seUJBQXlCLFdBQVc7QUFBQSxZQUMxQyxPQUFPLGdCQUFnQjtBQUFBLFVBQzNCO0FBQUEsVUFDQSxPQUFPLGFBQWEsTUFBTSx1QkFBdUI7QUFBQTtBQUFBLE1BRXpELEVBQ0s7QUFBQSxRQUNELElBQUk7QUFBQSxVQUNBLE9BQU8sTUFBTTtBQUFBLFFBTWpCLElBQUksVUFBVTtBQUFBLFVBQ1YsT0FBTyxNQUFNO0FBQUEsUUFDakI7QUFBQSxRQUNBLEtBQUssWUFBWSxLQUFLO0FBQUEsUUFDdEIsSUFBSSxnQkFBZ0I7QUFBQSxVQUNoQixLQUFLLGVBQWUsS0FBSztBQUFBLFFBQzdCO0FBQUEsUUFDQSxPQUFPO0FBQUE7QUFBQSxJQUVmLEVBQ0ssU0FBSSxRQUFRO0FBQUEsTUFDYixPQUFPLE1BQU07QUFBQSxJQUNqQjtBQUFBO0FBQUEsRUFFSixRQUFRLENBQUMsR0FBRyxHQUFHO0FBQUEsSUFDWCxLQUFLLE1BQU0sS0FBSztBQUFBLElBQ2hCLEtBQUssTUFBTSxLQUFLO0FBQUE7QUFBQSxFQUVwQixXQUFXLENBQUMsT0FBTztBQUFBLElBU2YsSUFBSSxVQUFVLEtBQUssT0FBTztBQUFBLE1BQ3RCLElBQUksVUFBVSxLQUFLLE9BQU87QUFBQSxRQUN0QixLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsTUFDNUIsRUFDSztBQUFBLFFBQ0QsS0FBSyxTQUFTLEtBQUssTUFBTSxRQUFRLEtBQUssTUFBTSxNQUFNO0FBQUE7QUFBQSxNQUV0RCxLQUFLLFNBQVMsS0FBSyxPQUFPLEtBQUs7QUFBQSxNQUMvQixLQUFLLFFBQVE7QUFBQSxJQUNqQjtBQUFBO0FBQUEsRUFPSixNQUFNLENBQUMsR0FBRztBQUFBLElBQ04sT0FBTyxLQUFLLFFBQVEsR0FBRyxRQUFRO0FBQUE7QUFBQSxFQUVuQyxPQUFPLENBQUMsR0FBRyxRQUFRO0FBQUEsSUFDZixJQUFJLFVBQVU7QUFBQSxJQUNkLElBQUksS0FBSyxVQUFVLEdBQUc7QUFBQSxNQUNsQixNQUFNLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQztBQUFBLE1BQ2hDLElBQUksVUFBVSxXQUFXO0FBQUEsUUFDckIsVUFBVTtBQUFBLFFBQ1YsSUFBSSxLQUFLLFVBQVUsR0FBRztBQUFBLFVBQ2xCLEtBQUssT0FBTyxNQUFNO0FBQUEsUUFDdEIsRUFDSztBQUFBLFVBQ0QsS0FBSyxnQkFBZ0IsS0FBSztBQUFBLFVBQzFCLE1BQU0sSUFBSSxLQUFLLFNBQVM7QUFBQSxVQUN4QixJQUFJLEtBQUssbUJBQW1CLENBQUMsR0FBRztBQUFBLFlBQzVCLEVBQUUsa0JBQWtCLE1BQU0sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUFBLFVBQ2xELEVBQ0ssU0FBSSxLQUFLLGVBQWUsS0FBSyxrQkFBa0I7QUFBQSxZQUNoRCxJQUFJLEtBQUssYUFBYTtBQUFBLGNBQ2xCLEtBQUssV0FBVyxHQUFHLEdBQUcsTUFBTTtBQUFBLFlBQ2hDO0FBQUEsWUFDQSxJQUFJLEtBQUssa0JBQWtCO0FBQUEsY0FDdkIsS0FBSyxXQUFXLEtBQUssQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBQUEsWUFDdkM7QUFBQSxVQUNKO0FBQUEsVUFDQSxLQUFLLFFBQVEsT0FBTyxDQUFDO0FBQUEsVUFDckIsS0FBSyxTQUFTLFNBQVM7QUFBQSxVQUN2QixLQUFLLFNBQVMsU0FBUztBQUFBLFVBQ3ZCLElBQUksVUFBVSxLQUFLLE9BQU87QUFBQSxZQUN0QixLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsVUFDNUIsRUFDSyxTQUFJLFVBQVUsS0FBSyxPQUFPO0FBQUEsWUFDM0IsS0FBSyxRQUFRLEtBQUssTUFBTTtBQUFBLFVBQzVCLEVBQ0s7QUFBQSxZQUNELE1BQU0sS0FBSyxLQUFLLE1BQU07QUFBQSxZQUN0QixLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU07QUFBQSxZQUM1QixNQUFNLEtBQUssS0FBSyxNQUFNO0FBQUEsWUFDdEIsS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNO0FBQUE7QUFBQSxVQUVoQyxLQUFLO0FBQUEsVUFDTCxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFBQSxNQUU3QjtBQUFBLElBQ0o7QUFBQSxJQUNBLElBQUksS0FBSyxvQkFBb0IsS0FBSyxXQUFXLFFBQVE7QUFBQSxNQUNqRCxNQUFNLEtBQUssS0FBSztBQUFBLE1BQ2hCLElBQUk7QUFBQSxNQUNKLE9BQVEsT0FBTyxJQUFJLE1BQU0sR0FBSTtBQUFBLFFBQ3pCLEtBQUssZ0JBQWdCLEdBQUcsSUFBSTtBQUFBLE1BQ2hDO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFLWCxLQUFLLEdBQUc7QUFBQSxJQUNKLE9BQU8sS0FBSyxPQUFPLFFBQVE7QUFBQTtBQUFBLEVBRS9CLE1BQU0sQ0FBQyxRQUFRO0FBQUEsSUFDWCxXQUFXLFNBQVMsS0FBSyxVQUFVLEVBQUUsWUFBWSxLQUFLLENBQUMsR0FBRztBQUFBLE1BQ3RELE1BQU0sSUFBSSxLQUFLLFNBQVM7QUFBQSxNQUN4QixJQUFJLEtBQUssbUJBQW1CLENBQUMsR0FBRztBQUFBLFFBQzVCLEVBQUUsa0JBQWtCLE1BQU0sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUFBLE1BQ2xELEVBQ0s7QUFBQSxRQUNELE1BQU0sSUFBSSxLQUFLLFNBQVM7QUFBQSxRQUN4QixJQUFJLEtBQUssYUFBYTtBQUFBLFVBQ2xCLEtBQUssV0FBVyxHQUFHLEdBQUcsTUFBTTtBQUFBLFFBQ2hDO0FBQUEsUUFDQSxJQUFJLEtBQUssa0JBQWtCO0FBQUEsVUFDdkIsS0FBSyxXQUFXLEtBQUssQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBQUEsUUFDdkM7QUFBQTtBQUFBLElBRVI7QUFBQSxJQUNBLEtBQUssUUFBUSxNQUFNO0FBQUEsSUFDbkIsS0FBSyxTQUFTLEtBQUssU0FBUztBQUFBLElBQzVCLEtBQUssU0FBUyxLQUFLLFNBQVM7QUFBQSxJQUM1QixJQUFJLEtBQUssU0FBUyxLQUFLLFNBQVM7QUFBQSxNQUM1QixLQUFLLE1BQU0sS0FBSyxDQUFDO0FBQUEsTUFDakIsS0FBSyxRQUFRLEtBQUssQ0FBQztBQUFBLElBQ3ZCO0FBQUEsSUFDQSxJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2IsS0FBSyxPQUFPLEtBQUssQ0FBQztBQUFBLElBQ3RCO0FBQUEsSUFDQSxLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxNQUFNLFNBQVM7QUFBQSxJQUNwQixLQUFLLGtCQUFrQjtBQUFBLElBQ3ZCLEtBQUssUUFBUTtBQUFBLElBQ2IsSUFBSSxLQUFLLG9CQUFvQixLQUFLLFdBQVc7QUFBQSxNQUN6QyxNQUFNLEtBQUssS0FBSztBQUFBLE1BQ2hCLElBQUk7QUFBQSxNQUNKLE9BQVEsT0FBTyxJQUFJLE1BQU0sR0FBSTtBQUFBLFFBQ3pCLEtBQUssZ0JBQWdCLEdBQUcsSUFBSTtBQUFBLE1BQ2hDO0FBQUEsSUFDSjtBQUFBO0FBRVI7OztBQ3JoREE7QUFDQTtBQUNBLCtCQUFvQixzREFBaUQ7QUFDckU7QUFJQTs7O0FDRkE7QUFDQTtBQUNBO0FBUkEsSUFBTSxPQUFPLE9BQU8sWUFBWSxZQUFZLFVBQ3RDLFVBQ0E7QUFBQSxFQUNFLFFBQVE7QUFBQSxFQUNSLFFBQVE7QUFDWjtBQVFHLElBQU0sV0FBVyxDQUFDLFFBQVEsS0FDN0IsT0FBTyxNQUFNLGFBQ1osYUFBYSxZQUNWLGFBQWEsVUFDYixXQUFXLENBQUMsS0FDWixXQUFXLENBQUM7QUFJYixJQUFNLGFBQWEsQ0FBQyxRQUFRLEtBQy9CLE9BQU8sTUFBTSxZQUNiLGFBQWEsZ0JBQ2IsT0FBTyxFQUFFLFNBQVMsY0FFbEIsRUFBRSxTQUFTLE9BQU8sU0FBUyxVQUFVO0FBSWxDLElBQU0sYUFBYSxDQUFDLFFBQVEsS0FDL0IsT0FBTyxNQUFNLFlBQ2IsYUFBYSxnQkFDYixPQUFPLEVBQUUsVUFBVSxjQUNuQixPQUFPLEVBQUUsUUFBUTtBQUNyQixJQUFNLE1BQU0sT0FBTyxLQUFLO0FBQ3hCLElBQU0saUJBQWlCLE9BQU8sY0FBYztBQUM1QyxJQUFNLGNBQWMsT0FBTyxZQUFZO0FBQ3ZDLElBQU0sZUFBZSxPQUFPLGFBQWE7QUFDekMsSUFBTSxnQkFBZ0IsT0FBTyxjQUFjO0FBQzNDLElBQU0sU0FBUyxPQUFPLFFBQVE7QUFDOUIsSUFBTSxPQUFPLE9BQU8sTUFBTTtBQUMxQixJQUFNLFFBQVEsT0FBTyxPQUFPO0FBQzVCLElBQU0sYUFBYSxPQUFPLFlBQVk7QUFDdEMsSUFBTSxXQUFXLE9BQU8sVUFBVTtBQUNsQyxJQUFNLFVBQVUsT0FBTyxTQUFTO0FBQ2hDLElBQU0sVUFBVSxPQUFPLFNBQVM7QUFDaEMsSUFBTSxTQUFTLE9BQU8sUUFBUTtBQUM5QixJQUFNLFNBQVMsT0FBTyxRQUFRO0FBQzlCLElBQU0sU0FBUyxPQUFPLFFBQVE7QUFDOUIsSUFBTSxRQUFRLE9BQU8sT0FBTztBQUM1QixJQUFNLGVBQWUsT0FBTyxjQUFjO0FBQzFDLElBQU0sYUFBYSxPQUFPLFlBQVk7QUFDdEMsSUFBTSxjQUFjLE9BQU8sYUFBYTtBQUN4QyxJQUFNLGFBQWEsT0FBTyxZQUFZO0FBRXRDLElBQU0sWUFBWSxPQUFPLFdBQVc7QUFFcEMsSUFBTSxRQUFRLE9BQU8sT0FBTztBQUM1QixJQUFNLFdBQVcsT0FBTyxVQUFVO0FBQ2xDLElBQU0sVUFBVSxPQUFPLFNBQVM7QUFDaEMsSUFBTSxXQUFXLE9BQU8sVUFBVTtBQUNsQyxJQUFNLFFBQVEsT0FBTyxPQUFPO0FBQzVCLElBQU0sUUFBUSxPQUFPLE9BQU87QUFDNUIsSUFBTSxVQUFVLE9BQU8sU0FBUztBQUNoQyxJQUFNLFNBQVMsT0FBTyxRQUFRO0FBQzlCLElBQU0sZ0JBQWdCLE9BQU8sZUFBZTtBQUM1QyxJQUFNLFlBQVksT0FBTyxXQUFXO0FBQ3BDLElBQU0sUUFBUSxDQUFDLE9BQU8sUUFBUSxRQUFRLEVBQUUsS0FBSyxFQUFFO0FBQy9DLElBQU0sVUFBVSxDQUFDLE9BQU8sR0FBRztBQUMzQixJQUFNLFdBQVcsQ0FBQyxPQUFPLE9BQU8sU0FBUyxPQUFPLFlBQVksT0FBTztBQUNuRSxJQUFNLG9CQUFvQixDQUFDLE1BQU0sYUFBYSxpQkFDdkMsS0FDQyxPQUFPLE1BQU0sWUFDYixFQUFFLGVBQ0YsRUFBRSxZQUFZLFNBQVMsaUJBQ3ZCLEVBQUUsY0FBYztBQUN4QixJQUFNLG9CQUFvQixDQUFDLE9BQU8sT0FBTyxTQUFTLENBQUMsS0FBSyxZQUFZLE9BQU8sQ0FBQztBQUFBO0FBTTVFLE1BQU0sS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLFdBQVcsQ0FBQyxLQUFLLE1BQU0sTUFBTTtBQUFBLElBQ3pCLEtBQUssTUFBTTtBQUFBLElBQ1gsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssVUFBVSxNQUFNLElBQUksUUFBUTtBQUFBLElBQ2pDLEtBQUssS0FBSyxHQUFHLFNBQVMsS0FBSyxPQUFPO0FBQUE7QUFBQSxFQUV0QyxNQUFNLEdBQUc7QUFBQSxJQUNMLEtBQUssS0FBSyxlQUFlLFNBQVMsS0FBSyxPQUFPO0FBQUE7QUFBQSxFQUlsRCxXQUFXLENBQUMsS0FBSztBQUFBLEVBRWpCLEdBQUcsR0FBRztBQUFBLElBQ0YsS0FBSyxPQUFPO0FBQUEsSUFDWixJQUFJLEtBQUssS0FBSztBQUFBLE1BQ1YsS0FBSyxLQUFLLElBQUk7QUFBQTtBQUUxQjtBQUFBO0FBT0EsTUFBTSx3QkFBd0IsS0FBSztBQUFBLEVBQy9CLE1BQU0sR0FBRztBQUFBLElBQ0wsS0FBSyxJQUFJLGVBQWUsU0FBUyxLQUFLLFdBQVc7QUFBQSxJQUNqRCxNQUFNLE9BQU87QUFBQTtBQUFBLEVBRWpCLFdBQVcsQ0FBQyxLQUFLLE1BQU0sTUFBTTtBQUFBLElBQ3pCLE1BQU0sS0FBSyxNQUFNLElBQUk7QUFBQSxJQUNyQixLQUFLLGNBQWMsUUFBTSxLQUFLLEtBQUssU0FBUyxFQUFFO0FBQUEsSUFDOUMsSUFBSSxHQUFHLFNBQVMsS0FBSyxXQUFXO0FBQUE7QUFFeEM7QUFDQSxJQUFNLHNCQUFzQixDQUFDLFFBQVEsRUFBRTtBQUN2QyxJQUFNLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsYUFBYTtBQUFBO0FBWTFFLE1BQU0saUJBQWlCLGFBQWE7QUFBQSxHQUN0QyxXQUFXO0FBQUEsR0FDWCxVQUFVO0FBQUEsR0FDVixTQUFTLENBQUM7QUFBQSxHQUNWLFVBQVUsQ0FBQztBQUFBLEdBQ1g7QUFBQSxHQUNBO0FBQUEsR0FDQTtBQUFBLEdBQ0E7QUFBQSxHQUNBLE9BQU87QUFBQSxHQUNQLGVBQWU7QUFBQSxHQUNmLGdCQUFnQjtBQUFBLEdBQ2hCLFVBQVU7QUFBQSxHQUNWLGlCQUFpQjtBQUFBLEdBQ2pCLGdCQUFnQjtBQUFBLEdBQ2hCLGFBQWE7QUFBQSxHQUNiO0FBQUEsR0FDQSxXQUFXO0FBQUEsR0FDWCxpQkFBaUI7QUFBQSxHQUNqQixhQUFhO0FBQUEsRUFJZCxXQUFXO0FBQUEsRUFJWCxXQUFXO0FBQUEsRUFPWCxXQUFXLElBQUksTUFBTTtBQUFBLElBQ2pCLE1BQU0sVUFBVyxLQUFLLE1BQ2xCLENBQUM7QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOLElBQUksUUFBUSxjQUFjLE9BQU8sUUFBUSxhQUFhLFVBQVU7QUFBQSxNQUM1RCxNQUFNLElBQUksVUFBVSxrREFBa0Q7QUFBQSxJQUMxRTtBQUFBLElBQ0EsSUFBSSxvQkFBb0IsT0FBTyxHQUFHO0FBQUEsTUFDOUIsS0FBSyxjQUFjO0FBQUEsTUFDbkIsS0FBSyxZQUFZO0FBQUEsSUFDckIsRUFDSyxTQUFJLGtCQUFrQixPQUFPLEdBQUc7QUFBQSxNQUNqQyxLQUFLLFlBQVksUUFBUTtBQUFBLE1BQ3pCLEtBQUssY0FBYztBQUFBLElBQ3ZCLEVBQ0s7QUFBQSxNQUNELEtBQUssY0FBYztBQUFBLE1BQ25CLEtBQUssWUFBWTtBQUFBO0FBQUEsSUFFckIsS0FBSyxXQUFXLFFBQVE7QUFBQSxJQUN4QixLQUFLLFdBQVcsS0FBSyxZQUNmLElBQUksY0FBYyxLQUFLLFNBQVMsSUFDaEM7QUFBQSxJQUVOLElBQUksV0FBVyxRQUFRLHNCQUFzQixNQUFNO0FBQUEsTUFDL0MsT0FBTyxlQUFlLE1BQU0sVUFBVSxFQUFFLEtBQUssTUFBTSxLQUFLLFFBQVEsQ0FBQztBQUFBLElBQ3JFO0FBQUEsSUFFQSxJQUFJLFdBQVcsUUFBUSxxQkFBcUIsTUFBTTtBQUFBLE1BQzlDLE9BQU8sZUFBZSxNQUFNLFNBQVMsRUFBRSxLQUFLLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFBQSxJQUNuRTtBQUFBLElBQ0EsUUFBUSxXQUFXO0FBQUEsSUFDbkIsSUFBSSxRQUFRO0FBQUEsTUFDUixLQUFLLFVBQVU7QUFBQSxNQUNmLElBQUksT0FBTyxTQUFTO0FBQUEsUUFDaEIsS0FBSyxPQUFPO0FBQUEsTUFDaEIsRUFDSztBQUFBLFFBQ0QsT0FBTyxpQkFBaUIsU0FBUyxNQUFNLEtBQUssT0FBTyxDQUFDO0FBQUE7QUFBQSxJQUU1RDtBQUFBO0FBQUEsTUFXQSxZQUFZLEdBQUc7QUFBQSxJQUNmLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFLWixRQUFRLEdBQUc7QUFBQSxJQUNYLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFLWixRQUFRLENBQUMsTUFBTTtBQUFBLElBQ2YsTUFBTSxJQUFJLE1BQU0sNENBQTRDO0FBQUE7QUFBQSxFQUtoRSxXQUFXLENBQUMsTUFBTTtBQUFBLElBQ2QsTUFBTSxJQUFJLE1BQU0sNENBQTRDO0FBQUE7QUFBQSxNQUs1RCxVQUFVLEdBQUc7QUFBQSxJQUNiLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFLWixVQUFVLENBQUMsS0FBSztBQUFBLElBQ2hCLE1BQU0sSUFBSSxNQUFNLDhDQUE4QztBQUFBO0FBQUEsT0FLN0QsUUFBUSxHQUFHO0FBQUEsSUFDWixPQUFPLEtBQUs7QUFBQTtBQUFBLE9BU1gsUUFBUSxDQUFDLEdBQUc7QUFBQSxJQUNiLEtBQUssU0FBUyxLQUFLLFlBQVk7QUFBQTtBQUFBLEdBR2xDLE1BQU0sR0FBRztBQUFBLElBQ04sS0FBSyxXQUFXO0FBQUEsSUFDaEIsS0FBSyxLQUFLLFNBQVMsS0FBSyxTQUFTLE1BQU07QUFBQSxJQUN2QyxLQUFLLFFBQVEsS0FBSyxTQUFTLE1BQU07QUFBQTtBQUFBLE1BS2pDLE9BQU8sR0FBRztBQUFBLElBQ1YsT0FBTyxLQUFLO0FBQUE7QUFBQSxNQU1aLE9BQU8sQ0FBQyxHQUFHO0FBQUEsRUFDZixLQUFLLENBQUMsT0FBTyxVQUFVLElBQUk7QUFBQSxJQUN2QixJQUFJLEtBQUs7QUFBQSxNQUNMLE9BQU87QUFBQSxJQUNYLElBQUksS0FBSztBQUFBLE1BQ0wsTUFBTSxJQUFJLE1BQU0saUJBQWlCO0FBQUEsSUFDckMsSUFBSSxLQUFLLFlBQVk7QUFBQSxNQUNqQixLQUFLLEtBQUssU0FBUyxPQUFPLE9BQU8sSUFBSSxNQUFNLGdEQUFnRCxHQUFHLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQyxDQUFDO0FBQUEsTUFDL0gsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLElBQUksT0FBTyxhQUFhLFlBQVk7QUFBQSxNQUNoQyxLQUFLO0FBQUEsTUFDTCxXQUFXO0FBQUEsSUFDZjtBQUFBLElBQ0EsS0FBSztBQUFBLE1BQ0QsV0FBVztBQUFBLElBQ2YsTUFBTSxLQUFLLEtBQUssU0FBUyxRQUFRO0FBQUEsSUFLakMsS0FBSyxLQUFLLGdCQUFnQixPQUFPLFNBQVMsS0FBSyxHQUFHO0FBQUEsTUFDOUMsSUFBSSxrQkFBa0IsS0FBSyxHQUFHO0FBQUEsUUFFMUIsUUFBUSxPQUFPLEtBQUssTUFBTSxRQUFRLE1BQU0sWUFBWSxNQUFNLFVBQVU7QUFBQSxNQUN4RSxFQUNLLFNBQUksa0JBQWtCLEtBQUssR0FBRztBQUFBLFFBRS9CLFFBQVEsT0FBTyxLQUFLLEtBQUs7QUFBQSxNQUM3QixFQUNLLFNBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxRQUNoQyxNQUFNLElBQUksTUFBTSxzREFBc0Q7QUFBQSxNQUMxRTtBQUFBLElBQ0o7QUFBQSxJQUdBLElBQUksS0FBSyxhQUFhO0FBQUEsTUFHbEIsSUFBSSxLQUFLLFlBQVksS0FBSyxrQkFBa0I7QUFBQSxRQUN4QyxLQUFLLE9BQU8sSUFBSTtBQUFBLE1BRXBCLElBQUksS0FBSztBQUFBLFFBQ0wsS0FBSyxLQUFLLFFBQVEsS0FBSztBQUFBLE1BRXZCO0FBQUEsYUFBSyxZQUFZLEtBQUs7QUFBQSxNQUMxQixJQUFJLEtBQUssa0JBQWtCO0FBQUEsUUFDdkIsS0FBSyxLQUFLLFVBQVU7QUFBQSxNQUN4QixJQUFJO0FBQUEsUUFDQSxHQUFHLEVBQUU7QUFBQSxNQUNULE9BQU8sS0FBSztBQUFBLElBQ2hCO0FBQUEsSUFHQSxLQUFLLE1BQU0sUUFBUTtBQUFBLE1BQ2YsSUFBSSxLQUFLLGtCQUFrQjtBQUFBLFFBQ3ZCLEtBQUssS0FBSyxVQUFVO0FBQUEsTUFDeEIsSUFBSTtBQUFBLFFBQ0EsR0FBRyxFQUFFO0FBQUEsTUFDVCxPQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUFBLElBR0EsSUFBSSxPQUFPLFVBQVUsY0FFZixhQUFhLEtBQUssY0FBYyxLQUFLLFVBQVUsV0FBVztBQUFBLE1BRTVELFFBQVEsT0FBTyxLQUFLLE9BQU8sUUFBUTtBQUFBLElBQ3ZDO0FBQUEsSUFDQSxJQUFJLE9BQU8sU0FBUyxLQUFLLEtBQUssS0FBSyxXQUFXO0FBQUEsTUFFMUMsUUFBUSxLQUFLLFNBQVMsTUFBTSxLQUFLO0FBQUEsSUFDckM7QUFBQSxJQUVBLElBQUksS0FBSyxZQUFZLEtBQUssa0JBQWtCO0FBQUEsTUFDeEMsS0FBSyxPQUFPLElBQUk7QUFBQSxJQUNwQixJQUFJLEtBQUs7QUFBQSxNQUNMLEtBQUssS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUV2QjtBQUFBLFdBQUssWUFBWSxLQUFLO0FBQUEsSUFDMUIsSUFBSSxLQUFLLGtCQUFrQjtBQUFBLE1BQ3ZCLEtBQUssS0FBSyxVQUFVO0FBQUEsSUFDeEIsSUFBSTtBQUFBLE1BQ0EsR0FBRyxFQUFFO0FBQUEsSUFDVCxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBZWhCLElBQUksQ0FBQyxHQUFHO0FBQUEsSUFDSixJQUFJLEtBQUs7QUFBQSxNQUNMLE9BQU87QUFBQSxJQUNYLEtBQUssYUFBYTtBQUFBLElBQ2xCLElBQUksS0FBSyxrQkFBa0IsS0FDdkIsTUFBTSxLQUNMLEtBQUssSUFBSSxLQUFLLGVBQWdCO0FBQUEsTUFDL0IsS0FBSyxnQkFBZ0I7QUFBQSxNQUNyQixPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsSUFBSSxLQUFLO0FBQUEsTUFDTCxJQUFJO0FBQUEsSUFDUixJQUFJLEtBQUssUUFBUSxTQUFTLE1BQU0sS0FBSyxhQUFhO0FBQUEsTUFHOUMsS0FBSyxVQUFVO0FBQUEsUUFDVixLQUFLLFlBQ0EsS0FBSyxRQUFRLEtBQUssRUFBRSxJQUNwQixPQUFPLE9BQU8sS0FBSyxTQUFTLEtBQUssYUFBYTtBQUFBLE1BQ3hEO0FBQUEsSUFDSjtBQUFBLElBQ0EsTUFBTSxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxRQUFRLEVBQUU7QUFBQSxJQUNqRCxLQUFLLGdCQUFnQjtBQUFBLElBQ3JCLE9BQU87QUFBQTtBQUFBLEdBRVYsS0FBSyxDQUFDLEdBQUcsT0FBTztBQUFBLElBQ2IsSUFBSSxLQUFLO0FBQUEsTUFDTCxLQUFLLGFBQWE7QUFBQSxJQUNqQjtBQUFBLE1BQ0QsTUFBTSxJQUFJO0FBQUEsTUFDVixJQUFJLE1BQU0sRUFBRSxVQUFVLE1BQU07QUFBQSxRQUN4QixLQUFLLGFBQWE7QUFBQSxNQUNqQixTQUFJLE9BQU8sTUFBTSxVQUFVO0FBQUEsUUFDNUIsS0FBSyxRQUFRLEtBQUssRUFBRSxNQUFNLENBQUM7QUFBQSxRQUMzQixRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUM7QUFBQSxRQUNwQixLQUFLLGlCQUFpQjtBQUFBLE1BQzFCLEVBQ0s7QUFBQSxRQUNELEtBQUssUUFBUSxLQUFLLEVBQUUsU0FBUyxDQUFDO0FBQUEsUUFDOUIsUUFBUSxFQUFFLFNBQVMsR0FBRyxDQUFDO0FBQUEsUUFDdkIsS0FBSyxpQkFBaUI7QUFBQTtBQUFBO0FBQUEsSUFHOUIsS0FBSyxLQUFLLFFBQVEsS0FBSztBQUFBLElBQ3ZCLEtBQUssS0FBSyxRQUFRLFdBQVcsS0FBSztBQUFBLE1BQzlCLEtBQUssS0FBSyxPQUFPO0FBQUEsSUFDckIsT0FBTztBQUFBO0FBQUEsRUFFWCxHQUFHLENBQUMsT0FBTyxVQUFVLElBQUk7QUFBQSxJQUNyQixJQUFJLE9BQU8sVUFBVSxZQUFZO0FBQUEsTUFDN0IsS0FBSztBQUFBLE1BQ0wsUUFBUTtBQUFBLElBQ1o7QUFBQSxJQUNBLElBQUksT0FBTyxhQUFhLFlBQVk7QUFBQSxNQUNoQyxLQUFLO0FBQUEsTUFDTCxXQUFXO0FBQUEsSUFDZjtBQUFBLElBQ0EsSUFBSSxVQUFVO0FBQUEsTUFDVixLQUFLLE1BQU0sT0FBTyxRQUFRO0FBQUEsSUFDOUIsSUFBSTtBQUFBLE1BQ0EsS0FBSyxLQUFLLE9BQU8sRUFBRTtBQUFBLElBQ3ZCLEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxXQUFXO0FBQUEsSUFLaEIsSUFBSSxLQUFLLGFBQWEsS0FBSztBQUFBLE1BQ3ZCLEtBQUssZ0JBQWdCO0FBQUEsSUFDekIsT0FBTztBQUFBO0FBQUEsR0FHVixPQUFPLEdBQUc7QUFBQSxJQUNQLElBQUksS0FBSztBQUFBLE1BQ0w7QUFBQSxJQUNKLEtBQUssS0FBSyxtQkFBbUIsS0FBSyxPQUFPLFFBQVE7QUFBQSxNQUM3QyxLQUFLLGFBQWE7QUFBQSxJQUN0QjtBQUFBLElBQ0EsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFdBQVc7QUFBQSxJQUNoQixLQUFLLEtBQUssUUFBUTtBQUFBLElBQ2xCLElBQUksS0FBSyxRQUFRO0FBQUEsTUFDYixLQUFLLE9BQU87QUFBQSxJQUNYLFNBQUksS0FBSztBQUFBLE1BQ1YsS0FBSyxnQkFBZ0I7QUFBQSxJQUVyQjtBQUFBLFdBQUssS0FBSyxPQUFPO0FBQUE7QUFBQSxFQVd6QixNQUFNLEdBQUc7QUFBQSxJQUNMLE9BQU8sS0FBSyxRQUFRO0FBQUE7QUFBQSxFQUt4QixLQUFLLEdBQUc7QUFBQSxJQUNKLEtBQUssV0FBVztBQUFBLElBQ2hCLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxhQUFhO0FBQUE7QUFBQSxNQUtsQixTQUFTLEdBQUc7QUFBQSxJQUNaLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFNWixPQUFPLEdBQUc7QUFBQSxJQUNWLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFLWixNQUFNLEdBQUc7QUFBQSxJQUNULE9BQU8sS0FBSztBQUFBO0FBQUEsR0FFZixXQUFXLENBQUMsT0FBTztBQUFBLElBQ2hCLElBQUksS0FBSztBQUFBLE1BQ0wsS0FBSyxpQkFBaUI7QUFBQSxJQUV0QjtBQUFBLFdBQUssaUJBQWlCLE1BQU07QUFBQSxJQUNoQyxLQUFLLFFBQVEsS0FBSyxLQUFLO0FBQUE7QUFBQSxHQUUxQixZQUFZLEdBQUc7QUFBQSxJQUNaLElBQUksS0FBSztBQUFBLE1BQ0wsS0FBSyxpQkFBaUI7QUFBQSxJQUV0QjtBQUFBLFdBQUssaUJBQWlCLEtBQUssUUFBUSxHQUFHO0FBQUEsSUFDMUMsT0FBTyxLQUFLLFFBQVEsTUFBTTtBQUFBO0FBQUEsR0FFN0IsTUFBTSxDQUFDLFVBQVUsT0FBTztBQUFBLElBQ3JCLEdBQUcsQ0FBRSxTQUFTLEtBQUssWUFBWSxLQUFLLGFBQWEsQ0FBQyxLQUM5QyxLQUFLLFFBQVE7QUFBQSxJQUNqQixLQUFLLFlBQVksS0FBSyxRQUFRLFdBQVcsS0FBSztBQUFBLE1BQzFDLEtBQUssS0FBSyxPQUFPO0FBQUE7QUFBQSxHQUV4QixXQUFXLENBQUMsT0FBTztBQUFBLElBQ2hCLEtBQUssS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUN2QixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBT2hCLElBQUksQ0FBQyxNQUFNLE1BQU07QUFBQSxJQUNiLElBQUksS0FBSztBQUFBLE1BQ0wsT0FBTztBQUFBLElBQ1gsS0FBSyxhQUFhO0FBQUEsSUFDbEIsTUFBTSxRQUFRLEtBQUs7QUFBQSxJQUNuQixPQUFPLFFBQVEsQ0FBQztBQUFBLElBQ2hCLElBQUksU0FBUyxLQUFLLFVBQVUsU0FBUyxLQUFLO0FBQUEsTUFDdEMsS0FBSyxNQUFNO0FBQUEsSUFFWDtBQUFBLFdBQUssTUFBTSxLQUFLLFFBQVE7QUFBQSxJQUM1QixLQUFLLGdCQUFnQixLQUFLO0FBQUEsSUFFMUIsSUFBSSxPQUFPO0FBQUEsTUFDUCxJQUFJLEtBQUs7QUFBQSxRQUNMLEtBQUssSUFBSTtBQUFBLElBQ2pCLEVBQ0s7QUFBQSxNQUdELEtBQUssT0FBTyxNQUFNLEtBQUssY0FDakIsSUFBSSxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQ3pCLElBQUksZ0JBQWdCLE1BQU0sTUFBTSxJQUFJLENBQUM7QUFBQSxNQUMzQyxJQUFJLEtBQUs7QUFBQSxRQUNMLE1BQU0sTUFBTSxLQUFLLFFBQVEsQ0FBQztBQUFBLE1BRTFCO0FBQUEsYUFBSyxRQUFRO0FBQUE7QUFBQSxJQUVyQixPQUFPO0FBQUE7QUFBQSxFQVVYLE1BQU0sQ0FBQyxNQUFNO0FBQUEsSUFDVCxNQUFNLElBQUksS0FBSyxPQUFPLEtBQUssUUFBSyxHQUFFLFNBQVMsSUFBSTtBQUFBLElBQy9DLElBQUksR0FBRztBQUFBLE1BQ0gsSUFBSSxLQUFLLE9BQU8sV0FBVyxHQUFHO0FBQUEsUUFDMUIsSUFBSSxLQUFLLFlBQVksS0FBSyxtQkFBbUIsR0FBRztBQUFBLFVBQzVDLEtBQUssV0FBVztBQUFBLFFBQ3BCO0FBQUEsUUFDQSxLQUFLLFNBQVMsQ0FBQztBQUFBLE1BQ25CLEVBRUk7QUFBQSxhQUFLLE9BQU8sT0FBTyxLQUFLLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUFBLE1BQ2hELEVBQUUsT0FBTztBQUFBLElBQ2I7QUFBQTtBQUFBLEVBS0osV0FBVyxDQUFDLElBQUksU0FBUztBQUFBLElBQ3JCLE9BQU8sS0FBSyxHQUFHLElBQUksT0FBTztBQUFBO0FBQUEsRUFtQjlCLEVBQUUsQ0FBQyxJQUFJLFNBQVM7QUFBQSxJQUNaLE1BQU0sTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPO0FBQUEsSUFDaEMsSUFBSSxPQUFPLFFBQVE7QUFBQSxNQUNmLEtBQUssYUFBYTtBQUFBLE1BQ2xCLEtBQUs7QUFBQSxNQUNMLEtBQUssS0FBSyxPQUFPLFdBQVcsS0FBSyxVQUFVO0FBQUEsUUFDdkMsS0FBSyxRQUFRO0FBQUEsTUFDakI7QUFBQSxJQUNKLEVBQ0ssU0FBSSxPQUFPLGNBQWMsS0FBSyxrQkFBa0IsR0FBRztBQUFBLE1BQ3BELE1BQU0sS0FBSyxVQUFVO0FBQUEsSUFDekIsRUFDSyxTQUFJLFNBQVMsRUFBRSxLQUFLLEtBQUssY0FBYztBQUFBLE1BQ3hDLE1BQU0sS0FBSyxFQUFFO0FBQUEsTUFDYixLQUFLLG1CQUFtQixFQUFFO0FBQUEsSUFDOUIsRUFDSyxTQUFJLE9BQU8sV0FBVyxLQUFLLGdCQUFnQjtBQUFBLE1BQzVDLE1BQU0sSUFBSTtBQUFBLE1BQ1YsSUFBSSxLQUFLO0FBQUEsUUFDTCxNQUFNLE1BQU0sRUFBRSxLQUFLLE1BQU0sS0FBSyxjQUFjLENBQUM7QUFBQSxNQUU3QztBQUFBLFVBQUUsS0FBSyxNQUFNLEtBQUssY0FBYztBQUFBLElBQ3hDO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUtYLGNBQWMsQ0FBQyxJQUFJLFNBQVM7QUFBQSxJQUN4QixPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU87QUFBQTtBQUFBLEVBVS9CLEdBQUcsQ0FBQyxJQUFJLFNBQVM7QUFBQSxJQUNiLE1BQU0sTUFBTSxNQUFNLElBQUksSUFBSSxPQUFPO0FBQUEsSUFJakMsSUFBSSxPQUFPLFFBQVE7QUFBQSxNQUNmLEtBQUssaUJBQWlCLEtBQUssVUFBVSxNQUFNLEVBQUU7QUFBQSxNQUM3QyxJQUFJLEtBQUssbUJBQW1CLE1BQ3ZCLEtBQUssZUFDTCxLQUFLLE9BQU8sUUFBUTtBQUFBLFFBQ3JCLEtBQUssV0FBVztBQUFBLE1BQ3BCO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFVWCxrQkFBa0IsQ0FBQyxJQUFJO0FBQUEsSUFDbkIsTUFBTSxNQUFNLE1BQU0sbUJBQW1CLEVBQUU7QUFBQSxJQUN2QyxJQUFJLE9BQU8sVUFBVSxPQUFPLFdBQVc7QUFBQSxNQUNuQyxLQUFLLGlCQUFpQjtBQUFBLE1BQ3RCLEtBQUssS0FBSyxlQUFlLEtBQUssT0FBTyxRQUFRO0FBQUEsUUFDekMsS0FBSyxXQUFXO0FBQUEsTUFDcEI7QUFBQSxJQUNKO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxNQUtQLFVBQVUsR0FBRztBQUFBLElBQ2IsT0FBTyxLQUFLO0FBQUE7QUFBQSxHQUVmLGVBQWUsR0FBRztBQUFBLElBQ2YsS0FBSyxLQUFLLGtCQUNMLEtBQUssaUJBQ0wsS0FBSyxjQUNOLEtBQUssUUFBUSxXQUFXLEtBQ3hCLEtBQUssTUFBTTtBQUFBLE1BQ1gsS0FBSyxnQkFBZ0I7QUFBQSxNQUNyQixLQUFLLEtBQUssS0FBSztBQUFBLE1BQ2YsS0FBSyxLQUFLLFdBQVc7QUFBQSxNQUNyQixLQUFLLEtBQUssUUFBUTtBQUFBLE1BQ2xCLElBQUksS0FBSztBQUFBLFFBQ0wsS0FBSyxLQUFLLE9BQU87QUFBQSxNQUNyQixLQUFLLGdCQUFnQjtBQUFBLElBQ3pCO0FBQUE7QUFBQSxFQTBCSixJQUFJLENBQUMsT0FBTyxNQUFNO0FBQUEsSUFDZCxNQUFNLE9BQU8sS0FBSztBQUFBLElBRWxCLElBQUksT0FBTyxXQUNQLE9BQU8sV0FDUCxPQUFPLGFBQ1AsS0FBSyxZQUFZO0FBQUEsTUFDakIsT0FBTztBQUFBLElBQ1gsRUFDSyxTQUFJLE9BQU8sUUFBUTtBQUFBLE1BQ3BCLFFBQVEsS0FBSyxnQkFBZ0IsT0FDdkIsUUFDQSxLQUFLLFVBQ0EsTUFBTSxNQUFNLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBRyxRQUNwQyxLQUFLLFVBQVUsSUFBSTtBQUFBLElBQ2pDLEVBQ0ssU0FBSSxPQUFPLE9BQU87QUFBQSxNQUNuQixPQUFPLEtBQUssU0FBUztBQUFBLElBQ3pCLEVBQ0ssU0FBSSxPQUFPLFNBQVM7QUFBQSxNQUNyQixLQUFLLFVBQVU7QUFBQSxNQUVmLEtBQUssS0FBSyxpQkFBaUIsS0FBSztBQUFBLFFBQzVCLE9BQU87QUFBQSxNQUNYLE1BQU0sT0FBTSxNQUFNLEtBQUssT0FBTztBQUFBLE1BQzlCLEtBQUssbUJBQW1CLE9BQU87QUFBQSxNQUMvQixPQUFPO0FBQUEsSUFDWCxFQUNLLFNBQUksT0FBTyxTQUFTO0FBQUEsTUFDckIsS0FBSyxpQkFBaUI7QUFBQSxNQUN0QixNQUFNLEtBQUssT0FBTyxJQUFJO0FBQUEsTUFDdEIsTUFBTSxRQUFPLEtBQUssV0FBVyxLQUFLLFVBQVUsT0FBTyxFQUFFLFNBQy9DLE1BQU0sS0FBSyxTQUFTLElBQUksSUFDeEI7QUFBQSxNQUNOLEtBQUssZ0JBQWdCO0FBQUEsTUFDckIsT0FBTztBQUFBLElBQ1gsRUFDSyxTQUFJLE9BQU8sVUFBVTtBQUFBLE1BQ3RCLE1BQU0sT0FBTSxNQUFNLEtBQUssUUFBUTtBQUFBLE1BQy9CLEtBQUssZ0JBQWdCO0FBQUEsTUFDckIsT0FBTztBQUFBLElBQ1gsRUFDSyxTQUFJLE9BQU8sWUFBWSxPQUFPLGFBQWE7QUFBQSxNQUM1QyxNQUFNLE9BQU0sTUFBTSxLQUFLLEVBQUU7QUFBQSxNQUN6QixLQUFLLG1CQUFtQixFQUFFO0FBQUEsTUFDMUIsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUVBLE1BQU0sTUFBTSxNQUFNLEtBQUssSUFBSSxHQUFHLElBQUk7QUFBQSxJQUNsQyxLQUFLLGdCQUFnQjtBQUFBLElBQ3JCLE9BQU87QUFBQTtBQUFBLEdBRVYsU0FBUyxDQUFDLE1BQU07QUFBQSxJQUNiLFdBQVcsS0FBSyxLQUFLLFFBQVE7QUFBQSxNQUN6QixJQUFJLEVBQUUsS0FBSyxNQUFNLElBQUksTUFBTTtBQUFBLFFBQ3ZCLEtBQUssTUFBTTtBQUFBLElBQ25CO0FBQUEsSUFDQSxNQUFNLE1BQU0sS0FBSyxhQUFhLFFBQVEsTUFBTSxLQUFLLFFBQVEsSUFBSTtBQUFBLElBQzdELEtBQUssZ0JBQWdCO0FBQUEsSUFDckIsT0FBTztBQUFBO0FBQUEsR0FFVixRQUFRLEdBQUc7QUFBQSxJQUNSLElBQUksS0FBSztBQUFBLE1BQ0wsT0FBTztBQUFBLElBQ1gsS0FBSyxlQUFlO0FBQUEsSUFDcEIsS0FBSyxXQUFXO0FBQUEsSUFDaEIsT0FBTyxLQUFLLFVBQ0wsTUFBTSxNQUFNLEtBQUssVUFBVSxDQUFDLEdBQUcsUUFDaEMsS0FBSyxVQUFVO0FBQUE7QUFBQSxHQUV4QixTQUFTLEdBQUc7QUFBQSxJQUNULElBQUksS0FBSyxVQUFVO0FBQUEsTUFDZixNQUFNLE9BQU8sS0FBSyxTQUFTLElBQUk7QUFBQSxNQUMvQixJQUFJLE1BQU07QUFBQSxRQUNOLFdBQVcsS0FBSyxLQUFLLFFBQVE7QUFBQSxVQUN6QixFQUFFLEtBQUssTUFBTSxJQUFJO0FBQUEsUUFDckI7QUFBQSxRQUNBLEtBQUssS0FBSztBQUFBLFVBQ04sTUFBTSxLQUFLLFFBQVEsSUFBSTtBQUFBLE1BQy9CO0FBQUEsSUFDSjtBQUFBLElBQ0EsV0FBVyxLQUFLLEtBQUssUUFBUTtBQUFBLE1BQ3pCLEVBQUUsSUFBSTtBQUFBLElBQ1Y7QUFBQSxJQUNBLE1BQU0sTUFBTSxNQUFNLEtBQUssS0FBSztBQUFBLElBQzVCLEtBQUssbUJBQW1CLEtBQUs7QUFBQSxJQUM3QixPQUFPO0FBQUE7QUFBQSxPQU1MLFFBQU8sR0FBRztBQUFBLElBQ1osTUFBTSxNQUFNLE9BQU8sT0FBTyxDQUFDLEdBQUc7QUFBQSxNQUMxQixZQUFZO0FBQUEsSUFDaEIsQ0FBQztBQUFBLElBQ0QsS0FBSyxLQUFLO0FBQUEsTUFDTixJQUFJLGFBQWE7QUFBQSxJQUdyQixNQUFNLElBQUksS0FBSyxRQUFRO0FBQUEsSUFDdkIsS0FBSyxHQUFHLFFBQVEsT0FBSztBQUFBLE1BQ2pCLElBQUksS0FBSyxDQUFDO0FBQUEsTUFDVixLQUFLLEtBQUs7QUFBQSxRQUNOLElBQUksY0FBYyxFQUFFO0FBQUEsS0FDM0I7QUFBQSxJQUNELE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQTtBQUFBLE9BUUwsT0FBTSxHQUFHO0FBQUEsSUFDWCxJQUFJLEtBQUssYUFBYTtBQUFBLE1BQ2xCLE1BQU0sSUFBSSxNQUFNLDZCQUE2QjtBQUFBLElBQ2pEO0FBQUEsSUFDQSxNQUFNLE1BQU0sTUFBTSxLQUFLLFFBQVE7QUFBQSxJQUMvQixPQUFRLEtBQUssWUFDUCxJQUFJLEtBQUssRUFBRSxJQUNYLE9BQU8sT0FBTyxLQUFLLElBQUksVUFBVTtBQUFBO0FBQUEsT0FLckMsUUFBTyxHQUFHO0FBQUEsSUFDWixPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUFBLE1BQ3BDLEtBQUssR0FBRyxXQUFXLE1BQU0sT0FBTyxJQUFJLE1BQU0sa0JBQWtCLENBQUMsQ0FBQztBQUFBLE1BQzlELEtBQUssR0FBRyxTQUFTLFFBQU0sT0FBTyxFQUFFLENBQUM7QUFBQSxNQUNqQyxLQUFLLEdBQUcsT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUFBLEtBQ2pDO0FBQUE7QUFBQSxHQU9KLE9BQU8sY0FBYyxHQUFHO0FBQUEsSUFHckIsS0FBSyxhQUFhO0FBQUEsSUFDbEIsSUFBSSxVQUFVO0FBQUEsSUFDZCxNQUFNLE9BQU8sWUFBWTtBQUFBLE1BQ3JCLEtBQUssTUFBTTtBQUFBLE1BQ1gsVUFBVTtBQUFBLE1BQ1YsT0FBTyxFQUFFLE9BQU8sV0FBVyxNQUFNLEtBQUs7QUFBQTtBQUFBLElBRTFDLE1BQU0sT0FBTyxNQUFNO0FBQUEsTUFDZixJQUFJO0FBQUEsUUFDQSxPQUFPLEtBQUs7QUFBQSxNQUNoQixNQUFNLE1BQU0sS0FBSyxLQUFLO0FBQUEsTUFDdEIsSUFBSSxRQUFRO0FBQUEsUUFDUixPQUFPLFFBQVEsUUFBUSxFQUFFLE1BQU0sT0FBTyxPQUFPLElBQUksQ0FBQztBQUFBLE1BQ3RELElBQUksS0FBSztBQUFBLFFBQ0wsT0FBTyxLQUFLO0FBQUEsTUFDaEIsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osTUFBTSxRQUFRLENBQUMsT0FBTztBQUFBLFFBQ2xCLEtBQUssSUFBSSxRQUFRLE1BQU07QUFBQSxRQUN2QixLQUFLLElBQUksT0FBTyxLQUFLO0FBQUEsUUFDckIsS0FBSyxJQUFJLFdBQVcsU0FBUztBQUFBLFFBQzdCLEtBQUs7QUFBQSxRQUNMLE9BQU8sRUFBRTtBQUFBO0FBQUEsTUFFYixNQUFNLFNBQVMsQ0FBQyxVQUFVO0FBQUEsUUFDdEIsS0FBSyxJQUFJLFNBQVMsS0FBSztBQUFBLFFBQ3ZCLEtBQUssSUFBSSxPQUFPLEtBQUs7QUFBQSxRQUNyQixLQUFLLElBQUksV0FBVyxTQUFTO0FBQUEsUUFDN0IsS0FBSyxNQUFNO0FBQUEsUUFDWCxRQUFRLEVBQUUsT0FBTyxRQUFRLEtBQUssS0FBSyxDQUFDO0FBQUE7QUFBQSxNQUV4QyxNQUFNLFFBQVEsTUFBTTtBQUFBLFFBQ2hCLEtBQUssSUFBSSxTQUFTLEtBQUs7QUFBQSxRQUN2QixLQUFLLElBQUksUUFBUSxNQUFNO0FBQUEsUUFDdkIsS0FBSyxJQUFJLFdBQVcsU0FBUztBQUFBLFFBQzdCLEtBQUs7QUFBQSxRQUNMLFFBQVEsRUFBRSxNQUFNLE1BQU0sT0FBTyxVQUFVLENBQUM7QUFBQTtBQUFBLE1BRTVDLE1BQU0sWUFBWSxNQUFNLE1BQU0sSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQUEsTUFDM0QsT0FBTyxJQUFJLFFBQVEsQ0FBQyxNQUFLLFFBQVE7QUFBQSxRQUM3QixTQUFTO0FBQUEsUUFDVCxVQUFVO0FBQUEsUUFDVixLQUFLLEtBQUssV0FBVyxTQUFTO0FBQUEsUUFDOUIsS0FBSyxLQUFLLFNBQVMsS0FBSztBQUFBLFFBQ3hCLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFBQSxRQUN0QixLQUFLLEtBQUssUUFBUSxNQUFNO0FBQUEsT0FDM0I7QUFBQTtBQUFBLElBRUwsT0FBTztBQUFBLE1BQ0g7QUFBQSxNQUNBLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxPQUNQLE9BQU8sY0FBYyxHQUFHO0FBQUEsUUFDckIsT0FBTztBQUFBO0FBQUEsSUFFZjtBQUFBO0FBQUEsR0FRSCxPQUFPLFNBQVMsR0FBRztBQUFBLElBR2hCLEtBQUssYUFBYTtBQUFBLElBQ2xCLElBQUksVUFBVTtBQUFBLElBQ2QsTUFBTSxPQUFPLE1BQU07QUFBQSxNQUNmLEtBQUssTUFBTTtBQUFBLE1BQ1gsS0FBSyxJQUFJLE9BQU8sSUFBSTtBQUFBLE1BQ3BCLEtBQUssSUFBSSxXQUFXLElBQUk7QUFBQSxNQUN4QixLQUFLLElBQUksT0FBTyxJQUFJO0FBQUEsTUFDcEIsVUFBVTtBQUFBLE1BQ1YsT0FBTyxFQUFFLE1BQU0sTUFBTSxPQUFPLFVBQVU7QUFBQTtBQUFBLElBRTFDLE1BQU0sT0FBTyxNQUFNO0FBQUEsTUFDZixJQUFJO0FBQUEsUUFDQSxPQUFPLEtBQUs7QUFBQSxNQUNoQixNQUFNLFFBQVEsS0FBSyxLQUFLO0FBQUEsTUFDeEIsT0FBTyxVQUFVLE9BQU8sS0FBSyxJQUFJLEVBQUUsTUFBTSxPQUFPLE1BQU07QUFBQTtBQUFBLElBRTFELEtBQUssS0FBSyxPQUFPLElBQUk7QUFBQSxJQUNyQixLQUFLLEtBQUssT0FBTyxJQUFJO0FBQUEsSUFDckIsS0FBSyxLQUFLLFdBQVcsSUFBSTtBQUFBLElBQ3pCLE9BQU87QUFBQSxNQUNIO0FBQUEsTUFDQSxPQUFPO0FBQUEsTUFDUCxRQUFRO0FBQUEsT0FDUCxPQUFPLFNBQVMsR0FBRztBQUFBLFFBQ2hCLE9BQU87QUFBQTtBQUFBLElBRWY7QUFBQTtBQUFBLEVBY0osT0FBTyxDQUFDLElBQUk7QUFBQSxJQUNSLElBQUksS0FBSyxZQUFZO0FBQUEsTUFDakIsSUFBSTtBQUFBLFFBQ0EsS0FBSyxLQUFLLFNBQVMsRUFBRTtBQUFBLE1BRXJCO0FBQUEsYUFBSyxLQUFLLFNBQVM7QUFBQSxNQUN2QixPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsS0FBSyxhQUFhO0FBQUEsSUFDbEIsS0FBSyxhQUFhO0FBQUEsSUFFbEIsS0FBSyxRQUFRLFNBQVM7QUFBQSxJQUN0QixLQUFLLGdCQUFnQjtBQUFBLElBQ3JCLE1BQU0sS0FBSztBQUFBLElBQ1gsSUFBSSxPQUFPLEdBQUcsVUFBVSxlQUFlLEtBQUs7QUFBQSxNQUN4QyxHQUFHLE1BQU07QUFBQSxJQUNiLElBQUk7QUFBQSxNQUNBLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFBQSxJQUdyQjtBQUFBLFdBQUssS0FBSyxTQUFTO0FBQUEsSUFDdkIsT0FBTztBQUFBO0FBQUEsYUFTQSxRQUFRLEdBQUc7QUFBQSxJQUNsQixPQUFPO0FBQUE7QUFFZjs7O0FEbi9CQSxJQUFNLGVBQWUsSUFBSTtBQUt6QixJQUFNLFlBQVk7QUFBQSxFQUNkO0FBQUEsRUFDQSxTQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxVQUFVO0FBQUEsSUFDTjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0o7QUFDSjtBQUVBLElBQU0sZUFBZSxDQUFDLGNBQWMsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUNuRixZQUNFO0FBQUEsS0FDSztBQUFBLEtBQ0E7QUFBQSxFQUNILFVBQVU7QUFBQSxPQUNILFVBQVU7QUFBQSxPQUNULFNBQVMsWUFBWSxDQUFDO0FBQUEsRUFDOUI7QUFDSjtBQUVKLElBQU0saUJBQWlCO0FBQ3ZCLElBQU0sYUFBYSxDQUFDLGFBQWEsU0FBUyxRQUFRLE9BQU8sSUFBSSxFQUFFLFFBQVEsZ0JBQWdCLE1BQU07QUFFN0YsSUFBTSxZQUFZO0FBQ2xCLElBQU0sVUFBVTtBQUNoQixJQUFNLFFBQVE7QUFDZCxJQUFNLFFBQVE7QUFDZCxJQUFNLFFBQVE7QUFDZCxJQUFNLFFBQVE7QUFDZCxJQUFNLFFBQVE7QUFDZCxJQUFNLFFBQVE7QUFDZCxJQUFNLFNBQVM7QUFDZixJQUFNLE9BQU87QUFFYixJQUFNLGdCQUFnQjtBQUV0QixJQUFNLGlCQUFpQjtBQUV2QixJQUFNLGVBQWU7QUFFckIsSUFBTSxVQUFVO0FBR2hCLElBQU0sU0FBUztBQUdmLElBQU0sY0FBYztBQUVwQixJQUFNLGNBQWM7QUFDcEIsSUFBTSxXQUFXLFVBQVUsU0FBUztBQUNwQyxJQUFNLFdBQVc7QUFDakIsSUFBTSxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxRQUNoQyxFQUFFLFlBQVksSUFBSSxRQUNkLEVBQUUsZUFBZSxJQUFJLFFBQ2pCLEVBQUUsa0JBQWtCLElBQUksUUFDcEIsRUFBRSxjQUFjLElBQUksUUFDaEIsRUFBRSxTQUFTLElBQUksU0FDWCxFQUFFLE9BQU8sSUFBSSxRQUNUO0FBRTlCLElBQU0saUJBQWlCLElBQUk7QUFDM0IsSUFBTSxZQUFZLENBQUMsTUFBTTtBQUFBLEVBQ3JCLE1BQU0sSUFBSSxlQUFlLElBQUksQ0FBQztBQUFBLEVBQzlCLElBQUk7QUFBQSxJQUNBLE9BQU87QUFBQSxFQUNYLE1BQU0sSUFBSSxFQUFFLFVBQVUsTUFBTTtBQUFBLEVBQzVCLGVBQWUsSUFBSSxHQUFHLENBQUM7QUFBQSxFQUN2QixPQUFPO0FBQUE7QUFFWCxJQUFNLHVCQUF1QixJQUFJO0FBQ2pDLElBQU0sa0JBQWtCLENBQUMsTUFBTTtBQUFBLEVBQzNCLE1BQU0sSUFBSSxxQkFBcUIsSUFBSSxDQUFDO0FBQUEsRUFDcEMsSUFBSTtBQUFBLElBQ0EsT0FBTztBQUFBLEVBQ1gsTUFBTSxJQUFJLFVBQVUsRUFBRSxZQUFZLENBQUM7QUFBQSxFQUNuQyxxQkFBcUIsSUFBSSxHQUFHLENBQUM7QUFBQSxFQUM3QixPQUFPO0FBQUE7QUFBQTtBQU1KLE1BQU0scUJBQXFCLFNBQVM7QUFBQSxFQUN2QyxXQUFXLEdBQUc7QUFBQSxJQUNWLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQztBQUFBO0FBRTFCO0FBQUE7QUFnQk8sTUFBTSxzQkFBc0IsU0FBUztBQUFBLEVBQ3hDLFdBQVcsQ0FBQyxVQUFVLEtBQUssTUFBTTtBQUFBLElBQzdCLE1BQU07QUFBQSxNQUNGO0FBQUEsTUFFQSxpQkFBaUIsT0FBSyxFQUFFLFNBQVM7QUFBQSxJQUNyQyxDQUFDO0FBQUE7QUFFVDtBQUNBLElBQU0sV0FBVyxPQUFPLHFCQUFxQjtBQUFBO0FBY3RDLE1BQU0sU0FBUztBQUFBLEVBVWxCO0FBQUEsRUFNQTtBQUFBLEVBTUE7QUFBQSxFQU1BO0FBQUEsRUFLQTtBQUFBLEVBS0EsUUFBUTtBQUFBLEVBRVI7QUFBQSxFQUVBO0FBQUEsTUFDSSxHQUFHLEdBQUc7QUFBQSxJQUNOLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFaEI7QUFBQSxNQUNJLElBQUksR0FBRztBQUFBLElBQ1AsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUVoQjtBQUFBLE1BQ0ksS0FBSyxHQUFHO0FBQUEsSUFDUixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBRWhCO0FBQUEsTUFDSSxHQUFHLEdBQUc7QUFBQSxJQUNOLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFaEI7QUFBQSxNQUNJLEdBQUcsR0FBRztBQUFBLElBQ04sT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUVoQjtBQUFBLE1BQ0ksSUFBSSxHQUFHO0FBQUEsSUFDUCxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBRWhCO0FBQUEsTUFDSSxPQUFPLEdBQUc7QUFBQSxJQUNWLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFaEI7QUFBQSxNQUNJLEdBQUcsR0FBRztBQUFBLElBQ04sT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUVoQjtBQUFBLE1BQ0ksSUFBSSxHQUFHO0FBQUEsSUFDUCxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBRWhCO0FBQUEsTUFDSSxNQUFNLEdBQUc7QUFBQSxJQUNULE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFaEI7QUFBQSxNQUNJLE9BQU8sR0FBRztBQUFBLElBQ1YsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUVoQjtBQUFBLE1BQ0ksT0FBTyxHQUFHO0FBQUEsSUFDVixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBRWhCO0FBQUEsTUFDSSxPQUFPLEdBQUc7QUFBQSxJQUNWLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFaEI7QUFBQSxNQUNJLFdBQVcsR0FBRztBQUFBLElBQ2QsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUVoQjtBQUFBLE1BQ0ksS0FBSyxHQUFHO0FBQUEsSUFDUixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBRWhCO0FBQUEsTUFDSSxLQUFLLEdBQUc7QUFBQSxJQUNSLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFaEI7QUFBQSxNQUNJLEtBQUssR0FBRztBQUFBLElBQ1IsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUVoQjtBQUFBLE1BQ0ksU0FBUyxHQUFHO0FBQUEsSUFDWixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBRWhCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsTUFPSSxVQUFVLEdBQUc7QUFBQSxJQUNiLFFBQVEsS0FBSyxVQUFVLE1BQU0sU0FBUztBQUFBO0FBQUEsTUFRdEMsSUFBSSxHQUFHO0FBQUEsSUFDUCxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBUWhCLFdBQVcsQ0FBQyxNQUFNLE9BQU8sU0FBUyxNQUFNLE9BQU8sUUFBUSxVQUFVLE1BQU07QUFBQSxJQUNuRSxLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssYUFBYSxTQUFTLGdCQUFnQixJQUFJLElBQUksVUFBVSxJQUFJO0FBQUEsSUFDakUsS0FBSyxRQUFRLE9BQU87QUFBQSxJQUNwQixLQUFLLFNBQVM7QUFBQSxJQUNkLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxPQUFPLFFBQVE7QUFBQSxJQUNwQixLQUFLLFlBQVk7QUFBQSxJQUNqQixLQUFLLFlBQVksS0FBSztBQUFBLElBQ3RCLEtBQUssWUFBWSxLQUFLO0FBQUEsSUFDdEIsS0FBSyxpQkFBaUIsS0FBSztBQUFBLElBQzNCLEtBQUssU0FBUyxLQUFLO0FBQUEsSUFDbkIsSUFBSSxLQUFLLFFBQVE7QUFBQSxNQUNiLEtBQUssTUFBTSxLQUFLLE9BQU87QUFBQSxJQUMzQixFQUNLO0FBQUEsTUFDRCxLQUFLLE1BQU0sYUFBYSxLQUFLLEVBQUU7QUFBQTtBQUFBO0FBQUEsRUFRdkMsS0FBSyxHQUFHO0FBQUEsSUFDSixJQUFJLEtBQUssV0FBVztBQUFBLE1BQ2hCLE9BQU8sS0FBSztBQUFBLElBQ2hCLEtBQUssS0FBSztBQUFBLE1BQ04sT0FBUSxLQUFLLFNBQVM7QUFBQSxJQUMxQixPQUFRLEtBQUssU0FBUyxLQUFLLE9BQU8sTUFBTSxJQUFJO0FBQUE7QUFBQSxFQUtoRCxhQUFhLEdBQUc7QUFBQSxJQUNaLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFLaEIsT0FBTyxDQUFDLE9BQU07QUFBQSxJQUNWLEtBQUssT0FBTTtBQUFBLE1BQ1AsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLE1BQU0sV0FBVyxLQUFLLGNBQWMsS0FBSTtBQUFBLElBQ3hDLE1BQU0sTUFBTSxNQUFLLFVBQVUsU0FBUyxNQUFNO0FBQUEsSUFDMUMsTUFBTSxXQUFXLElBQUksTUFBTSxLQUFLLFFBQVE7QUFBQSxJQUN4QyxNQUFNLFNBQVMsV0FDWCxLQUFLLFFBQVEsUUFBUSxFQUFFLGNBQWMsUUFBUSxJQUMzQyxLQUFLLGNBQWMsUUFBUTtBQUFBLElBQ2pDLE9BQU87QUFBQTtBQUFBLEVBRVgsYUFBYSxDQUFDLFVBQVU7QUFBQSxJQUNwQixJQUFJLElBQUk7QUFBQSxJQUNSLFdBQVcsUUFBUSxVQUFVO0FBQUEsTUFDekIsSUFBSSxFQUFFLE1BQU0sSUFBSTtBQUFBLElBQ3BCO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQVVYLFFBQVEsR0FBRztBQUFBLElBQ1AsTUFBTSxTQUFTLEtBQUssVUFBVSxJQUFJLElBQUk7QUFBQSxJQUN0QyxJQUFJLFFBQVE7QUFBQSxNQUNSLE9BQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxNQUFNLFdBQVcsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQUEsSUFDckQsS0FBSyxVQUFVLElBQUksTUFBTSxRQUFRO0FBQUEsSUFDakMsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQWVYLEtBQUssQ0FBQyxVQUFVLE1BQU07QUFBQSxJQUNsQixJQUFJLGFBQWEsTUFBTSxhQUFhLEtBQUs7QUFBQSxNQUNyQyxPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsSUFBSSxhQUFhLE1BQU07QUFBQSxNQUNuQixPQUFPLEtBQUssVUFBVTtBQUFBLElBQzFCO0FBQUEsSUFFQSxNQUFNLFdBQVcsS0FBSyxTQUFTO0FBQUEsSUFDL0IsTUFBTSxPQUFPLEtBQUssU0FBUyxnQkFBZ0IsUUFBUSxJQUFJLFVBQVUsUUFBUTtBQUFBLElBQ3pFLFdBQVcsS0FBSyxVQUFVO0FBQUEsTUFDdEIsSUFBSSxFQUFFLGVBQWUsTUFBTTtBQUFBLFFBQ3ZCLE9BQU87QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUFBLElBSUEsTUFBTSxJQUFJLEtBQUssU0FBUyxLQUFLLE1BQU07QUFBQSxJQUNuQyxNQUFNLFdBQVcsS0FBSyxZQUFZLEtBQUssWUFBWSxJQUFJLFdBQVc7QUFBQSxJQUNsRSxNQUFNLFNBQVMsS0FBSyxTQUFTLFVBQVUsU0FBUztBQUFBLFNBQ3pDO0FBQUEsTUFDSCxRQUFRO0FBQUEsTUFDUjtBQUFBLElBQ0osQ0FBQztBQUFBLElBQ0QsS0FBSyxLQUFLLFdBQVcsR0FBRztBQUFBLE1BQ3BCLE9BQU8sU0FBUztBQUFBLElBQ3BCO0FBQUEsSUFHQSxTQUFTLEtBQUssTUFBTTtBQUFBLElBQ3BCLE9BQU87QUFBQTtBQUFBLEVBTVgsUUFBUSxHQUFHO0FBQUEsSUFDUCxJQUFJLEtBQUs7QUFBQSxNQUNMLE9BQU87QUFBQSxJQUNYLElBQUksS0FBSyxjQUFjLFdBQVc7QUFBQSxNQUM5QixPQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUFBLElBQ0EsTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUNsQixNQUFNLElBQUksS0FBSztBQUFBLElBQ2YsS0FBSyxHQUFHO0FBQUEsTUFDSixPQUFRLEtBQUssWUFBWSxLQUFLO0FBQUEsSUFDbEM7QUFBQSxJQUNBLE1BQU0sS0FBSyxFQUFFLFNBQVM7QUFBQSxJQUN0QixPQUFPLE9BQU8sT0FBTyxFQUFFLFNBQVMsS0FBSyxLQUFLLE9BQU87QUFBQTtBQUFBLEVBUXJELGFBQWEsR0FBRztBQUFBLElBQ1osSUFBSSxLQUFLLFFBQVE7QUFBQSxNQUNiLE9BQU8sS0FBSyxTQUFTO0FBQUEsSUFDekIsSUFBSSxLQUFLO0FBQUEsTUFDTCxPQUFPO0FBQUEsSUFDWCxJQUFJLEtBQUssbUJBQW1CO0FBQUEsTUFDeEIsT0FBTyxLQUFLO0FBQUEsSUFDaEIsTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUNsQixNQUFNLElBQUksS0FBSztBQUFBLElBQ2YsS0FBSyxHQUFHO0FBQUEsTUFDSixPQUFRLEtBQUssaUJBQWlCLEtBQUssY0FBYztBQUFBLElBQ3JEO0FBQUEsSUFDQSxNQUFNLEtBQUssRUFBRSxjQUFjO0FBQUEsSUFDM0IsT0FBTyxPQUFPLE9BQU8sRUFBRSxTQUFTLEtBQUssT0FBTztBQUFBO0FBQUEsRUFLaEQsUUFBUSxHQUFHO0FBQUEsSUFDUCxJQUFJLEtBQUssY0FBYyxXQUFXO0FBQUEsTUFDOUIsT0FBTyxLQUFLO0FBQUEsSUFDaEI7QUFBQSxJQUNBLE1BQU0sT0FBTyxLQUFLO0FBQUEsSUFDbEIsTUFBTSxJQUFJLEtBQUs7QUFBQSxJQUNmLEtBQUssR0FBRztBQUFBLE1BQ0osT0FBUSxLQUFLLFlBQVksS0FBSztBQUFBLElBQ2xDO0FBQUEsSUFDQSxNQUFNLEtBQUssRUFBRSxTQUFTO0FBQUEsSUFDdEIsTUFBTSxLQUFLLE9BQU8sRUFBRSxTQUFTLEtBQUssS0FBSyxPQUFPO0FBQUEsSUFDOUMsT0FBUSxLQUFLLFlBQVk7QUFBQTtBQUFBLEVBUTdCLGFBQWEsR0FBRztBQUFBLElBQ1osSUFBSSxLQUFLLG1CQUFtQjtBQUFBLE1BQ3hCLE9BQU8sS0FBSztBQUFBLElBQ2hCLElBQUksS0FBSyxRQUFRO0FBQUEsTUFDYixPQUFRLEtBQUssaUJBQWlCLEtBQUssU0FBUztBQUFBLElBQ2hELEtBQUssS0FBSyxRQUFRO0FBQUEsTUFDZCxNQUFNLEtBQUksS0FBSyxTQUFTLEVBQUUsUUFBUSxPQUFPLEdBQUc7QUFBQSxNQUM1QyxJQUFJLGFBQWEsS0FBSyxFQUFDLEdBQUc7QUFBQSxRQUN0QixPQUFRLEtBQUssaUJBQWlCLE9BQU87QUFBQSxNQUN6QyxFQUNLO0FBQUEsUUFDRCxPQUFRLEtBQUssaUJBQWlCO0FBQUE7QUFBQSxJQUV0QztBQUFBLElBQ0EsTUFBTSxJQUFJLEtBQUs7QUFBQSxJQUNmLE1BQU0sT0FBTyxFQUFFLGNBQWM7QUFBQSxJQUM3QixNQUFNLE1BQU0sU0FBUyxTQUFTLEVBQUUsU0FBUyxLQUFLLE9BQU8sS0FBSztBQUFBLElBQzFELE9BQVEsS0FBSyxpQkFBaUI7QUFBQTtBQUFBLEVBU2xDLFNBQVMsR0FBRztBQUFBLElBQ1IsUUFBUSxLQUFLLFFBQVEsVUFBVTtBQUFBO0FBQUEsRUFFbkMsTUFBTSxDQUFDLE1BQU07QUFBQSxJQUNULE9BQU8sS0FBSyxLQUFLLFFBQVE7QUFBQTtBQUFBLEVBRTdCLE9BQU8sR0FBRztBQUFBLElBQ04sT0FBUSxLQUFLLFVBQVUsSUFBSSxZQUNyQixLQUFLLFlBQVksSUFBSSxjQUNqQixLQUFLLE9BQU8sSUFBSSxTQUNaLEtBQUssZUFBZSxJQUFJLGlCQUNwQixLQUFLLE9BQU8sSUFBSSxTQUNaLEtBQUssa0JBQWtCLElBQUksb0JBQ3ZCLEtBQUssY0FBYyxJQUFJLGdCQUNHLEtBQUssU0FBUyxJQUFJLFdBQ3BDO0FBQUE7QUFBQSxFQU10QyxNQUFNLEdBQUc7QUFBQSxJQUNMLFFBQVEsS0FBSyxRQUFRLFVBQVU7QUFBQTtBQUFBLEVBS25DLFdBQVcsR0FBRztBQUFBLElBQ1YsUUFBUSxLQUFLLFFBQVEsVUFBVTtBQUFBO0FBQUEsRUFLbkMsaUJBQWlCLEdBQUc7QUFBQSxJQUNoQixRQUFRLEtBQUssUUFBUSxVQUFVO0FBQUE7QUFBQSxFQUtuQyxhQUFhLEdBQUc7QUFBQSxJQUNaLFFBQVEsS0FBSyxRQUFRLFVBQVU7QUFBQTtBQUFBLEVBS25DLE1BQU0sR0FBRztBQUFBLElBQ0wsUUFBUSxLQUFLLFFBQVEsVUFBVTtBQUFBO0FBQUEsRUFLbkMsUUFBUSxHQUFHO0FBQUEsSUFDUCxRQUFRLEtBQUssUUFBUSxVQUFVO0FBQUE7QUFBQSxFQUtuQyxjQUFjLEdBQUc7QUFBQSxJQUNiLFFBQVEsS0FBSyxRQUFRLFdBQVc7QUFBQTtBQUFBLEVBU3BDLFdBQVcsR0FBRztBQUFBLElBQ1YsT0FBTyxLQUFLLFFBQVEsZUFBZSxPQUFPO0FBQUE7QUFBQSxFQVU5QyxjQUFjLEdBQUc7QUFBQSxJQUNiLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFVaEIsY0FBYyxHQUFHO0FBQUEsSUFDYixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBVWhCLGFBQWEsR0FBRztBQUFBLElBQ1osTUFBTSxXQUFXLEtBQUssU0FBUztBQUFBLElBQy9CLE9BQU8sU0FBUyxNQUFNLEdBQUcsU0FBUyxXQUFXO0FBQUE7QUFBQSxFQVNqRCxXQUFXLEdBQUc7QUFBQSxJQUNWLElBQUksS0FBSztBQUFBLE1BQ0wsT0FBTztBQUFBLElBQ1gsS0FBSyxLQUFLO0FBQUEsTUFDTixPQUFPO0FBQUEsSUFFWCxNQUFNLE9BQU8sS0FBSyxRQUFRO0FBQUEsSUFDMUIsU0FBVSxTQUFTLFdBQVcsU0FBUyxTQUNuQyxLQUFLLFFBQVEsZUFDYixLQUFLLFFBQVE7QUFBQTtBQUFBLEVBTXJCLGFBQWEsR0FBRztBQUFBLElBQ1osVUFBVSxLQUFLLFFBQVE7QUFBQTtBQUFBLEVBTzNCLFFBQVEsR0FBRztBQUFBLElBQ1AsVUFBVSxLQUFLLFFBQVE7QUFBQTtBQUFBLEVBYTNCLE9BQU8sQ0FBQyxHQUFHO0FBQUEsSUFDUCxRQUFRLEtBQUssU0FDVCxLQUFLLGVBQWUsVUFBVSxDQUFDLElBQzdCLEtBQUssZUFBZSxnQkFBZ0IsQ0FBQztBQUFBO0FBQUEsT0FVekMsU0FBUSxHQUFHO0FBQUEsSUFDYixNQUFNLFNBQVMsS0FBSztBQUFBLElBQ3BCLElBQUksUUFBUTtBQUFBLE1BQ1IsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLEtBQUssS0FBSyxZQUFZLEdBQUc7QUFBQSxNQUNyQjtBQUFBLElBQ0o7QUFBQSxJQUdBLEtBQUssS0FBSyxRQUFRO0FBQUEsTUFDZDtBQUFBLElBQ0o7QUFBQSxJQUVBLElBQUk7QUFBQSxNQUNBLE1BQU0sT0FBTyxNQUFNLEtBQUssSUFBSSxTQUFTLFNBQVMsS0FBSyxTQUFTLENBQUM7QUFBQSxNQUM3RCxNQUFNLGNBQWMsTUFBTSxLQUFLLE9BQU8sU0FBUyxJQUFJLFFBQVEsSUFBSTtBQUFBLE1BQy9ELElBQUksWUFBWTtBQUFBLFFBQ1osT0FBUSxLQUFLLGNBQWM7QUFBQSxNQUMvQjtBQUFBLE1BRUosT0FBTyxJQUFJO0FBQUEsTUFDUCxLQUFLLGNBQWMsR0FBRyxJQUFJO0FBQUEsTUFDMUI7QUFBQTtBQUFBO0FBQUEsRUFNUixZQUFZLEdBQUc7QUFBQSxJQUNYLE1BQU0sU0FBUyxLQUFLO0FBQUEsSUFDcEIsSUFBSSxRQUFRO0FBQUEsTUFDUixPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsS0FBSyxLQUFLLFlBQVksR0FBRztBQUFBLE1BQ3JCO0FBQUEsSUFDSjtBQUFBLElBR0EsS0FBSyxLQUFLLFFBQVE7QUFBQSxNQUNkO0FBQUEsSUFDSjtBQUFBLElBRUEsSUFBSTtBQUFBLE1BQ0EsTUFBTSxPQUFPLEtBQUssSUFBSSxhQUFhLEtBQUssU0FBUyxDQUFDO0FBQUEsTUFDbEQsTUFBTSxhQUFhLEtBQUssT0FBTyxhQUFhLEdBQUcsUUFBUSxJQUFJO0FBQUEsTUFDM0QsSUFBSSxZQUFZO0FBQUEsUUFDWixPQUFRLEtBQUssY0FBYztBQUFBLE1BQy9CO0FBQUEsTUFFSixPQUFPLElBQUk7QUFBQSxNQUNQLEtBQUssY0FBYyxHQUFHLElBQUk7QUFBQSxNQUMxQjtBQUFBO0FBQUE7QUFBQSxFQUdSLGVBQWUsQ0FBQyxVQUFVO0FBQUEsSUFFdEIsS0FBSyxTQUFTO0FBQUEsSUFFZCxTQUFTLElBQUksU0FBUyxZQUFhLElBQUksU0FBUyxRQUFRLEtBQUs7QUFBQSxNQUN6RCxNQUFNLElBQUksU0FBUztBQUFBLE1BQ25CLElBQUk7QUFBQSxRQUNBLEVBQUUsWUFBWTtBQUFBLElBQ3RCO0FBQUE7QUFBQSxFQUVKLFdBQVcsR0FBRztBQUFBLElBRVYsSUFBSSxLQUFLLFFBQVE7QUFBQSxNQUNiO0FBQUEsSUFDSixLQUFLLFNBQVMsS0FBSyxRQUFRLFVBQVU7QUFBQSxJQUNyQyxLQUFLLG9CQUFvQjtBQUFBO0FBQUEsRUFFN0IsbUJBQW1CLEdBQUc7QUFBQSxJQUVsQixNQUFNLFdBQVcsS0FBSyxTQUFTO0FBQUEsSUFDL0IsU0FBUyxjQUFjO0FBQUEsSUFDdkIsV0FBVyxLQUFLLFVBQVU7QUFBQSxNQUN0QixFQUFFLFlBQVk7QUFBQSxJQUNsQjtBQUFBO0FBQUEsRUFFSixnQkFBZ0IsR0FBRztBQUFBLElBQ2YsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLGFBQWE7QUFBQTtBQUFBLEVBR3RCLFlBQVksR0FBRztBQUFBLElBTVgsSUFBSSxLQUFLLFFBQVE7QUFBQSxNQUNiO0FBQUEsSUFFSixJQUFJLElBQUksS0FBSztBQUFBLElBR2IsS0FBSyxJQUFJLFVBQVU7QUFBQSxNQUNmLEtBQUs7QUFBQSxJQUNULEtBQUssUUFBUSxJQUFJO0FBQUEsSUFDakIsS0FBSyxvQkFBb0I7QUFBQTtBQUFBLEVBRTdCLFlBQVksQ0FBQyxPQUFPLElBQUk7QUFBQSxJQUVwQixJQUFJLFNBQVMsYUFBYSxTQUFTLFNBQVM7QUFBQSxNQUN4QyxLQUFLLGFBQWE7QUFBQSxJQUN0QixFQUNLLFNBQUksU0FBUyxVQUFVO0FBQUEsTUFDeEIsS0FBSyxZQUFZO0FBQUEsSUFDckIsRUFDSztBQUFBLE1BQ0QsS0FBSyxTQUFTLEVBQUUsY0FBYztBQUFBO0FBQUE7QUFBQSxFQUd0QyxVQUFVLENBQUMsT0FBTyxJQUFJO0FBQUEsSUFHbEIsSUFBSSxTQUFTLFdBQVc7QUFBQSxNQUVwQixNQUFNLElBQUksS0FBSztBQUFBLE1BQ2YsRUFBRSxhQUFhO0FBQUEsSUFDbkIsRUFDSyxTQUFJLFNBQVMsVUFBVTtBQUFBLE1BRXhCLEtBQUssWUFBWTtBQUFBLElBQ3JCO0FBQUE7QUFBQSxFQUVKLGFBQWEsQ0FBQyxPQUFPLElBQUk7QUFBQSxJQUNyQixJQUFJLE1BQU0sS0FBSztBQUFBLElBQ2YsT0FBTztBQUFBLElBQ1AsSUFBSSxTQUFTO0FBQUEsTUFDVCxPQUFPO0FBQUEsSUFFWCxJQUFJLFNBQVMsWUFBWSxTQUFTLFdBQVc7QUFBQSxNQUd6QyxPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsS0FBSyxRQUFRO0FBQUEsSUFJYixJQUFJLFNBQVMsYUFBYSxLQUFLLFFBQVE7QUFBQSxNQUNuQyxLQUFLLE9BQU8sYUFBYTtBQUFBLElBQzdCO0FBQUE7QUFBQSxFQUdKLGdCQUFnQixDQUFDLEdBQUcsR0FBRztBQUFBLElBQ25CLE9BQVEsS0FBSywwQkFBMEIsR0FBRyxDQUFDLEtBQ3ZDLEtBQUssb0JBQW9CLEdBQUcsQ0FBQztBQUFBO0FBQUEsRUFFckMsbUJBQW1CLENBQUMsR0FBRyxHQUFHO0FBQUEsSUFFdEIsTUFBTSxPQUFPLFVBQVUsQ0FBQztBQUFBLElBQ3hCLE1BQU0sUUFBUSxLQUFLLFNBQVMsRUFBRSxNQUFNLE1BQU0sRUFBRSxRQUFRLEtBQUssQ0FBQztBQUFBLElBQzFELE1BQU0sT0FBTyxNQUFNLFFBQVE7QUFBQSxJQUMzQixJQUFJLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTO0FBQUEsTUFDdEQsTUFBTSxTQUFTO0FBQUEsSUFDbkI7QUFBQSxJQUNBLEVBQUUsUUFBUSxLQUFLO0FBQUEsSUFDZixFQUFFO0FBQUEsSUFDRixPQUFPO0FBQUE7QUFBQSxFQUVYLHlCQUF5QixDQUFDLEdBQUcsR0FBRztBQUFBLElBQzVCLFNBQVMsSUFBSSxFQUFFLFlBQWEsSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLE1BQzNDLE1BQU0sU0FBUyxFQUFFO0FBQUEsTUFDakIsTUFBTSxPQUFPLEtBQUssU0FBUyxnQkFBZ0IsRUFBRSxJQUFJLElBQUksVUFBVSxFQUFFLElBQUk7QUFBQSxNQUNyRSxJQUFJLFNBQVMsT0FBTyxZQUFZO0FBQUEsUUFDNUI7QUFBQSxNQUNKO0FBQUEsTUFDQSxPQUFPLEtBQUsscUJBQXFCLEdBQUcsUUFBUSxHQUFHLENBQUM7QUFBQSxJQUNwRDtBQUFBO0FBQUEsRUFFSixvQkFBb0IsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHO0FBQUEsSUFDakMsTUFBTSxJQUFJLEVBQUU7QUFBQSxJQUVaLEVBQUUsUUFBUyxFQUFFLFFBQVEsZUFBZ0IsVUFBVSxDQUFDO0FBQUEsSUFFaEQsSUFBSSxNQUFNLEVBQUU7QUFBQSxNQUNSLEVBQUUsT0FBTyxFQUFFO0FBQUEsSUFHZixJQUFJLFVBQVUsRUFBRSxhQUFhO0FBQUEsTUFDekIsSUFBSSxVQUFVLEVBQUUsU0FBUztBQUFBLFFBQ3JCLEVBQUUsSUFBSTtBQUFBLE1BRU47QUFBQSxVQUFFLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDckIsRUFBRSxRQUFRLENBQUM7QUFBQSxJQUNmO0FBQUEsSUFDQSxFQUFFO0FBQUEsSUFDRixPQUFPO0FBQUE7QUFBQSxPQWlCTCxNQUFLLEdBQUc7QUFBQSxJQUNWLEtBQUssS0FBSyxRQUFRLFlBQVksR0FBRztBQUFBLE1BQzdCLElBQUk7QUFBQSxRQUNBLEtBQUssV0FBVyxNQUFNLEtBQUssSUFBSSxTQUFTLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQztBQUFBLFFBQzlELE9BQU87QUFBQSxRQUVYLE9BQU8sSUFBSTtBQUFBLFFBQ1AsS0FBSyxXQUFXLEdBQUcsSUFBSTtBQUFBO0FBQUEsSUFFL0I7QUFBQTtBQUFBLEVBS0osU0FBUyxHQUFHO0FBQUEsSUFDUixLQUFLLEtBQUssUUFBUSxZQUFZLEdBQUc7QUFBQSxNQUM3QixJQUFJO0FBQUEsUUFDQSxLQUFLLFdBQVcsS0FBSyxJQUFJLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQztBQUFBLFFBQ25ELE9BQU87QUFBQSxRQUVYLE9BQU8sSUFBSTtBQUFBLFFBQ1AsS0FBSyxXQUFXLEdBQUcsSUFBSTtBQUFBO0FBQUEsSUFFL0I7QUFBQTtBQUFBLEVBRUosVUFBVSxDQUFDLElBQUk7QUFBQSxJQUNYLFFBQVEsT0FBTyxTQUFTLFdBQVcsYUFBYSxTQUFTLFFBQVEsT0FBTyxTQUFTLEtBQUssS0FBSyxLQUFLLE1BQU0sT0FBTyxTQUFTLE9BQU8sTUFBTSxNQUFNLFFBQVM7QUFBQSxJQUNsSixLQUFLLFNBQVM7QUFBQSxJQUNkLEtBQUssV0FBVztBQUFBLElBQ2hCLEtBQUssYUFBYTtBQUFBLElBQ2xCLEtBQUssZUFBZTtBQUFBLElBQ3BCLEtBQUssV0FBVztBQUFBLElBQ2hCLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLFdBQVc7QUFBQSxJQUNoQixLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxXQUFXO0FBQUEsSUFDaEIsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxPQUFPO0FBQUEsSUFDWixNQUFNLE9BQU8sVUFBVSxFQUFFO0FBQUEsSUFFekIsS0FBSyxRQUFTLEtBQUssUUFBUSxlQUFnQixPQUFPO0FBQUEsSUFDbEQsSUFBSSxTQUFTLFdBQVcsU0FBUyxTQUFTLFNBQVMsT0FBTztBQUFBLE1BQ3RELEtBQUssU0FBUztBQUFBLElBQ2xCO0FBQUE7QUFBQSxFQUVKLGVBQWUsQ0FBQztBQUFBLEVBQ2hCLHFCQUFxQjtBQUFBLEVBQ3JCLGdCQUFnQixDQUFDLFVBQVU7QUFBQSxJQUN2QixLQUFLLHFCQUFxQjtBQUFBLElBQzFCLE1BQU0sTUFBTSxLQUFLLGFBQWEsTUFBTTtBQUFBLElBQ3BDLEtBQUssYUFBYSxTQUFTO0FBQUEsSUFDM0IsSUFBSSxRQUFRLFFBQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQztBQUFBO0FBQUEsRUFrQnhDLFNBQVMsQ0FBQyxJQUFJLGFBQWEsT0FBTztBQUFBLElBQzlCLEtBQUssS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUNwQixJQUFJO0FBQUEsUUFDQSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQUEsTUFFWDtBQUFBLHVCQUFlLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQUEsTUFDckM7QUFBQSxJQUNKO0FBQUEsSUFDQSxNQUFNLFdBQVcsS0FBSyxTQUFTO0FBQUEsSUFDL0IsSUFBSSxLQUFLLGNBQWMsR0FBRztBQUFBLE1BQ3RCLE1BQU0sSUFBSSxTQUFTLE1BQU0sR0FBRyxTQUFTLFdBQVc7QUFBQSxNQUNoRCxJQUFJO0FBQUEsUUFDQSxHQUFHLE1BQU0sQ0FBQztBQUFBLE1BRVY7QUFBQSx1QkFBZSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFBQSxNQUNwQztBQUFBLElBQ0o7QUFBQSxJQUVBLEtBQUssYUFBYSxLQUFLLEVBQUU7QUFBQSxJQUN6QixJQUFJLEtBQUssb0JBQW9CO0FBQUEsTUFDekI7QUFBQSxJQUNKO0FBQUEsSUFDQSxLQUFLLHFCQUFxQjtBQUFBLElBRzFCLE1BQU0sV0FBVyxLQUFLLFNBQVM7QUFBQSxJQUMvQixLQUFLLElBQUksUUFBUSxVQUFVLEVBQUUsZUFBZSxLQUFLLEdBQUcsQ0FBQyxJQUFJLFlBQVk7QUFBQSxNQUNqRSxJQUFJLElBQUk7QUFBQSxRQUNKLEtBQUssYUFBYSxHQUFHLElBQUk7QUFBQSxRQUN6QixTQUFTLGNBQWM7QUFBQSxNQUMzQixFQUNLO0FBQUEsUUFHRCxXQUFXLEtBQUssU0FBUztBQUFBLFVBQ3JCLEtBQUssaUJBQWlCLEdBQUcsUUFBUTtBQUFBLFFBQ3JDO0FBQUEsUUFDQSxLQUFLLGdCQUFnQixRQUFRO0FBQUE7QUFBQSxNQUVqQyxLQUFLLGlCQUFpQixTQUFTLE1BQU0sR0FBRyxTQUFTLFdBQVcsQ0FBQztBQUFBLE1BQzdEO0FBQUEsS0FDSDtBQUFBO0FBQUEsRUFFTDtBQUFBLE9BVU0sUUFBTyxHQUFHO0FBQUEsSUFDWixLQUFLLEtBQUssV0FBVyxHQUFHO0FBQUEsTUFDcEIsT0FBTyxDQUFDO0FBQUEsSUFDWjtBQUFBLElBQ0EsTUFBTSxXQUFXLEtBQUssU0FBUztBQUFBLElBQy9CLElBQUksS0FBSyxjQUFjLEdBQUc7QUFBQSxNQUN0QixPQUFPLFNBQVMsTUFBTSxHQUFHLFNBQVMsV0FBVztBQUFBLElBQ2pEO0FBQUEsSUFHQSxNQUFNLFdBQVcsS0FBSyxTQUFTO0FBQUEsSUFDL0IsSUFBSSxLQUFLLHVCQUF1QjtBQUFBLE1BQzVCLE1BQU0sS0FBSztBQUFBLElBQ2YsRUFDSztBQUFBLE1BRUQsSUFBSSxVQUFVLE1BQU07QUFBQSxNQUVwQixLQUFLLHdCQUF3QixJQUFJLFFBQVEsU0FBUSxVQUFVLEdBQUk7QUFBQSxNQUMvRCxJQUFJO0FBQUEsUUFDQSxXQUFXLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxRQUFRLFVBQVU7QUFBQSxVQUN0RCxlQUFlO0FBQUEsUUFDbkIsQ0FBQyxHQUFHO0FBQUEsVUFDQSxLQUFLLGlCQUFpQixHQUFHLFFBQVE7QUFBQSxRQUNyQztBQUFBLFFBQ0EsS0FBSyxnQkFBZ0IsUUFBUTtBQUFBLFFBRWpDLE9BQU8sSUFBSTtBQUFBLFFBQ1AsS0FBSyxhQUFhLEdBQUcsSUFBSTtBQUFBLFFBQ3pCLFNBQVMsY0FBYztBQUFBO0FBQUEsTUFFM0IsS0FBSyx3QkFBd0I7QUFBQSxNQUM3QixRQUFRO0FBQUE7QUFBQSxJQUVaLE9BQU8sU0FBUyxNQUFNLEdBQUcsU0FBUyxXQUFXO0FBQUE7QUFBQSxFQUtqRCxXQUFXLEdBQUc7QUFBQSxJQUNWLEtBQUssS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUNwQixPQUFPLENBQUM7QUFBQSxJQUNaO0FBQUEsSUFDQSxNQUFNLFdBQVcsS0FBSyxTQUFTO0FBQUEsSUFDL0IsSUFBSSxLQUFLLGNBQWMsR0FBRztBQUFBLE1BQ3RCLE9BQU8sU0FBUyxNQUFNLEdBQUcsU0FBUyxXQUFXO0FBQUEsSUFDakQ7QUFBQSxJQUdBLE1BQU0sV0FBVyxLQUFLLFNBQVM7QUFBQSxJQUMvQixJQUFJO0FBQUEsTUFDQSxXQUFXLEtBQUssS0FBSyxJQUFJLFlBQVksVUFBVTtBQUFBLFFBQzNDLGVBQWU7QUFBQSxNQUNuQixDQUFDLEdBQUc7QUFBQSxRQUNBLEtBQUssaUJBQWlCLEdBQUcsUUFBUTtBQUFBLE1BQ3JDO0FBQUEsTUFDQSxLQUFLLGdCQUFnQixRQUFRO0FBQUEsTUFFakMsT0FBTyxJQUFJO0FBQUEsTUFDUCxLQUFLLGFBQWEsR0FBRyxJQUFJO0FBQUEsTUFDekIsU0FBUyxjQUFjO0FBQUE7QUFBQSxJQUUzQixPQUFPLFNBQVMsTUFBTSxHQUFHLFNBQVMsV0FBVztBQUFBO0FBQUEsRUFFakQsVUFBVSxHQUFHO0FBQUEsSUFDVCxJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2IsT0FBTztBQUFBLElBQ1gsTUFBTSxPQUFPLE9BQU8sS0FBSztBQUFBLElBR3pCLE1BQU0sU0FBUyxXQUFXLFNBQVMsU0FBUyxTQUFTLFFBQVE7QUFBQSxNQUN6RCxPQUFPO0FBQUEsSUFDWDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFFWCxVQUFVLENBQUMsTUFBTSxZQUFZO0FBQUEsSUFDekIsUUFBUyxLQUFLLFFBQVEsV0FBVyxXQUMzQixLQUFLLFFBQVEsY0FDZCxLQUFLLElBQUksSUFBSSxPQUNaLGNBQWMsV0FBVyxJQUFJO0FBQUE7QUFBQSxPQVdqQyxTQUFRLEdBQUc7QUFBQSxJQUNiLElBQUksS0FBSztBQUFBLE1BQ0wsT0FBTyxLQUFLO0FBQUEsSUFDaEIsS0FBSyxjQUFjLGNBQWMsVUFBVSxLQUFLO0FBQUEsTUFDNUM7QUFBQSxJQUNKLElBQUk7QUFBQSxNQUNBLE1BQU0sS0FBSyxNQUFNLEtBQUssSUFBSSxTQUFTLFNBQVMsS0FBSyxTQUFTLENBQUM7QUFBQSxNQUMzRCxPQUFRLEtBQUssWUFBWSxLQUFLLFFBQVEsRUFBRTtBQUFBLE1BRTVDLE9BQU8sR0FBRztBQUFBLE1BQ04sS0FBSyxpQkFBaUI7QUFBQTtBQUFBO0FBQUEsRUFNOUIsWUFBWSxHQUFHO0FBQUEsSUFDWCxJQUFJLEtBQUs7QUFBQSxNQUNMLE9BQU8sS0FBSztBQUFBLElBQ2hCLEtBQUssY0FBYyxjQUFjLFVBQVUsS0FBSztBQUFBLE1BQzVDO0FBQUEsSUFDSixJQUFJO0FBQUEsTUFDQSxNQUFNLEtBQUssS0FBSyxJQUFJLGFBQWEsS0FBSyxTQUFTLENBQUM7QUFBQSxNQUNoRCxPQUFRLEtBQUssWUFBWSxLQUFLLFFBQVEsRUFBRTtBQUFBLE1BRTVDLE9BQU8sR0FBRztBQUFBLE1BQ04sS0FBSyxpQkFBaUI7QUFBQTtBQUFBO0FBQUEsR0FTN0IsU0FBUyxDQUFDLFFBQVE7QUFBQSxJQUNmLElBQUksV0FBVztBQUFBLE1BQ1g7QUFBQSxJQUNKLE9BQU8sUUFBUTtBQUFBLElBQ2YsS0FBSyxRQUFRO0FBQUEsSUFDYixNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUFBLElBQzFCLElBQUksS0FBSyxDQUFDO0FBQUEsSUFDVixJQUFJLElBQUk7QUFBQSxJQUNSLE9BQU8sS0FBSyxFQUFFLFFBQVE7QUFBQSxNQUNsQixRQUFRLElBQUksQ0FBQztBQUFBLE1BQ2IsRUFBRSxZQUFZLEdBQUcsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUM5QixFQUFFLGlCQUFpQixHQUFHLEtBQUssR0FBRztBQUFBLE1BQzlCLElBQUksRUFBRTtBQUFBLE1BQ04sR0FBRyxLQUFLLElBQUk7QUFBQSxJQUNoQjtBQUFBLElBRUEsSUFBSTtBQUFBLElBQ0osT0FBTyxLQUFLLEVBQUUsV0FBVyxRQUFRLElBQUksQ0FBQyxHQUFHO0FBQUEsTUFDckMsRUFBRSxZQUFZO0FBQUEsTUFDZCxFQUFFLGlCQUFpQjtBQUFBLE1BQ25CLElBQUksRUFBRTtBQUFBLElBQ1Y7QUFBQTtBQUVSO0FBQUE7QUFPTyxNQUFNLGtCQUFrQixTQUFTO0FBQUEsRUFJcEMsTUFBTTtBQUFBLEVBSU4sV0FBVztBQUFBLEVBT1gsV0FBVyxDQUFDLE1BQU0sT0FBTyxTQUFTLE1BQU0sT0FBTyxRQUFRLFVBQVUsTUFBTTtBQUFBLElBQ25FLE1BQU0sTUFBTSxNQUFNLE1BQU0sT0FBTyxRQUFRLFVBQVUsSUFBSTtBQUFBO0FBQUEsRUFLekQsUUFBUSxDQUFDLE1BQU0sT0FBTyxTQUFTLE9BQU8sQ0FBQyxHQUFHO0FBQUEsSUFDdEMsT0FBTyxJQUFJLFVBQVUsTUFBTSxNQUFNLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxRQUFRLEtBQUssY0FBYyxHQUFHLElBQUk7QUFBQTtBQUFBLEVBS25HLGFBQWEsQ0FBQyxPQUFNO0FBQUEsSUFDaEIsT0FBTyxNQUFNLE1BQU0sS0FBSSxFQUFFO0FBQUE7QUFBQSxFQUs3QixPQUFPLENBQUMsVUFBVTtBQUFBLElBQ2QsV0FBVyxXQUFXLFNBQVMsWUFBWSxDQUFDO0FBQUEsSUFDNUMsSUFBSSxhQUFhLEtBQUssS0FBSyxNQUFNO0FBQUEsTUFDN0IsT0FBTyxLQUFLO0FBQUEsSUFDaEI7QUFBQSxJQUVBLFlBQVksU0FBUyxTQUFTLE9BQU8sUUFBUSxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3RELElBQUksS0FBSyxTQUFTLFVBQVUsT0FBTyxHQUFHO0FBQUEsUUFDbEMsT0FBUSxLQUFLLE1BQU0sWUFBWTtBQUFBLE1BQ25DO0FBQUEsSUFDSjtBQUFBLElBRUEsT0FBUSxLQUFLLE1BQU0sWUFBWSxJQUFJLGdCQUFnQixVQUFVLElBQUksRUFBRTtBQUFBO0FBQUEsRUFLdkUsUUFBUSxDQUFDLFVBQVUsVUFBVSxLQUFLLEtBQUssTUFBTTtBQUFBLElBSXpDLFdBQVcsU0FDTixZQUFZLEVBQ1osUUFBUSxPQUFPLElBQUksRUFDbkIsUUFBUSxnQkFBZ0IsTUFBTTtBQUFBLElBQ25DLE9BQU8sYUFBYTtBQUFBO0FBRTVCO0FBQUE7QUFNTyxNQUFNLGtCQUFrQixTQUFTO0FBQUEsRUFJcEMsV0FBVztBQUFBLEVBSVgsTUFBTTtBQUFBLEVBT04sV0FBVyxDQUFDLE1BQU0sT0FBTyxTQUFTLE1BQU0sT0FBTyxRQUFRLFVBQVUsTUFBTTtBQUFBLElBQ25FLE1BQU0sTUFBTSxNQUFNLE1BQU0sT0FBTyxRQUFRLFVBQVUsSUFBSTtBQUFBO0FBQUEsRUFLekQsYUFBYSxDQUFDLE9BQU07QUFBQSxJQUNoQixPQUFPLE1BQUssV0FBVyxHQUFHLElBQUksTUFBTTtBQUFBO0FBQUEsRUFLeEMsT0FBTyxDQUFDLFdBQVc7QUFBQSxJQUNmLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFLaEIsUUFBUSxDQUFDLE1BQU0sT0FBTyxTQUFTLE9BQU8sQ0FBQyxHQUFHO0FBQUEsSUFDdEMsT0FBTyxJQUFJLFVBQVUsTUFBTSxNQUFNLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxRQUFRLEtBQUssY0FBYyxHQUFHLElBQUk7QUFBQTtBQUV2RztBQUFBO0FBU08sTUFBTSxlQUFlO0FBQUEsRUFJeEI7QUFBQSxFQUlBO0FBQUEsRUFJQTtBQUFBLEVBSUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQU1BO0FBQUEsRUFDQTtBQUFBLEVBUUEsV0FBVyxDQUFDLE1BQU0sUUFBUSxJQUFJLEdBQUcsVUFBVSxRQUFPLFFBQVEsb0JBQW9CLEtBQUssTUFBTSxLQUFLLGNBQWUsQ0FBQyxHQUFHO0FBQUEsSUFDN0csS0FBSyxNQUFNLGFBQWEsRUFBRTtBQUFBLElBQzFCLElBQUksZUFBZSxPQUFPLElBQUksV0FBVyxTQUFTLEdBQUc7QUFBQSxNQUNqRCxNQUFNLGNBQWMsR0FBRztBQUFBLElBQzNCO0FBQUEsSUFHQSxNQUFNLFVBQVUsU0FBUyxRQUFRLEdBQUc7QUFBQSxJQUNwQyxLQUFLLFFBQVEsT0FBTyxPQUFPLElBQUk7QUFBQSxJQUMvQixLQUFLLFdBQVcsS0FBSyxjQUFjLE9BQU87QUFBQSxJQUMxQyxLQUFLLGdCQUFnQixJQUFJO0FBQUEsSUFDekIsS0FBSyxxQkFBcUIsSUFBSTtBQUFBLElBQzlCLEtBQUssWUFBWSxJQUFJLGNBQWMsaUJBQWlCO0FBQUEsSUFDcEQsTUFBTSxRQUFRLFFBQVEsVUFBVSxLQUFLLFNBQVMsTUFBTSxFQUFFLE1BQU0sSUFBRztBQUFBLElBRS9ELElBQUksTUFBTSxXQUFXLE1BQU0sTUFBTSxJQUFJO0FBQUEsTUFDakMsTUFBTSxJQUFJO0FBQUEsSUFDZDtBQUFBLElBRUEsSUFBSSxXQUFXLFdBQVc7QUFBQSxNQUN0QixNQUFNLElBQUksVUFBVSxvREFBb0Q7QUFBQSxJQUM1RTtBQUFBLElBRUEsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLE9BQU8sS0FBSyxRQUFRLEtBQUssR0FBRztBQUFBLElBQ2pDLEtBQUssTUFBTSxLQUFLLFlBQVksS0FBSztBQUFBLElBQ2pDLElBQUksT0FBTyxLQUFLO0FBQUEsSUFDaEIsSUFBSSxNQUFNLE1BQU0sU0FBUztBQUFBLElBQ3pCLE1BQU0sVUFBVSxTQUFTO0FBQUEsSUFDekIsSUFBSSxNQUFNLEtBQUs7QUFBQSxJQUNmLElBQUksV0FBVztBQUFBLElBQ2YsV0FBVyxRQUFRLE9BQU87QUFBQSxNQUN0QixNQUFNLElBQUk7QUFBQSxNQUNWLE9BQU8sS0FBSyxNQUFNLE1BQU07QUFBQSxRQUNwQixVQUFVLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsS0FBSyxPQUFPO0FBQUEsUUFDOUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLEtBQUssR0FBRztBQUFBLFFBQy9DLFVBQVcsUUFBUSxXQUFXLEtBQUssV0FBVztBQUFBLE1BQ2xELENBQUM7QUFBQSxNQUNELFdBQVc7QUFBQSxJQUNmO0FBQUEsSUFDQSxLQUFLLE1BQU07QUFBQTtBQUFBLEVBS2YsS0FBSyxDQUFDLFFBQU8sS0FBSyxLQUFLO0FBQUEsSUFDbkIsSUFBSSxPQUFPLFVBQVMsVUFBVTtBQUFBLE1BQzFCLFFBQU8sS0FBSyxJQUFJLFFBQVEsS0FBSTtBQUFBLElBQ2hDO0FBQUEsSUFDQSxPQUFPLE1BQUssTUFBTTtBQUFBO0FBQUEsRUFRdEIsYUFBYSxHQUFHO0FBQUEsSUFDWixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBV2hCLE9BQU8sSUFBSSxPQUFPO0FBQUEsSUFHZCxJQUFJLElBQUk7QUFBQSxJQUNSLFNBQVMsSUFBSSxNQUFNLFNBQVMsRUFBRyxLQUFLLEdBQUcsS0FBSztBQUFBLE1BQ3hDLE1BQU0sSUFBSSxNQUFNO0FBQUEsTUFDaEIsS0FBSyxLQUFLLE1BQU07QUFBQSxRQUNaO0FBQUEsTUFDSixJQUFJLElBQUksR0FBRyxLQUFLLE1BQU07QUFBQSxNQUN0QixJQUFJLEtBQUssV0FBVyxDQUFDLEdBQUc7QUFBQSxRQUNwQjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsSUFDQSxNQUFNLFNBQVMsS0FBSyxjQUFjLElBQUksQ0FBQztBQUFBLElBQ3ZDLElBQUksV0FBVyxXQUFXO0FBQUEsTUFDdEIsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLE1BQU0sU0FBUyxLQUFLLElBQUksUUFBUSxDQUFDLEVBQUUsU0FBUztBQUFBLElBQzVDLEtBQUssY0FBYyxJQUFJLEdBQUcsTUFBTTtBQUFBLElBQ2hDLE9BQU87QUFBQTtBQUFBLEVBYVgsWUFBWSxJQUFJLE9BQU87QUFBQSxJQUduQixJQUFJLElBQUk7QUFBQSxJQUNSLFNBQVMsSUFBSSxNQUFNLFNBQVMsRUFBRyxLQUFLLEdBQUcsS0FBSztBQUFBLE1BQ3hDLE1BQU0sSUFBSSxNQUFNO0FBQUEsTUFDaEIsS0FBSyxLQUFLLE1BQU07QUFBQSxRQUNaO0FBQUEsTUFDSixJQUFJLElBQUksR0FBRyxLQUFLLE1BQU07QUFBQSxNQUN0QixJQUFJLEtBQUssV0FBVyxDQUFDLEdBQUc7QUFBQSxRQUNwQjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsSUFDQSxNQUFNLFNBQVMsS0FBSyxtQkFBbUIsSUFBSSxDQUFDO0FBQUEsSUFDNUMsSUFBSSxXQUFXLFdBQVc7QUFBQSxNQUN0QixPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsTUFBTSxTQUFTLEtBQUssSUFBSSxRQUFRLENBQUMsRUFBRSxjQUFjO0FBQUEsSUFDakQsS0FBSyxtQkFBbUIsSUFBSSxHQUFHLE1BQU07QUFBQSxJQUNyQyxPQUFPO0FBQUE7QUFBQSxFQUtYLFFBQVEsQ0FBQyxRQUFRLEtBQUssS0FBSztBQUFBLElBQ3ZCLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUMzQixRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNsQztBQUFBLElBQ0EsT0FBTyxNQUFNLFNBQVM7QUFBQTtBQUFBLEVBTTFCLGFBQWEsQ0FBQyxRQUFRLEtBQUssS0FBSztBQUFBLElBQzVCLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUMzQixRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNsQztBQUFBLElBQ0EsT0FBTyxNQUFNLGNBQWM7QUFBQTtBQUFBLEVBSy9CLFFBQVEsQ0FBQyxRQUFRLEtBQUssS0FBSztBQUFBLElBQ3ZCLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUMzQixRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNsQztBQUFBLElBQ0EsT0FBTyxNQUFNO0FBQUE7QUFBQSxFQUtqQixPQUFPLENBQUMsUUFBUSxLQUFLLEtBQUs7QUFBQSxJQUN0QixJQUFJLE9BQU8sVUFBVSxVQUFVO0FBQUEsTUFDM0IsUUFBUSxLQUFLLElBQUksUUFBUSxLQUFLO0FBQUEsSUFDbEM7QUFBQSxJQUNBLFFBQVEsTUFBTSxVQUFVLE9BQU8sU0FBUztBQUFBO0FBQUEsT0FFdEMsUUFBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLE9BQU87QUFBQSxJQUNuQyxlQUFlO0FBQUEsRUFDbkIsR0FBRztBQUFBLElBQ0MsSUFBSSxPQUFPLFVBQVUsVUFBVTtBQUFBLE1BQzNCLFFBQVEsS0FBSyxJQUFJLFFBQVEsS0FBSztBQUFBLElBQ2xDLEVBQ0ssV0FBTSxpQkFBaUIsV0FBVztBQUFBLE1BQ25DLE9BQU87QUFBQSxNQUNQLFFBQVEsS0FBSztBQUFBLElBQ2pCO0FBQUEsSUFDQSxRQUFRLGtCQUFrQjtBQUFBLElBQzFCLEtBQUssTUFBTSxXQUFXLEdBQUc7QUFBQSxNQUNyQixPQUFPLENBQUM7QUFBQSxJQUNaLEVBQ0s7QUFBQSxNQUNELE1BQU0sSUFBSSxNQUFNLE1BQU0sUUFBUTtBQUFBLE1BQzlCLE9BQU8sZ0JBQWdCLElBQUksRUFBRSxJQUFJLE9BQUssRUFBRSxJQUFJO0FBQUE7QUFBQTtBQUFBLEVBR3BELFdBQVcsQ0FBQyxRQUFRLEtBQUssS0FBSyxPQUFPO0FBQUEsSUFDakMsZUFBZTtBQUFBLEVBQ25CLEdBQUc7QUFBQSxJQUNDLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUMzQixRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNsQyxFQUNLLFdBQU0saUJBQWlCLFdBQVc7QUFBQSxNQUNuQyxPQUFPO0FBQUEsTUFDUCxRQUFRLEtBQUs7QUFBQSxJQUNqQjtBQUFBLElBQ0EsUUFBUSxnQkFBZ0IsU0FBUztBQUFBLElBQ2pDLEtBQUssTUFBTSxXQUFXLEdBQUc7QUFBQSxNQUNyQixPQUFPLENBQUM7QUFBQSxJQUNaLEVBQ0ssU0FBSSxlQUFlO0FBQUEsTUFDcEIsT0FBTyxNQUFNLFlBQVk7QUFBQSxJQUM3QixFQUNLO0FBQUEsTUFDRCxPQUFPLE1BQU0sWUFBWSxFQUFFLElBQUksT0FBSyxFQUFFLElBQUk7QUFBQTtBQUFBO0FBQUEsT0FrQjVDLE1BQUssQ0FBQyxRQUFRLEtBQUssS0FBSztBQUFBLElBQzFCLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUMzQixRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNsQztBQUFBLElBQ0EsT0FBTyxNQUFNLE1BQU07QUFBQTtBQUFBLEVBS3ZCLFNBQVMsQ0FBQyxRQUFRLEtBQUssS0FBSztBQUFBLElBQ3hCLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUMzQixRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNsQztBQUFBLElBQ0EsT0FBTyxNQUFNLFVBQVU7QUFBQTtBQUFBLE9BRXJCLFNBQVEsQ0FBQyxRQUFRLEtBQUssT0FBTyxrQkFBa0I7QUFBQSxJQUNqRCxlQUFlO0FBQUEsRUFDbkIsR0FBRztBQUFBLElBQ0MsSUFBSSxPQUFPLFVBQVUsVUFBVTtBQUFBLE1BQzNCLFFBQVEsS0FBSyxJQUFJLFFBQVEsS0FBSztBQUFBLElBQ2xDLEVBQ0ssV0FBTSxpQkFBaUIsV0FBVztBQUFBLE1BQ25DLGdCQUFnQixNQUFNO0FBQUEsTUFDdEIsUUFBUSxLQUFLO0FBQUEsSUFDakI7QUFBQSxJQUNBLE1BQU0sSUFBSSxNQUFNLE1BQU0sU0FBUztBQUFBLElBQy9CLE9BQU8sZ0JBQWdCLElBQUksR0FBRyxTQUFTO0FBQUE7QUFBQSxFQUUzQyxZQUFZLENBQUMsUUFBUSxLQUFLLE9BQU8sa0JBQWtCO0FBQUEsSUFDL0MsZUFBZTtBQUFBLEVBQ25CLEdBQUc7QUFBQSxJQUNDLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUMzQixRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNsQyxFQUNLLFdBQU0saUJBQWlCLFdBQVc7QUFBQSxNQUNuQyxnQkFBZ0IsTUFBTTtBQUFBLE1BQ3RCLFFBQVEsS0FBSztBQUFBLElBQ2pCO0FBQUEsSUFDQSxNQUFNLElBQUksTUFBTSxhQUFhO0FBQUEsSUFDN0IsT0FBTyxnQkFBZ0IsSUFBSSxHQUFHLFNBQVM7QUFBQTtBQUFBLE9BRXJDLFNBQVEsQ0FBQyxRQUFRLEtBQUssT0FBTyxrQkFBa0I7QUFBQSxJQUNqRCxlQUFlO0FBQUEsRUFDbkIsR0FBRztBQUFBLElBQ0MsSUFBSSxPQUFPLFVBQVUsVUFBVTtBQUFBLE1BQzNCLFFBQVEsS0FBSyxJQUFJLFFBQVEsS0FBSztBQUFBLElBQ2xDLEVBQ0ssV0FBTSxpQkFBaUIsV0FBVztBQUFBLE1BQ25DLGdCQUFnQixNQUFNO0FBQUEsTUFDdEIsUUFBUSxLQUFLO0FBQUEsSUFDakI7QUFBQSxJQUNBLE1BQU0sSUFBSSxNQUFNLE1BQU0sU0FBUztBQUFBLElBQy9CLE9BQU8sZ0JBQWdCLElBQUksR0FBRyxTQUFTO0FBQUE7QUFBQSxFQUUzQyxZQUFZLENBQUMsUUFBUSxLQUFLLE9BQU8sa0JBQWtCO0FBQUEsSUFDL0MsZUFBZTtBQUFBLEVBQ25CLEdBQUc7QUFBQSxJQUNDLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUMzQixRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNsQyxFQUNLLFdBQU0saUJBQWlCLFdBQVc7QUFBQSxNQUNuQyxnQkFBZ0IsTUFBTTtBQUFBLE1BQ3RCLFFBQVEsS0FBSztBQUFBLElBQ2pCO0FBQUEsSUFDQSxNQUFNLElBQUksTUFBTSxhQUFhO0FBQUEsSUFDN0IsT0FBTyxnQkFBZ0IsSUFBSSxHQUFHLFNBQVM7QUFBQTtBQUFBLE9BRXJDLEtBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxPQUFPLENBQUMsR0FBRztBQUFBLElBQ3BDLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUMzQixRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNsQyxFQUNLLFdBQU0saUJBQWlCLFdBQVc7QUFBQSxNQUNuQyxPQUFPO0FBQUEsTUFDUCxRQUFRLEtBQUs7QUFBQSxJQUNqQjtBQUFBLElBQ0EsUUFBUSxnQkFBZ0IsTUFBTSxTQUFTLE9BQU8saUJBQVEsZUFBZ0I7QUFBQSxJQUN0RSxNQUFNLFVBQVUsQ0FBQztBQUFBLElBQ2pCLEtBQUssV0FBVSxRQUFPLEtBQUssR0FBRztBQUFBLE1BQzFCLFFBQVEsS0FBSyxnQkFBZ0IsUUFBUSxNQUFNLFNBQVMsQ0FBQztBQUFBLElBQ3pEO0FBQUEsSUFDQSxNQUFNLE9BQU8sSUFBSTtBQUFBLElBQ2pCLE1BQU0sT0FBTyxDQUFDLEtBQUssT0FBTztBQUFBLE1BQ3RCLEtBQUssSUFBSSxHQUFHO0FBQUEsTUFDWixJQUFJLFVBQVUsQ0FBQyxJQUFJLFlBQVk7QUFBQSxRQUUzQixJQUFJLElBQUk7QUFBQSxVQUNKLE9BQU8sR0FBRyxFQUFFO0FBQUEsUUFDaEI7QUFBQSxRQUVBLElBQUksTUFBTSxRQUFRO0FBQUEsUUFDbEIsS0FBSztBQUFBLFVBQ0QsT0FBTyxHQUFHO0FBQUEsUUFDZCxNQUFNLE9BQU8sTUFBTTtBQUFBLFVBQ2YsTUFBTSxRQUFRLEdBQUc7QUFBQSxZQUNiLEdBQUc7QUFBQSxVQUNQO0FBQUE7QUFBQSxRQUVKLFdBQVcsS0FBSyxTQUFTO0FBQUEsVUFDckIsS0FBSyxXQUFVLFFBQU8sQ0FBQyxHQUFHO0FBQUEsWUFDdEIsUUFBUSxLQUFLLGdCQUFnQixJQUFJLEVBQUUsU0FBUyxDQUFDO0FBQUEsVUFDakQ7QUFBQSxVQUNBLElBQUksVUFBVSxFQUFFLGVBQWUsR0FBRztBQUFBLFlBQzlCLEVBQUUsU0FBUyxFQUNOLEtBQUssT0FBTSxHQUFHLFVBQVUsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFFLEVBQzFDLEtBQUssT0FBSyxHQUFHLFdBQVcsTUFBTSxVQUFVLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLENBQUM7QUFBQSxVQUMzRSxFQUNLO0FBQUEsWUFDRCxJQUFJLEVBQUUsV0FBVyxNQUFNLFVBQVUsR0FBRztBQUFBLGNBQ2hDLEtBQUssR0FBRyxJQUFJO0FBQUEsWUFDaEIsRUFDSztBQUFBLGNBQ0QsS0FBSztBQUFBO0FBQUE7QUFBQSxRQUdqQjtBQUFBLFNBQ0QsSUFBSTtBQUFBO0FBQUEsSUFFWCxNQUFNLFFBQVE7QUFBQSxJQUNkLE9BQU8sSUFBSSxRQUFRLENBQUMsS0FBSyxRQUFRO0FBQUEsTUFDN0IsS0FBSyxPQUFPLFFBQU07QUFBQSxRQUVkLElBQUk7QUFBQSxVQUNBLE9BQU8sSUFBSSxFQUFFO0FBQUEsUUFFakIsSUFBSSxPQUFPO0FBQUEsT0FDZDtBQUFBLEtBQ0o7QUFBQTtBQUFBLEVBRUwsUUFBUSxDQUFDLFFBQVEsS0FBSyxLQUFLLE9BQU8sQ0FBQyxHQUFHO0FBQUEsSUFDbEMsSUFBSSxPQUFPLFVBQVUsVUFBVTtBQUFBLE1BQzNCLFFBQVEsS0FBSyxJQUFJLFFBQVEsS0FBSztBQUFBLElBQ2xDLEVBQ0ssV0FBTSxpQkFBaUIsV0FBVztBQUFBLE1BQ25DLE9BQU87QUFBQSxNQUNQLFFBQVEsS0FBSztBQUFBLElBQ2pCO0FBQUEsSUFDQSxRQUFRLGdCQUFnQixNQUFNLFNBQVMsT0FBTyxpQkFBUSxlQUFnQjtBQUFBLElBQ3RFLE1BQU0sVUFBVSxDQUFDO0FBQUEsSUFDakIsS0FBSyxXQUFVLFFBQU8sS0FBSyxHQUFHO0FBQUEsTUFDMUIsUUFBUSxLQUFLLGdCQUFnQixRQUFRLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDekQ7QUFBQSxJQUNBLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7QUFBQSxJQUM1QixXQUFXLE9BQU8sTUFBTTtBQUFBLE1BQ3BCLE1BQU0sVUFBVSxJQUFJLFlBQVk7QUFBQSxNQUNoQyxXQUFXLEtBQUssU0FBUztBQUFBLFFBQ3JCLEtBQUssV0FBVSxRQUFPLENBQUMsR0FBRztBQUFBLFVBQ3RCLFFBQVEsS0FBSyxnQkFBZ0IsSUFBSSxFQUFFLFNBQVMsQ0FBQztBQUFBLFFBQ2pEO0FBQUEsUUFDQSxJQUFJLElBQUk7QUFBQSxRQUNSLElBQUksRUFBRSxlQUFlLEdBQUc7QUFBQSxVQUNwQixNQUFNLFdBQVcsSUFBSSxFQUFFLGFBQWE7QUFBQSxZQUNoQztBQUFBLFVBQ0osSUFBSSxFQUFFLFVBQVU7QUFBQSxZQUNaLEVBQUUsVUFBVTtBQUFBLFFBQ3BCO0FBQUEsUUFDQSxJQUFJLEVBQUUsV0FBVyxNQUFNLFVBQVUsR0FBRztBQUFBLFVBQ2hDLEtBQUssSUFBSSxDQUFDO0FBQUEsUUFDZDtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxHQVdWLE9BQU8sY0FBYyxHQUFHO0FBQUEsSUFDckIsT0FBTyxLQUFLLFFBQVE7QUFBQTtBQUFBLEVBRXhCLE9BQU8sQ0FBQyxRQUFRLEtBQUssS0FBSyxVQUFVLENBQUMsR0FBRztBQUFBLElBSXBDLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUMzQixRQUFRLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNsQyxFQUNLLFdBQU0saUJBQWlCLFdBQVc7QUFBQSxNQUNuQyxVQUFVO0FBQUEsTUFDVixRQUFRLEtBQUs7QUFBQSxJQUNqQjtBQUFBLElBQ0EsT0FBTyxLQUFLLE9BQU8sT0FBTyxPQUFPLEVBQUUsT0FBTyxlQUFlO0FBQUE7QUFBQSxHQU81RCxPQUFPLFNBQVMsR0FBRztBQUFBLElBQ2hCLE9BQU8sS0FBSyxZQUFZO0FBQUE7QUFBQSxHQUUzQixXQUFXLENBQUMsUUFBUSxLQUFLLEtBQUssT0FBTyxDQUFDLEdBQUc7QUFBQSxJQUN0QyxJQUFJLE9BQU8sVUFBVSxVQUFVO0FBQUEsTUFDM0IsUUFBUSxLQUFLLElBQUksUUFBUSxLQUFLO0FBQUEsSUFDbEMsRUFDSyxXQUFNLGlCQUFpQixXQUFXO0FBQUEsTUFDbkMsT0FBTztBQUFBLE1BQ1AsUUFBUSxLQUFLO0FBQUEsSUFDakI7QUFBQSxJQUNBLFFBQVEsZ0JBQWdCLE1BQU0sU0FBUyxPQUFPLGlCQUFRLGVBQWdCO0FBQUEsSUFDdEUsS0FBSyxXQUFVLFFBQU8sS0FBSyxHQUFHO0FBQUEsTUFDMUIsTUFBTSxnQkFBZ0IsUUFBUSxNQUFNLFNBQVM7QUFBQSxJQUNqRDtBQUFBLElBQ0EsTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztBQUFBLElBQzVCLFdBQVcsT0FBTyxNQUFNO0FBQUEsTUFDcEIsTUFBTSxVQUFVLElBQUksWUFBWTtBQUFBLE1BQ2hDLFdBQVcsS0FBSyxTQUFTO0FBQUEsUUFDckIsS0FBSyxXQUFVLFFBQU8sQ0FBQyxHQUFHO0FBQUEsVUFDdEIsTUFBTSxnQkFBZ0IsSUFBSSxFQUFFLFNBQVM7QUFBQSxRQUN6QztBQUFBLFFBQ0EsSUFBSSxJQUFJO0FBQUEsUUFDUixJQUFJLEVBQUUsZUFBZSxHQUFHO0FBQUEsVUFDcEIsTUFBTSxXQUFXLElBQUksRUFBRSxhQUFhO0FBQUEsWUFDaEM7QUFBQSxVQUNKLElBQUksRUFBRSxVQUFVO0FBQUEsWUFDWixFQUFFLFVBQVU7QUFBQSxRQUNwQjtBQUFBLFFBQ0EsSUFBSSxFQUFFLFdBQVcsTUFBTSxVQUFVLEdBQUc7QUFBQSxVQUNoQyxLQUFLLElBQUksQ0FBQztBQUFBLFFBQ2Q7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBO0FBQUEsRUFFSixNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssT0FBTyxDQUFDLEdBQUc7QUFBQSxJQUNoQyxJQUFJLE9BQU8sVUFBVSxVQUFVO0FBQUEsTUFDM0IsUUFBUSxLQUFLLElBQUksUUFBUSxLQUFLO0FBQUEsSUFDbEMsRUFDSyxXQUFNLGlCQUFpQixXQUFXO0FBQUEsTUFDbkMsT0FBTztBQUFBLE1BQ1AsUUFBUSxLQUFLO0FBQUEsSUFDakI7QUFBQSxJQUNBLFFBQVEsZ0JBQWdCLE1BQU0sU0FBUyxPQUFPLGlCQUFRLGVBQWdCO0FBQUEsSUFDdEUsTUFBTSxVQUFVLElBQUksU0FBUyxFQUFFLFlBQVksS0FBSyxDQUFDO0FBQUEsSUFDakQsS0FBSyxXQUFVLFFBQU8sS0FBSyxHQUFHO0FBQUEsTUFDMUIsUUFBUSxNQUFNLGdCQUFnQixRQUFRLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDMUQ7QUFBQSxJQUNBLE1BQU0sT0FBTyxJQUFJO0FBQUEsSUFDakIsTUFBTSxRQUFRLENBQUMsS0FBSztBQUFBLElBQ3BCLElBQUksYUFBYTtBQUFBLElBQ2pCLE1BQU0sV0FBVSxNQUFNO0FBQUEsTUFDbEIsSUFBSSxTQUFTO0FBQUEsTUFDYixRQUFRLFFBQVE7QUFBQSxRQUNaLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFBQSxRQUN4QixLQUFLLEtBQUs7QUFBQSxVQUNOLElBQUksZUFBZTtBQUFBLFlBQ2YsUUFBUSxJQUFJO0FBQUEsVUFDaEI7QUFBQSxRQUNKO0FBQUEsUUFDQTtBQUFBLFFBQ0EsS0FBSyxJQUFJLEdBQUc7QUFBQSxRQUNaLE1BQU0sWUFBWSxDQUFDLElBQUksU0FBUyxlQUFlLFVBQVU7QUFBQSxVQUVyRCxJQUFJO0FBQUEsWUFDQSxPQUFPLFFBQVEsS0FBSyxTQUFTLEVBQUU7QUFBQSxVQUVuQyxJQUFJLFdBQVcsY0FBYztBQUFBLFlBQ3pCLE1BQU0sV0FBVyxDQUFDO0FBQUEsWUFDbEIsV0FBVyxLQUFLLFNBQVM7QUFBQSxjQUNyQixJQUFJLEVBQUUsZUFBZSxHQUFHO0FBQUEsZ0JBQ3BCLFNBQVMsS0FBSyxFQUNULFNBQVMsRUFDVCxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFBQSxjQUNwRDtBQUFBLFlBQ0o7QUFBQSxZQUNBLElBQUksU0FBUyxRQUFRO0FBQUEsY0FDakIsUUFBUSxJQUFJLFFBQVEsRUFBRSxLQUFLLE1BQU0sVUFBVSxNQUFNLFNBQVMsSUFBSSxDQUFDO0FBQUEsY0FDL0Q7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFVBQ0EsV0FBVyxLQUFLLFNBQVM7QUFBQSxZQUNyQixJQUFJLE9BQU8sV0FBVSxRQUFPLENBQUMsSUFBSTtBQUFBLGNBQzdCLEtBQUssUUFBUSxNQUFNLGdCQUFnQixJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUc7QUFBQSxnQkFDbEQsU0FBUztBQUFBLGNBQ2I7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFVBQ0E7QUFBQSxVQUNBLFdBQVcsS0FBSyxTQUFTO0FBQUEsWUFDckIsTUFBTSxJQUFJLEVBQUUsZUFBZSxLQUFLO0FBQUEsWUFDaEMsSUFBSSxFQUFFLFdBQVcsTUFBTSxVQUFVLEdBQUc7QUFBQSxjQUNoQyxNQUFNLEtBQUssQ0FBQztBQUFBLFlBQ2hCO0FBQUEsVUFDSjtBQUFBLFVBQ0EsSUFBSSxXQUFXLFFBQVEsU0FBUztBQUFBLFlBQzVCLFFBQVEsS0FBSyxTQUFTLFFBQU87QUFBQSxVQUNqQyxFQUNLLFVBQUssTUFBTTtBQUFBLFlBQ1osU0FBUTtBQUFBLFVBQ1o7QUFBQTtBQUFBLFFBR0osSUFBSSxPQUFPO0FBQUEsUUFDWCxJQUFJLFVBQVUsV0FBVyxJQUFJO0FBQUEsUUFDN0IsT0FBTztBQUFBLE1BQ1g7QUFBQTtBQUFBLElBRUosU0FBUTtBQUFBLElBQ1IsT0FBTztBQUFBO0FBQUEsRUFFWCxVQUFVLENBQUMsUUFBUSxLQUFLLEtBQUssT0FBTyxDQUFDLEdBQUc7QUFBQSxJQUNwQyxJQUFJLE9BQU8sVUFBVSxVQUFVO0FBQUEsTUFDM0IsUUFBUSxLQUFLLElBQUksUUFBUSxLQUFLO0FBQUEsSUFDbEMsRUFDSyxXQUFNLGlCQUFpQixXQUFXO0FBQUEsTUFDbkMsT0FBTztBQUFBLE1BQ1AsUUFBUSxLQUFLO0FBQUEsSUFDakI7QUFBQSxJQUNBLFFBQVEsZ0JBQWdCLE1BQU0sU0FBUyxPQUFPLGlCQUFRLGVBQWdCO0FBQUEsSUFDdEUsTUFBTSxVQUFVLElBQUksU0FBUyxFQUFFLFlBQVksS0FBSyxDQUFDO0FBQUEsSUFDakQsTUFBTSxPQUFPLElBQUk7QUFBQSxJQUNqQixLQUFLLFdBQVUsUUFBTyxLQUFLLEdBQUc7QUFBQSxNQUMxQixRQUFRLE1BQU0sZ0JBQWdCLFFBQVEsTUFBTSxTQUFTLENBQUM7QUFBQSxJQUMxRDtBQUFBLElBQ0EsTUFBTSxRQUFRLENBQUMsS0FBSztBQUFBLElBQ3BCLElBQUksYUFBYTtBQUFBLElBQ2pCLE1BQU0sV0FBVSxNQUFNO0FBQUEsTUFDbEIsSUFBSSxTQUFTO0FBQUEsTUFDYixRQUFRLFFBQVE7QUFBQSxRQUNaLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFBQSxRQUN4QixLQUFLLEtBQUs7QUFBQSxVQUNOLElBQUksZUFBZTtBQUFBLFlBQ2YsUUFBUSxJQUFJO0FBQUEsVUFDaEI7QUFBQSxRQUNKO0FBQUEsUUFDQTtBQUFBLFFBQ0EsS0FBSyxJQUFJLEdBQUc7QUFBQSxRQUNaLE1BQU0sVUFBVSxJQUFJLFlBQVk7QUFBQSxRQUNoQyxXQUFXLEtBQUssU0FBUztBQUFBLFVBQ3JCLEtBQUssV0FBVSxRQUFPLENBQUMsR0FBRztBQUFBLFlBQ3RCLEtBQUssUUFBUSxNQUFNLGdCQUFnQixJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUc7QUFBQSxjQUNsRCxTQUFTO0FBQUEsWUFDYjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsUUFDQTtBQUFBLFFBQ0EsV0FBVyxLQUFLLFNBQVM7QUFBQSxVQUNyQixJQUFJLElBQUk7QUFBQSxVQUNSLElBQUksRUFBRSxlQUFlLEdBQUc7QUFBQSxZQUNwQixNQUFNLFdBQVcsSUFBSSxFQUFFLGFBQWE7QUFBQSxjQUNoQztBQUFBLFlBQ0osSUFBSSxFQUFFLFVBQVU7QUFBQSxjQUNaLEVBQUUsVUFBVTtBQUFBLFVBQ3BCO0FBQUEsVUFDQSxJQUFJLEVBQUUsV0FBVyxNQUFNLFVBQVUsR0FBRztBQUFBLFlBQ2hDLE1BQU0sS0FBSyxDQUFDO0FBQUEsVUFDaEI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLE1BQ0EsSUFBSSxXQUFXLFFBQVE7QUFBQSxRQUNuQixRQUFRLEtBQUssU0FBUyxRQUFPO0FBQUE7QUFBQSxJQUVyQyxTQUFRO0FBQUEsSUFDUixPQUFPO0FBQUE7QUFBQSxFQUVYLEtBQUssQ0FBQyxRQUFPLEtBQUssS0FBSztBQUFBLElBQ25CLE1BQU0sU0FBUyxLQUFLO0FBQUEsSUFDcEIsS0FBSyxNQUFNLE9BQU8sVUFBUyxXQUFXLEtBQUssSUFBSSxRQUFRLEtBQUksSUFBSTtBQUFBLElBQy9ELEtBQUssSUFBSSxVQUFVLE1BQU07QUFBQTtBQUVqQztBQUFBO0FBT08sTUFBTSx3QkFBd0IsZUFBZTtBQUFBLEVBSWhELE1BQU07QUFBQSxFQUNOLFdBQVcsQ0FBQyxNQUFNLFFBQVEsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHO0FBQUEsSUFDeEMsUUFBUSxTQUFTLFNBQVM7QUFBQSxJQUMxQixNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxPQUFPLENBQUM7QUFBQSxJQUMzQyxLQUFLLFNBQVM7QUFBQSxJQUNkLFNBQVMsSUFBSSxLQUFLLElBQUssR0FBRyxJQUFJLEVBQUUsUUFBUTtBQUFBLE1BQ3BDLEVBQUUsU0FBUyxLQUFLO0FBQUEsSUFDcEI7QUFBQTtBQUFBLEVBS0osYUFBYSxDQUFDLEtBQUs7QUFBQSxJQUlmLE9BQU8sTUFBTSxNQUFNLEdBQUcsRUFBRSxLQUFLLFlBQVk7QUFBQTtBQUFBLEVBSzdDLE9BQU8sQ0FBQyxJQUFJO0FBQUEsSUFDUixPQUFPLElBQUksVUFBVSxLQUFLLFVBQVUsT0FBTyxXQUFXLEtBQUssT0FBTyxLQUFLLFFBQVEsS0FBSyxjQUFjLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFBQTtBQUFBLEVBSy9HLFVBQVUsQ0FBQyxHQUFHO0FBQUEsSUFDVixPQUFRLEVBQUUsV0FBVyxHQUFHLEtBQUssRUFBRSxXQUFXLElBQUksS0FBSyxrQkFBa0IsS0FBSyxDQUFDO0FBQUE7QUFFbkY7QUFBQTtBQVFPLE1BQU0sd0JBQXdCLGVBQWU7QUFBQSxFQUloRCxNQUFNO0FBQUEsRUFDTixXQUFXLENBQUMsTUFBTSxRQUFRLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRztBQUFBLElBQ3hDLFFBQVEsU0FBUyxVQUFVO0FBQUEsSUFDM0IsTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDMUMsS0FBSyxTQUFTO0FBQUE7QUFBQSxFQUtsQixhQUFhLENBQUMsTUFBTTtBQUFBLElBQ2hCLE9BQU87QUFBQTtBQUFBLEVBS1gsT0FBTyxDQUFDLElBQUk7QUFBQSxJQUNSLE9BQU8sSUFBSSxVQUFVLEtBQUssVUFBVSxPQUFPLFdBQVcsS0FBSyxPQUFPLEtBQUssUUFBUSxLQUFLLGNBQWMsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUFBO0FBQUEsRUFLL0csVUFBVSxDQUFDLEdBQUc7QUFBQSxJQUNWLE9BQU8sRUFBRSxXQUFXLEdBQUc7QUFBQTtBQUUvQjtBQUFBO0FBU08sTUFBTSx5QkFBeUIsZ0JBQWdCO0FBQUEsRUFDbEQsV0FBVyxDQUFDLE1BQU0sUUFBUSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUc7QUFBQSxJQUN4QyxRQUFRLFNBQVMsU0FBUztBQUFBLElBQzFCLE1BQU0sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQUE7QUFFdEM7QUFNTyxJQUFNLE9BQU8sUUFBUSxhQUFhLFVBQVUsWUFBWTtBQU94RCxJQUFNLGFBQWEsUUFBUSxhQUFhLFVBQVUsa0JBQ25ELFFBQVEsYUFBYSxXQUFXLG1CQUM1Qjs7O0FFejdEVixJQUFNLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxVQUFVO0FBQzNDLElBQU0sYUFBYSxDQUFDLE9BQU8sR0FBRyxVQUFVO0FBQUE7QUFLakMsTUFBTSxRQUFRO0FBQUEsRUFDakI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLGtCQUFrQjtBQUFBLEVBQ2xCLFdBQVcsQ0FBQyxhQUFhLFVBQVUsT0FBTyxVQUFVO0FBQUEsSUFDaEQsS0FBSyxjQUFjLFdBQVcsR0FBRztBQUFBLE1BQzdCLE1BQU0sSUFBSSxVQUFVLG9CQUFvQjtBQUFBLElBQzVDO0FBQUEsSUFDQSxLQUFLLFdBQVcsUUFBUSxHQUFHO0FBQUEsTUFDdkIsTUFBTSxJQUFJLFVBQVUsaUJBQWlCO0FBQUEsSUFDekM7QUFBQSxJQUNBLElBQUksU0FBUyxXQUFXLFlBQVksUUFBUTtBQUFBLE1BQ3hDLE1BQU0sSUFBSSxVQUFVLCtDQUErQztBQUFBLElBQ3ZFO0FBQUEsSUFDQSxLQUFLLFNBQVMsWUFBWTtBQUFBLElBQzFCLElBQUksUUFBUSxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQUEsTUFDbkMsTUFBTSxJQUFJLFVBQVUsb0JBQW9CO0FBQUEsSUFDNUM7QUFBQSxJQUNBLEtBQUssZUFBZTtBQUFBLElBQ3BCLEtBQUssWUFBWTtBQUFBLElBQ2pCLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxZQUFZO0FBQUEsSUFFakIsSUFBSSxLQUFLLFdBQVcsR0FBRztBQUFBLE1BU25CLElBQUksS0FBSyxNQUFNLEdBQUc7QUFBQSxRQUVkLE9BQU8sSUFBSSxJQUFJLElBQUksT0FBTyxTQUFTLEtBQUs7QUFBQSxRQUN4QyxPQUFPLElBQUksSUFBSSxJQUFJLE9BQU8sU0FBUyxLQUFLO0FBQUEsUUFDeEMsSUFBSSxNQUFNLE9BQU8sSUFBSTtBQUFBLFVBRWpCLE1BQU0sTUFBTTtBQUFBLFVBQ1osTUFBTSxNQUFNO0FBQUEsUUFDaEI7QUFBQSxRQUNBLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssR0FBRztBQUFBLFFBQ3ZDLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssR0FBRztBQUFBLFFBQ3ZDLEtBQUssZUFBZSxDQUFDLEdBQUcsR0FBRyxLQUFLO0FBQUEsUUFDaEMsS0FBSyxZQUFZLENBQUMsR0FBRyxHQUFHLEtBQUs7QUFBQSxRQUM3QixLQUFLLFNBQVMsS0FBSyxhQUFhO0FBQUEsTUFDcEMsRUFDSyxTQUFJLEtBQUssUUFBUSxLQUFLLEtBQUssV0FBVyxHQUFHO0FBQUEsUUFDMUMsT0FBTyxPQUFPLFNBQVMsS0FBSztBQUFBLFFBQzVCLE9BQU8sT0FBTyxTQUFTLEtBQUs7QUFBQSxRQUM1QixJQUFJLE1BQU0sT0FBTyxJQUFJO0FBQUEsVUFFakIsTUFBTSxNQUFNO0FBQUEsVUFDWixNQUFNLE1BQU07QUFBQSxRQUNoQjtBQUFBLFFBQ0EsTUFBTSxJQUFJLEtBQUs7QUFBQSxRQUNmLE1BQU0sSUFBSSxLQUFLO0FBQUEsUUFDZixLQUFLLGVBQWUsQ0FBQyxHQUFHLEdBQUcsS0FBSztBQUFBLFFBQ2hDLEtBQUssWUFBWSxDQUFDLEdBQUcsR0FBRyxLQUFLO0FBQUEsUUFDN0IsS0FBSyxTQUFTLEtBQUssYUFBYTtBQUFBLE1BQ3BDO0FBQUEsSUFDSjtBQUFBO0FBQUEsRUFLSixPQUFPLEdBQUc7QUFBQSxJQUNOLE9BQU8sS0FBSyxhQUFhLEtBQUs7QUFBQTtBQUFBLEVBS2xDLFFBQVEsR0FBRztBQUFBLElBQ1AsT0FBTyxPQUFPLEtBQUssYUFBYSxLQUFLLFlBQVk7QUFBQTtBQUFBLEVBS3JELFVBQVUsR0FBRztBQUFBLElBQ1QsT0FBTyxLQUFLLGFBQWEsS0FBSyxZQUFZO0FBQUE7QUFBQSxFQUs5QyxRQUFRLEdBQUc7QUFBQSxJQUNQLE9BQU8sS0FBSyxhQUFhLEtBQUssbUJBQW1CO0FBQUE7QUFBQSxFQUtyRCxVQUFVLEdBQUc7QUFBQSxJQUNULE9BQVEsS0FBSyxjQUNULEtBQUssZ0JBQ0EsS0FBSyxXQUFXLElBQ2IsS0FBSyxXQUFXLElBQ1osS0FBSyxVQUFVLEtBQUssS0FBSyxVQUFVLE1BQU0sQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUNsRCxLQUFLLFVBQVUsS0FBSyxHQUFHLElBQzNCLEtBQUssVUFBVSxNQUFNLEtBQUssTUFBTSxFQUFFLEtBQUssR0FBRztBQUFBO0FBQUEsRUFLNUQsT0FBTyxHQUFHO0FBQUEsSUFDTixPQUFPLEtBQUssU0FBUyxLQUFLLFNBQVM7QUFBQTtBQUFBLEVBS3ZDLElBQUksR0FBRztBQUFBLElBQ0gsSUFBSSxLQUFLLFVBQVU7QUFBQSxNQUNmLE9BQU8sS0FBSztBQUFBLElBQ2hCLEtBQUssS0FBSyxRQUFRO0FBQUEsTUFDZCxPQUFRLEtBQUssUUFBUTtBQUFBLElBQ3pCLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxjQUFjLEtBQUssV0FBVyxLQUFLLFNBQVMsR0FBRyxLQUFLLFNBQVM7QUFBQSxJQUMzRixLQUFLLE1BQU0sY0FBYyxLQUFLO0FBQUEsSUFDOUIsS0FBSyxNQUFNLFNBQVMsS0FBSztBQUFBLElBQ3pCLEtBQUssTUFBTSxXQUFXLEtBQUs7QUFBQSxJQUMzQixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBS2hCLEtBQUssR0FBRztBQUFBLElBQ0osTUFBTSxLQUFLLEtBQUs7QUFBQSxJQUNoQixPQUFPLEtBQUssV0FBVyxZQUNuQixLQUFLLFNBQ0YsS0FBSyxTQUNKLEtBQUssY0FBYyxXQUNmLEtBQUssV0FBVyxLQUNoQixHQUFHLE9BQU8sTUFDVixHQUFHLE9BQU8sTUFDVixPQUFPLEdBQUcsT0FBTyxjQUNmLEdBQUcsTUFDTCxPQUFPLEdBQUcsT0FBTyxjQUNmLEdBQUc7QUFBQTtBQUFBLEVBVXJCLE9BQU8sR0FBRztBQUFBLElBQ04sTUFBTSxLQUFLLEtBQUs7QUFBQSxJQUNoQixPQUFPLEtBQUssYUFBYSxZQUNyQixLQUFLLFdBQ0YsS0FBSyxXQUNKLEtBQUssY0FBYyxXQUNmLEtBQUssV0FBVyxLQUNoQixLQUFLLFNBQVMsS0FDZCxPQUFPLEdBQUcsT0FBTyxZQUNqQixZQUFZLEtBQUssR0FBRyxFQUFFO0FBQUE7QUFBQSxFQVF0QyxVQUFVLEdBQUc7QUFBQSxJQUNULE1BQU0sS0FBSyxLQUFLO0FBQUEsSUFDaEIsT0FBTyxLQUFLLGdCQUFnQixZQUN4QixLQUFLLGNBQ0YsS0FBSyxjQUNILEdBQUcsT0FBTyxNQUFNLEdBQUcsU0FBUyxLQUN6QixLQUFLLFFBQVEsS0FDYixLQUFLLE1BQU07QUFBQTtBQUFBLEVBSzNCLElBQUksR0FBRztBQUFBLElBQ0gsTUFBTSxJQUFJLEtBQUssYUFBYTtBQUFBLElBQzVCLE9BQVEsT0FBTyxNQUFNLFlBQVksS0FBSyxXQUFXLEtBQUssS0FBSyxXQUFXLElBQ2xFLElBQ0U7QUFBQTtBQUFBLEVBTVYsbUJBQW1CLEdBQUc7QUFBQSxJQUNsQixTQUFTLEtBQUssV0FBVyxNQUNwQixLQUFLLFdBQVcsTUFDaEIsS0FBSztBQUFBO0FBQUEsRUFLZCxrQkFBa0IsR0FBRztBQUFBLElBQ2pCLElBQUksS0FBSyxXQUFXLE1BQU0sS0FBSyxXQUFXLE1BQU0sS0FBSztBQUFBLE1BQ2pELE9BQU87QUFBQSxJQUNYLEtBQUssa0JBQWtCO0FBQUEsSUFDdkIsT0FBTztBQUFBO0FBRWY7OztBQy9NQSxJQUFNLG1CQUFtQixPQUFPLFlBQVksWUFDeEMsV0FDQSxPQUFPLFFBQVEsYUFBYSxXQUM1QixRQUFRLFdBQ047QUFBQTtBQUlDLE1BQU0sT0FBTztBQUFBLEVBQ2hCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLFdBQVcsQ0FBQyxXQUFXLFNBQVMsUUFBUSxPQUFPLFlBQVksV0FBVyxvQkFBb0I7QUFBQSxJQUN0RixLQUFLLFdBQVcsQ0FBQztBQUFBLElBQ2pCLEtBQUssV0FBVyxDQUFDO0FBQUEsSUFDakIsS0FBSyxtQkFBbUIsQ0FBQztBQUFBLElBQ3pCLEtBQUssbUJBQW1CLENBQUM7QUFBQSxJQUN6QixLQUFLLFdBQVc7QUFBQSxJQUNoQixLQUFLLFNBQVM7QUFBQSxNQUNWLEtBQUs7QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxtQkFBbUI7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsV0FBVztBQUFBLE1BQ1gsVUFBVTtBQUFBLElBQ2Q7QUFBQSxJQUNBLFdBQVcsT0FBTztBQUFBLE1BQ2QsS0FBSyxJQUFJLEdBQUc7QUFBQTtBQUFBLEVBRXBCLEdBQUcsQ0FBQyxLQUFLO0FBQUEsSUFhTCxNQUFNLEtBQUssSUFBSSxVQUFVLEtBQUssS0FBSyxNQUFNO0FBQUEsSUFDekMsU0FBUyxJQUFJLEVBQUcsSUFBSSxHQUFHLElBQUksUUFBUSxLQUFLO0FBQUEsTUFDcEMsTUFBTSxTQUFTLEdBQUcsSUFBSTtBQUFBLE1BQ3RCLE1BQU0sWUFBWSxHQUFHLFVBQVU7QUFBQSxNQUUvQixLQUFLLFdBQVcsV0FBVztBQUFBLFFBQ3ZCLE1BQU0sSUFBSSxNQUFNLHdCQUF3QjtBQUFBLE1BQzVDO0FBQUEsTUFHQSxPQUFPLE9BQU8sT0FBTyxPQUFPLFVBQVUsT0FBTyxLQUFLO0FBQUEsUUFDOUMsT0FBTyxNQUFNO0FBQUEsUUFDYixVQUFVLE1BQU07QUFBQSxNQUNwQjtBQUFBLE1BRUEsTUFBTSxJQUFJLElBQUksUUFBUSxRQUFRLFdBQVcsR0FBRyxLQUFLLFFBQVE7QUFBQSxNQUN6RCxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsV0FBVyxHQUFHLEtBQUssTUFBTTtBQUFBLE1BQ25ELE1BQU0sV0FBVyxVQUFVLFVBQVUsU0FBUyxPQUFPO0FBQUEsTUFDckQsTUFBTSxXQUFXLEVBQUUsV0FBVztBQUFBLE1BQzlCLElBQUk7QUFBQSxRQUNBLEtBQUssU0FBUyxLQUFLLENBQUM7QUFBQSxNQUVwQjtBQUFBLGFBQUssU0FBUyxLQUFLLENBQUM7QUFBQSxNQUN4QixJQUFJLFVBQVU7QUFBQSxRQUNWLElBQUk7QUFBQSxVQUNBLEtBQUssaUJBQWlCLEtBQUssQ0FBQztBQUFBLFFBRTVCO0FBQUEsZUFBSyxpQkFBaUIsS0FBSyxDQUFDO0FBQUEsTUFDcEM7QUFBQSxJQUNKO0FBQUE7QUFBQSxFQUVKLE9BQU8sQ0FBQyxHQUFHO0FBQUEsSUFDUCxNQUFNLFdBQVcsRUFBRSxTQUFTO0FBQUEsSUFDNUIsTUFBTSxZQUFZLEdBQUc7QUFBQSxJQUNyQixNQUFNLFdBQVcsRUFBRSxTQUFTLEtBQUs7QUFBQSxJQUNqQyxNQUFNLFlBQVksR0FBRztBQUFBLElBQ3JCLFdBQVcsS0FBSyxLQUFLLFVBQVU7QUFBQSxNQUMzQixJQUFJLEVBQUUsTUFBTSxRQUFRLEtBQUssRUFBRSxNQUFNLFNBQVM7QUFBQSxRQUN0QyxPQUFPO0FBQUEsSUFDZjtBQUFBLElBQ0EsV0FBVyxLQUFLLEtBQUssVUFBVTtBQUFBLE1BQzNCLElBQUksRUFBRSxNQUFNLFFBQVEsS0FBSyxFQUFFLE1BQU0sU0FBUztBQUFBLFFBQ3RDLE9BQU87QUFBQSxJQUNmO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUVYLGVBQWUsQ0FBQyxHQUFHO0FBQUEsSUFDZixNQUFNLFdBQVcsRUFBRSxTQUFTLElBQUk7QUFBQSxJQUNoQyxNQUFNLFlBQVksRUFBRSxTQUFTLEtBQUssT0FBTztBQUFBLElBQ3pDLFdBQVcsS0FBSyxLQUFLLGtCQUFrQjtBQUFBLE1BQ25DLElBQUksRUFBRSxNQUFNLFFBQVE7QUFBQSxRQUNoQixPQUFPO0FBQUEsSUFDZjtBQUFBLElBQ0EsV0FBVyxLQUFLLEtBQUssa0JBQWtCO0FBQUEsTUFDbkMsSUFBSSxFQUFFLE1BQU0sUUFBUTtBQUFBLFFBQ2hCLE9BQU87QUFBQSxJQUNmO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFFZjs7O0FDNUdPLE1BQU0sZUFBZTtBQUFBLEVBQ3hCO0FBQUEsRUFDQSxXQUFXLENBQUMsUUFBUSxJQUFJLEtBQU87QUFBQSxJQUMzQixLQUFLLFFBQVE7QUFBQTtBQUFBLEVBRWpCLElBQUksR0FBRztBQUFBLElBQ0gsT0FBTyxJQUFJLGVBQWUsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDO0FBQUE7QUFBQSxFQUVqRCxTQUFTLENBQUMsUUFBUSxTQUFTO0FBQUEsSUFDdkIsT0FBTyxLQUFLLE1BQU0sSUFBSSxPQUFPLFNBQVMsQ0FBQyxHQUFHLElBQUksUUFBUSxXQUFXLENBQUM7QUFBQTtBQUFBLEVBRXRFLFdBQVcsQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUN6QixNQUFNLFdBQVcsT0FBTyxTQUFTO0FBQUEsSUFDakMsTUFBTSxTQUFTLEtBQUssTUFBTSxJQUFJLFFBQVE7QUFBQSxJQUN0QyxJQUFJO0FBQUEsTUFDQSxPQUFPLElBQUksUUFBUSxXQUFXLENBQUM7QUFBQSxJQUUvQjtBQUFBLFdBQUssTUFBTSxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQUE7QUFFcEU7QUFBQTtBQU1PLE1BQU0sWUFBWTtBQUFBLEVBQ3JCLFFBQVEsSUFBSTtBQUFBLEVBQ1osR0FBRyxDQUFDLFFBQVEsVUFBVSxPQUFPO0FBQUEsSUFDekIsTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLFFBQVEsSUFBSTtBQUFBLElBQzVDLE1BQU0sVUFBVSxLQUFLLE1BQU0sSUFBSSxNQUFNO0FBQUEsSUFDckMsS0FBSyxNQUFNLElBQUksUUFBUSxZQUFZLFlBQVksSUFBSSxJQUFJLE9BQU87QUFBQTtBQUFBLEVBR2xFLE9BQU8sR0FBRztBQUFBLElBQ04sT0FBTyxDQUFDLEdBQUcsS0FBSyxNQUFNLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFNLE9BQU87QUFBQSxNQUNoRDtBQUFBLFNBQ0csSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLElBQ1gsQ0FBQztBQUFBO0FBRVQ7QUFBQTtBQUtPLE1BQU0sU0FBUztBQUFBLEVBQ2xCLFFBQVEsSUFBSTtBQUFBLEVBQ1osR0FBRyxDQUFDLFFBQVEsU0FBUztBQUFBLElBQ2pCLEtBQUssT0FBTyxXQUFXLEdBQUc7QUFBQSxNQUN0QjtBQUFBLElBQ0o7QUFBQSxJQUNBLE1BQU0sT0FBTyxLQUFLLE1BQU0sSUFBSSxNQUFNO0FBQUEsSUFDbEMsSUFBSSxNQUFNO0FBQUEsTUFDTixLQUFLLEtBQUssS0FBSyxPQUFLLEVBQUUsV0FBVyxNQUFNLFFBQVEsV0FBVyxDQUFDLEdBQUc7QUFBQSxRQUMxRCxLQUFLLEtBQUssT0FBTztBQUFBLE1BQ3JCO0FBQUEsSUFDSixFQUVJO0FBQUEsV0FBSyxNQUFNLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUFBO0FBQUEsRUFFeEMsR0FBRyxDQUFDLFFBQVE7QUFBQSxJQUNSLE1BQU0sT0FBTyxLQUFLLE1BQU0sSUFBSSxNQUFNO0FBQUEsSUFFbEMsS0FBSyxNQUFNO0FBQUEsTUFDUCxNQUFNLElBQUksTUFBTSxpQ0FBaUM7QUFBQSxJQUNyRDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFFWCxPQUFPLEdBQUc7QUFBQSxJQUNOLE9BQU8sS0FBSyxLQUFLLEVBQUUsSUFBSSxPQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztBQUFBO0FBQUEsRUFFdEQsSUFBSSxHQUFHO0FBQUEsSUFDSCxPQUFPLENBQUMsR0FBRyxLQUFLLE1BQU0sS0FBSyxDQUFDLEVBQUUsT0FBTyxPQUFLLEVBQUUsV0FBVyxDQUFDO0FBQUE7QUFFaEU7QUFBQTtBQU9PLE1BQU0sVUFBVTtBQUFBLEVBQ25CO0FBQUEsRUFDQSxVQUFVLElBQUk7QUFBQSxFQUNkLFdBQVcsSUFBSTtBQUFBLEVBQ2Y7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLFdBQVcsQ0FBQyxNQUFNLGdCQUFnQjtBQUFBLElBQzlCLEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxXQUFXLEtBQUs7QUFBQSxJQUNyQixLQUFLLFFBQVEsS0FBSztBQUFBLElBQ2xCLEtBQUssaUJBQ0QsaUJBQWlCLGVBQWUsS0FBSyxJQUFJLElBQUk7QUFBQTtBQUFBLEVBRXJELGVBQWUsQ0FBQyxRQUFRLFVBQVU7QUFBQSxJQUM5QixLQUFLLFdBQVc7QUFBQSxJQUNoQixNQUFNLGdCQUFnQixTQUFTLElBQUksT0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFHbkQsVUFBVSxHQUFHLFlBQVksZUFBZTtBQUFBLE1BQ3BDLEtBQUssZUFBZSxZQUFZLEdBQUcsT0FBTztBQUFBLE1BQzFDLE1BQU0sT0FBTyxRQUFRLEtBQUs7QUFBQSxNQUMxQixNQUFNLFdBQVcsUUFBUSxXQUFXLEtBQUssS0FBSyxLQUFLLGFBQWE7QUFBQSxNQUVoRSxJQUFJLE1BQU07QUFBQSxRQUNOLElBQUksRUFBRSxRQUFRLFNBQVMsT0FBTyxLQUFLLEtBQUssU0FBUyxZQUM3QyxLQUFLLEtBQUssT0FDUixJQUFJO0FBQUEsUUFDVixNQUFNLFFBQU8sUUFBUSxLQUFLO0FBQUEsUUFDMUIsS0FBSyxPQUFNO0FBQUEsVUFDUCxLQUFLLFFBQVEsSUFBSSxHQUFHLE1BQU0sS0FBSztBQUFBLFVBQy9CO0FBQUEsUUFDSixFQUNLO0FBQUEsVUFDRCxVQUFVO0FBQUE7QUFBQSxNQUVsQjtBQUFBLE1BQ0EsSUFBSSxFQUFFLFNBQVM7QUFBQSxRQUNYO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixJQUFJLFVBQVU7QUFBQSxNQUNkLE9BQU8sUUFBUSxJQUFJLFFBQVEsUUFBUSxPQUFPLGFBQ3JDLE9BQU8sUUFBUSxLQUFLLElBQUk7QUFBQSxRQUN6QixNQUFNLElBQUksRUFBRSxRQUFRLENBQUM7QUFBQSxRQUNyQixJQUFJO0FBQUEsUUFDSixVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsTUFDZDtBQUFBLE1BQ0EsSUFBSSxRQUFRLFFBQVE7QUFBQSxNQUNwQixPQUFPLFFBQVEsS0FBSztBQUFBLE1BQ3BCLElBQUksU0FBUztBQUFBLFFBQ1QsSUFBSSxLQUFLLGVBQWUsVUFBVSxHQUFHLE9BQU87QUFBQSxVQUN4QztBQUFBLFFBQ0osS0FBSyxlQUFlLFlBQVksR0FBRyxPQUFPO0FBQUEsTUFDOUM7QUFBQSxNQUlBLElBQUksT0FBTyxNQUFNLFVBQVU7QUFBQSxRQUd2QixNQUFNLFFBQVEsTUFBTSxRQUFRLE1BQU0sTUFBTSxNQUFNO0FBQUEsUUFDOUMsS0FBSyxRQUFRLElBQUksRUFBRSxRQUFRLENBQUMsR0FBRyxVQUFVLEtBQUs7QUFBQSxRQUM5QztBQUFBLE1BQ0osRUFDSyxTQUFJLE1BQU0sVUFBVTtBQUFBLFFBTXJCLEtBQUssRUFBRSxlQUFlLEtBQ2xCLEtBQUssVUFDTCxRQUFRLG9CQUFvQixHQUFHO0FBQUEsVUFDL0IsS0FBSyxTQUFTLElBQUksR0FBRyxPQUFPO0FBQUEsUUFDaEM7QUFBQSxRQUNBLE1BQU0sS0FBSyxNQUFNLFFBQVE7QUFBQSxRQUN6QixNQUFNLFFBQVEsTUFBTSxLQUFLO0FBQUEsUUFDekIsS0FBSyxTQUFVLE9BQU8sTUFBTSxPQUFPLFNBQVMsT0FBUTtBQUFBLFVBR2hELEtBQUssUUFBUSxJQUFJLEdBQUcsVUFBVSxPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQUEsUUFDekQsRUFDSztBQUFBLFVBQ0QsSUFBSSxPQUFPLE1BQU07QUFBQSxZQUliLE1BQU0sS0FBSyxFQUFFLFVBQVU7QUFBQSxZQUV2QixLQUFLO0FBQUEsY0FDRCxLQUFLLFFBQVEsSUFBSSxJQUFJLFVBQVUsSUFBSTtBQUFBLFlBQ2xDLFVBQUssS0FBSyxlQUFlLFVBQVUsSUFBSSxLQUFLLEdBQUc7QUFBQSxjQUNoRCxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUs7QUFBQSxZQUMvQjtBQUFBLFVBQ0o7QUFBQTtBQUFBLE1BRVIsRUFDSyxTQUFJLGFBQWEsUUFBUTtBQUFBLFFBQzFCLEtBQUssU0FBUyxJQUFJLEdBQUcsT0FBTztBQUFBLE1BQ2hDO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFFWCxjQUFjLEdBQUc7QUFBQSxJQUNiLE9BQU8sS0FBSyxTQUFTLEtBQUs7QUFBQTtBQUFBLEVBRTlCLEtBQUssR0FBRztBQUFBLElBQ0osT0FBTyxJQUFJLFVBQVUsS0FBSyxNQUFNLEtBQUssY0FBYztBQUFBO0FBQUEsRUFNdkQsYUFBYSxDQUFDLFFBQVEsU0FBUztBQUFBLElBQzNCLE1BQU0sV0FBVyxLQUFLLFNBQVMsSUFBSSxNQUFNO0FBQUEsSUFFekMsTUFBTSxVQUFVLEtBQUssTUFBTTtBQUFBLElBQzNCLFdBQVcsS0FBSyxTQUFTO0FBQUEsTUFDckIsV0FBVyxXQUFXLFVBQVU7QUFBQSxRQUM1QixNQUFNLFdBQVcsUUFBUSxXQUFXO0FBQUEsUUFDcEMsTUFBTSxJQUFJLFFBQVEsUUFBUTtBQUFBLFFBQzFCLE1BQU0sT0FBTyxRQUFRLEtBQUs7QUFBQSxRQUMxQixJQUFJLE1BQU0sVUFBVTtBQUFBLFVBQ2hCLFFBQVEsYUFBYSxHQUFHLFNBQVMsTUFBTSxRQUFRO0FBQUEsUUFDbkQsRUFDSyxTQUFJLGFBQWEsUUFBUTtBQUFBLFVBQzFCLFFBQVEsV0FBVyxHQUFHLEdBQUcsTUFBTSxRQUFRO0FBQUEsUUFDM0MsRUFDSztBQUFBLFVBQ0QsUUFBUSxXQUFXLEdBQUcsR0FBRyxNQUFNLFFBQVE7QUFBQTtBQUFBLE1BRS9DO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFFWCxZQUFZLENBQUMsR0FBRyxTQUFTLE1BQU0sVUFBVTtBQUFBLElBQ3JDLElBQUksS0FBSyxRQUFRLEVBQUUsS0FBSyxXQUFXLEdBQUcsR0FBRztBQUFBLE1BQ3JDLEtBQUssUUFBUSxRQUFRLEdBQUc7QUFBQSxRQUNwQixLQUFLLFFBQVEsSUFBSSxHQUFHLFVBQVUsS0FBSztBQUFBLE1BQ3ZDO0FBQUEsTUFDQSxJQUFJLEVBQUUsV0FBVyxHQUFHO0FBQUEsUUFNaEIsSUFBSSxLQUFLLFdBQVcsRUFBRSxlQUFlLEdBQUc7QUFBQSxVQUNwQyxLQUFLLFNBQVMsSUFBSSxHQUFHLE9BQU87QUFBQSxRQUNoQyxFQUNLLFNBQUksRUFBRSxlQUFlLEdBQUc7QUFBQSxVQUN6QixJQUFJLFFBQVEsUUFBUSxvQkFBb0IsR0FBRztBQUFBLFlBQ3ZDLEtBQUssU0FBUyxJQUFJLEdBQUcsSUFBSTtBQUFBLFVBQzdCLEVBQ0ssU0FBSSxRQUFRLG1CQUFtQixHQUFHO0FBQUEsWUFDbkMsS0FBSyxTQUFTLElBQUksR0FBRyxPQUFPO0FBQUEsVUFDaEM7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxJQUdBLElBQUksTUFBTTtBQUFBLE1BQ04sTUFBTSxLQUFLLEtBQUssUUFBUTtBQUFBLE1BQ3hCLElBQUksT0FBTyxPQUFPLFlBRWQsT0FBTyxRQUNQLE9BQU8sTUFDUCxPQUFPLEtBQUs7QUFBQSxRQUNaLEtBQUssV0FBVyxHQUFHLElBQUksS0FBSyxLQUFLLEdBQUcsUUFBUTtBQUFBLE1BQ2hELEVBQ0ssU0FBSSxPQUFPLE1BQU07QUFBQSxRQUVsQixNQUFNLEtBQUssRUFBRSxVQUFVO0FBQUEsUUFFdkIsS0FBSyxTQUFTLElBQUksSUFBSSxJQUFJO0FBQUEsTUFDOUIsRUFDSyxTQUFJLGNBQWMsUUFBUTtBQUFBLFFBQzNCLEtBQUssV0FBVyxHQUFHLElBQUksS0FBSyxLQUFLLEdBQUcsUUFBUTtBQUFBLE1BQ2hEO0FBQUEsSUFDSjtBQUFBO0FBQUEsRUFFSixVQUFVLENBQUMsR0FBRyxHQUFHLE1BQU0sVUFBVTtBQUFBLElBQzdCLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSTtBQUFBLE1BQ2Q7QUFBQSxJQUNKLEtBQUssTUFBTTtBQUFBLE1BQ1AsS0FBSyxRQUFRLElBQUksR0FBRyxVQUFVLEtBQUs7QUFBQSxJQUN2QyxFQUNLO0FBQUEsTUFDRCxLQUFLLFNBQVMsSUFBSSxHQUFHLElBQUk7QUFBQTtBQUFBO0FBQUEsRUFHakMsVUFBVSxDQUFDLEdBQUcsR0FBRyxNQUFNLFVBQVU7QUFBQSxJQUU3QixLQUFLLEVBQUUsUUFBUSxDQUFDO0FBQUEsTUFDWjtBQUFBLElBQ0osS0FBSyxNQUFNO0FBQUEsTUFDUCxLQUFLLFFBQVEsSUFBSSxHQUFHLFVBQVUsS0FBSztBQUFBLElBQ3ZDLEVBQ0s7QUFBQSxNQUNELEtBQUssU0FBUyxJQUFJLEdBQUcsSUFBSTtBQUFBO0FBQUE7QUFHckM7OztBQzNSQSxJQUFNLGFBQWEsQ0FBQyxRQUFRLFNBQVMsT0FBTyxXQUFXLFdBQVcsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksSUFDckYsTUFBTSxRQUFRLE1BQU0sSUFBSSxJQUFJLE9BQU8sUUFBUSxJQUFJLElBQzNDO0FBQUE7QUFJSCxNQUFNLFNBQVM7QUFBQSxFQUNsQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxPQUFPLElBQUk7QUFBQSxFQUNYLFNBQVM7QUFBQSxFQUNULFVBQVU7QUFBQSxFQUNWLFlBQVksQ0FBQztBQUFBLEVBQ2I7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxXQUFXLENBQUMsVUFBVSxPQUFNLE1BQU07QUFBQSxJQUM5QixLQUFLLFdBQVc7QUFBQSxJQUNoQixLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxRQUFRLEtBQUssU0FBUyxLQUFLLGFBQWEsVUFBVSxPQUFPO0FBQUEsSUFDOUQsS0FBSyxzQkFBc0IsS0FBSyx3QkFBd0I7QUFBQSxJQUN4RCxJQUFJLEtBQUssV0FBVyxLQUFLLHFCQUFxQjtBQUFBLE1BQzFDLEtBQUssVUFBVSxXQUFXLEtBQUssVUFBVSxDQUFDLEdBQUcsSUFBSTtBQUFBLE1BQ2pELEtBQUssS0FBSyx1QkFDTixPQUFPLEtBQUssUUFBUSxRQUFRLFlBQVk7QUFBQSxRQUN4QyxNQUFNLElBQUk7QUFBQSxRQUNWLE1BQU0sSUFBSSxNQUFNLENBQUM7QUFBQSxNQUNyQjtBQUFBLElBQ0o7QUFBQSxJQUlBLEtBQUssV0FBVyxLQUFLLFlBQVk7QUFBQSxJQUVqQyxJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2IsS0FBSyxTQUFTLEtBQUs7QUFBQSxNQUNuQixLQUFLLE9BQU8saUJBQWlCLFNBQVMsTUFBTTtBQUFBLFFBQ3hDLEtBQUssVUFBVSxTQUFTO0FBQUEsT0FDM0I7QUFBQSxJQUNMO0FBQUE7QUFBQSxFQUVKLFFBQVEsQ0FBQyxPQUFNO0FBQUEsSUFDWCxPQUFPLEtBQUssS0FBSyxJQUFJLEtBQUksT0FBTyxLQUFLLFNBQVMsVUFBVSxLQUFJO0FBQUE7QUFBQSxFQUVoRSxnQkFBZ0IsQ0FBQyxPQUFNO0FBQUEsSUFDbkIsU0FBUyxLQUFLLFNBQVMsa0JBQWtCLEtBQUk7QUFBQTtBQUFBLEVBR2pELEtBQUssR0FBRztBQUFBLElBQ0osS0FBSyxTQUFTO0FBQUE7QUFBQSxFQUVsQixNQUFNLEdBQUc7QUFBQSxJQUVMLElBQUksS0FBSyxRQUFRO0FBQUEsTUFDYjtBQUFBLElBRUosS0FBSyxTQUFTO0FBQUEsSUFDZCxJQUFJLEtBQUs7QUFBQSxJQUNULFFBQVEsS0FBSyxXQUFXLEtBQUssS0FBSyxVQUFVLE1BQU0sSUFBSTtBQUFBLE1BQ2xELEdBQUc7QUFBQSxJQUNQO0FBQUE7QUFBQSxFQUVKLFFBQVEsQ0FBQyxJQUFJO0FBQUEsSUFDVCxJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2I7QUFBQSxJQUVKLEtBQUssS0FBSyxRQUFRO0FBQUEsTUFDZCxHQUFHO0FBQUEsSUFDUCxFQUNLO0FBQUEsTUFFRCxLQUFLLFVBQVUsS0FBSyxFQUFFO0FBQUE7QUFBQTtBQUFBLE9BS3hCLFdBQVUsQ0FBQyxHQUFHLE9BQU87QUFBQSxJQUN2QixJQUFJLFNBQVMsS0FBSyxLQUFLO0FBQUEsTUFDbkI7QUFBQSxJQUNKLElBQUk7QUFBQSxJQUNKLElBQUksS0FBSyxLQUFLLFVBQVU7QUFBQSxNQUNwQixNQUFNLEVBQUUsZUFBZSxLQUFNLE1BQU0sRUFBRSxTQUFTO0FBQUEsTUFDOUMsS0FBSztBQUFBLFFBQ0Q7QUFBQSxNQUNKLElBQUk7QUFBQSxJQUNSO0FBQUEsSUFDQSxNQUFNLFdBQVcsRUFBRSxVQUFVLEtBQUssS0FBSyxLQUFLO0FBQUEsSUFDNUMsTUFBTSxJQUFJLFdBQVcsTUFBTSxFQUFFLE1BQU0sSUFBSTtBQUFBLElBQ3ZDLElBQUksS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFNBQVMsR0FBRyxlQUFlLEdBQUc7QUFBQSxNQUM1RCxNQUFNLFNBQVMsTUFBTSxFQUFFLFNBQVM7QUFBQSxNQUVoQyxJQUFJLFdBQVcsT0FBTyxVQUFVLEtBQUssS0FBSyxLQUFLLE9BQU87QUFBQSxRQUNsRCxNQUFNLE9BQU8sTUFBTTtBQUFBLE1BQ3ZCO0FBQUEsSUFFSjtBQUFBLElBQ0EsT0FBTyxLQUFLLGVBQWUsR0FBRyxLQUFLO0FBQUE7QUFBQSxFQUV2QyxjQUFjLENBQUMsR0FBRyxPQUFPO0FBQUEsSUFDckIsT0FBUSxNQUNILEtBQUssYUFBYSxZQUFZLEVBQUUsTUFBTSxLQUFLLEtBQUssZUFDL0MsU0FBUyxFQUFFLFdBQVcsUUFDdEIsS0FBSyxLQUFLLFVBQVUsRUFBRSxZQUFZLFFBQ2xDLEtBQUssS0FBSyxVQUNQLEtBQUssS0FBSyxXQUNWLEVBQUUsZUFBZSxNQUNqQixFQUFFLGVBQWUsR0FBRyxZQUFZLE9BQ3BDLEtBQUssU0FBUyxDQUFDLElBQ2hCLElBQ0U7QUFBQTtBQUFBLEVBRVYsY0FBYyxDQUFDLEdBQUcsT0FBTztBQUFBLElBQ3JCLElBQUksU0FBUyxLQUFLLEtBQUs7QUFBQSxNQUNuQjtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSSxLQUFLLEtBQUssVUFBVTtBQUFBLE1BQ3BCLE1BQU0sRUFBRSxlQUFlLEtBQUssRUFBRSxhQUFhO0FBQUEsTUFDM0MsS0FBSztBQUFBLFFBQ0Q7QUFBQSxNQUNKLElBQUk7QUFBQSxJQUNSO0FBQUEsSUFDQSxNQUFNLFdBQVcsRUFBRSxVQUFVLEtBQUssS0FBSyxLQUFLO0FBQUEsSUFDNUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxVQUFVLElBQUk7QUFBQSxJQUNyQyxJQUFJLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSyxTQUFTLEdBQUcsZUFBZSxHQUFHO0FBQUEsTUFDNUQsTUFBTSxTQUFTLEVBQUUsYUFBYTtBQUFBLE1BQzlCLElBQUksV0FBVyxRQUFRLFVBQVUsS0FBSyxLQUFLLEtBQUssT0FBTztBQUFBLFFBQ25ELE9BQU8sVUFBVTtBQUFBLE1BQ3JCO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTyxLQUFLLGVBQWUsR0FBRyxLQUFLO0FBQUE7QUFBQSxFQUV2QyxXQUFXLENBQUMsR0FBRyxVQUFVO0FBQUEsSUFDckIsSUFBSSxLQUFLLFNBQVMsQ0FBQztBQUFBLE1BQ2Y7QUFBQSxJQUVKLEtBQUssS0FBSyx1QkFBdUIsS0FBSyxTQUFTLEtBQUs7QUFBQSxNQUNoRCxNQUFNLE1BQU0sR0FBRyxFQUFFLGNBQWM7QUFBQSxNQUMvQixLQUFLLFFBQVEsSUFBSSxHQUFHO0FBQUEsSUFDeEI7QUFBQSxJQUNBLE1BQU0sTUFBTSxLQUFLLEtBQUssYUFBYSxZQUFZLFdBQVcsS0FBSyxLQUFLO0FBQUEsSUFDcEUsS0FBSyxLQUFLLElBQUksQ0FBQztBQUFBLElBQ2YsTUFBTSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsWUFBWSxJQUFJLEtBQUssT0FBTztBQUFBLElBRTdELElBQUksS0FBSyxLQUFLLGVBQWU7QUFBQSxNQUN6QixLQUFLLFVBQVUsQ0FBQztBQUFBLElBQ3BCLEVBQ0ssU0FBSSxLQUFLO0FBQUEsTUFDVixNQUFNLE9BQU0sS0FBSyxLQUFLLFFBQVEsRUFBRSxjQUFjLElBQUksRUFBRSxTQUFTO0FBQUEsTUFDN0QsS0FBSyxVQUFVLE9BQU0sSUFBSTtBQUFBLElBQzdCLEVBQ0s7QUFBQSxNQUNELE1BQU0sTUFBTSxLQUFLLEtBQUssUUFBUSxFQUFFLGNBQWMsSUFBSSxFQUFFLFNBQVM7QUFBQSxNQUM3RCxNQUFNLE1BQU0sS0FBSyxLQUFLLGdCQUFnQixJQUFJLFdBQVcsT0FBTyxLQUFLLElBQUksSUFDakUsTUFBTSxLQUFLLE9BQ1Q7QUFBQSxNQUNOLEtBQUssV0FBVyxNQUFNLE1BQU0sT0FBTyxNQUFNLE1BQU0sSUFBSTtBQUFBO0FBQUE7QUFBQSxPQUdyRCxNQUFLLENBQUMsR0FBRyxVQUFVLE9BQU87QUFBQSxJQUM1QixNQUFNLElBQUksTUFBTSxLQUFLLFdBQVcsR0FBRyxLQUFLO0FBQUEsSUFDeEMsSUFBSTtBQUFBLE1BQ0EsS0FBSyxZQUFZLEdBQUcsUUFBUTtBQUFBO0FBQUEsRUFFcEMsU0FBUyxDQUFDLEdBQUcsVUFBVSxPQUFPO0FBQUEsSUFDMUIsTUFBTSxJQUFJLEtBQUssZUFBZSxHQUFHLEtBQUs7QUFBQSxJQUN0QyxJQUFJO0FBQUEsTUFDQSxLQUFLLFlBQVksR0FBRyxRQUFRO0FBQUE7QUFBQSxFQUVwQyxNQUFNLENBQUMsUUFBUSxVQUFVLElBQUk7QUFBQSxJQUV6QixJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2IsR0FBRztBQUFBLElBRVAsS0FBSyxRQUFRLFFBQVEsVUFBVSxJQUFJLFVBQVUsS0FBSyxJQUFJLEdBQUcsRUFBRTtBQUFBO0FBQUEsRUFFL0QsT0FBTyxDQUFDLFFBQVEsVUFBVSxXQUFXLElBQUk7QUFBQSxJQUNyQyxJQUFJLEtBQUssaUJBQWlCLE1BQU07QUFBQSxNQUM1QixPQUFPLEdBQUc7QUFBQSxJQUNkLElBQUksS0FBSyxRQUFRO0FBQUEsTUFDYixHQUFHO0FBQUEsSUFDUCxJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2IsS0FBSyxTQUFTLE1BQU0sS0FBSyxRQUFRLFFBQVEsVUFBVSxXQUFXLEVBQUUsQ0FBQztBQUFBLE1BQ2pFO0FBQUEsSUFDSjtBQUFBLElBQ0EsVUFBVSxnQkFBZ0IsUUFBUSxRQUFRO0FBQUEsSUFJMUMsSUFBSSxRQUFRO0FBQUEsSUFDWixNQUFNLE9BQU8sTUFBTTtBQUFBLE1BQ2YsTUFBTSxVQUFVO0FBQUEsUUFDWixHQUFHO0FBQUE7QUFBQSxJQUVYLFlBQVksR0FBRyxVQUFVLFVBQVUsVUFBVSxRQUFRLFFBQVEsR0FBRztBQUFBLE1BQzVELElBQUksS0FBSyxTQUFTLENBQUM7QUFBQSxRQUNmO0FBQUEsTUFDSjtBQUFBLE1BQ0EsS0FBSyxNQUFNLEdBQUcsVUFBVSxLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssQ0FBQztBQUFBLElBQ3BEO0FBQUEsSUFDQSxXQUFXLEtBQUssVUFBVSxlQUFlLEdBQUc7QUFBQSxNQUN4QyxJQUFJLEtBQUssYUFBYSxZQUFZLEVBQUUsTUFBTSxLQUFLLEtBQUssVUFBVTtBQUFBLFFBQzFEO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBLE1BQU0saUJBQWlCLEVBQUUsY0FBYztBQUFBLE1BQ3ZDLElBQUksRUFBRSxjQUFjO0FBQUEsUUFDaEIsS0FBSyxRQUFRLEdBQUcsZ0JBQWdCLFdBQVcsSUFBSTtBQUFBLE1BQzlDO0FBQUEsUUFDRCxFQUFFLFVBQVUsQ0FBQyxHQUFHLFlBQVksS0FBSyxRQUFRLEdBQUcsU0FBUyxXQUFXLElBQUksR0FBRyxJQUFJO0FBQUE7QUFBQSxJQUVuRjtBQUFBLElBQ0EsS0FBSztBQUFBO0FBQUEsRUFFVCxPQUFPLENBQUMsUUFBUSxTQUFTLFdBQVcsSUFBSTtBQUFBLElBQ3BDLFlBQVksVUFBVSxjQUFjLFFBQVEsT0FBTztBQUFBLElBQ25ELElBQUksUUFBUTtBQUFBLElBQ1osTUFBTSxPQUFPLE1BQU07QUFBQSxNQUNmLE1BQU0sVUFBVTtBQUFBLFFBQ1osR0FBRztBQUFBO0FBQUEsSUFFWCxZQUFZLEdBQUcsVUFBVSxVQUFVLFVBQVUsUUFBUSxRQUFRLEdBQUc7QUFBQSxNQUM1RCxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQUEsUUFDZjtBQUFBLE1BQ0o7QUFBQSxNQUNBLEtBQUssTUFBTSxHQUFHLFVBQVUsS0FBSyxFQUFFLEtBQUssTUFBTSxLQUFLLENBQUM7QUFBQSxJQUNwRDtBQUFBLElBQ0EsWUFBWSxTQUFRLGFBQWEsVUFBVSxTQUFTLFFBQVEsR0FBRztBQUFBLE1BQzNEO0FBQUEsTUFDQSxLQUFLLFFBQVEsU0FBUSxVQUFVLFVBQVUsTUFBTSxHQUFHLElBQUk7QUFBQSxJQUMxRDtBQUFBLElBQ0EsS0FBSztBQUFBO0FBQUEsRUFFVCxVQUFVLENBQUMsUUFBUSxVQUFVLElBQUk7QUFBQSxJQUU3QixJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2IsR0FBRztBQUFBLElBRVAsS0FBSyxZQUFZLFFBQVEsVUFBVSxJQUFJLFVBQVUsS0FBSyxJQUFJLEdBQUcsRUFBRTtBQUFBO0FBQUEsRUFFbkUsV0FBVyxDQUFDLFFBQVEsVUFBVSxXQUFXLElBQUk7QUFBQSxJQUN6QyxJQUFJLEtBQUssaUJBQWlCLE1BQU07QUFBQSxNQUM1QixPQUFPLEdBQUc7QUFBQSxJQUNkLElBQUksS0FBSyxRQUFRO0FBQUEsTUFDYixHQUFHO0FBQUEsSUFDUCxJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2IsS0FBSyxTQUFTLE1BQU0sS0FBSyxZQUFZLFFBQVEsVUFBVSxXQUFXLEVBQUUsQ0FBQztBQUFBLE1BQ3JFO0FBQUEsSUFDSjtBQUFBLElBQ0EsVUFBVSxnQkFBZ0IsUUFBUSxRQUFRO0FBQUEsSUFJMUMsSUFBSSxRQUFRO0FBQUEsSUFDWixNQUFNLE9BQU8sTUFBTTtBQUFBLE1BQ2YsTUFBTSxVQUFVO0FBQUEsUUFDWixHQUFHO0FBQUE7QUFBQSxJQUVYLFlBQVksR0FBRyxVQUFVLFVBQVUsVUFBVSxRQUFRLFFBQVEsR0FBRztBQUFBLE1BQzVELElBQUksS0FBSyxTQUFTLENBQUM7QUFBQSxRQUNmO0FBQUEsTUFDSixLQUFLLFVBQVUsR0FBRyxVQUFVLEtBQUs7QUFBQSxJQUNyQztBQUFBLElBQ0EsV0FBVyxLQUFLLFVBQVUsZUFBZSxHQUFHO0FBQUEsTUFDeEMsSUFBSSxLQUFLLGFBQWEsWUFBWSxFQUFFLE1BQU0sS0FBSyxLQUFLLFVBQVU7QUFBQSxRQUMxRDtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsTUFDQSxNQUFNLFdBQVcsRUFBRSxZQUFZO0FBQUEsTUFDL0IsS0FBSyxZQUFZLEdBQUcsVUFBVSxXQUFXLElBQUk7QUFBQSxJQUNqRDtBQUFBLElBQ0EsS0FBSztBQUFBO0FBQUEsRUFFVCxXQUFXLENBQUMsUUFBUSxTQUFTLFdBQVcsSUFBSTtBQUFBLElBQ3hDLFlBQVksVUFBVSxjQUFjLFFBQVEsT0FBTztBQUFBLElBQ25ELElBQUksUUFBUTtBQUFBLElBQ1osTUFBTSxPQUFPLE1BQU07QUFBQSxNQUNmLE1BQU0sVUFBVTtBQUFBLFFBQ1osR0FBRztBQUFBO0FBQUEsSUFFWCxZQUFZLEdBQUcsVUFBVSxVQUFVLFVBQVUsUUFBUSxRQUFRLEdBQUc7QUFBQSxNQUM1RCxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQUEsUUFDZjtBQUFBLE1BQ0osS0FBSyxVQUFVLEdBQUcsVUFBVSxLQUFLO0FBQUEsSUFDckM7QUFBQSxJQUNBLFlBQVksU0FBUSxhQUFhLFVBQVUsU0FBUyxRQUFRLEdBQUc7QUFBQSxNQUMzRDtBQUFBLE1BQ0EsS0FBSyxZQUFZLFNBQVEsVUFBVSxVQUFVLE1BQU0sR0FBRyxJQUFJO0FBQUEsSUFDOUQ7QUFBQSxJQUNBLEtBQUs7QUFBQTtBQUViO0FBQUE7QUFDTyxNQUFNLG1CQUFtQixTQUFTO0FBQUEsRUFDckMsVUFBVSxJQUFJO0FBQUEsRUFDZCxXQUFXLENBQUMsVUFBVSxPQUFNLE1BQU07QUFBQSxJQUM5QixNQUFNLFVBQVUsT0FBTSxJQUFJO0FBQUE7QUFBQSxFQUU5QixTQUFTLENBQUMsR0FBRztBQUFBLElBQ1QsS0FBSyxRQUFRLElBQUksQ0FBQztBQUFBO0FBQUEsT0FFaEIsS0FBSSxHQUFHO0FBQUEsSUFDVCxJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2IsTUFBTSxLQUFLLE9BQU87QUFBQSxJQUN0QixJQUFJLEtBQUssS0FBSyxVQUFVLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxNQUFNO0FBQUEsSUFDMUI7QUFBQSxJQUNBLE1BQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxRQUFRO0FBQUEsTUFDNUIsS0FBSyxPQUFPLEtBQUssTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUFBLFFBQ3hDLElBQUksS0FBSyxRQUFRLFNBQVM7QUFBQSxVQUN0QixJQUFJLEtBQUssT0FBTyxNQUFNO0FBQUEsUUFDMUIsRUFDSztBQUFBLFVBQ0QsSUFBSSxLQUFLLE9BQU87QUFBQTtBQUFBLE9BRXZCO0FBQUEsS0FDSjtBQUFBLElBQ0QsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUVoQixRQUFRLEdBQUc7QUFBQSxJQUNQLElBQUksS0FBSyxRQUFRO0FBQUEsTUFDYixNQUFNLEtBQUssT0FBTztBQUFBLElBQ3RCLElBQUksS0FBSyxLQUFLLFVBQVUsR0FBRztBQUFBLE1BQ3ZCLEtBQUssS0FBSyxVQUFVO0FBQUEsSUFDeEI7QUFBQSxJQUVBLEtBQUssV0FBVyxLQUFLLE1BQU0sS0FBSyxVQUFVLE1BQU07QUFBQSxNQUM1QyxJQUFJLEtBQUssUUFBUTtBQUFBLFFBQ2IsTUFBTSxLQUFLLE9BQU87QUFBQSxLQUN6QjtBQUFBLElBQ0QsT0FBTyxLQUFLO0FBQUE7QUFFcEI7QUFBQTtBQUNPLE1BQU0sbUJBQW1CLFNBQVM7QUFBQSxFQUNyQztBQUFBLEVBQ0EsV0FBVyxDQUFDLFVBQVUsT0FBTSxNQUFNO0FBQUEsSUFDOUIsTUFBTSxVQUFVLE9BQU0sSUFBSTtBQUFBLElBQzFCLEtBQUssVUFBVSxJQUFJLFNBQVM7QUFBQSxNQUN4QixRQUFRLEtBQUs7QUFBQSxNQUNiLFlBQVk7QUFBQSxJQUNoQixDQUFDO0FBQUEsSUFDRCxLQUFLLFFBQVEsR0FBRyxTQUFTLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFBQSxJQUM1QyxLQUFLLFFBQVEsR0FBRyxVQUFVLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFBQTtBQUFBLEVBRWpELFNBQVMsQ0FBQyxHQUFHO0FBQUEsSUFDVCxLQUFLLFFBQVEsTUFBTSxDQUFDO0FBQUEsSUFDcEIsS0FBSyxLQUFLLFFBQVE7QUFBQSxNQUNkLEtBQUssTUFBTTtBQUFBO0FBQUEsRUFFbkIsTUFBTSxHQUFHO0FBQUEsSUFDTCxNQUFNLFNBQVMsS0FBSztBQUFBLElBQ3BCLElBQUksT0FBTyxVQUFVLEdBQUc7QUFBQSxNQUNwQixPQUFPLE1BQU0sRUFBRSxLQUFLLE1BQU07QUFBQSxRQUN0QixLQUFLLE9BQU8sUUFBUSxLQUFLLFVBQVUsTUFBTSxLQUFLLFFBQVEsSUFBSSxDQUFDO0FBQUEsT0FDOUQ7QUFBQSxJQUNMLEVBQ0s7QUFBQSxNQUNELEtBQUssT0FBTyxRQUFRLEtBQUssVUFBVSxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUM7QUFBQTtBQUFBLElBRS9ELE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFaEIsVUFBVSxHQUFHO0FBQUEsSUFDVCxJQUFJLEtBQUssS0FBSyxVQUFVLEdBQUc7QUFBQSxNQUN2QixLQUFLLEtBQUssVUFBVTtBQUFBLElBQ3hCO0FBQUEsSUFDQSxLQUFLLFdBQVcsS0FBSyxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUM7QUFBQSxJQUNsRSxPQUFPLEtBQUs7QUFBQTtBQUVwQjs7O0FQcFhBLElBQU0sbUJBQW1CLE9BQU8sWUFBWSxZQUN4QyxXQUNBLE9BQU8sUUFBUSxhQUFhLFdBQzVCLFFBQVEsV0FDTjtBQUFBO0FBSUMsTUFBTSxLQUFLO0FBQUEsRUFDZDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBSUE7QUFBQSxFQUlBO0FBQUEsRUFhQSxXQUFXLENBQUMsU0FBUyxNQUFNO0FBQUEsSUFFdkIsS0FBSztBQUFBLE1BQ0QsTUFBTSxJQUFJLFVBQVUsdUJBQXVCO0FBQUEsSUFFL0MsS0FBSyxrQkFBa0IsS0FBSztBQUFBLElBQzVCLEtBQUssU0FBUyxLQUFLO0FBQUEsSUFDbkIsS0FBSyxXQUFXLEtBQUs7QUFBQSxJQUNyQixLQUFLLFFBQVEsS0FBSztBQUFBLElBQ2xCLEtBQUssZ0JBQWdCLEtBQUs7QUFBQSxJQUMxQixLQUFLLFVBQVUsS0FBSztBQUFBLElBQ3BCLEtBQUssU0FBUyxLQUFLO0FBQUEsSUFDbkIsS0FBSyxLQUFLLEtBQUs7QUFBQSxNQUNYLEtBQUssTUFBTTtBQUFBLElBQ2YsRUFDSyxTQUFJLEtBQUssZUFBZSxPQUFPLEtBQUssSUFBSSxXQUFXLFNBQVMsR0FBRztBQUFBLE1BQ2hFLEtBQUssTUFBTSxlQUFjLEtBQUssR0FBRztBQUFBLElBQ3JDO0FBQUEsSUFDQSxLQUFLLE1BQU0sS0FBSyxPQUFPO0FBQUEsSUFDdkIsS0FBSyxPQUFPLEtBQUs7QUFBQSxJQUNqQixLQUFLLGtCQUFrQixLQUFLO0FBQUEsSUFDNUIsS0FBSyxZQUFZLEtBQUs7QUFBQSxJQUN0QixLQUFLLFVBQVUsS0FBSztBQUFBLElBQ3BCLEtBQUssYUFBYSxLQUFLO0FBQUEsSUFDdkIsS0FBSyxXQUFXLEtBQUs7QUFBQSxJQUNyQixLQUFLLHNCQUFzQixLQUFLLHdCQUF3QjtBQUFBLElBQ3hELEtBQUssZUFBZSxLQUFLO0FBQUEsSUFDekIsS0FBSyxjQUFjLEtBQUs7QUFBQSxJQUN4QixLQUFLLFdBQ0QsT0FBTyxLQUFLLGFBQWEsV0FBVyxLQUFLLFdBQVc7QUFBQSxJQUN4RCxLQUFLLFNBQVMsS0FBSztBQUFBLElBQ25CLEtBQUssU0FBUyxLQUFLO0FBQUEsSUFDbkIsSUFBSSxLQUFLLGlCQUFpQixLQUFLLGFBQWEsV0FBVztBQUFBLE1BQ25ELE1BQU0sSUFBSSxNQUFNLDRDQUE0QztBQUFBLElBQ2hFO0FBQUEsSUFDQSxJQUFJLE9BQU8sWUFBWSxVQUFVO0FBQUEsTUFDN0IsVUFBVSxDQUFDLE9BQU87QUFBQSxJQUN0QjtBQUFBLElBQ0EsS0FBSyx5QkFDQyxLQUFLLHdCQUNILEtBQUssdUJBQ0Q7QUFBQSxJQUNaLElBQUksS0FBSyxzQkFBc0I7QUFBQSxNQUMzQixVQUFVLFFBQVEsSUFBSSxPQUFLLEVBQUUsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUFBLElBQ3BEO0FBQUEsSUFDQSxJQUFJLEtBQUssV0FBVztBQUFBLE1BQ2hCLElBQUksS0FBSyxZQUFZO0FBQUEsUUFDakIsTUFBTSxJQUFJLFVBQVUsaUNBQWlDO0FBQUEsTUFDekQ7QUFBQSxNQUNBLFVBQVUsUUFBUSxJQUFJLE9BQU0sRUFBRSxTQUFTLEdBQUcsSUFBSSxJQUFJLFFBQVEsR0FBSTtBQUFBLElBQ2xFO0FBQUEsSUFDQSxLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssV0FBVyxLQUFLLFlBQVk7QUFBQSxJQUNqQyxLQUFLLE9BQU8sS0FBSyxNQUFNLFVBQVUsS0FBSyxTQUFTO0FBQUEsSUFDL0MsSUFBSSxLQUFLLFFBQVE7QUFBQSxNQUNiLEtBQUssU0FBUyxLQUFLO0FBQUEsTUFDbkIsSUFBSSxLQUFLLFdBQVcsYUFDaEIsS0FBSyxXQUFXLEtBQUssT0FBTyxRQUFRO0FBQUEsUUFDcEMsTUFBTSxJQUFJLE1BQU0sa0RBQWtEO0FBQUEsTUFDdEU7QUFBQSxJQUNKLEVBQ0s7QUFBQSxNQUNELE1BQU0sU0FBUyxLQUFLLGFBQWEsVUFBVSxrQkFDckMsS0FBSyxhQUFhLFdBQVcsbUJBQ3pCLEtBQUssV0FBVyxrQkFDWjtBQUFBLE1BQ2QsS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLEtBQUs7QUFBQSxRQUMvQixRQUFRLEtBQUs7QUFBQSxRQUNiLElBQUksS0FBSztBQUFBLE1BQ2IsQ0FBQztBQUFBO0FBQUEsSUFFTCxLQUFLLFNBQVMsS0FBSyxPQUFPO0FBQUEsSUFLMUIsTUFBTSxrQkFBa0IsS0FBSyxhQUFhLFlBQVksS0FBSyxhQUFhO0FBQUEsSUFDeEUsTUFBTSxNQUFNO0FBQUEsU0FFTDtBQUFBLE1BQ0gsS0FBSyxLQUFLO0FBQUEsTUFDVixXQUFXLEtBQUs7QUFBQSxNQUNoQixTQUFTLEtBQUs7QUFBQSxNQUNkLFFBQVEsS0FBSztBQUFBLE1BQ2I7QUFBQSxNQUNBLFdBQVc7QUFBQSxNQUNYLE9BQU8sS0FBSztBQUFBLE1BQ1osVUFBVTtBQUFBLE1BQ1YsbUJBQW1CO0FBQUEsTUFDbkIsVUFBVSxLQUFLO0FBQUEsTUFDZixzQkFBc0IsS0FBSztBQUFBLE1BQzNCLFNBQVMsS0FBSyxLQUFLO0FBQUEsSUFDdkI7QUFBQSxJQUNBLE1BQU0sTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFLLElBQUksVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUFBLElBQ3ZELE9BQU8sVUFBVSxhQUFhLElBQUksT0FBTyxDQUFDLEtBQUssTUFBTTtBQUFBLE1BQ2pELElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHO0FBQUEsTUFDcEIsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFLFNBQVM7QUFBQSxNQUMxQixPQUFPO0FBQUEsT0FDUixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUFBLElBQ1gsS0FBSyxXQUFXLFNBQVMsSUFBSSxDQUFDLEtBQUssTUFBTTtBQUFBLE1BQ3JDLE1BQU0sSUFBSSxVQUFVO0FBQUEsTUFFcEIsS0FBSztBQUFBLFFBQ0QsTUFBTSxJQUFJLE1BQU0sd0JBQXdCO0FBQUEsTUFFNUMsT0FBTyxJQUFJLFFBQVEsS0FBSyxHQUFHLEdBQUcsS0FBSyxRQUFRO0FBQUEsS0FDOUM7QUFBQTtBQUFBLE9BRUMsS0FBSSxHQUFHO0FBQUEsSUFLVCxPQUFPO0FBQUEsTUFDSCxHQUFJLE1BQU0sSUFBSSxXQUFXLEtBQUssVUFBVSxLQUFLLE9BQU8sS0FBSztBQUFBLFdBQ2xELEtBQUs7QUFBQSxRQUNSLFVBQVUsS0FBSyxhQUFhLFdBQ3hCLEtBQUssV0FBVyxLQUFLLE9BQU8sSUFBSSxNQUFNLElBQ3BDO0FBQUEsUUFDTixVQUFVLEtBQUs7QUFBQSxRQUNmLFFBQVEsS0FBSztBQUFBLFFBQ2IscUJBQXFCLEtBQUs7QUFBQSxNQUM5QixDQUFDLEVBQUUsS0FBSztBQUFBLElBQ1o7QUFBQTtBQUFBLEVBRUosUUFBUSxHQUFHO0FBQUEsSUFDUCxPQUFPO0FBQUEsTUFDSCxHQUFHLElBQUksV0FBVyxLQUFLLFVBQVUsS0FBSyxPQUFPLEtBQUs7QUFBQSxXQUMzQyxLQUFLO0FBQUEsUUFDUixVQUFVLEtBQUssYUFBYSxXQUN4QixLQUFLLFdBQVcsS0FBSyxPQUFPLElBQUksTUFBTSxJQUNwQztBQUFBLFFBQ04sVUFBVSxLQUFLO0FBQUEsUUFDZixRQUFRLEtBQUs7QUFBQSxRQUNiLHFCQUFxQixLQUFLO0FBQUEsTUFDOUIsQ0FBQyxFQUFFLFNBQVM7QUFBQSxJQUNoQjtBQUFBO0FBQUEsRUFFSixNQUFNLEdBQUc7QUFBQSxJQUNMLE9BQU8sSUFBSSxXQUFXLEtBQUssVUFBVSxLQUFLLE9BQU8sS0FBSztBQUFBLFNBQy9DLEtBQUs7QUFBQSxNQUNSLFVBQVUsS0FBSyxhQUFhLFdBQ3hCLEtBQUssV0FBVyxLQUFLLE9BQU8sSUFBSSxNQUFNLElBQ3BDO0FBQUEsTUFDTixVQUFVLEtBQUs7QUFBQSxNQUNmLFFBQVEsS0FBSztBQUFBLE1BQ2IscUJBQXFCLEtBQUs7QUFBQSxJQUM5QixDQUFDLEVBQUUsT0FBTztBQUFBO0FBQUEsRUFFZCxVQUFVLEdBQUc7QUFBQSxJQUNULE9BQU8sSUFBSSxXQUFXLEtBQUssVUFBVSxLQUFLLE9BQU8sS0FBSztBQUFBLFNBQy9DLEtBQUs7QUFBQSxNQUNSLFVBQVUsS0FBSyxhQUFhLFdBQ3hCLEtBQUssV0FBVyxLQUFLLE9BQU8sSUFBSSxNQUFNLElBQ3BDO0FBQUEsTUFDTixVQUFVLEtBQUs7QUFBQSxNQUNmLFFBQVEsS0FBSztBQUFBLE1BQ2IscUJBQXFCLEtBQUs7QUFBQSxJQUM5QixDQUFDLEVBQUUsV0FBVztBQUFBO0FBQUEsRUFNbEIsV0FBVyxHQUFHO0FBQUEsSUFDVixPQUFPLEtBQUssV0FBVyxFQUFFLE9BQU8sVUFBVTtBQUFBO0FBQUEsR0FFN0MsT0FBTyxTQUFTLEdBQUc7QUFBQSxJQUNoQixPQUFPLEtBQUssWUFBWTtBQUFBO0FBQUEsRUFNNUIsT0FBTyxHQUFHO0FBQUEsSUFDTixPQUFPLEtBQUssT0FBTyxFQUFFLE9BQU8sZUFBZTtBQUFBO0FBQUEsR0FFOUMsT0FBTyxjQUFjLEdBQUc7QUFBQSxJQUNyQixPQUFPLEtBQUssUUFBUTtBQUFBO0FBRTVCOzs7QVFyT08sSUFBTSxXQUFXLENBQUMsU0FBUyxVQUFVLENBQUMsTUFBTTtBQUFBLEVBQy9DLEtBQUssTUFBTSxRQUFRLE9BQU8sR0FBRztBQUFBLElBQ3pCLFVBQVUsQ0FBQyxPQUFPO0FBQUEsRUFDdEI7QUFBQSxFQUNBLFdBQVcsS0FBSyxTQUFTO0FBQUEsSUFDckIsSUFBSSxJQUFJLFVBQVUsR0FBRyxPQUFPLEVBQUUsU0FBUztBQUFBLE1BQ25DLE9BQU87QUFBQSxFQUNmO0FBQUEsRUFDQSxPQUFPO0FBQUE7OztBQ2JKLFNBQVMsY0FBYyxDQUFDLFNBQVMsVUFBVSxDQUFDLEdBQUc7QUFBQSxFQUNsRCxPQUFPLElBQUksS0FBSyxTQUFTLE9BQU8sRUFBRSxXQUFXO0FBQUE7QUFFMUMsU0FBUyxVQUFVLENBQUMsU0FBUyxVQUFVLENBQUMsR0FBRztBQUFBLEVBQzlDLE9BQU8sSUFBSSxLQUFLLFNBQVMsT0FBTyxFQUFFLE9BQU87QUFBQTtBQUV0QyxTQUFTLFFBQVEsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxHQUFHO0FBQUEsRUFDNUMsT0FBTyxJQUFJLEtBQUssU0FBUyxPQUFPLEVBQUUsU0FBUztBQUFBO0FBRS9DLGVBQWUsS0FBSyxDQUFDLFNBQVMsVUFBVSxDQUFDLEdBQUc7QUFBQSxFQUN4QyxPQUFPLElBQUksS0FBSyxTQUFTLE9BQU8sRUFBRSxLQUFLO0FBQUE7QUFFcEMsU0FBUyxlQUFlLENBQUMsU0FBUyxVQUFVLENBQUMsR0FBRztBQUFBLEVBQ25ELE9BQU8sSUFBSSxLQUFLLFNBQVMsT0FBTyxFQUFFLFlBQVk7QUFBQTtBQUUzQyxTQUFTLFdBQVcsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxHQUFHO0FBQUEsRUFDL0MsT0FBTyxJQUFJLEtBQUssU0FBUyxPQUFPLEVBQUUsUUFBUTtBQUFBO0FBR3ZDLElBQU0sYUFBYTtBQUNuQixJQUFNLFNBQVMsT0FBTyxPQUFPLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxJQUFNLGNBQWM7QUFDcEIsSUFBTSxVQUFVLE9BQU8sT0FBTyxhQUFhO0FBQUEsRUFDOUMsTUFBTTtBQUNWLENBQUM7QUFDTSxJQUFNLE9BQU8sT0FBTyxPQUFPLFVBQVU7QUFBQSxFQUN4QyxRQUFRO0FBQUEsRUFDUixTQUFTO0FBQ2IsQ0FBQztBQUNNLElBQU0sT0FBTyxPQUFPLE9BQU8sT0FBTztBQUFBLEVBQ3JDLE1BQU07QUFBQSxFQUNOO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNKLENBQUM7QUFDRCxLQUFLLE9BQU87OztBQ2pEWjtBQUhBO0FBQ0E7QUFJQSxJQUFNLGNBQWM7QUFFYixTQUFTLGNBQWMsR0FBa0I7QUFBQSxFQUM5QyxPQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixTQUFTLE9BQU8sWUFBZ0I7QUFBQSxNQU05QixNQUFNLFFBQW1CLENBQUM7QUFBQSxNQUMxQixNQUFNLFVBQVUsTUFBTSxLQUFLLG9DQUFvQztBQUFBLE1BQy9ELE1BQU0sUUFBOEIsQ0FBQztBQUFBLE1BQ3JDLFdBQVcsa0JBQWtCLFNBQVM7QUFBQSxRQUNwQyxNQUFNLE1BQ0gsWUFBWTtBQUFBLFVBQ1gsTUFBTSxZQUFZLGVBQ2YsV0FBVyxNQUFNLEdBQUcsRUFDcEIsTUFBTSxHQUFHLGVBQWUsU0FBUyxFQUFFLEVBQ25DLE1BQU0sR0FBRyxFQUNULE1BQU0sQ0FBQztBQUFBLFVBQ1YsTUFBTSxRQUFRLFVBQVU7QUFBQSxVQUN4QixNQUFNLFFBQU8sVUFBVSxLQUFLLEdBQUc7QUFBQSxVQUMvQixNQUFNLGFBQWEsTUFBTSxPQUFPLFFBQVEsQ0FBQztBQUFBLFVBQ3pDLE1BQU0sZUFBZSx3Q0FBd0MsTUFBSyxXQUFXLEtBQUssSUFBSSxFQUFFLFdBQVcsS0FBSyxHQUFHO0FBQUEsVUFHM0csTUFBTSxvQkFBb0IsTUFBTSx3QkFBRyxRQUFRLFlBQVk7QUFBQSxVQUN2RCxJQUFJLGtCQUFrQixXQUFXO0FBQUEsWUFBRyxNQUFNLElBQUksTUFBTSxzQkFBc0IsY0FBYztBQUFBLFVBRXhGLE1BQU0saUJBQWlCLE1BQU0sUUFBUSxJQUNuQyxrQkFBa0IsSUFBSSxPQUFPLFNBQVM7QUFBQSxZQUNwQyxNQUFNLFdBQVcsS0FBSyxjQUFjLElBQUk7QUFBQSxZQUN4QyxNQUFNLFFBQVEsTUFBTSx3QkFBRyxLQUFLLFFBQVE7QUFBQSxZQUNwQyxPQUFPLEVBQUUsVUFBVSxXQUFXLE1BQU0sVUFBVTtBQUFBLFdBQy9DLENBQ0g7QUFBQSxVQUNBLE1BQU0sWUFBWSxlQUFlLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxVQUFVLFFBQVEsSUFBSSxFQUFFLFVBQVUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7QUFBQSxVQUN0RyxLQUFLO0FBQUEsWUFBVyxNQUFNLElBQUksTUFBTSxzQkFBc0IsY0FBYztBQUFBLFVBRXBFLE1BQU0sZ0JBQWdCLFdBQVcsZUFBZTtBQUFBLFVBQ2hELE1BQU0sd0JBQUcsV0FDUCxlQUNBLDJCQUEyQjtBQUFBLDJCQUNkLGFBQWEsVUFBVSxXQUFXLE1BQU0sR0FBRztBQUFBO0FBQUE7QUFBQSxhQUd6RCxJQUFJLG1CQUFtQixXQUFXLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQVF4QyxJQUFJLG1CQUFtQixXQUFXLGdCQUFnQjtBQUFBO0FBQUE7QUFBQSxFQUl0RDtBQUFBLFVBRUEsTUFBTSxTQUFRO0FBQUEsV0FDYixDQUNMO0FBQUEsTUFDRjtBQUFBLE1BQ0EsTUFBTSxRQUFRLElBQUksS0FBSztBQUFBLE1BT3ZCLE1BQU0sU0FBcUIsQ0FBQztBQUFBLE1BQzVCLE9BQU8saUJBQWlCO0FBQUEsTUFDeEIsT0FBTyxpQkFBaUI7QUFBQSxNQUN4QixPQUFPLGlCQUFpQjtBQUFBLE1BQ3hCLE9BQU8sWUFBWTtBQUFBLE1BQ25CLE9BQU8sa0JBQWtCO0FBQUEsTUFFekIsT0FBTyxFQUFFLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFFM0I7QUFBQTs7O0FDMUVLLElBQU0sV0FBaUMsQ0FBQyxlQUFlLENBQUM7OztBbEJMeEQsU0FBUyxtQkFBbUIsQ0FBQyxTQUVqQztBQUFBLEVBQ0QsSUFBSSxTQUFTO0FBQUEsRUFFYixPQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsU0FDQSxnQkFBZSxDQUFDLFFBQVE7QUFBQSxNQUM1QixPQUFPLFlBQVksSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO0FBQUEsUUFDL0MsTUFBTSxNQUFNLE1BQU0sT0FBTyxjQUFjLFlBQVksRUFBRSxlQUFlLE1BQU0sQ0FBQztBQUFBLFFBQzNFLE1BQU0sU0FBUyxNQUFNLElBQUksT0FBTztBQUFBLFVBQzlCLFNBQVMsS0FBSSxtQkFBbUI7QUFBQSxVQUNoQyxNQUFNLFFBQVE7QUFBQSxRQUNoQixDQUFDO0FBQUEsUUFDRCxJQUFJO0FBQUEsVUFDRixPQUFPLE1BQU0sc0JBQXNCLE9BQU8sWUFBcUI7QUFBQSxZQUM3RCxPQUFPLE1BQU0sT0FBTyxTQUFTLE1BQU07QUFBQSxjQUNqQztBQUFBLGNBQ0EsS0FBSztBQUFBLGNBQ0wsU0FBUyxLQUFJLG1CQUFtQixXQUFXLGdCQUFnQjtBQUFBLFlBQzdELENBQUM7QUFBQSxXQUNGLEVBQUUsS0FBSyxHQUFHO0FBQUEsVUFDWCxPQUFPLEdBQUc7QUFBQSxVQUNWLElBQUksYUFBYTtBQUFBLFlBQU8sT0FBTyxpQkFBaUIsQ0FBQztBQUFBLFVBQ2pELE9BQU8sS0FBSyxDQUFDO0FBQUE7QUFBQSxPQUVoQjtBQUFBO0FBQUEsU0FHRyxPQUFNLENBQUMsVUFBVSxXQUFXO0FBQUEsTUFDaEMsSUFBSSxZQUFZO0FBQUEsUUFBUztBQUFBLE1BQ3pCLE1BQU0sVUFBVSxNQUFNLHVCQUF1QjtBQUFBLE1BRzdDLEtBQUssT0FBTztBQUFBLFFBQU8sT0FBTyxRQUFRLENBQUM7QUFBQSxNQUNuQyxPQUFPLE1BQU0sTUFBTTtBQUFBLE1BQ25CLE9BQU8sTUFBTSxTQUFTO0FBQUEsTUFFdEIsS0FBSyxPQUFPLE1BQU07QUFBQSxRQUFlLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUFBLE1BRS9ELEtBQUssT0FBTyxNQUFNLGNBQWM7QUFBQSxRQUFRLE9BQU8sTUFBTSxjQUFjLFNBQVMsQ0FBQztBQUFBLE1BRTdFLE9BQU8sTUFBTSxjQUFjLFFBQVE7QUFBQSxRQUNqQyxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsS0FBSyxRQUFRLFNBQVM7QUFBQSxRQUNwQixJQUFJLFNBQXdCO0FBQUEsUUFDNUIsSUFBSSxPQUEyQjtBQUFBLFFBQy9CLElBQUksUUFBUSxZQUFZLFFBQVE7QUFBQSxVQUM5QixTQUFTLFNBQVMsZ0JBQWdCO0FBQUEsVUFDbEMsT0FBTztBQUFBLFFBQ1QsRUFBTyxTQUFJLFFBQVEsWUFBWSxPQUFPO0FBQUEsVUFDcEMsU0FBUyxTQUFTLGdCQUFnQjtBQUFBLFVBQ2xDLE9BQU87QUFBQSxRQUNULEVBQU87QUFBQSxnQkFBTSxJQUFJLE1BQU0sdUJBQXVCO0FBQUEsUUFDOUMsV0FBVyxVQUFVLE1BQU0sUUFBUSxPQUFPLE1BQU0sY0FBYyxNQUFNLElBQUksT0FBTyxNQUFNLGNBQWMsU0FBUyxDQUFDLE9BQU8sTUFBTSxjQUFjLE1BQU0sR0FBRztBQUFBLFVBQy9JLE9BQU8sU0FBUztBQUFBLFVBQ2hCLE9BQU8sWUFBWTtBQUFBLFVBQ25CLE9BQU8sa0JBQWtCO0FBQUEsUUFDM0I7QUFBQSxNQUNGLEVBQU87QUFBQSxRQUNMLElBQUksT0FBTztBQUFBLFFBQ1gsV0FBVyxXQUFXLFVBQVU7QUFBQSxVQUM5QixJQUFJLFFBQVEsU0FBUyxRQUFRLFNBQVM7QUFBQSxZQUNwQyxPQUFPO0FBQUEsWUFDUCxNQUFNLFNBQVMsTUFBTSxRQUFRLFFBQVE7QUFBQSxjQUNuQztBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsWUFDRixDQUFDO0FBQUEsWUFDRCxPQUFPLE1BQU0sY0FBYyxRQUFRLE9BQU87QUFBQSxZQUMxQyxPQUFPLE1BQU0sY0FBYyxTQUFTLE9BQU87QUFBQSxZQUMzQztBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsUUFDQSxLQUFLO0FBQUEsVUFBTSxNQUFNLElBQUksTUFBTSxZQUFZLFFBQVEsb0JBQW9CO0FBQUE7QUFBQSxNQUlyRSxLQUFLLE9BQU87QUFBQSxRQUFRLE9BQU8sU0FBUyxDQUFDO0FBQUEsTUFFckMsT0FBTyxPQUFPLE1BQU07QUFBQSxNQUdwQixLQUFLLE9BQU87QUFBQSxRQUFjLE9BQU8sZUFBZSxDQUFDO0FBQUEsTUFDakQsT0FBTyxhQUFhLGNBQWM7QUFBQSxNQUdsQyxLQUFLLE9BQU87QUFBQSxRQUFTLE9BQU8sVUFBVSxDQUFDO0FBQUEsTUFFdkMsT0FBTyxRQUFRLFFBQVE7QUFBQSxXQUNqQixPQUFPLFFBQVEsU0FBUyxDQUFDO0FBQUEsTUFDL0I7QUFBQSxNQUdBLE9BQU8sTUFBTTtBQUFBLFFBQ1gsWUFBWSxjQUFjO0FBQUEsTUFDNUI7QUFBQTtBQUFBLElBR0YsY0FBYyxDQUFDLGdCQUFnQjtBQUFBLE1BQzdCLFNBQVMsZUFBZSxNQUFNLFVBQVU7QUFBQTtBQUFBLFNBR3BDLFlBQVcsR0FBRztBQUFBLE1BQ2xCLE1BQU0sV0FBVyxNQUFLLEtBQUksR0FBRyxRQUFRLFVBQVU7QUFBQSxNQUMvQyxNQUFNLFVBQVUsVUFBVSxJQUFJLE9BQU87QUFBQTtBQUFBLEVBRXpDO0FBQUE7QUFHRixTQUFTLGFBQWEsR0FBRztBQUFBLEVBRXZCLE1BQU0sTUFBTSxDQUFDLE9BQU8sT0FBTztBQUFBLEVBRzNCLElBQUksY0FBYyxDQUFDLEdBQUksV0FBVyxNQUFLLEtBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxhQUFZLE1BQUssS0FBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBSSxHQUFJLFdBQVcsTUFBSyxLQUFJLEdBQUcsTUFBTSxNQUFNLGNBQWMsQ0FBQyxJQUFJLGFBQVksTUFBSyxLQUFJLEdBQUcsTUFBTSxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBRSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsV0FBVyxXQUFXLEdBQUcsQ0FBQztBQUFBLEVBRXpSLGNBQWMsWUFBWSxPQUFPLENBQUMsZUFBZSxlQUFlLFVBQVU7QUFBQSxFQUUxRSxNQUFNLG9CQUFvQixZQUFZLElBQUksQ0FBQyxlQUFnQixXQUFXLFdBQVcsR0FBRyxJQUFJLElBQUksT0FBTyxJQUFJLGFBQWEsSUFBSSxVQUFXO0FBQUEsRUFFbkksT0FBTyxDQUFDLEdBQUcsS0FBSyxHQUFHLGlCQUFpQjtBQUFBO0FBR3RDLGVBQWUsc0JBQXNCLEdBQWlCO0FBQUEsRUFDcEQsTUFBTSxrQkFBa0IsTUFBTSxTQUFTLE1BQUssS0FBSSxHQUFHLE1BQU0sTUFBTSxlQUFlLEdBQUcsT0FBTztBQUFBLEVBQ3hGLE1BQU0sZUFBZSxvQkFBSyxNQUFNLGVBQWU7QUFBQSxFQUMvQyxJQUFJO0FBQUEsRUFDSixXQUFXLGVBQWUsYUFBYSxVQUFpQjtBQUFBLElBRXRELElBQUksTUFBSyxLQUFJLENBQUMsTUFBTSxNQUFLLEtBQUksR0FBRyxNQUFNLFdBQVc7QUFBQSxNQUFHO0FBQUEsSUFDcEQsVUFBVyxhQUFhLFNBQWlCO0FBQUEsSUFDekM7QUFBQSxFQUNGO0FBQUEsRUFDQSxLQUFLO0FBQUEsSUFBUyxNQUFNLElBQUksTUFBTSxvQ0FBb0M7QUFBQSxFQUNsRSxPQUFPO0FBQUE7IiwKICAiZGVidWdJZCI6ICIwNDM1NkM3NjU1QjUyMDA3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==