PageSourceSearch

https://blueberrysgrill.com/_next/static/chunks/framework-a8f101efc67f70a3.js

js blueberrysgrill.com collected 2026-10-04 04:36:08 UTC 1,456,068 bytes, 1 lines download raw bytes

1!function(){try{var I="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new I.Error).stack;n&&(I._sentryDebugIds=I._sentryDebugIds||{},I._sentryDebugIds[n]="ecade9aa-0fc3-440f-93c7-ba43108ba5c0",I._sentryDebugIdIdentifier="sentry-dbid-ecade9aa-0fc3-440f-93c7-ba43108ba5c0")}catch(I){}}();"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6593],{2167:(__unused_webpack_module,exports,__webpack_require__)=>{eval(__webpack_require__.ts('/* provided dependency */ var process = __webpack_require__(5364);\n/**\n * @license React\n * react.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\nvar REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"),\n  REACT_PORTAL_TYPE = Symbol.for("react.portal"),\n  REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"),\n  REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"),\n  REACT_PROFILER_TYPE = Symbol.for("react.profiler"),\n  REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),\n  REACT_CONTEXT_TYPE = Symbol.for("react.context"),\n  REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"),\n  REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"),\n  REACT_MEMO_TYPE = Symbol.for("react.memo"),\n  REACT_LAZY_TYPE = Symbol.for("react.lazy"),\n  MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n  if (null === maybeIterable || "object" !== typeof maybeIterable) return null;\n  maybeIterable =\n    (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n    maybeIterable["@@iterator"];\n  return "function" === typeof maybeIterable ? maybeIterable : null;\n}\nvar ReactNoopUpdateQueue = {\n    isMounted: function () {\n      return !1;\n    },\n    enqueueForceUpdate: function () {},\n    enqueueReplaceState: function () {},\n    enqueueSetState: function () {}\n  },\n  assign = Object.assign,\n  emptyObject = {};\nfunction Component(props, context, updater) {\n  this.props = props;\n  this.context = context;\n  this.refs = emptyObject;\n  this.updater = updater || ReactNoopUpdateQueue;\n}\nComponent.prototype.isReactComponent = {};\nComponent.prototype.setState = function (partialState, callback) {\n  if (\n    "object" !== typeof partialState &&\n    "function" !== typeof partialState &&\n    null != partialState\n  )\n    throw Error(\n      "takes an object of state variables to update or a function which returns an object of state variables."\n    );\n  this.updater.enqueueSetState(this, partialState, callback, "setState");\n};\nComponent.prototype.forceUpdate = function (callback) {\n  this.updater.enqueueForceUpdate(this, callback, "forceUpdate");\n};\nfunction ComponentDummy() {}\nComponentDummy.prototype = Component.prototype;\nfunction PureComponent(props, context, updater) {\n  this.props = props;\n  this.context = context;\n  this.refs = emptyObject;\n  this.updater = updater || ReactNoopUpdateQueue;\n}\nvar pureComponentPrototype = (PureComponent.prototype = new ComponentDummy());\npureComponentPrototype.constructor = PureComponent;\nassign(pureComponentPrototype, Component.prototype);\npureComponentPrototype.isPureReactComponent = !0;\nvar isArrayImpl = Array.isArray,\n  ReactSharedInternals = { H: null, A: null, T: null, S: null, V: null },\n  hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction ReactElement(type, key, self, source, owner, props) {\n  self = props.ref;\n  return {\n    $$typeof: REACT_ELEMENT_TYPE,\n    type: type,\n    key: key,\n    ref: void 0 !== self ? self : null,\n    props: props\n  };\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n  return ReactElement(\n    oldElement.type,\n    newKey,\n    void 0,\n    void 0,\n    void 0,\n    oldElement.props\n  );\n}\nfunction isValidElement(object) {\n  return (\n    "object" === typeof object &&\n    null !== object &&\n    object.$$typeof === REACT_ELEMENT_TYPE\n  );\n}\nfunction escape(key) {\n  var escaperLookup = { "=": "=0", ":": "=2" };\n  return (\n    "$" +\n    key.replace(/[=:]/g, function (match) {\n      return escaperLookup[match];\n    })\n  );\n}\nvar userProvidedKeyEscapeRegex = /\\/+/g;\nfunction getElementKey(element, index) {\n  return "object" === typeof element && null !== element && null != element.key\n    ? escape("" + element.key)\n    : index.toString(36);\n}\nfunction noop$1() {}\nfunction resolveThenable(thenable) {\n  switch (thenable.status) {\n    case "fulfilled":\n      return thenable.value;\n    case "rejected":\n      throw thenable.reason;\n    default:\n      switch (\n        ("string" === typeof thenable.status\n          ? thenable.then(noop$1, noop$1)\n          : ((thenable.status = "pending"),\n            thenable.then(\n              function (fulfilledValue) {\n                "pending" === thenable.status &&\n                  ((thenable.status = "fulfilled"),\n                  (thenable.value = fulfilledValue));\n              },\n              function (error) {\n                "pending" === thenable.status &&\n                  ((thenable.status = "rejected"), (thenable.reason = error));\n              }\n            )),\n        thenable.status)\n      ) {\n        case "fulfilled":\n          return thenable.value;\n        case "rejected":\n          throw thenable.reason;\n      }\n  }\n  throw thenable;\n}\nfunction mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {\n  var type = typeof children;\n  if ("undefined" === type || "boolean" === type) children = null;\n  var invokeCallback = !1;\n  if (null === children) invokeCallback = !0;\n  else\n    switch (type) {\n      case "bigint":\n      case "string":\n      case "number":\n        invokeCallback = !0;\n        break;\n      case "object":\n        switch (children.$$typeof) {\n          case REACT_ELEMENT_TYPE:\n          case REACT_PORTAL_TYPE:\n            invokeCallback = !0;\n            break;\n          case REACT_LAZY_TYPE:\n            return (\n              (invokeCallback = children._init),\n              mapIntoArray(\n                invokeCallback(children._payload),\n                array,\n                escapedPrefix,\n                nameSoFar,\n                callback\n              )\n            );\n        }\n    }\n  if (invokeCallback)\n    return (\n      (callback = callback(children)),\n      (invokeCallback =\n        "" === nameSoFar ? "." + getElementKey(children, 0) : nameSoFar),\n      isArrayImpl(callback)\n        ? ((escapedPrefix = ""),\n          null != invokeCallback &&\n            (escapedPrefix =\n              invokeCallback.replace(userProvidedKeyEscapeRegex, "$&/") + "/"),\n          mapIntoArray(callback, array, escapedPrefix, "", function (c) {\n            return c;\n          }))\n        : null != callback &&\n          (isValidElement(callback) &&\n            (callback = cloneAndReplaceKey(\n              callback,\n              escapedPrefix +\n                (null == callback.key ||\n                (children && children.key === callback.key)\n                  ? ""\n                  : ("" + callback.key).replace(\n                      userProvidedKeyEscapeRegex,\n                      "$&/"\n                    ) + "/") +\n                invokeCallback\n            )),\n          array.push(callback)),\n      1\n    );\n  invokeCallback = 0;\n  var nextNamePrefix = "" === nameSoFar ? "." : nameSoFar + ":";\n  if (isArrayImpl(children))\n    for (var i = 0; i < children.length; i++)\n      (nameSoFar = children[i]),\n        (type = nextNamePrefix + getElementKey(nameSoFar, i)),\n        (invokeCallback += mapIntoArray(\n          nameSoFar,\n          array,\n          escapedPrefix,\n          type,\n          callback\n        ));\n  else if (((i = getIteratorFn(children)), "function" === typeof i))\n    for (\n      children = i.call(children), i = 0;\n      !(nameSoFar = children.next()).done;\n\n    )\n      (nameSoFar = nameSoFar.value),\n        (type = nextNamePrefix + getElementKey(nameSoFar, i++)),\n        (invokeCallback += mapIntoArray(\n          nameSoFar,\n          array,\n          escapedPrefix,\n          type,\n          callback\n        ));\n  else if ("object" === type) {\n    if ("function" === typeof children.then)\n      return mapIntoArray(\n        resolveThenable(children),\n        array,\n        escapedPrefix,\n        nameSoFar,\n        callback\n      );\n    array = String(children);\n    throw Error(\n      "Objects are not valid as a React child (found: " +\n        ("[object Object]" === array\n          ? "object with keys {" + Object.keys(children).join(", ") + "}"\n          : array) +\n        "). If you meant to render a collection of children, use an array instead."\n    );\n  }\n  return invokeCallback;\n}\nfunction mapChildren(children, func, context) {\n  if (null == children) return children;\n  var result = [],\n    count = 0;\n  mapIntoArray(children, result, "", "", function (child) {\n    return func.call(context, child, count++);\n  });\n  return result;\n}\nfunction lazyInitializer(payload) {\n  if (-1 === payload._status) {\n    var ctor = payload._result;\n    ctor = ctor();\n    ctor.then(\n      function (moduleObject) {\n        if (0 === payload._status || -1 === payload._status)\n          (payload._status = 1), (payload._result = moduleObject);\n      },\n      function (error) {\n        if (0 === payload._status || -1 === payload._status)\n          (payload._status = 2), (payload._result = error);\n      }\n    );\n    -1 === payload._status && ((payload._status = 0), (payload._result = ctor));\n  }\n  if (1 === payload._status) return payload._result.default;\n  throw payload._result;\n}\nvar reportGlobalError =\n  "function" === typeof reportError\n    ? reportError\n    : function (error) {\n        if (\n          "object" === typeof window &&\n          "function" === typeof window.ErrorEvent\n        ) {\n          var event = new window.ErrorEvent("error", {\n            bubbles: !0,\n            cancelable: !0,\n            message:\n              "object" === typeof error &&\n              null !== error &&\n              "string" === typeof error.message\n                ? String(error.message)\n                : String(error),\n            error: error\n          });\n          if (!window.dispatchEvent(event)) return;\n        } else if (\n          "object" === typeof process &&\n          "function" === typeof process.emit\n        ) {\n          process.emit("uncaughtException", error);\n          return;\n        }\n        console.error(error);\n      };\nfunction noop() {}\nexports.Children = {\n  map: mapChildren,\n  forEach: function (children, forEac
1hFunc, forEachContext) {\n    mapChildren(\n      children,\n      function () {\n        forEachFunc.apply(this, arguments);\n      },\n      forEachContext\n    );\n  },\n  count: function (children) {\n    var n = 0;\n    mapChildren(children, function () {\n      n++;\n    });\n    return n;\n  },\n  toArray: function (children) {\n    return (\n      mapChildren(children, function (child) {\n        return child;\n      }) || []\n    );\n  },\n  only: function (children) {\n    if (!isValidElement(children))\n      throw Error(\n        "React.Children.only expected to receive a single React element child."\n      );\n    return children;\n  }\n};\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n  ReactSharedInternals;\nexports.__COMPILER_RUNTIME = {\n  __proto__: null,\n  c: function (size) {\n    return ReactSharedInternals.H.useMemoCache(size);\n  }\n};\nexports.cache = function (fn) {\n  return function () {\n    return fn.apply(null, arguments);\n  };\n};\nexports.cloneElement = function (element, config, children) {\n  if (null === element || void 0 === element)\n    throw Error(\n      "The argument must be a React element, but you passed " + element + "."\n    );\n  var props = assign({}, element.props),\n    key = element.key,\n    owner = void 0;\n  if (null != config)\n    for (propName in (void 0 !== config.ref && (owner = void 0),\n    void 0 !== config.key && (key = "" + config.key),\n    config))\n      !hasOwnProperty.call(config, propName) ||\n        "key" === propName ||\n        "__self" === propName ||\n        "__source" === propName ||\n        ("ref" === propName && void 0 === config.ref) ||\n        (props[propName] = config[propName]);\n  var propName = arguments.length - 2;\n  if (1 === propName) props.children = children;\n  else if (1 < propName) {\n    for (var childArray = Array(propName), i = 0; i < propName; i++)\n      childArray[i] = arguments[i + 2];\n    props.children = childArray;\n  }\n  return ReactElement(element.type, key, void 0, void 0, owner, props);\n};\nexports.createContext = function (defaultValue) {\n  defaultValue = {\n    $$typeof: REACT_CONTEXT_TYPE,\n    _currentValue: defaultValue,\n    _currentValue2: defaultValue,\n    _threadCount: 0,\n    Provider: null,\n    Consumer: null\n  };\n  defaultValue.Provider = defaultValue;\n  defaultValue.Consumer = {\n    $$typeof: REACT_CONSUMER_TYPE,\n    _context: defaultValue\n  };\n  return defaultValue;\n};\nexports.createElement = function (type, config, children) {\n  var propName,\n    props = {},\n    key = null;\n  if (null != config)\n    for (propName in (void 0 !== config.key && (key = "" + config.key), config))\n      hasOwnProperty.call(config, propName) &&\n        "key" !== propName &&\n        "__self" !== propName &&\n        "__source" !== propName &&\n        (props[propName] = config[propName]);\n  var childrenLength = arguments.length - 2;\n  if (1 === childrenLength) props.children = children;\n  else if (1 < childrenLength) {\n    for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++)\n      childArray[i] = arguments[i + 2];\n    props.children = childArray;\n  }\n  if (type && type.defaultProps)\n    for (propName in ((childrenLength = type.defaultProps), childrenLength))\n      void 0 === props[propName] &&\n        (props[propName] = childrenLength[propName]);\n  return ReactElement(type, key, void 0, void 0, null, props);\n};\nexports.createRef = function () {\n  return { current: null };\n};\nexports.forwardRef = function (render) {\n  return { $$typeof: REACT_FORWARD_REF_TYPE, render: render };\n};\nexports.isValidElement = isValidElement;\nexports.lazy = function (ctor) {\n  return {\n    $$typeof: REACT_LAZY_TYPE,\n    _payload: { _status: -1, _result: ctor },\n    _init: lazyInitializer\n  };\n};\nexports.memo = function (type, compare) {\n  return {\n    $$typeof: REACT_MEMO_TYPE,\n    type: type,\n    compare: void 0 === compare ? null : compare\n  };\n};\nexports.startTransition = function (scope) {\n  var prevTransition = ReactSharedInternals.T,\n    currentTransition = {};\n  ReactSharedInternals.T = currentTransition;\n  try {\n    var returnValue = scope(),\n      onStartTransitionFinish = ReactSharedInternals.S;\n    null !== onStartTransitionFinish &&\n      onStartTransitionFinish(currentTransition, returnValue);\n    "object" === typeof returnValue &&\n      null !== returnValue &&\n      "function" === typeof returnValue.then &&\n      returnValue.then(noop, reportGlobalError);\n  } catch (error) {\n    reportGlobalError(error);\n  } finally {\n    ReactSharedInternals.T = prevTransition;\n  }\n};\nexports.unstable_useCacheRefresh = function () {\n  return ReactSharedInternals.H.useCacheRefresh();\n};\nexports.use = function (usable) {\n  return ReactSharedInternals.H.use(us
1able);\n};\nexports.useActionState = function (action, initialState, permalink) {\n  return ReactSharedInternals.H.useActionState(action, initialState, permalink);\n};\nexports.useCallback = function (callback, deps) {\n  return ReactSharedInternals.H.useCallback(callback, deps);\n};\nexports.useContext = function (Context) {\n  return ReactSharedInternals.H.useContext(Context);\n};\nexports.useDebugValue = function () {};\nexports.useDeferredValue = function (value, initialValue) {\n  return ReactSharedInternals.H.useDeferredValue(value, initialValue);\n};\nexports.useEffect = function (create, createDeps, update) {\n  var dispatcher = ReactSharedInternals.H;\n  if ("function" === typeof update)\n    throw Error(\n      "useEffect CRUD overload is not enabled in this build of React."\n    );\n  return dispatcher.useEffect(create, createDeps);\n};\nexports.useId = function () {\n  return ReactSharedInternals.H.useId();\n};\nexports.useImperativeHandle = function (ref, create, deps) {\n  return ReactSharedInternals.H.useImperativeHandle(ref, create, deps);\n};\nexports.useInsertionEffect = function (create, deps) {\n  return ReactSharedInternals.H.useInsertionEffect(create, deps);\n};\nexports.useLayoutEffect = function (create, deps) {\n  return ReactSharedInternals.H.useLayoutEffect(create, deps);\n};\nexports.useMemo = function (create, deps) {\n  return ReactSharedInternals.H.useMemo(create, deps);\n};\nexports.useOptimistic = function (passthrough, reducer) {\n  return ReactSharedInternals.H.useOptimistic(passthrough, reducer);\n};\nexports.useReducer = function (reducer, initialArg, init) {\n  return ReactSharedInternals.H.useReducer(reducer, initialArg, init);\n};\nexports.useRef = function (initialValue) {\n  return ReactSharedInternals.H.useRef(initialValue);\n};\nexports.useState = function (initialState) {\n  return ReactSharedInternals.H.useState(initialState);\n};\nexports.useSyncExternalStore = function (\n  subscribe,\n  getSnapshot,\n  getServerSnapshot\n) {\n  return ReactSharedInternals.H.useSyncExternalStore(\n    subscribe,\n    getSnapshot,\n    getServerSnapshot\n  );\n};\nexports.useTransition = function () {\n  return ReactSharedInternals.H.useTransition();\n};\nexports.version = "19.1.0";\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE2Ny5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsc0NBQXNDO0FBQ3RDLHVDQUF1QztBQUN2QztBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNkNBQTZDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixxQkFBcUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQix5Q0FBeUM7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsVUFBVTtBQUNWLDhCQUE4QixPQUFPO0FBQ3JDLGdDQU
1FnQyxPQUFPO0FBQ3ZDO0FBQ0EsVUFBVSxPQUFPO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEIsZ0JBQWdCO0FBQ2hCLHFCQUFxQjtBQUNyQixrQkFBa0I7QUFDbEIsZ0JBQWdCO0FBQ2hCLHVFQUF1RTtBQUN2RTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxjQUFjO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Qsb0JBQW9CO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixXQUFXO0FBQ1g7QUFDQSxrQkFBa0I7QUFDbEIsV0FBVztBQUNYO0FBQ0Esc0JBQXNCO0FBQ3RCLFlBQVk7QUFDWjtBQUNBO0FBQ0EsZ0JBQWdCLDRCQUE0QjtBQUM1QztBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLHdCQUF3QjtB
1QUN4QjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxlQUFlIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QucHJvZHVjdGlvbi5qcz80NzY3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LnByb2R1Y3Rpb24uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblwidXNlIHN0cmljdFwiO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC50cmFuc2l0aW9uYWwuZWxlbWVudFwiKSxcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLFxuICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLFxuICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpLFxuICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLFxuICBSRUFDVF9DT05TVU1FUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnN1bWVyXCIpLFxuICBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxcbiAgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIiksXG4gIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpLFxuICBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG51bGwgPT09IG1heWJlSXRlcmFibGUgfHwgXCJvYmplY3RcIiAhPT0gdHlwZW9mIG1heWJlSXRlcmFibGUpIHJldHVybiBudWxsO1xuICBtYXliZUl0ZXJhYmxlID1cbiAgICAoTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSkgfHxcbiAgICBtYXliZUl0ZXJhYmxlW1wiQEBpdGVyYXRvclwiXTtcbiAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG1heWJlSXRlcmFibGUgPyBtYXliZUl0ZXJhYmxlIDogbnVsbDtcbn1cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgICBpc01vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9LFxuICAgIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKCkge30sXG4gICAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKCkge30sXG4gICAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAoKSB7fVxuICB9LFxuICBhc3NpZ24gPSBPYmplY3QuYXNzaWduLFxuICBlbXB0eU9iamVjdCA9IHt9O1xuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5Db21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcbkNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICBpZiAoXG4gICAgXCJvYmplY3RcIiAhPT0gdHlwZW9mIHBhcnRpYWxTdGF0ZSAmJlxuICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHBhcnRpYWxTdGF0ZSAmJlxuICAgIG51bGwgIT0gcGFydGlhbFN0YXRlXG4gIClcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIFwidGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuXCJcbiAgICApO1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIFwic2V0U3RhdGVcIik7XG59O1xuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCBcImZvcmNlVXBkYXRlXCIpO1xufTtcbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cbkNvbXBvbmVudER1bW15LnByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IChQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50O1xuYXNzaWduKHB1cmVDb21wb25lbnRQcm90b3R5cGUsIENvbXBvbmVudC5wcm90b3R5cGUpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9ICEwO1xudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheSxcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7IEg6IG51bGwsIEE6IG51bGwsIFQ6IG51bGwsIFM6IG51bGwsIFY6IG51bGwgfSxcbiAgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgc2VsZiA9IHByb3BzLnJlZjtcbiAgcmV0dXJuIHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiB2b2lkIDAgIT09IHNlbGYgPyBzZWxmIDogbnVsbCxcbiAgICBwcm9wczogcHJvcHNcbiAgfTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgcmV0dXJuIFJlYWN0RWxlbWVudChcbiAgICBvbGRFbGVtZW50LnR5cGUsXG4gICAgbmV3S2V5LFxuICAgIHZvaWQgMCxcbiAgICB2b2lkIDAsXG4gICAgdm9pZCAwLFxuICAgIG9sZEVsZW1lbnQucHJvcHNcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gKFxuICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBvYmplY3QgJiZcbiAgICBudWxsICE9PSBvYmplY3QgJiZcbiAgICBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRVxuICApO1xufVxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHsgXCI9XCI6IFwiPTBcIiwgXCI6XCI6IFwiPTJcIiB9O1xuICByZXR1cm4gKFxuICAgIFwiJFwiICtcbiAgICBrZXkucmVwbGFjZSgvWz06XS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgIHJldHVybi
1Blc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgICB9KVxuICApO1xufVxudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcbmZ1bmN0aW9uIGdldEVsZW1lbnRLZXkoZWxlbWVudCwgaW5kZXgpIHtcbiAgcmV0dXJuIFwib2JqZWN0XCIgPT09IHR5cGVvZiBlbGVtZW50ICYmIG51bGwgIT09IGVsZW1lbnQgJiYgbnVsbCAhPSBlbGVtZW50LmtleVxuICAgID8gZXNjYXBlKFwiXCIgKyBlbGVtZW50LmtleSlcbiAgICA6IGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cbmZ1bmN0aW9uIG5vb3AkMSgpIHt9XG5mdW5jdGlvbiByZXNvbHZlVGhlbmFibGUodGhlbmFibGUpIHtcbiAgc3dpdGNoICh0aGVuYWJsZS5zdGF0dXMpIHtcbiAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICByZXR1cm4gdGhlbmFibGUudmFsdWU7XG4gICAgY2FzZSBcInJlamVjdGVkXCI6XG4gICAgICB0aHJvdyB0aGVuYWJsZS5yZWFzb247XG4gICAgZGVmYXVsdDpcbiAgICAgIHN3aXRjaCAoXG4gICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgdGhlbmFibGUuc3RhdHVzXG4gICAgICAgICAgPyB0aGVuYWJsZS50aGVuKG5vb3AkMSwgbm9vcCQxKVxuICAgICAgICAgIDogKCh0aGVuYWJsZS5zdGF0dXMgPSBcInBlbmRpbmdcIiksXG4gICAgICAgICAgICB0aGVuYWJsZS50aGVuKFxuICAgICAgICAgICAgICBmdW5jdGlvbiAoZnVsZmlsbGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBcInBlbmRpbmdcIiA9PT0gdGhlbmFibGUuc3RhdHVzICYmXG4gICAgICAgICAgICAgICAgICAoKHRoZW5hYmxlLnN0YXR1cyA9IFwiZnVsZmlsbGVkXCIpLFxuICAgICAgICAgICAgICAgICAgKHRoZW5hYmxlLnZhbHVlID0gZnVsZmlsbGVkVmFsdWUpKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgXCJwZW5kaW5nXCIgPT09IHRoZW5hYmxlLnN0YXR1cyAmJlxuICAgICAgICAgICAgICAgICAgKCh0aGVuYWJsZS5zdGF0dXMgPSBcInJlamVjdGVkXCIpLCAodGhlbmFibGUucmVhc29uID0gZXJyb3IpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKSksXG4gICAgICAgIHRoZW5hYmxlLnN0YXR1cylcbiAgICAgICkge1xuICAgICAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICAgICAgcmV0dXJuIHRoZW5hYmxlLnZhbHVlO1xuICAgICAgICBjYXNlIFwicmVqZWN0ZWRcIjpcbiAgICAgICAgICB0aHJvdyB0aGVuYWJsZS5yZWFzb247XG4gICAgICB9XG4gIH1cbiAgdGhyb3cgdGhlbmFibGU7XG59XG5mdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuICBpZiAoXCJ1bmRlZmluZWRcIiA9PT0gdHlwZSB8fCBcImJvb2xlYW5cIiA9PT0gdHlwZSkgY2hpbGRyZW4gPSBudWxsO1xuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSAhMTtcbiAgaWYgKG51bGwgPT09IGNoaWxkcmVuKSBpbnZva2VDYWxsYmFjayA9ICEwO1xuICBlbHNlXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIGludm9rZUNhbGxiYWNrID0gITA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gITA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChpbnZva2VDYWxsYmFjayA9IGNoaWxkcmVuLl9pbml0KSxcbiAgICAgICAgICAgICAgbWFwSW50b0FycmF5KFxuICAgICAgICAgICAgICAgIGludm9rZUNhbGxiYWNrKGNoaWxkcmVuLl9wYXlsb2FkKSxcbiAgICAgICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgICAgICBlc2NhcGVkUHJlZml4LFxuICAgICAgICAgICAgICAgIG5hbWVTb0ZhcixcbiAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuICBpZiAoaW52b2tlQ2FsbGJhY2spXG4gICAgcmV0dXJuIChcbiAgICAgIChjYWxsYmFjayA9IGNhbGxiYWNrKGNoaWxkcmVuKSksXG4gICAgICAoaW52b2tlQ2FsbGJhY2sgPVxuICAgICAgICBcIlwiID09PSBuYW1lU29GYXIgPyBcIi5cIiArIGdldEVsZW1lbnRLZXkoY2hpbGRyZW4sIDApIDogbmFtZVNvRmFyKSxcbiAgICAgIGlzQXJyYXlJbXBsKGNhbGxiYWNrKVxuICAgICAgICA/ICgoZXNjYXBlZFByZWZpeCA9IFwiXCIpLFxuICAgICAgICAgIG51bGwgIT0gaW52b2tlQ2FsbGJhY2sgJiZcbiAgICAgICAgICAgIChlc2NhcGVkUHJlZml4ID1cbiAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgXCIkJi9cIikgKyBcIi9cIiksXG4gICAgICAgICAgbWFwSW50b0FycmF5KGNhbGxiYWNrLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgXCJcIiwgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgIH0pKVxuICAgICAgICA6IG51bGwgIT0gY2FsbGJhY2sgJiZcbiAgICAgICAgICAoaXNWYWxpZEVsZW1lbnQoY2FsbGJhY2spICYmXG4gICAgICAgICAgICAoY2FsbGJhY2sgPSBjbG9uZUFuZFJlcGxhY2VLZXkoXG4gICAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgICBlc2NhcGVkUHJlZml4ICtcbiAgICAgICAgICAgICAgICAobnVsbCA9PSBjYWxsYmFjay5rZXkgfHxcbiAgICAgICAgICAgICAgICAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ua2V5ID09PSBjYWxsYmFjay5rZXkpXG4gICAgICAgICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgICAgICAgIDogKFwiXCIgKyBjYWxsYmFjay5rZXkpLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsXG4gICAgICAgICAgICAgICAgICAgICAgXCIkJi9cIlxuICAgICAgICAgICAgICAgICAgICApICsgXCIvXCIpICtcbiAgICAgICAgICAgICAgICBpbnZva2VDYWxsYmFja1xuICAgICAgICAgICAgKSksXG4gICAgICAgICAgYXJyYXkucHVzaChjYWxsYmFjaykpLFxuICAgICAgMVxuICAgICk7XG4gIGludm9rZUNhbGxiYWNrID0gMDtcbiAgdmFyIG5leHROYW1lUHJlZml4ID0gXCJcIiA9PT0gbmFtZVNvRmFyID8gXCIuXCIgOiBuYW1lU29GYXIgKyBcIjpcIjtcbiAgaWYgKGlzQXJyYXlJbXBsKGNoaWxkcmVuKSlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuICAgICAgKG5hbWVTb0ZhciA9IGNoaWxkcmVuW2ldKSxcbiAgICAgICAgKHR5cGUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkobmFtZVNvRmFyLCBpKSksXG4gICAgICAgIChpbnZva2VDYWxsYmFjayArPSBtYXBJbnRvQXJyYXkoXG4gICAgICAgICAgbmFtZVNvRmFyLFxuICAgICAgICAgIGFycmF5LFxuICAgICAgICAgIGVzY2FwZWRQcmVmaXgsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBjYWxsYmFja1xuICAgICAgICApKTtcbiAgZWxzZSBpZiAoKChpID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbikpLCBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpKSlcbiAgICBmb3IgKFxuICAgICAgY2hpbGRyZW4gPSBpLmNhbGwoY2hpbGRyZW4pLCBpID0gMDtcbiAgICAgICEobmFtZVNvRmFyID0gY2hpbGRyZW4ubmV4dCgpKS5kb25lO1xuXG4gICAgKVxuICAgICAgKG5hbWVTb0ZhciA9IG5hbWVTb0Zhci52YWx1ZSksXG4gICAgICAgICh0eXBlID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KG5hbWVTb0ZhciwgaSsrKSksXG4gICAgICAgIChpbnZva2VDYWxsYmFjayArPSBtYXBJbnRvQXJyYXkoXG4gICAgICAgICAgbmFtZVNvRmFyLFxuICAgICAgICAgIGFycmF5LFxuICAgICAgICAgIGVzY2FwZWRQcmVmaXgsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBjYWxsYmFja1xuICAgICAgICApKTtcbiAgZWxzZSBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZSkge1xuICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjaGlsZHJlbi50aGVuKVxuICAgICAgcmV0dXJuIG1hcEludG9BcnJheShcbiAgICAgICAgcmVzb2x2ZVRoZW5hYmxlKGNoaWxkcmVuKSxcbiAgICAgICAgYXJyYXksXG4gICAgICAgIGVzY2FwZWRQcmVmaXgsXG4gICAgICAgIG5hbWVTb0ZhcixcbiAgICAgICAgY2FsbGJhY2tcbiAgICAgICk7XG4gICAgYXJyYXkgPSBTdHJpbmcoY2hpbGRyZW4pO
11xuICAgIHRocm93IEVycm9yKFxuICAgICAgXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICtcbiAgICAgICAgKFwiW29iamVjdCBPYmplY3RdXCIgPT09IGFycmF5XG4gICAgICAgICAgPyBcIm9iamVjdCB3aXRoIGtleXMge1wiICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oXCIsIFwiKSArIFwifVwiXG4gICAgICAgICAgOiBhcnJheSkgK1xuICAgICAgICBcIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC5cIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGludm9rZUNhbGxiYWNrO1xufVxuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKG51bGwgPT0gY2hpbGRyZW4pIHJldHVybiBjaGlsZHJlbjtcbiAgdmFyIHJlc3VsdCA9IFtdLFxuICAgIGNvdW50ID0gMDtcbiAgbWFwSW50b0FycmF5KGNoaWxkcmVuLCByZXN1bHQsIFwiXCIsIFwiXCIsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGNvdW50KyspO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGxhenlJbml0aWFsaXplcihwYXlsb2FkKSB7XG4gIGlmICgtMSA9PT0gcGF5bG9hZC5fc3RhdHVzKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgY3RvciA9IGN0b3IoKTtcbiAgICBjdG9yLnRoZW4oXG4gICAgICBmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICAgIGlmICgwID09PSBwYXlsb2FkLl9zdGF0dXMgfHwgLTEgPT09IHBheWxvYWQuX3N0YXR1cylcbiAgICAgICAgICAocGF5bG9hZC5fc3RhdHVzID0gMSksIChwYXlsb2FkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3QpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBpZiAoMCA9PT0gcGF5bG9hZC5fc3RhdHVzIHx8IC0xID09PSBwYXlsb2FkLl9zdGF0dXMpXG4gICAgICAgICAgKHBheWxvYWQuX3N0YXR1cyA9IDIpLCAocGF5bG9hZC5fcmVzdWx0ID0gZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gICAgLTEgPT09IHBheWxvYWQuX3N0YXR1cyAmJiAoKHBheWxvYWQuX3N0YXR1cyA9IDApLCAocGF5bG9hZC5fcmVzdWx0ID0gY3RvcikpO1xuICB9XG4gIGlmICgxID09PSBwYXlsb2FkLl9zdGF0dXMpIHJldHVybiBwYXlsb2FkLl9yZXN1bHQuZGVmYXVsdDtcbiAgdGhyb3cgcGF5bG9hZC5fcmVzdWx0O1xufVxudmFyIHJlcG9ydEdsb2JhbEVycm9yID1cbiAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmVwb3J0RXJyb3JcbiAgICA/IHJlcG9ydEVycm9yXG4gICAgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiB3aW5kb3cgJiZcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB3aW5kb3cuRXJyb3JFdmVudFxuICAgICAgICApIHtcbiAgICAgICAgICB2Y
1XIgZXZlbnQgPSBuZXcgd2luZG93LkVycm9yRXZlbnQoXCJlcnJvclwiLCB7XG4gICAgICAgICAgICBidWJibGVzOiAhMCxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6ICEwLFxuICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGVycm9yICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IGVycm9yICYmXG4gICAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgPyBTdHJpbmcoZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgICA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KSkgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBwcm9jZXNzICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcHJvY2Vzcy5lbWl0XG4gICAgICAgICkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdChcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9O1xuZnVuY3Rpb24gbm9vcCgpIHt9XG5leHBvcnRzLkNoaWxkcmVuID0ge1xuICBtYXA6IG1hcENoaWxkcmVuLFxuICBmb3JFYWNoOiBmdW5jdGlvbiAoY2hpbGRyZW4sIGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCkge1xuICAgIG1hcENoaWxkcmVuKFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvckVhY2hGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgZm9yRWFjaENvbnRleHRcbiAgICApO1xuICB9LFxuICBjb3VudDogZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gICAgdmFyIG4gPSAwO1xuICAgIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgICBuKys7XG4gICAgfSk7XG4gICAgcmV0dXJuIG47XG4gIH0sXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgIHJldHVybiAoXG4gICAgICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH0pIHx8IFtdXG4gICAgKTtcbiAgfSxcbiAgb25seTogZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC5cIlxuICAgICAgKTtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbn07XG5leHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5Qcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuZXhwb3J0cy5fX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUgPVxuICBSZWFjdFNoYXJlZEludGVybmFscztcbmV4cG9ydHMuX19DT01QSUxFUl9SVU5USU1FID0ge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGM6IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgcmV0dXJuIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkgudXNlTWVtb0NhY2hlKHNpemUpO1xuICB9XG59O1xuZXhwb3J0cy5jYWNoZSA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9O1xufTtcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgaWYgKG51bGwgPT09IGVsZW1lbnQgfHwgdm9pZCAwID09PSBlbGVtZW50KVxuICAgIHRocm93IEVycm9yKFxuICAgICAgXCJUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICsgZWxlbWVudCArIFwiLlwiXG4gICAgKTtcbiAgdmFyIHByb3BzID0gYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKSxcbiAgICBrZXkgPSBlbGVtZW50LmtleSxcbiAgICBvd25lciA9IHZvaWQgMDtcbiAgaWYgKG51bGwgIT0gY29uZmlnKVxuICAgIGZvciAocHJvcE5hbWUgaW4gKHZvaWQgMCAhPT0gY29uZmlnLnJlZiAmJiAob3duZXIgPSB2b2lkIDApLFxuICAgIHZvaWQgMCAhPT0gY29uZmlnLmtleSAmJiAoa2V5ID0gXCJcIiArIGNvbmZpZy5rZXkpLFxuICAgIGNvbmZpZykpXG4gICAgICAhaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSB8fFxuICAgICAgICBcImtleVwiID09PSBwcm9wTmFtZSB8fFxuICAgICAgICBcIl9fc2VsZlwiID09PSBwcm9wTmFtZSB8fFxuICAgICAgICBcIl9fc291cmNlXCIgPT09IHByb3BOYW1lIHx8XG4gICAgICAgIChcInJlZlwiID09PSBwcm9wTmFtZSAmJiB2b2lkIDAgPT09IGNvbmZpZy5yZWYpIHx8XG4gICAgICAgIChwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdKTtcbiAgdmFyIHByb3BOYW1lID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG4gIGlmICgxID09PSBwcm9wTmFtZSkgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgZWxzZSBpZiAoMSA8IHByb3BOYW1lKSB7XG4gICAgZm9yICh2YXIgY2hpbGRBcnJheSA9IEFycmF5KHByb3BOYW1lKSwgaSA9IDA7IGkgPCBwcm9wTmFtZTsgaSsrKVxuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHZvaWQgMCwgdm9pZCAwLCBvd25lciwgcHJvcHMpO1xufTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGZ1bmN0aW9uIChkZWZh
1dWx0VmFsdWUpIHtcbiAgZGVmYXVsdFZhbHVlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsXG4gIH07XG4gIGRlZmF1bHRWYWx1ZS5Qcm92aWRlciA9IGRlZmF1bHRWYWx1ZTtcbiAgZGVmYXVsdFZhbHVlLkNvbnN1bWVyID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9DT05TVU1FUl9UWVBFLFxuICAgIF9jb250ZXh0OiBkZWZhdWx0VmFsdWVcbiAgfTtcbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbn07XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWUsXG4gICAgcHJvcHMgPSB7fSxcbiAgICBrZXkgPSBudWxsO1xuICBpZiAobnVsbCAhPSBjb25maWcpXG4gICAgZm9yIChwcm9wTmFtZSBpbiAodm9pZCAwICE9PSBjb25maWcua2V5ICYmIChrZXkgPSBcIlwiICsgY29uZmlnLmtleSksIGNvbmZpZykpXG4gICAgICBoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmXG4gICAgICAgIFwia2V5XCIgIT09IHByb3BOYW1lICYmXG4gICAgICAgIFwiX19zZWxmXCIgIT09IHByb3BOYW1lICYmXG4gICAgICAgIFwiX19zb3VyY2VcIiAhPT0gcHJvcE5hbWUgJiZcbiAgICAgICAgKHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV0pO1xuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKDEgPT09IGNoaWxkcmVuTGVuZ3RoKSBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICBlbHNlIGlmICgxIDwgY2hpbGRyZW5MZW5ndGgpIHtcbiAgICBmb3IgKHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpLCBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspXG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpXG4gICAgZm9yIChwcm9wTmFtZSBpbiAoKGNoaWxkcmVuTGVuZ3RoID0gdHlwZS5kZWZhdWx0UHJvcHMpLCBjaGlsZHJlbkxlbmd0aCkpXG4gICAgICB2b2lkIDAgPT09IHByb3BzW3Byb3BOYW1lXSAmJlxuICAgICAgICAocHJvcHNbcHJvcE5hbWVdID0gY2hpbGRyZW5MZW5ndGhbcHJvcE5hbWVdKTtcbiAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHZvaWQgMCwgdm9pZCAwLCBudWxsLCBwcm9wcyk7XG59O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB7IGN1cnJlbnQ6IG51bGwgfTtcbn07XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmdW5jdGlvbiAocmVuZGVyKSB7XG4gIHJldHVybiB7ICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLCByZW5kZXI6IHJlbmRlciB9O1xufTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnQgPSBpc1ZhbGlkRWxlbWVudDtcbmV4cG9ydHMubGF6eSA9IGZ1bmN0aW9uIChjdG9yKSB7XG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogeyBfc3RhdHVzOiAtMSwgX3Jlc3VsdDogY3RvciB9LFxuICAgIF9pbml0OiBsYXp5SW5pdGlhbGl6ZXJcbiAgfTtcbn07XG5leHBvcnRzLm1lbW8gPSBmdW5jdGlvbiAodHlwZSwgY29tcGFyZSkge1xuICByZXR1cm4ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiB2b2lkIDAgPT09IGNvbXBhcmUgPyBudWxsIDogY29tcGFyZVxuICB9O1xufTtcbmV4cG9ydHMuc3RhcnRUcmFuc2l0aW9uID0gZnVuY3Rpb24gKHNjb3BlKSB7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQsXG4gICAgY3VycmVudFRyYW5zaXRpb24gPSB7fTtcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IGN1cnJlbnRUcmFuc2l0aW9uO1xuICB0cnkge1xuICAgIHZhciByZXR1cm5WYWx1ZSA9IHNjb3BlKCksXG4gICAgICBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlM7XG4gICAgbnVsbCAhPT0gb25TdGFydFRyYW5zaXRpb25GaW5pc2ggJiZcbiAgICAgIG9uU3RhcnRUcmFuc2l0aW9uRmluaXNoKGN1cnJlbnRUcmFuc2l0aW9uLCByZXR1cm5WYWx1ZSk7XG4gICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlICYmXG4gICAgICBudWxsICE9PSByZXR1cm5WYWx1ZSAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmV0dXJuVmFsdWUudGhlbiAmJlxuICAgICAgcmV0dXJuVmFsdWUudGhlbihub29wLCByZXBvcnRHbG9iYWxFcnJvcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0R2xvYmFsRXJyb3IoZXJyb3IpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufTtcbmV4cG9ydHMudW5zdGFibGVfdXNlQ2FjaGVSZWZyZXNoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSC51c2VDYWNoZVJlZnJlc2goKTtcbn07XG5leHBvcnRzLnVzZSA9IGZ1bmN0aW9uICh1c2FibGUpIHtcbiAgcmV0dXJuIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkgudXNlKHVzYWJsZSk7XG59O1xuZXhwb3J0cy51c2VBY3Rpb25TdGF0ZSA9IGZ1bmN0aW9uIChhY3Rpb24sIGluaXRpYWxTdGF0ZSwgcGVybWFsaW5rKSB7XG4gIHJldHVybiBSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZUFjdGlvblN0YXRlKGFjdGlvbiwgaW5pdGlhbFN0YXRlLCBwZXJtYWxpbmspO1xufTtcbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgcmV0dXJuIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkgudXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xufTtcbmV4cG9ydHMudXNlQ29udGV4dCA9IGZ1bmN0aW9uIChDb250ZXh0KSB7XG4gIHJldHVybi
1BSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZUNvbnRleHQoQ29udGV4dCk7XG59O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gZnVuY3Rpb24gKCkge307XG5leHBvcnRzLnVzZURlZmVycmVkVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICByZXR1cm4gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSC51c2VEZWZlcnJlZFZhbHVlKHZhbHVlLCBpbml0aWFsVmFsdWUpO1xufTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gZnVuY3Rpb24gKGNyZWF0ZSwgY3JlYXRlRGVwcywgdXBkYXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHVwZGF0ZSlcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIFwidXNlRWZmZWN0IENSVUQgb3ZlcmxvYWQgaXMgbm90IGVuYWJsZWQgaW4gdGhpcyBidWlsZCBvZiBSZWFjdC5cIlxuICAgICk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGNyZWF0ZURlcHMpO1xufTtcbmV4cG9ydHMudXNlSWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZUlkKCk7XG59O1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiBSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xufTtcbmV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0ID0gZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSC51c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn07XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdCA9IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkgudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59O1xuZXhwb3J0cy51c2VNZW1vID0gZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSC51c2VNZW1vKGNyZWF0ZSwgZGVwcyk7XG59O1xuZXhwb3J0cy51c2VPcHRpbWlzdGljID0gZnVuY3Rpb24gKHBhc3N0aHJvdWdoLCByZWR1Y2VyKSB7XG4gIHJldHVybiBSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZU9wdGltaXN0aWMocGFzc3Rocm91Z2gsIHJlZHVjZXIpO1xufTtcbmV4cG9ydHMudXNlUmVkdWNlciA9IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHJldHVybiBSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG59O1xuZXhwb3J0cy51c2VSZWYgPSBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gIHJldHVybiBSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZVJlZihpbml0aWFsVmFsdWUpO1xufTtcbmV4cG9ydHMudXNlU3RhdGUgPSBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiBSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59O1xuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IGZ1bmN0aW9uIChcbiAgc3Vic2NyaWJlLFxuICBnZXRTbmFwc2hvdCxcbiAgZ2V0U2VydmVyU25hcHNob3Rcbikge1xuICByZXR1cm4gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSC51c2VTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICBzdWJzY3JpYmUsXG4gICAgZ2V0U25hcHNob3QsXG4gICAgZ2V0U2VydmVyU25hcHNob3RcbiAgKTtcbn07XG5leHBvcnRzLnVzZVRyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZVRyYW5zaXRpb24oKTtcbn07XG5leHBvcnRzLnZlcnNpb24gPSBcIjE5LjEuMFwiO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2167\n'))},2786:(module,__unused_webpack_exports,__webpack_require__)=>{eval(__webpack_require__.ts("\n\nif (true) {\n  module.exports = __webpack_require__(5919);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc4Ni5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDLEVBQUUsMENBQXlEO0FBQzNELEVBQUUsS0FBSyxFQUVOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanM/NjgxMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2786\n"))},4232:(module,__unused_webpack_exports,__webpack_require__)=>{eval(__webpack_require__.ts("\n\nif (true) {\n  module.exports = __webpack_require__(2167);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIzMi5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDLEVBQUUsMENBQXFEO0FBQ3ZELEVBQUUsS0FBSyxFQUVOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcz9kY2U2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4232\n"))},4279:(__unused_webpack_module,exports,__webpack_require__)=>{eval(__webpack_require__.ts('/* provided dependency */ var process = __webpack_require__(5364);\n/**\n * @license React\n * react-dom-client.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n\nvar Scheduler = __webpack_require__(2786),\n  React = __webpack_require__(4232),\n  ReactDOM = __webpack_require__(8477);\nfunction formatProdErrorMessage(code) {\n  var url = "https://react.dev/errors/" + code;
1\n  if (1 < arguments.length) {\n    url += "?args[]=" + encodeURIComponent(arguments[1]);\n    for (var i = 2; i < arguments.length; i++)\n      url += "&args[]=" + encodeURIComponent(arguments[i]);\n  }\n  return (\n    "Minified React error #" +\n    code +\n    "; visit " +\n    url +\n    " for the full message or use the non-minified dev environment for full errors and additional helpful warnings."\n  );\n}\nfunction isValidContainer(node) {\n  return !(\n    !node ||\n    (1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType)\n  );\n}\nfunction getNearestMountedFiber(fiber) {\n  var node = fiber,\n    nearestMounted = fiber;\n  if (fiber.alternate) for (; node.return; ) node = node.return;\n  else {\n    fiber = node;\n    do\n      (node = fiber),\n        0 !== (node.flags & 4098) && (nearestMounted = node.return),\n        (fiber = node.return);\n    while (fiber);\n  }\n  return 3 === node.tag ? nearestMounted : null;\n}\nfunction getSuspenseInstanceFromFiber(fiber) {\n  if (13 === fiber.tag) {\n    var suspenseState = fiber.memoizedState;\n    null === suspenseState &&\n      ((fiber = fiber.alternate),\n      null !== fiber && (suspenseState = fiber.memoizedState));\n    if (null !== suspenseState) return suspenseState.dehydrated;\n  }\n  return null;\n}\nfunction assertIsMounted(fiber) {\n  if (getNearestMountedFiber(fiber) !== fiber)\n    throw Error(formatProdErrorMessage(188));\n}\nfunction findCurrentFiberUsingSlowPath(fiber) {\n  var alternate = fiber.alternate;\n  if (!alternate) {\n    alternate = getNearestMountedFiber(fiber);\n    if (null === alternate) throw Error(formatProdErrorMessage(188));\n    return alternate !== fiber ? null : fiber;\n  }\n  for (var a = fiber, b = alternate; ; ) {\n    var parentA = a.return;\n    if (null === parentA) break;\n    var parentB = parentA.alternate;\n    if (null === parentB) {\n      b = parentA.return;\n      if (null !== b) {\n        a = b;\n        continue;\n      }\n      break;\n    }\n    if (parentA.child === parentB.child) {\n      for (parentB = parentA.child; parentB; ) {\n        if (parentB === a) return assertIsMounted(parentA), fiber;\n        if (parentB === b) return assertIsMounted(parentA), alternate;\n        parentB = parentB.sibling;\n      }\n      throw Error(formatProdErrorMessage(188));\n    }\n    if (a.return !== b.return) (a = parentA), (b = parentB);\n    else {\n      for (var didFindChild = !1, child$0 = parentA.child; child$0; ) {\n        if (child$0 === a) {\n          didFindChild = !0;\n          a = parentA;\n          b = parentB;\n          break;\n        }\n        if (child$0 === b) {\n          didFindChild = !0;\n          b = parentA;\n          a = parentB;\n          break;\n        }\n        child$0 = child$0.sibling;\n      }\n      if (!didFindChild) {\n        for (child$0 = parentB.child; child$0; ) {\n          if (child$0 === a) {\n            didFindChild = !0;\n            a = parentB;\n            b = parentA;\n            break;\n          }\n          if (child$0 === b) {\n            didFindChild = !0;\n            b = parentB;\n            a = parentA;\n            break;\n          }\n          child$0 = child$0.sibling;\n        }\n        if (!didFindChild) throw Error(formatProdErrorMessage(189));\n      }\n    }\n    if (a.alternate !== b) throw Error(formatProdErrorMessage(190));\n  }\n  if (3 !== a.tag) throw Error(formatProdErrorMessage(188));\n  return a.stateNode.current === a ? fiber : alternate;\n}\nfunction findCurrentHostFiberImpl(node) {\n  var tag = node.tag;\n  if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;\n  for (node = node.child; null !== node; ) {\n    tag = findCurrentHostFiberImpl(node);\n    if (null !== tag) return tag;\n    node = node.sibling;\n  }\n  return null;\n}\nvar assign = Object.assign,\n  REACT_LEGACY_ELEMENT_TYPE = Symbol.for("react.element"),\n  REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"),\n  REACT_PORTAL_TYPE = Symbol.for("react.portal"),\n  REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"),\n  REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"),\n  REACT_PROFILER_TYPE = Symbol.for("react.profiler"),\n  REACT_PROVIDER_TYPE = Symbol.for("react.provider"),\n  REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),\n  REACT_CONTEXT_TYPE = Symbol.for("react.context"),\n  REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"),\n  REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"),\n  REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"),\n  REACT_MEMO_TYPE = Symbol.for("react.memo"),\n  REACT_LAZY_TYPE = Symbol.for("react.lazy");\nSymbol.for("react.scope");\nvar REACT_ACTIVITY_TYPE = Symbol.for("react.activity");\nSymbol.for("react.legacy_hidden");\nSymbol.for("react.tracing_marker");\nvar REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel");\nSymbol.for("react.view_transition");\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n  if (null === maybeIterable || "object" !== typeof maybeIterable) return null;\n  maybeIterable =\n    (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n    maybeIterable["@@iterator"];\n  return "function" === typeof maybeIterable ? maybeIterable : null;\n}\nvar REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference");\nfunction getComponentNameFromType(type) {\n  if (null == type) return null;\n  if ("function" === typeof type)\n    return type.$$typeof === REACT_CLIENT_REFERENCE\n      ? null\n      : type.displayName || type.name || null;\n  if ("string" === typeof type) return type;\n  switch (type) {\n    case REACT_FRAGMENT_TYPE:\n      return "Fragment";\n    case REACT_PROFILER_TYPE:\n      return "Profiler";\n    case REACT_STRICT_MODE_TYPE:\n      return "StrictMode";\n    case REACT_SUSPENSE_TYPE:\n      return "Suspense";\n    case REACT_SUSPENSE_LIST_TYPE:\n      return "SuspenseList";\n    case REACT_ACTIVITY_TYPE:\n      return "Activity";\n  }\n  if ("object" === typeof type)\n    switch (type.$$typeof) {\n      case REACT_PORTAL_TYPE:\n        return "Portal";\n      case REACT_CONTEXT_TYPE:\n        return (type.displayName || "Context") + ".Provider";\n      case REACT_CONSUMER_TYPE:\n        return (type._context.displayName || "Context") + ".Consumer";\n      case REACT_FORWARD_REF_TYPE:\n        var innerType = type.render;\n        type = type.displayName;
1\n        type ||\n          ((type = innerType.displayName || innerType.name || ""),\n          (type = "" !== type ? "ForwardRef(" + type + ")" : "ForwardRef"));\n        return type;\n      case REACT_MEMO_TYPE:\n        return (\n          (innerType = type.displayName || null),\n          null !== innerType\n            ? innerType\n            : getComponentNameFromType(type.type) || "Memo"\n        );\n      case REACT_LAZY_TYPE:\n        innerType = type._payload;\n        type = type._init;\n        try {\n          return getComponentNameFromType(type(innerType));\n        } catch (x) {}\n    }\n  return null;\n}\nvar isArrayImpl = Array.isArray,\n  ReactSharedInternals =\n    React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n  ReactDOMSharedInternals =\n    ReactDOM.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n  sharedNotPendingObject = {\n    pending: !1,\n    data: null,\n    method: null,\n    action: null\n  },\n  valueStack = [],\n  index = -1;\nfunction createCursor(defaultValue) {\n  return { current: defaultValue };\n}\nfunction pop(cursor) {\n  0 > index ||\n    ((cursor.current = valueStack[index]), (valueStack[index] = null), index--);\n}\nfunction push(cursor, value) {\n  index++;\n  valueStack[index] = cursor.current;\n  cursor.current = value;\n}\nvar contextStackCursor = createCursor(null),\n  contextFiberStackCursor = createCursor(null),\n  rootInstanceStackCursor = createCursor(null),\n  hostTransitionProviderCursor = createCursor(null);\nfunction pushHostContainer(fiber, nextRootInstance) {\n  push(rootInstanceStackCursor, nextRootInstance);\n  push(contextFiberStackCursor, fiber);\n  push(contextStackCursor, null);\n  switch (nextRootInstance.nodeType) {\n    case 9:\n    case 11:\n      fiber = (fiber = nextRootInstance.documentElement)\n        ? (fiber = fiber.namespaceURI)\n          ? getOwnHostContext(fiber)\n          : 0\n        : 0;\n      break;\n    default:\n      if (\n        ((fiber = nextRootInstance.tagName),\n        (nextRootInstance = nextRootInstance.namespaceURI))\n      )\n        (nextRootInstance = getOwnHostContext(nextRootInstance)),\n          (fiber = getChildHostContextProd(nextRootInstance, fiber));\n      else\n        switch (fiber) {\n          case "svg":\n            fiber = 1;\n            break;\n          case "math":\n            fiber = 2;\n            break;\n          default:\n            fiber = 0;\n        }\n  }\n  pop(contextStackCursor);\n  push(contextStackCursor, fiber);\n}\nfunction popHostContainer() {\n  pop(contextStackCursor);\n  pop(contextFiberStackCursor);\n  pop(rootInstanceStackCursor);\n}\nfunction pushHostContext(fiber) {\n  null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber);\n  var context = contextStackCursor.current;\n  var JSCompiler_inline_result = getChildHostContextProd(context, fiber.type);\n  context !== JSCompiler_inline_result &&\n    (push(contextFiberStackCursor, fiber),\n    push(contextStackCursor, JSCompiler_inline_result));\n}\nfunction popHostContext(fiber) {\n  contextFiberStackCursor.current === fiber &&\n    (pop(contextStackCursor), pop(contextFiberStackCursor));\n  hostTransitionProviderCursor.current === fiber &&\n    (pop(hostTransitionProviderCursor),\n    (HostTransitionContext._currentValue = sharedNotPendingObject));\n}\nvar hasOwnProperty = Object.prototype.hasOwnProperty,\n  scheduleCallback$3 = Scheduler.unstable_scheduleCallback,\n  cancelCallback$1 = Scheduler.unstable_cancelCallback,\n  shouldYield = Scheduler.unstable_shouldYield,\n  requestPaint = Scheduler.unstable_requestPaint,\n  now = Scheduler.unstable_now,\n  getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,\n  ImmediatePriority = Scheduler.unstable_ImmediatePriority,\n  UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n  NormalPriority$1 = Scheduler.unstable_NormalPriority,\n  LowPriority = Scheduler.unstable_LowPriority,\n  IdlePriority = Scheduler.unstable_IdlePriority,\n  log$1 = Scheduler.log,\n  unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue,\n  rendererID = null,\n  injectedHook = null;\nfunction setIsStrictModeForDevtools(newIsStrictMode) {\n  "function" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);\n  if (injectedHook && "function" === typeof injectedHook.setStrictMode)\n    try {\n      injectedHook.setStrictMode(rendererID, newIsStrictMode);\n    } catch (err) {}\n}
1\nvar clz32 = Math.clz32 ? Math.clz32 : clz32Fallback,\n  log = Math.log,\n  LN2 = Math.LN2;\nfunction clz32Fallback(x) {\n  x >>>= 0;\n  return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;\n}\nvar nextTransitionLane = 256,\n  nextRetryLane = 4194304;\nfunction getHighestPriorityLanes(lanes) {\n  var pendingSyncLanes = lanes & 42;\n  if (0 !== pendingSyncLanes) return pendingSyncLanes;\n  switch (lanes & -lanes) {\n    case 1:\n      return 1;\n    case 2:\n      return 2;\n    case 4:\n      return 4;\n    case 8:\n      return 8;\n    case 16:\n      return 16;\n    case 32:\n      return 32;\n    case 64:\n      return 64;\n    case 128:\n      return 128;\n    case 256:\n    case 512:\n    case 1024:\n    case 2048:\n    case 4096:\n    case 8192:\n    case 16384:\n    case 32768:\n    case 65536:\n    case 131072:\n    case 262144:\n    case 524288:\n    case 1048576:\n    case 2097152:\n      return lanes & 4194048;\n    case 4194304:\n    case 8388608:\n    case 16777216:\n    case 33554432:\n      return lanes & 62914560;\n    case 67108864:\n      return 67108864;\n    case 134217728:\n      return 134217728;\n    case 268435456:\n      return 268435456;\n    case 536870912:\n      return 536870912;\n    case 1073741824:\n      return 0;\n    default:\n      return lanes;\n  }\n}\nfunction getNextLanes(root, wipLanes, rootHasPendingCommit) {\n  var pendingLanes = root.pendingLanes;\n  if (0 === pendingLanes) return 0;\n  var nextLanes = 0,\n    suspendedLanes = root.suspendedLanes,\n    pingedLanes = root.pingedLanes;\n  root = root.warmLanes;\n  var nonIdlePendingLanes = pendingLanes & 134217727;\n  0 !== nonIdlePendingLanes\n    ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),\n      0 !== pendingLanes\n        ? (nextLanes = getHighestPriorityLanes(pendingLanes))\n        : ((pingedLanes &= nonIdlePendingLanes),\n          0 !== pingedLanes\n            ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n            : rootHasPendingCommit ||\n              ((rootHasPendingCommit = nonIdlePendingLanes & ~root),\n              0 !== rootHasPendingCommit &&\n                (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))))\n    : ((nonIdlePendingLanes = pendingLanes & ~suspendedLanes),\n      0 !== nonIdlePendingLanes\n        ? (nextLanes = getHighestPriorityLanes(nonIdlePendingLanes))\n        : 0 !== pingedLanes\n          ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n          : rootHasPendingCommit ||\n            ((rootHasPendingCommit = pendingLanes & ~root),\n            0 !== rootHasPendingCommit &&\n              (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))));\n  return 0 === nextLanes\n    ? 0\n    : 0 !== wipLanes &&\n        wipLanes !== nextLanes &&\n        0 === (wipLanes & suspendedLanes) &&\n        ((suspendedLanes = nextLanes & -nextLanes),\n        (rootHasPendingCommit = wipLanes & -wipLanes),\n        suspendedLanes >= rootHasPendingCommit ||\n          (32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)))\n      ? wipLanes\n      : nextLanes;\n}\nfunction checkIfRootIsPrerendering(root, renderLanes) {\n  return (\n    0 ===\n    (root.pendingLanes &\n      ~(root.suspendedLanes & ~root.pingedLanes) &\n      renderLanes)\n  );\n}\nfunction computeExpirationTime(lane, currentTime) {\n  switch (lane) {\n    case 1:\n    case 2:\n    case 4:\n    case 8:\n    case 64:\n      return currentTime + 250;\n    case 16:\n    case 32:\n    case 128:\n    case 256:\n    case 512:\n    case 1024:\n    case 2048:\n    case 4096:\n    case 8192:\n    case 16384:\n    case 32768:\n    case 65536:\n    case 131072:\n    case 262144:\n    case 524288:\n    case 1048576:\n    case 2097152:\n      return currentTime + 5e3;\n    case 4194304:\n    case 8388608:\n    case 16777216:\n    case 33554432:\n      return -1;\n    case 67108864:\n    case 134217728:\n    case 268435456:\n    case 536870912:\n    case 1073741824:\n      return -1;\n    default:\n      return -1;\n  }\n}\nfunction claimNextTransitionLane() {\n  var lane = nextTransitionLane;\n  nextTransitionLane <<= 1;\n  0 === (nextTransitionLane & 4194048) && (nextTransitionLane = 256);\n  return lane;\n}\nfunction claimNextRetryLane() {\n  var lane = nextRetryLane;\n  nextRetryLane <<= 1;\n  0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304);\n  return lane;\n}\nfunction createLaneMap(initial) {\n  for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial);\n  return laneMap;\n}\nfunction markRootUpdated$1(root, updateLane) {\n  root.pendingLanes |= updateLane;\n  268435456 !== updateLane &&\n    ((root.suspendedLanes = 0), (root.pingedLanes = 0), (root.warmLanes = 0));\n}\nfunction markRootFinished(\n  root,\n  finishedLanes,\n  remainingLanes,\n  spawnedLane,\n  updatedLanes,\n  suspendedRetryLanes\n) {\n  var previouslyPendingLanes = root.pendingLanes;\n  root.pendingLanes = remainingLanes;\n  root.suspendedLanes = 0;\n  root.pingedLanes = 0;\n  root.warmLanes = 0;\n  root.expiredLanes &= remainingLanes;\n  root.entangledLanes &= remainingLanes;\n  root.errorRecoveryDisabledLanes &= remainingLanes;\n  root.shellSuspendCounter = 0;\n  var entanglements = root.entanglements,\n    expirationTimes = root.expirationTimes,\n    hiddenUpdates = root.hiddenUpdates;\n  for (\n    remainingLanes = previouslyPendingLanes & ~remainingLanes;\n    0 < remainingLanes;\n\n  ) {\n    var index$5 = 31 - clz32(remainingLanes),\n      lane = 1 << index$5;\n    entanglements[index$5] = 0;\n    expirationTimes[index$5] = -1;\n    var hiddenUpdatesForLane = hiddenUpdates[index$5];\n    if (null !== hiddenUpdatesForLane)\n      for (\n        hiddenUpdates[index$5] = null, index$5 = 0;\n        index$5 < hiddenUpdatesForLane.length;\n        index$5++\n      ) {\n        var update = hiddenUpdatesForLane[index$5];\n        null !== update && (update.lane &= -536870913);\n      }\n    remainingLanes &= ~lane;\n  }\n  0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, 0);\n  0 !== suspendedRetryLanes &&\n    0 === updatedLanes &&\n    0 !== root.tag &&\n    (root.suspendedLanes |=\n      suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes));\n}\nfunction markSpawnedDeferredLane(root, spawnedLane, entangledLanes) {\n  root.pendingLanes |= spawnedLane;\n  root.suspendedLanes &= ~spawnedLane;\n  var spawnedLaneIndex = 31 - clz32(spawnedLane);\n  root.entangledLanes |= spawnedLane;\n  root.entanglements[spawnedLaneIndex] =\n    root.entanglements[spawnedLaneIndex] |\n    1073741824 |\n    (entangledLanes & 4194090);\n}\nfunction markRootEntangled(root, entangledLanes) {\n  var rootEntangledLanes = (root.entangledLanes |= entangledLanes);\n  for (root = root.entanglements; rootEntangledLanes; ) {\n    var index$6 = 31 - clz32(rootEntangledLanes),\n      lane = 1 << index$6;\n    (lane & entangledLanes) | (root[index$6] & entangledLanes) &&\n      (root[index$6] |= entangledLanes);\n    rootEntangledLanes &= ~lane;\n  }\n}\nfunction getBumpedLaneForHydrationByLane(lane) {\n  switch (lane) {\n    case 2:\n      lane = 1;\n      break;\n    case 8:\n      lane = 4;\n      break;\n    case 32:\n      lane = 16;\n      break;\n    case 256:\n    case 512:\n    case 1024:\n    case 2048:\n    case 4096:\n    case 8192:\n    case 16384:\n    case 32768:\n    case 65536:\n    case 131072:\n    case 262144:\n    case 524288:\n    case 1048576:\n    case 2097152:\n    case 4194304:\n    case 8388608:\n    case 16777216:\n    case 33554432:\n      lane = 128;\n      break;\n    case 268435456:\n      lane = 134217728;\n      break;\n    default:\n      lane = 0;\n  }\n  return lane;\n}\nfunction lanesToEventPriority(lanes) {\n  lanes &= -lanes;\n  return 2 < lanes\n    ? 8 < lanes\n      ? 0 !== (lanes & 134217727)\n        ? 32\n        : 268435456\n      : 8\n    : 2;\n}\nfunction resolveUpdatePriority() {\n  var updatePriority = ReactDOMSharedInternals.p;\n  if (0 !== updatePriority) return updatePriority;\n  updatePriority = window.event;\n  return void 0 === updatePriority ? 32 : getEventPriority(updatePriority.type);\n}\nfunction runWithPriority(priority, fn) {\n  var previousPriority = ReactDOMSharedInternals.p;\n  try {\n    return (ReactDOMSharedInternals.p = priority), fn();\n  } finally {\n    ReactDOMSharedInternals.p = previousPriority;\n  }\n}\nvar randomKey = Math.random().toString(36).slice(2),\n  internalInstanceKey = "__reactFiber$" + randomKey,\n  internalPropsKey = "__reactProps$" + randomKey,\n  internalContainerInstanceKey = "__reactContainer$" + randomKey,\n  internalEventHandlersKey = "__reactEvents$" + randomKey,\n  internalEventHandlerListenersKey = "__reactListeners$" + randomKey,\n  internalEventHandlesSetKey = "__reactHandles$" + randomKey,\n  internalRootNodeResourcesKey = "__reactResources$" + randomKey,\n  internalHoistableMarker = "__reactMarker$" + randomKey;\nfunction detachDeletedInstance(node) {\n  delete node[internalInstanceKey];\n  delete node[internalPropsKey];\n  delete node[internalEventHandlersKey];\n  delete node[internalEventHandlerListenersKey];\n  delete node[internalEventHandlesSetKey];\n}\nfunction getClosestInstanceFromNode(targetNode) {\n  var targetInst = targetNode[internalInstanceKey];\n  if (targetInst) return targetInst;\n  for (var parentNode = targetNode.parentNode; parentNode; ) {\n    if (\n      (targetInst =\n        parentNode[internalContainerInstanceKey] ||\n        parentNode[internalInstanceKey])\n    ) {\n      parentNode = targetInst.alternate;\n      if (\n        null !== targetInst.child ||\n        (null !== parentNode && null !== parentNode.child)\n      )\n        for (\n          targetNode = getParentSuspenseInstance(targetNode);\n          null !== targetNode;\n\n        ) {\n          if ((parentNode = targetNode[internalInstanceKey])) return parentNode;\n          targetNode = getParentSuspenseInstance(targetNode);\n        }\n      return targetInst;\n    }\n    targetNode = parentNode;\n    parentNode = targetNode.parentNode;\n  }\n  return null;\n}\nfunction getInstanceFromNode(node) {\n  if (\n    (node = node[internalInstanceKey] || node[internalContainerInstanceKey])\n  ) {\n    var tag = node.tag;\n    if (\n      5 === tag ||\n      6 === tag ||\n      13 === tag ||\n      26 === tag ||\n      27 === tag ||\n      3 === tag\n    )\n      return node;\n  }\n  return null;\n}\nfunction getNodeFromInstance(inst) {\n  var tag = inst.tag;\n  if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return inst.stateNode;\n  throw Error(formatProdErrorMessage(33));\n}\nfunction getResourcesFromRoot(root) {\n  var resources = root[internalRootNodeResourcesKey];\n  resources ||\n    (resources = root[internalRootNodeResourcesKey] =\n      { hoistableStyles: new Map(), hoistableScripts: new Map() });\n  return resources;\n}\nfunction markNodeAsHoistable(node) {\n  node[internalHoistableMarker] = !0;\n}\nvar allNativeEvents = new Set(),\n  registrationNameDependencies = {};\nfunction registerTwoPhaseEvent(registrationName, dependencies) {\n  registerDirectEvent(registrationName, dependencies);\n  registerDirectEvent(registrationName + "Capture", dependencies);\n}\nfunction registerDirectEvent(registrationName, dependencies) {\n  registrationNameDependencies[registrationName] = depen
1dencies;\n  for (\n    registrationName = 0;\n    registrationName < dependencies.length;\n    registrationName++\n  )\n    allNativeEvents.add(dependencies[registrationName]);\n}\nvar VALID_ATTRIBUTE_NAME_REGEX = RegExp(\n    "^[:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD][:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*$"\n  ),\n  illegalAttributeNameCache = {},\n  validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n  if (hasOwnProperty.call(validatedAttributeNameCache, attributeName))\n    return !0;\n  if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) return !1;\n  if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName))\n    return (validatedAttributeNameCache[attributeName] = !0);\n  illegalAttributeNameCache[attributeName] = !0;\n  return !1;\n}\nfunction setValueForAttribute(node, name, value) {\n  if (isAttributeNameSafe(name))\n    if (null === value) node.removeAttribute(name);\n    else {\n      switch (typeof value) {\n        case "undefined":\n        case "function":\n        case "symbol":\n          node.removeAttribute(name);\n          return;\n        case "boolean":\n          var prefix$8 = name.toLowerCase().slice(0, 5);\n          if ("data-" !== prefix$8 && "aria-" !== prefix$8) {\n            node.removeAttribute(name);\n            return;\n          }\n      }\n      node.setAttribute(name, "" + value);\n    }\n}\nfunction setValueForKnownAttribute(node, name, value) {\n  if (null === value) node.removeAttribute(name);\n  else {\n    switch (typeof value) {\n      case "undefined":\n      case "function":\n      case "symbol":\n      case "boolean":\n        node.removeAttribute(name);\n        return;\n    }\n    node.setAttribute(name, "" + value);\n  }\n}\nfunction setValueForNamespacedAttribute(node, namespace, name, value) {\n  if (null === value) node.removeAttribute(name);\n  else {\n    switch (typeof value) {\n      case "undefined":\n      case "function":\n      case "symbol":\n      case "boolean":\n        node.removeAttribute(name);\n        return;\n    }\n    node.setAttributeNS(namespace, name, "" + value);\n  }\n}\nvar prefix, suffix;\nfunction describeBuiltInComponentFrame(name) {\n  if (void 0 === prefix)\n    try {\n      throw Error();\n    } catch (x) {\n      var match = x.stack.trim().match(/\\n( *(at )?)/);\n      prefix = (match && match[1]) || "";\n      suffix =\n        -1 < x.stack.indexOf("\\n    at")\n          ? " (<anonymous>)"\n          : -1 < x.stack.indexOf("@")\n            ? "@unknown:0:0"\n            : "";\n    }\n  return "\\n" + prefix + name + suffix;\n}\nvar reentry = !1;\nfunction describeNativeComponentFrame(fn, construct) {\n  if (!fn || reentry) return "";\n  reentry = !0;\n  var previousPrepareStackTrace = Error.prepareStackTrace;\n  Error.prepareStackTrace = void 0;\n  try {\n    var RunInRootFrame = {\n      DetermineComponentFrameRoot: function () {\n        try {\n          if (construct) {\n            var Fake = function () {\n              throw Error();\n            };\n            Object.defineProperty(Fake.prototype, "props", {\n              set: function () {\n                throw Error();\n              }\n            });\n            if ("object" === typeof Reflect && Reflect.construct) {\n              try {\n                Reflect.construct(Fake, []);\n              } catch (x) {\n                var control = x;\n              }\n              Reflect.construct(fn, [], Fake);\n            } else {\n              try {\n                Fake.call();\n              } catch (x$9) {\n                control = x$9;\n              }\n              fn.call(Fake.prototype);\n            }\n          } else {\n            try {\n              throw Error();\n            } catch (x$10) {\n              control = x$10;\n            }\n            (Fake = fn()) &&\n              "function" === typeof Fake.catch &&\n              Fake.catch(function () {});\n          }\n        } catch (sample) {\n          if (sample && control && "string" === typeof sample.
1stack)\n            return [sample.stack, control.stack];\n        }\n        return [null, null];\n      }\n    };\n    RunInRootFrame.DetermineComponentFrameRoot.displayName =\n      "DetermineComponentFrameRoot";\n    var namePropDescriptor = Object.getOwnPropertyDescriptor(\n      RunInRootFrame.DetermineComponentFrameRoot,\n      "name"\n    );\n    namePropDescriptor &&\n      namePropDescriptor.configurable &&\n      Object.defineProperty(\n        RunInRootFrame.DetermineComponentFrameRoot,\n        "name",\n        { value: "DetermineComponentFrameRoot" }\n      );\n    var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(),\n      sampleStack = _RunInRootFrame$Deter[0],\n      controlStack = _RunInRootFrame$Deter[1];\n    if (sampleStack && controlStack) {\n      var sampleLines = sampleStack.split("\\n"),\n        controlLines = controlStack.split("\\n");\n      for (\n        namePropDescriptor = RunInRootFrame = 0;\n        RunInRootFrame < sampleLines.length &&\n        !sampleLines[RunInRootFrame].includes("DetermineComponentFrameRoot");\n\n      )\n        RunInRootFrame++;\n      for (\n        ;\n        namePropDescriptor < controlLines.length &&\n        !controlLines[namePropDescriptor].includes(\n          "DetermineComponentFrameRoot"\n        );\n\n      )\n        namePropDescriptor++;\n      if (\n        RunInRootFrame === sampleLines.length ||\n        namePropDescriptor === controlLines.length\n      )\n        for (\n          RunInRootFrame = sampleLines.length - 1,\n            namePropDescriptor = controlLines.length - 1;\n          1 <= RunInRootFrame &&\n          0 <= namePropDescriptor &&\n          sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor];\n\n        )\n          namePropDescriptor--;\n      for (\n        ;\n        1 <= RunInRootFrame && 0 <= namePropDescriptor;\n        RunInRootFrame--, namePropDescriptor--\n      )\n        if (sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor]) {\n          if (1 !== RunInRootFrame || 1 !== namePropDescriptor) {\n            do\n              if (\n                (RunInRootFrame--,\n                namePropDescriptor--,\n                0 > namePropDescriptor ||\n                  sampleLines[RunInRootFrame] !==\n                    controlLines[namePropDescriptor])\n              ) {\n                var frame =\n                  "\\n" +\n                  sampleLines[RunInRootFrame].replace(" at new ", " at ");\n                fn.displayName &&\n                  frame.includes("<anonymous>") &&\n                  (frame = frame.replace("<anonymous>", fn.displayName));\n                return frame;\n              }\n            while (1 <= RunInRootFrame && 0 <= namePropDescriptor);\n          }\n          break;\n        }\n    }\n  } finally {\n    (reentry = !1), (Error.prepareStackTrace = previousPrepareStackTrace);\n  }\n  return (previousPrepareStackTrace = fn ? fn.displayName || fn.name : "")\n    ? describeBuiltInComponentFrame(previousPrepareStackTrace)\n    : "";\n}\nfunction describeFiber(fiber) {\n  switch (fiber.tag) {\n    case 26:\n    case 27:\n    case 5:\n      return describeBuiltInComponentFrame(fiber.type);\n    case 16:\n      return describeBuiltInComponentFrame("Lazy");\n    case 13:\n      return describeBuiltInComponentFrame("Suspense");\n    case 19:\n      return describeBuiltInComponentFrame("SuspenseList");\n    case 0:\n    case 15:\n      return describeNativeComponentFrame(fiber.type, !1);\n    case 11:\n      return describeNativeComponentFrame(fiber.type.render, !1);\n    case 1:\n      return describeNativeComponentFrame(fiber.type, !0);\n    case 31:\n      return describeBuiltInComponentFrame("Activity");\n    default:\n      return "";\n  }\n}
1\nfunction getStackByFiberInDevAndProd(workInProgress) {\n  try {\n    var info = "";\n    do\n      (info += describeFiber(workInProgress)),\n        (workInProgress = workInProgress.return);\n    while (workInProgress);\n    return info;\n  } catch (x) {\n    return "\\nError generating stack: " + x.message + "\\n" + x.stack;\n  }\n}\nfunction getToStringValue(value) {\n  switch (typeof value) {\n    case "bigint":\n    case "boolean":\n    case "number":\n    case "string":\n    case "undefined":\n      return value;\n    case "object":\n      return value;\n    default:\n      return "";\n  }\n}\nfunction isCheckable(elem) {\n  var type = elem.type;\n  return (\n    (elem = elem.nodeName) &&\n    "input" === elem.toLowerCase() &&\n    ("checkbox" === type || "radio" === type)\n  );\n}\nfunction trackValueOnNode(node) {\n  var valueField = isCheckable(node) ? "checked" : "value",\n    descriptor = Object.getOwnPropertyDescriptor(\n      node.constructor.prototype,\n      valueField\n    ),\n    currentValue = "" + node[valueField];\n  if (\n    !node.hasOwnProperty(valueField) &&\n    "undefined" !== typeof descriptor &&\n    "function" === typeof descriptor.get &&\n    "function" === typeof descriptor.set\n  ) {\n    var get = descriptor.get,\n      set = descriptor.set;\n    Object.defineProperty(node, valueField, {\n      configurable: !0,\n      get: function () {\n        return get.call(this);\n      },\n      set: function (value) {\n        currentValue = "" + value;\n        set.call(this, value);\n      }\n    });\n    Object.defineProperty(node, valueField, {\n      enumerable: descriptor.enumerable\n    });\n    return {\n      getValue: function () {\n        return currentValue;\n      },\n      setValue: function (value) {\n        currentValue = "" + value;\n      },\n      stopTracking: function () {\n        node._valueTracker = null;\n        delete node[valueField];\n      }\n    };\n  }\n}\nfunction track(node) {\n  node._valueTracker || (node._valueTracker = trackValueOnNode(node));\n}\nfunction updateValueIfChanged(node) {\n  if (!node) return !1;\n  var tracker = node._valueTracker;\n  if (!tracker) return !0;\n  var lastValue = tracker.getValue();\n  var value = "";\n  node &&\n    (value = isCheckable(node)\n      ? node.checked\n        ? "true"\n        : "false"\n      : node.value);\n  node = value;\n  return node !== lastValue ? (tracker.setValue(node), !0) : !1;\n}\nfunction getActiveElement(doc) {\n  doc = doc || ("undefined" !== typeof document ? document : void 0);\n  if ("undefined" === typeof doc) return null;\n  try {\n    return doc.activeElement || doc.body;\n  } catch (e) {\n    return doc.body;\n  }\n}\nvar escapeSelectorAttributeValueInsideDoubleQuotesRegex = /[\\n"\\\\]/g;\nfunction escapeSelectorAttributeValueInsideDoubleQuotes(value) {\n  return value.replace(\n    escapeSelectorAttributeValueInsideDoubleQuotesRegex,\n    function (ch) {\n      return "\\\\" + ch.charCodeAt(0).toString(16) + " ";\n    }\n  );\n}\nfunction updateInput(\n  element,\n  value,\n  defaultValue,\n  lastDefaultValue,\n  checked,\n  defaultChecked,\n  type,\n  name\n) {\n  element.name = "";\n  null != type &&\n  "function" !== typeof type &&\n  "symbol" !== typeof type &&\n  "boolean" !== typeof type\n    ? (element.type = type)\n    : element.removeAttribute("type");\n  if (null != value)\n    if ("number" === type) {\n      if ((0 === value && "" === element.value) || element.value != value)\n        element.value = "" + getToStringValue(value);\n    } else\n      element.value !== "" + getToStringValue(value) &&\n        (element.value = "" + getToStringValue(value));\n  else\n    ("submit" !== type && "reset" !== type) || element.removeAttribute("value");\n  null != value\n    ? setDefaultValue(element, type, getToStringValue(value))\n    : null != defaultValue\n      ? setDefaultValue(element, type, getToStringValue(defaultValue))\n      : null != lastDefaultValue && element.removeAttribute("value");\n  null == checked &&\n    null != defaultChecked &&\n    (element.defaultChecked = !!defaultChecked);\n  null != checked &&\n    (element.checked =\n      checked && "function" !== typeof checked && "symbol" !== typeof checked);\n  null != name &&\n  "function" !== typeof name &&\n  "symbol" !== typeof name &&\n  "boolean" !== typeof name\n    ? (element.name = "" + getToStringValue(name))\n    : element.removeAttribute("name");\n}\nfunction initInput(\n  element,\n  value,\n  defaultValue,\n  checked,\n  defaultChecked,\n  type,\n  name,\n  isHydrating\
1n) {\n  null != type &&\n    "function" !== typeof type &&\n    "symbol" !== typeof type &&\n    "boolean" !== typeof type &&\n    (element.type = type);\n  if (null != value || null != defaultValue) {\n    if (\n      !(\n        ("submit" !== type && "reset" !== type) ||\n        (void 0 !== value && null !== value)\n      )\n    )\n      return;\n    defaultValue =\n      null != defaultValue ? "" + getToStringValue(defaultValue) : "";\n    value = null != value ? "" + getToStringValue(value) : defaultValue;\n    isHydrating || value === element.value || (element.value = value);\n    element.defaultValue = value;\n  }\n  checked = null != checked ? checked : defaultChecked;\n  checked =\n    "function" !== typeof checked && "symbol" !== typeof checked && !!checked;\n  element.checked = isHydrating ? element.checked : !!checked;\n  element.defaultChecked = !!checked;\n  null != name &&\n    "function" !== typeof name &&\n    "symbol" !== typeof name &&\n    "boolean" !== typeof name &&\n    (element.name = name);\n}\nfunction setDefaultValue(node, type, value) {\n  ("number" === type && getActiveElement(node.ownerDocument) === node) ||\n    node.defaultValue === "" + value ||\n    (node.defaultValue = "" + value);\n}\nfunction updateOptions(node, multiple, propValue, setDefaultSelected) {\n  node = node.options;\n  if (multiple) {\n    multiple = {};\n    for (var i = 0; i < propValue.length; i++)\n      multiple["$" + propValue[i]] = !0;\n    for (propValue = 0; propValue < node.length; propValue++)\n      (i = multiple.hasOwnProperty("$" + node[propValue].value)),\n        node[propValue].selected !== i && (node[propValue].selected = i),\n        i && setDefaultSelected && (node[propValue].defaultSelected = !0);\n  } else {\n    propValue = "" + getToStringValue(propValue);\n    multiple = null;\n    for (i = 0; i < node.length; i++) {\n      if (node[i].value === propValue) {\n        node[i].selected = !0;\n        setDefaultSelected && (node[i].defaultSelected = !0);\n        return;\n      }\n      null !== multiple || node[i].disabled || (multiple = node[i]);\n    }\n    null !== multiple && (multiple.selected = !0);\n  }\n}\nfunction updateTextarea(element, value, defaultValue) {\n  if (\n    null != value &&\n    ((value = "" + getToStringValue(value)),\n    value !== element.value && (element.value = value),\n    null == defaultValue)\n  ) {\n    element.defaultValue !== value && (element.defaultValue = value);\n    return;\n  }\n  element.defaultValue =\n    null != defaultValue ? "" + getToStringValue(defaultValue) : "";\n}\nfunction initTextarea(element, value, defaultValue, children) {\n  if (null == value) {\n    if (null != children) {\n      if (null != defaultValue) throw Error(formatProdErrorMessage(92));\n      if (isArrayImpl(children)) {\n        if (1 < children.length) throw Error(formatProdErrorMessage(93));\n        children = children[0];\n      }\n      defaultValue = children;\n    }\n    null == defaultValue && (defaultValue = "");\n    value = defaultValue;\n  }\n  defaultValue = getToStringValue(value);\n  element.defaultValue = defaultValue;\n  children = element.textContent;\n  children === defaultValue &&\n    "" !== children &&\n    null !== children &&\n    (element.value = children);\n}\nfunction setTextContent(node, text) {\n  if (text) {\n    var firstChild = node.firstChild;\n    if (\n      firstChild &&\n      firstChild === node.lastChild &&\n      3 === firstChild.nodeType\n    ) {\n      firstChild.nodeValue = text;\n      return;\n    }\n  }\n  node.textContent = text;\n}\nvar unitlessNumbers = new Set(\n  "animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(\n    " "\n  )\n);\nfunction setValueForStyle(style, styleName, value) {\n  var isCustomProperty = 0 === styleName.indexOf("--");\n  null == value || "boolean" === typeof value || "" === value\
1n    ? isCustomProperty\n      ? style.setProperty(styleName, "")\n      : "float" === styleName\n        ? (style.cssFloat = "")\n        : (style[styleName] = "")\n    : isCustomProperty\n      ? style.setProperty(styleName, value)\n      : "number" !== typeof value ||\n          0 === value ||\n          unitlessNumbers.has(styleName)\n        ? "float" === styleName\n          ? (style.cssFloat = value)\n          : (style[styleName] = ("" + value).trim())\n        : (style[styleName] = value + "px");\n}\nfunction setValueForStyles(node, styles, prevStyles) {\n  if (null != styles && "object" !== typeof styles)\n    throw Error(formatProdErrorMessage(62));\n  node = node.style;\n  if (null != prevStyles) {\n    for (var styleName in prevStyles)\n      !prevStyles.hasOwnProperty(styleName) ||\n        (null != styles && styles.hasOwnProperty(styleName)) ||\n        (0 === styleName.indexOf("--")\n          ? node.setProperty(styleName, "")\n          : "float" === styleName\n            ? (node.cssFloat = "")\n            : (node[styleName] = ""));\n    for (var styleName$16 in styles)\n      (styleName = styles[styleName$16]),\n        styles.hasOwnProperty(styleName$16) &&\n          prevStyles[styleName$16] !== styleName &&\n          setValueForStyle(node, styleName$16, styleName);\n  } else\n    for (var styleName$17 in styles)\n      styles.hasOwnProperty(styleName$17) &&\n        setValueForStyle(node, styleName$17, styles[styleName$17]);\n}\nfunction isCustomElement(tagName) {\n  if (-1 === tagName.indexOf("-")) return !1;\n  switch (tagName) {\n    case "annotation-xml":\n    case "color-profile":\n    case "font-face":\n    case "font-face-src":\n    case "font-face-uri":\n    case "font-face-format":\n    case "font-face-name":\n    case "missing-glyph":\n      return !1;\n    default:\n      return !0;\n  }\n}\nvar aliases = new Map([\n    ["acceptCharset", "accept-charset"],\n    ["htmlFor", "for"],\n    ["httpEquiv", "http-equiv"],\n    ["crossOrigin", "crossorigin"],\n    ["accentHeight", "accent-height"],\n    ["alignmentBaseline", "alignment-baseline"],\n    ["arabicForm", "arabic-form"],\n    ["baselineShift", "baseline-shift"],\n    ["capHeight", "cap-height"],\n    ["clipPath", "clip-path"],\n    ["clipRule", "clip-rule"],\n    ["colorInterpolation", "color-interpolation"],\n    ["colorInterpolationFilters", "color-interpolation-filters"],\n    ["colorProfile", "color-profile"],\n    ["colorRendering", "color-rendering"],\n    ["dominantBaseline", "dominant-baseline"],\n    ["enableBackground", "enable-background"],\n    ["fillOpacity", "fill-opacity"],\n    ["fillRule", "fill-rule"],\n    ["floodColor", "flood-color"],\n    ["floodOpacity", "flood-opacity"],\n    ["fontFamily", "font-family"],\n    ["fontSize", "font-size"],\n    ["fontSizeAdjust", "font-size-adjust"],\n    ["fontStretch", "font-stretch"],\n    ["fontStyle", "font-style"],\n    ["fontVariant", "font-variant"],\n    ["fontWeight", "font-weight"],\n    ["glyphName", "glyph-name"],\n    ["glyphOrientationHorizontal", "glyph-orientation-horizontal"],\n    ["glyphOrientationVertical", "glyph-orientation-vertical"],\n    ["horizAdvX", "horiz-adv-x"],\n    ["horizOriginX", "horiz-origin-x"],\n    ["imageRendering", "image-rendering"],\n    ["letterSpacing", "letter-spacing"],\n    ["lightingColor", "lighting-color"],\n    ["markerEnd", "marker-end"],\n    ["markerMid", "marker-mid"],\n    ["markerStart", "marker-start"],\n    ["overlinePosition", "overline-position"],\n    ["overlineThickness", "overline-thickness"],\n    ["paintOrder", "paint-order"],\n    ["panose-1", "panose-1"],\n    ["pointerEvents", "pointer-events"],\n    ["renderingIntent", "rendering-intent"],\n    ["shapeRendering", "shape-rendering"],\n    ["stopColor", "stop-color"],\n    ["stopOpacity", "stop-opacity"],\n    ["strikethroughPosition", "strikethrough-position"],\n    ["strikethroughThickness", "strikethrough-thickness"],\n    ["strokeDasharray", "stroke-dasharray"],\n    ["strokeDashoffset", "stroke-dashoffset"],\n    ["strokeLinecap", "stroke-linecap"],\n    ["strokeLinejoin", "stroke-linejoin"],\n    ["strokeMiterlimit", "stroke-miterlimit"],\n    ["strokeOpacity", "stroke-opacity"],\n    ["strokeWidth", "stroke-width"],\n    ["textAnchor", "text-anchor"],\n    ["textDecoration", "text-decoration"],\n    ["textRendering", "text-rendering"],\n    ["transformOrigin", "transform-origin"],\n    ["underlinePosition", "underline-position"],\n    ["underlineThickness", "underline-thickness"],\n    ["unicodeBidi", "unicode
1-bidi"],\n    ["unicodeRange", "unicode-range"],\n    ["unitsPerEm", "units-per-em"],\n    ["vAlphabetic", "v-alphabetic"],\n    ["vHanging", "v-hanging"],\n    ["vIdeographic", "v-ideographic"],\n    ["vMathematical", "v-mathematical"],\n    ["vectorEffect", "vector-effect"],\n    ["vertAdvY", "vert-adv-y"],\n    ["vertOriginX", "vert-origin-x"],\n    ["vertOriginY", "vert-origin-y"],\n    ["wordSpacing", "word-spacing"],\n    ["writingMode", "writing-mode"],\n    ["xmlnsXlink", "xmlns:xlink"],\n    ["xHeight", "x-height"]\n  ]),\n  isJavaScriptProtocol =\n    /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*:/i;\nfunction sanitizeURL(url) {\n  return isJavaScriptProtocol.test("" + url)\n    ? "javascript:throw new Error(\'React has blocked a javascript: URL as a security precaution.\')"\n    : url;\n}\nvar currentReplayingEvent = null;\nfunction getEventTarget(nativeEvent) {\n  nativeEvent = nativeEvent.target || nativeEvent.srcElement || window;\n  nativeEvent.correspondingUseElement &&\n    (nativeEvent = nativeEvent.correspondingUseElement);\n  return 3 === nativeEvent.nodeType ? nativeEvent.parentNode : nativeEvent;\n}\nvar restoreTarget = null,\n  restoreQueue = null;\nfunction restoreStateOfTarget(target) {\n  var internalInstance = getInstanceFromNode(target);\n  if (internalInstance && (target = internalInstance.stateNode)) {\n    var props = target[internalPropsKey] || null;\n    a: switch (((target = internalInstance.stateNode), internalInstance.type)) {\n      case "input":\n        updateInput(\n          target,\n          props.value,\n          props.defaultValue,\n          props.defaultValue,\n          props.checked,\n          props.defaultChecked,\n          props.type,\n          props.name\n        );\n        internalInstance = props.name;\n        if ("radio" === props.type && null != internalInstance) {\n          for (props = target; props.parentNode; ) props = props.parentNode;\n          props = props.querySelectorAll(\n            \'input[name="\' +\n              escapeSelectorAttributeValueInsideDoubleQuotes(\n                "" + internalInstance\n              ) +\n              \'"][type="radio"]\'\n          );\n          for (\n            internalInstance = 0;\n            internalInstance < props.length;\n            internalInstance++\n          ) {\n            var otherNode = props[internalInstance];\n            if (otherNode !== target && otherNode.form === target.form) {\n              var otherProps = otherNode[internalPropsKey] || null;\n              if (!otherProps) throw Error(formatProdErrorMessage(90));\n              updateInput(\n                otherNode,\n                otherProps.value,\n                otherProps.defaultValue,\n                otherProps.defaultValue,\n                otherProps.checked,\n                otherProps.defaultChecked,\n                otherProps.type,\n                otherProps.name\n              );\n            }\n          }\n          for (\n            internalInstance = 0;\n            internalInstance < props.length;\n            internalInstance++\n          )\n            (otherNode = props[internalInstance]),\n              otherNode.form === target.form && updateValueIfChanged(otherNode);\n        }\n        break a;\n      case "textarea":\n        updateTextarea(target, props.value, props.defaultValue);\n        break a;\n      case "select":\n        (internalInstance = props.value),\n          null != internalInstance &&\n            updateOptions(target, !!props.multiple, internalInstance, !1);\n    }\n  }\n}\nvar isInsideEventHandler = !1;\nfunction batchedUpdates$1(fn, a, b) {\n  if (isInsideEventHandler) return fn(a, b);\n  isInsideEventHandler = !0;\n  try {\n    var JSCompiler_inline_result = fn(a);\n    return JSCompiler_inline_result;\n  } finally {\n    if (\n      ((isInsideEventHandler = !1),\n      null !== restoreTarget || null !== restoreQueue)\n    )\n      if (\n        (flushSyncWork$1(),\n        restoreTarget &&\n          ((a = restoreTarget),\n          (fn = restoreQueue),\n          (restoreQueue = restoreTarget = null),\n          restoreStateOfTarget(a),\n          fn))\n      )\n        for (a = 0; a < fn.length; a++) restoreStateOfTarget(fn[a]);\n  }\n}\nfunction getListener(inst, registrationName) {\n  var stateNode = inst.stateNode;\n  if (null === stateNode) return null;\n  var props = stateNode[internalPropsKey] || null;\n  if (null === props) return null;\n  stateNode = props[registrationName];\n  a: switch (registrationName) {\n    case "onClick":\n    case "onClickCapture":\n    case "onDoubleClick":\n    case "onDoubleClickCapture":\n    case "onMouseDown":\n    case "onMouseDownCapture":\n    case "onMouseMove":\n    case "onMouseMoveCapture":\n    case "onMouseUp":\n    case "onMouseUpCapture":\n    case "onMouseEnter":\n      (props = !props.disabled) ||\n        ((inst = inst.type),\n        (props = !(\n          "button" === inst ||\n          "input" === inst ||\n          "select" === inst ||\n          "textarea" === inst\n        )));\n      inst = !props;\n      break a;\n    default:\n      inst = !1;\n  }\n  if (inst) return null;\n  if (stateNode && "function" !== typeof stateNode)\n    throw Error(\n      formatProdErrorMessage(231, registrationName, typeof stateNode)\n    );\n  return stateNode;\n}\nvar canUseDOM = !(\n    "undefined" === typeof window ||\n    "undefined" === typeof window.document ||\
1n    "undefined" === typeof window.document.createElement\n  ),\n  passiveBrowserEventsSupported = !1;\nif (canUseDOM)\n  try {\n    var options = {};\n    Object.defineProperty(options, "passive", {\n      get: function () {\n        passiveBrowserEventsSupported = !0;\n      }\n    });\n    window.addEventListener("test", options, options);\n    window.removeEventListener("test", options, options);\n  } catch (e) {\n    passiveBrowserEventsSupported = !1;\n  }\nvar root = null,\n  startText = null,\n  fallbackText = null;\nfunction getData() {\n  if (fallbackText) return fallbackText;\n  var start,\n    startValue = startText,\n    startLength = startValue.length,\n    end,\n    endValue = "value" in root ? root.value : root.textContent,\n    endLength = endValue.length;\n  for (\n    start = 0;\n    start < startLength && startValue[start] === endValue[start];\n    start++\n  );\n  var minEnd = startLength - start;\n  for (\n    end = 1;\n    end <= minEnd &&\n    startValue[startLength - end] === endValue[endLength - end];\n    end++\n  );\n  return (fallbackText = endValue.slice(start, 1 < end ? 1 - end : void 0));\n}\nfunction getEventCharCode(nativeEvent) {\n  var keyCode = nativeEvent.keyCode;\n  "charCode" in nativeEvent\n    ? ((nativeEvent = nativeEvent.charCode),\n      0 === nativeEvent && 13 === keyCode && (nativeEvent = 13))\n    : (nativeEvent = keyCode);\n  10 === nativeEvent && (nativeEvent = 13);\n  return 32 <= nativeEvent || 13 === nativeEvent ? nativeEvent : 0;\n}\nfunction functionThatReturnsTrue() {\n  return !0;\n}\nfunction functionThatReturnsFalse() {\n  return !1;\n}\nfunction createSyntheticEvent(Interface) {\n  function SyntheticBaseEvent(\n    reactName,\n    reactEventType,\n    targetInst,\n    nativeEvent,\n    nativeEventTarget\n  ) {\n    this._reactName = reactName;\n    this._targetInst = targetInst;\n    this.type = reactEventType;\n    this.nativeEvent = nativeEvent;\n    this.target = nativeEventTarget;\n    this.currentTarget = null;\n    for (var propName in Interface)\n      Interface.hasOwnProperty(propName) &&\n        ((reactName = Interface[propName]),\n        (this[propName] = reactName\n          ? reactName(nativeEvent)\n          : nativeEvent[propName]));\n    this.isDefaultPrevented = (\n      null != nativeEvent.defaultPrevented\n        ? nativeEvent.defaultPrevented\n        : !1 === nativeEvent.returnValue\n    )\n      ? functionThatReturnsTrue\n      : functionThatReturnsFalse;\n    this.isPropagationStopped = functionThatReturnsFalse;\n    return this;\n  }\n  assign(SyntheticBaseEvent.prototype, {\n    preventDefault: function () {\n      this.defaultPrevented = !0;\n      var event = this.nativeEvent;\n      event &&\n        (event.preventDefault\n          ? event.preventDefault()\n          : "unknown" !== typeof event.returnValue && (event.returnValue = !1),\n        (this.isDefaultPrevented = functionThatReturnsTrue));\n    },\n    stopPropagation: function () {\n      var event = this.nativeEvent;\n      event &&\n        (event.stopPropagation\n          ? event.stopPropagation()\n          : "unknown" !== typeof event.cancelBubble &&\n            (event.cancelBubble = !0),\n        (this.isPropagationStopped = functionThatReturnsTrue));\n    },\n    persist: function () {},\n    isPersistent: functionThatReturnsTrue\n  });\n  return SyntheticBaseEvent;\n}\nvar EventInterface = {\n    eventPhase: 0,\n    bubbles: 0,\n    cancelable: 0,\n    timeStamp: function (event) {\n      return event.timeStamp || Date.now();\n    },\n    defaultPrevented: 0,\n    isTrusted: 0\n  },\n  SyntheticEvent = createSyntheticEvent(EventInterface),\n  UIEventInterface = assign({}, EventInterface, { view: 0, detail: 0 }),\n  SyntheticUIEvent = createSyntheticEvent(UIEventInterface),\n  lastMovementX,\n  lastMovementY,\n  lastMouseEvent,\n  MouseEventInterface = assign({}, UIEventInterface, {\n    screenX: 0,\n    screenY: 0,\n    clientX: 0,\n    clientY: 0,\n    pageX: 0,\n    pageY: 0,\n    ctrlKey: 0,\n    shiftKey: 0,\n    altKey: 0,\n    metaKey: 0,\n    getModifierState: getEventModifierState,\n    button: 0,\n    buttons: 0,\n    relatedTarget: function (event) {\n      return void 0 === event.relatedTarget\n        ? event.fromElement === event.srcElement\n          ? event.toElement\n          : event.fromElement\n        : event.relatedTarget;\n    },\n    movementX: function (event) {\n      if ("movementX" in event) return event.movementX;\n      event !== lastMouseEvent &&\n        (lastMouseEvent && "mousemove" === event.type\n          ? ((lastMovementX = event.screenX - lastMouseEvent.screenX),\n            (lastMovementY = event.screenY - lastMouseEvent.screenY))\n          : (lastMovementY = lastMovementX = 0),\n        (lastMouseEvent = event));\n      return lastMovementX;\n    },\n    movementY: function (event) {\n      return "movementY" in event ? event.movementY : lastMovementY;\n    }\n  }),\n  SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface),\n  DragEventInterface = assign({}, MouseEventInterface, { dataTransfer: 0 }),\n  SyntheticDragEvent = createSyntheticEvent(DragEventInterface),\n  FocusEventInterface = assign({}, UIEventInterface, { relatedTarget: 0 }),\n  SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface),\n  AnimationEventInterface = assign({}, EventInterface, {\n    animationName: 0,\n    elapsedTime: 0,\n    pseudoElement: 0\n  }),\n  SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface),\n  ClipboardEventInterface = assign({}, EventInterface, {\n    clipboardData: function (event) {\n      return "clipboardData" in event\n        ? event.clipboardData\n        : window.clipboardData;\n    }\n  }),\n  SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface),\n  CompositionEventInterface = assign({}, EventInterface, { data: 0 }),\n  SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface),\n  normalizeKey = {\n    Esc: "Escape",\n    Spacebar: " ",\n    Left: "ArrowLeft",\n    Up: "ArrowUp",\n    Right: "ArrowRight",\n    Down: "ArrowDown",\n    Del: "Delete",\n    Win: "OS",\n    Menu: "ContextMenu",\n    Apps: "ContextMenu",\n    Scroll: "ScrollLock",\n    MozPrintableKey: "Unidentified"\n  },\n  translateToKey = {\n    8: "Backspace",\n    9: "Tab",\n    12: "Clear",\n    13: "Enter",\n    16: "Shift",\n    17: "Control",\n    18: "Alt",\n    19: "Pause",\n    20: "CapsLock",\n    27: "Escape",\n    32: " ",\n    33: "PageUp",\n    34: "PageDown",\n    35: "End",\n    36: "Home",\n    37: "ArrowLeft",\n    38: "ArrowUp",\n    39: "ArrowRight",\n    40: "ArrowDown",\n    45: "Insert",\n    46: "Delete",\n    112: "F1",\n    113: "F2",\n    114: "F3",\n    115: "F4",\n    116: "F5",\n    117: "F6",\n    118: "F7",\n    119: "F8",\n    120: "F9",\n    121: "F10",\n    122: "F11",\n    123: "F12",\n    144: "NumLock",\n    145: "ScrollLock",\n    224: "Meta"\n  },\n  modifierKeyToProp = {\n    Alt: "altKey",\n    Control: "ctrlKey",\n    Meta: "metaKey",\n    Shift: "shiftKey"\n  };\nfunction modifierStateGetter(keyArg) {\n  var nativeEvent = this.nativeEvent;\n  return nativeEvent.getModifierState\n    ? nativeEvent.getModifierState(keyArg)\n    : (keyArg = modifierKeyToProp[keyArg])\n      ? !!nativeEvent[ke
1yArg]\n      : !1;\n}\nfunction getEventModifierState() {\n  return modifierStateGetter;\n}\nvar KeyboardEventInterface = assign({}, UIEventInterface, {\n    key: function (nativeEvent) {\n      if (nativeEvent.key) {\n        var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n        if ("Unidentified" !== key) return key;\n      }\n      return "keypress" === nativeEvent.type\n        ? ((nativeEvent = getEventCharCode(nativeEvent)),\n          13 === nativeEvent ? "Enter" : String.fromCharCode(nativeEvent))\n        : "keydown" === nativeEvent.type || "keyup" === nativeEvent.type\n          ? translateToKey[nativeEvent.keyCode] || "Unidentified"\n          : "";\n    },\n    code: 0,\n    location: 0,\n    ctrlKey: 0,\n    shiftKey: 0,\n    altKey: 0,\n    metaKey: 0,\n    repeat: 0,\n    locale: 0,\n    getModifierState: getEventModifierState,\n    charCode: function (event) {\n      return "keypress" === event.type ? getEventCharCode(event) : 0;\n    },\n    keyCode: function (event) {\n      return "keydown" === event.type || "keyup" === event.type\n        ? event.keyCode\n        : 0;\n    },\n    which: function (event) {\n      return "keypress" === event.type\n        ? getEventCharCode(event)\n        : "keydown" === event.type || "keyup" === event.type\n          ? event.keyCode\n          : 0;\n    }\n  }),\n  SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface),\n  PointerEventInterface = assign({}, MouseEventInterface, {\n    pointerId: 0,\n    width: 0,\n    height: 0,\n    pressure: 0,\n    tangentialPressure: 0,\n    tiltX: 0,\n    tiltY: 0,\n    twist: 0,\n    pointerType: 0,\n    isPrimary: 0\n  }),\n  SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface),\n  TouchEventInterface = assign({}, UIEventInterface, {\n    touches: 0,\n    targetTouches: 0,\n    changedTouches: 0,\n    altKey: 0,\n    metaKey: 0,\n    ctrlKey: 0,\n    shiftKey: 0,\n    getModifierState: getEventModifierState\n  }),\n  SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface),\n  TransitionEventInterface = assign({}, EventInterface, {\n    propertyName: 0,\n    elapsedTime: 0,\n    pseudoElement: 0\n  }),\n  SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface),\n  WheelEventInterface = assign({}, MouseEventInterface, {\n    deltaX: function (event) {\n      return "deltaX" in event\n        ? event.deltaX\n        : "wheelDeltaX" in event\n          ? -event.wheelDeltaX\n          : 0;\n    },\n    deltaY: function (event) {\n      return "deltaY" in event\n        ? event.deltaY\n        : "wheelDeltaY" in event\n          ? -event.wheelDeltaY\n          : "wheelDelta" in event\n            ? -event.wheelDelta\n            : 0;\n    },\n    deltaZ: 0,\n    deltaMode: 0\n  }),\n  SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface),\n  ToggleEventInterface = assign({}, EventInterface, {\n    newState: 0,\n    oldState: 0\n  }),\n  SyntheticToggleEvent = createSyntheticEvent(ToggleEventInterface),\n  END_KEYCODES = [9, 13, 27, 32],\n  canUseCompositionEvent = canUseDOM && "CompositionEvent" in window,\n  documentMode = null;\ncanUseDOM &&\n  "documentMode" in document &&\n  (documentMode = document.documentMode);\nvar canUseTextInputEvent = canUseDOM && "TextEvent" in window && !documentMode,\n  useFallbackCompositionData =\n    canUseDOM &&\n    (!canUseCompositionEvent ||\n      (documentMode && 8 < documentMode && 11 >= documentMode)),\n  SPACEBAR_CHAR = String.fromCharCode(32),\n  hasSpaceKeypress = !1;\nfunction isFallbackCompositionEnd(domEventName, nativeEvent) {\n  switch (domEventName) {\n    case "keyup":\n      return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode);\n    case "keydown":\n      return 229 !== nativeEvent.keyCode;\n    case "keypress":\n    case "mousedown":\n    case "focusout":\n      return !0;\n    default:\n      return !1;\n  }\n}\nfunction getDataFromCustomEvent(nativeEvent) {\n  nativeEvent = nativeEvent.detail;\n  return "object" === typeof nativeEvent && "data" in nativeEvent\n    ? nativeEvent.data\n    : null;\n}\nvar isComposing = !1;\nfunction getNativeBeforeInputChars(domEventName, nativeEvent) {\n  switch (domEventName) {\n    case "compositionend":\n      return getDataFromCustomEvent(nativeEvent);\n    case "keypress":\n      if (32 !== nativeEvent.which) return null;\n      hasSpaceKeypress = !0;\n      return SPACEBAR_CHAR;\n    case "textInput":\n      return (\n        (domEventName = nativeEvent.data),\n        domEventName === SPACEBAR_CHAR && hasSpaceKeypress ? null : domEventName\n      );\n    default:\n      return null;\n  }\n}\nfunction getFallbackBeforeInputChars(domEventName, nativeEvent) {\n  if (isComposing)\n    return "compositionend" === domEventName ||\n      (!canUseCompositionEvent &&\n        isFallbackCompositionEnd(domEventName, nativeEvent))\n      ? ((domEventName = getData()),\n        (fallbackText = startText = root = null),\n        (isComposing = !1),\n        domEventName)\n      : null;\n  switch (domEventName) {\n    case "paste":\n      return null;\n    case "keypress":\n      if (\n        !(nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) ||\n        (nativeEvent.ctrlKey && nativeEvent.altKey)\n      ) {\n        if (nativeEvent.char && 1 < nativeEvent.char.length)\n          return nativeEvent.char;\n        if (nativeEvent.which) return String.fromCharCode(nativeEvent.which);\n      }\n      return null;\n    case "compositionend":\n      return useFallbackCompositionData && "ko" !== nativeEvent.locale\n        ? null\n        : nativeEvent.data;\n    default:\n      return null;\n  }\n}\nvar supportedInputTypes = {\n  color: !0,\n  date: !0,\n  datetime: !0,\n  "datetime-local": !0,\n  email: !0,\n  month: !0,\n  number: !0,\n  password: !0,\n  range: !0,\n  search: !0,\n  tel: !0,\n  text: !0,\n  time: !0,\n  url: !0,\n  week: !0\n};\nfunction isTextInputElement(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n  return "input" === nodeName\n    ? !!supportedInputTypes[elem.type]\n    : "textarea" === nodeName\n      ? !0\n      : !1;\n}\nfunction createAndAccumulateChangeEvent(\n  dispatchQueue,\n  inst,\n  nativeEvent,\n  target\n) {\n  restoreTarget\n    ? restoreQueue\n      ? restoreQueue.push(target)\n      : (restoreQueue = [target])\n    : (restoreTarget = target);\n  inst = accumulateTwoPhaseListeners(inst, "onChange");\n  0 < inst.length &&\n    ((nativeEvent = new SyntheticEvent(\n      "onChange",\n      "change",\n      null,\n      nativeEvent,\n      target\n    )),\n    dispatchQueue.push({ event: nativeEvent, listeners: inst }));\n}\nvar activeElement$1 = null,\n  activeElementInst$1 = null;\nfunction runEventInBatch(dispatchQueue) {\n  processDispatchQueue(dispat
1chQueue, 0);\n}\nfunction getInstIfValueChanged(targetInst) {\n  var targetNode = getNodeFromInstance(targetInst);\n  if (updateValueIfChanged(targetNode)) return targetInst;\n}\nfunction getTargetInstForChangeEvent(domEventName, targetInst) {\n  if ("change" === domEventName) return targetInst;\n}\nvar isInputEventSupported = !1;\nif (canUseDOM) {\n  var JSCompiler_inline_result$jscomp$282;\n  if (canUseDOM) {\n    var isSupported$jscomp$inline_417 = "oninput" in document;\n    if (!isSupported$jscomp$inline_417) {\n      var element$jscomp$inline_418 = document.createElement("div");\n      element$jscomp$inline_418.setAttribute("oninput", "return;");\n      isSupported$jscomp$inline_417 =\n        "function" === typeof element$jscomp$inline_418.oninput;\n    }\n    JSCompiler_inline_result$jscomp$282 = isSupported$jscomp$inline_417;\n  } else JSCompiler_inline_result$jscomp$282 = !1;\n  isInputEventSupported =\n    JSCompiler_inline_result$jscomp$282 &&\n    (!document.documentMode || 9 < document.documentMode);\n}\nfunction stopWatchingForValueChange() {\n  activeElement$1 &&\n    (activeElement$1.detachEvent("onpropertychange", handlePropertyChange),\n    (activeElementInst$1 = activeElement$1 = null));\n}\nfunction handlePropertyChange(nativeEvent) {\n  if (\n    "value" === nativeEvent.propertyName &&\n    getInstIfValueChanged(activeElementInst$1)\n  ) {\n    var dispatchQueue = [];\n    createAndAccumulateChangeEvent(\n      dispatchQueue,\n      activeElementInst$1,\n      nativeEvent,\n      getEventTarget(nativeEvent)\n    );\n    batchedUpdates$1(runEventInBatch, dispatchQueue);\n  }\n}\nfunction handleEventsForInputEventPolyfill(domEventName, target, targetInst) {\n  "focusin" === domEventName\n    ? (stopWatchingForValueChange(),\n      (activeElement$1 = target),\n      (activeElementInst$1 = targetInst),\n      activeElement$1.attachEvent("onpropertychange", handlePropertyChange))\n    : "focusout" === domEventName && stopWatchingForValueChange();\n}\nfunction getTargetInstForInputEventPolyfill(domEventName) {\n  if (\n    "selectionchange" === domEventName ||\n    "keyup" === domEventName ||\n    "keydown" === domEventName\n  )\n    return getInstIfValueChanged(activeElementInst$1);\n}\nfunction getTargetInstForClickEvent(domEventName, targetInst) {\n  if ("click" === domEventName) return getInstIfValueChanged(targetInst);\n}\nfunction getTargetInstForInputOrChangeEvent(domEventName, targetInst) {\n  if ("input" === domEventName || "change" === domEventName)\n    return getInstIfValueChanged(targetInst);\n}\nfunction is(x, y) {\n  return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = "function" === typeof Object.is ? Object.is : is;\nfunction shallowEqual(objA, objB) {\n  if (objectIs(objA, objB)) return !0;\n  if (\n    "object" !== typeof objA ||\n    null === objA ||\n    "object" !== typeof objB ||\n    null === objB\n  )\n    return !1;\n  var keysA = Object.keys(objA),\n    keysB = Object.keys(objB);\n  if (keysA.length !== keysB.length) return !1;\n  for (keysB = 0; keysB < keysA.length; keysB++) {\n    var currentKey = keysA[keysB];\n    if (\n      !hasOwnProperty.call(objB, currentKey) ||\n      !objectIs(objA[currentKey], objB[currentKey])\n    )\n      return !1;\n  }\n  return !0;\n}\nfunction getLeafNode(node) {\n  for (; node && node.firstChild; ) node = node.firstChild;\n  return node;\n}\nfunction getNodeForCharacterOffset(root, offset) {\n  var node = getLeafNode(root);\n  root = 0;\n  for (var nodeEnd; node; ) {\n    if (3 === node.nodeType) {\n      nodeEnd = root + node.textContent.length;\n      if (root <= offset && nodeEnd >= offset)\n        return { node: node, offset: offset - root };\n      root = nodeEnd;\n    }\n    a: {\n      for (; node; ) {\n        if (node.nextSibling) {\n          node = node.nextSibling;\n          break a;\n        }\n        node = node.parentNode;\n      }\n      node = void 0;\n    }\n    node = getLeafNode(node);\n  }\n}\nfunction containsNode(outerNode, innerNode) {\n  return outerNode && innerNode\n    ? outerNode === innerNode\n      ? !0\n      : outerNode && 3 === outerNode.nodeType\n        ? !1\n        : innerNode && 3 === innerNode.nodeType\n          ? containsNode(outerNode, inner
1Node.parentNode)\n          : "contains" in outerNode\n            ? outerNode.contains(innerNode)\n            : outerNode.compareDocumentPosition\n              ? !!(outerNode.compareDocumentPosition(innerNode) & 16)\n              : !1\n    : !1;\n}\nfunction getActiveElementDeep(containerInfo) {\n  containerInfo =\n    null != containerInfo &&\n    null != containerInfo.ownerDocument &&\n    null != containerInfo.ownerDocument.defaultView\n      ? containerInfo.ownerDocument.defaultView\n      : window;\n  for (\n    var element = getActiveElement(containerInfo.document);\n    element instanceof containerInfo.HTMLIFrameElement;\n\n  ) {\n    try {\n      var JSCompiler_inline_result =\n        "string" === typeof element.contentWindow.location.href;\n    } catch (err) {\n      JSCompiler_inline_result = !1;\n    }\n    if (JSCompiler_inline_result) containerInfo = element.contentWindow;\n    else break;\n    element = getActiveElement(containerInfo.document);\n  }\n  return element;\n}\nfunction hasSelectionCapabilities(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n  return (\n    nodeName &&\n    (("input" === nodeName &&\n      ("text" === elem.type ||\n        "search" === elem.type ||\n        "tel" === elem.type ||\n        "url" === elem.type ||\n        "password" === elem.type)) ||\n      "textarea" === nodeName ||\n      "true" === elem.contentEditable)\n  );\n}\nvar skipSelectionChangeEvent =\n    canUseDOM && "documentMode" in document && 11 >= document.documentMode,\n  activeElement = null,\n  activeElementInst = null,\n  lastSelection = null,\n  mouseDown = !1;\nfunction constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {\n  var doc =\n    nativeEventTarget.window === nativeEventTarget\n      ? nativeEventTarget.document\n      : 9 === nativeEventTarget.nodeType\n        ? nativeEventTarget\n        : nativeEventTarget.ownerDocument;\n  mouseDown ||\n    null == activeElement ||\n    activeElement !== getActiveElement(doc) ||\n    ((doc = activeElement),\n    "selectionStart" in doc && hasSelectionCapabilities(doc)\n      ? (doc = { start: doc.selectionStart, end: doc.selectionEnd })\n      : ((doc = (\n          (doc.ownerDocument && doc.ownerDocument.defaultView) ||\n          window\n        ).getSelection()),\n        (doc = {\n          anchorNode: doc.anchorNode,\n          anchorOffset: doc.anchorOffset,\n          focusNode: doc.focusNode,\n          focusOffset: doc.focusOffset\n        })),\n    (lastSelection && shallowEqual(lastSelection, doc)) ||\n      ((lastSelection = doc),\n      (doc = accumulateTwoPhaseListeners(activeElementInst, "onSelect")),\n      0 < doc.length &&\n        ((nativeEvent = new SyntheticEvent(\n          "onSelect",\n          "select",\n          null,\n          nativeEvent,\n          nativeEventTarget\n        )),\n        dispatchQueue.push({ event: nativeEvent, listeners: doc }),\n        (nativeEvent.target = activeElement))));\n}\nfunction makePrefixMap(styleProp, eventName) {\n  var prefixes = {};\n  prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n  prefixes["Webkit" + styleProp] = "webkit" + eventName;\n  prefixes["Moz" + styleProp] = "moz" + eventName;\n  return prefixes;\n}\nvar vendorPrefixes = {\n    animationend: makePrefixMap("Animation", "AnimationEnd"),\n    animationiteration: makePrefixMap("Animation", "AnimationIteration"),\n    animationstart: makePrefixMap("Animation", "AnimationStart"),\n    transitionrun: makePrefixMap("Transition", "TransitionRun"),\n    transitionstart: makePrefixMap("Transition", "TransitionStart"),\n    transitioncancel: makePrefixMap("Transition", "TransitionCancel"),\n    transitionend: makePrefixMap("Transition", "TransitionEnd")\n  },\n  prefixedEventNames = {},\n  style = {};\ncanUseDOM &&\n  ((style = document.createElement("div").style),\n  "AnimationEvent" in window ||\n    (delete vendorPrefixes.animationend.animation,\n    delete vendorPrefixes.animationiteration.animation,\n    delete vendorPrefixes.animationstart.animation),\n  "TransitionEvent" in window ||\n    delete vendorPrefixes.transitionend.transition);\nfunction getVendorPrefixedEventName(eventName) {\n  if (prefixedEventNames[eventName]) return prefixedEventNames[eventName];\n  if (!vendorPrefixes[eventName]) return eventName;
1\n  var prefixMap = vendorPrefixes[eventName],\n    styleProp;\n  for (styleProp in prefixMap)\n    if (prefixMap.hasOwnProperty(styleProp) && styleProp in style)\n      return (prefixedEventNames[eventName] = prefixMap[styleProp]);\n  return eventName;\n}\nvar ANIMATION_END = getVendorPrefixedEventName("animationend"),\n  ANIMATION_ITERATION = getVendorPrefixedEventName("animationiteration"),\n  ANIMATION_START = getVendorPrefixedEventName("animationstart"),\n  TRANSITION_RUN = getVendorPrefixedEventName("transitionrun"),\n  TRANSITION_START = getVendorPrefixedEventName("transitionstart"),\n  TRANSITION_CANCEL = getVendorPrefixedEventName("transitioncancel"),\n  TRANSITION_END = getVendorPrefixedEventName("transitionend"),\n  topLevelEventsToReactNames = new Map(),\n  simpleEventPluginEvents =\n    "abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(\n      " "\n    );\nsimpleEventPluginEvents.push("scrollEnd");\nfunction registerSimpleEvent(domEventName, reactName) {\n  topLevelEventsToReactNames.set(domEventName, reactName);\n  registerTwoPhaseEvent(reactName, [domEventName]);\n}\nvar CapturedStacks = new WeakMap();\nfunction createCapturedValueAtFiber(value, source) {\n  if ("object" === typeof value && null !== value) {\n    var existing = CapturedStacks.get(value);\n    if (void 0 !== existing) return existing;\n    source = {\n      value: value,\n      source: source,\n      stack: getStackByFiberInDevAndProd(source)\n    };\n    CapturedStacks.set(value, source);\n    return source;\n  }\n  return {\n    value: value,\n    source: source,\n    stack: getStackByFiberInDevAndProd(source)\n  };\n}\nvar concurrentQueues = [],\n  concurrentQueuesIndex = 0,\n  concurrentlyUpdatedLanes = 0;\nfunction finishQueueingConcurrentUpdates() {\n  for (\n    var endIndex = concurrentQueuesIndex,\n      i = (concurrentlyUpdatedLanes = concurrentQueuesIndex = 0);\n    i < endIndex;\n\n  ) {\n    var fiber = concurrentQueues[i];\n    concurrentQueues[i++] = null;\n    var queue = concurrentQueues[i];\n    concurrentQueues[i++] = null;\n    var update = concurrentQueues[i];\n    concurrentQueues[i++] = null;\n    var lane = concurrentQueues[i];\n    concurrentQueues[i++] = null;\n    if (null !== queue && null !== update) {\n      var pending = queue.pending;\n      null === pending\n        ? (update.next = update)\n        : ((update.next = pending.next), (pending.next = update));\n      queue.pending = update;\n    }\n    0 !== lane && markUpdateLaneFromFiberToRoot(fiber, update, lane);\n  }\n}\nfunction enqueueUpdate$1(fiber, queue, update, lane) {\n  concurrentQueues[concurrentQueuesIndex++] = fiber;\n  concurrentQueues[concurrentQueuesIndex++] = queue;\n  concurrentQueues[concurrentQueuesIndex++] = update;\n  concurrentQueues[concurrentQueuesIndex++] = lane;\n  concurrentlyUpdatedLanes |= lane;\n  fiber.lanes |= lane;\n  fiber = fiber.alternate;\n  null !== fiber && (fiber.lanes |= lane);\n}\nfunction enqueueConcurrentHookUpdate(fiber, queue, update, lane) {\n  enqueueUpdate$1(fiber, queue, update, lane);\n  return getRootForUpdatedFiber(fiber);\n}\nfunction enqueueConcurrentRenderForLane(fiber, lane) {\n  enqueueUpdate$1(fiber, null, null, lane);\n  return getRootForUpdatedFiber(fiber);\n}\nfunction markUpdateLaneFromFiberToRoot(sourceFiber, update, lane) {\n  sourceFiber.lanes |= lane;\n  var alternate = sourceFiber.alternate;\n  null !== alternate && (alternate.lanes |= lane);\n  for (var isHidden = !1, parent = sourceFiber.return; null !== parent; )\n    (parent.childLanes |= lane),\n      (alternate = parent.alternate),\n      null !== alternate && (alternate.childLanes |= lane),\n      22 === parent.tag &&\n        ((sourceFiber = parent.stateNode),\n        null === sourceFiber || sourceFiber._visibility & 1 || (isHidden = !0)),\n      (sourceFiber = parent),\n      (parent = parent.return);\n  return 3 === sourceFiber.tag\n    ? ((parent = sourceFiber.stateNode),\n      isHidden &&\n        null !== update &&\n        ((isHidden = 31 - clz32(lane)),\n        (sourceFiber = parent.hiddenUpdates),\n        (alternate = sourceFiber[isHidden]),\n        null === alternate\n          ? (sourceFiber[isHidden] = [update])\n          : alternate.push(update),\n        (update.lane = lane | 536870912)),\n      parent)\n    : null;\n}\nfunction getRootForUpdatedFiber(sourceFiber) {\n  if (50 < nestedUpdateCount)\n    throw (\n      ((nestedUpdateCount = 0),\n      (rootWithNestedUpdates = null),\n      Error(formatProdErrorMessage(185)))\n    );\n  for (var parent = sourceFiber.return; null !== parent; )\n    (sourceFiber = parent), (parent = sourceFiber.return);\n  return 3 === sourceFiber.tag ? sourceFiber.stateNode : null;\n}\nvar emptyContextObject = {};\nfunction FiberNode(tag, pendingProps, key, mode) {\n  this.tag = tag;\n  this.key = key;\n  this.sibling =\n    this.child =\n    this.return =\n    this.stateNode =\n    this.type =\n    this.elementType =\n      null;\n  this.index = 0;\n  this.refCleanup = this.ref = null;\n  this.pendingProps = pendingProps;\n  this.dependencies =\n    this.memoizedState =\n    this.updateQueue =\n    this.memoizedProps =\n      null;\n  this.mode = mode;\n  this.subtreeFlags = this.flags = 0;\n  this.deletions = null;\n  this.childLanes = this.lanes = 0;\n  this.alternate = null;\n}\nfunction createFiberImplClass(tag, pendingProps, key, mode) {\n  return new FiberNode(tag, pendingProps, key, mode);\n}\nfunction shouldConstruct(Component) {\n  Component = Component.prototype;\n  return !(!Component || !Component.isReactComponent);\n}
1\nfunction createWorkInProgress(current, pendingProps) {\n  var workInProgress = current.alternate;\n  null === workInProgress\n    ? ((workInProgress = createFiberImplClass(\n        current.tag,\n        pendingProps,\n        current.key,\n        current.mode\n      )),\n      (workInProgress.elementType = current.elementType),\n      (workInProgress.type = current.type),\n      (workInProgress.stateNode = current.stateNode),\n      (workInProgress.alternate = current),\n      (current.alternate = workInProgress))\n    : ((workInProgress.pendingProps = pendingProps),\n      (workInProgress.type = current.type),\n      (workInProgress.flags = 0),\n      (workInProgress.subtreeFlags = 0),\n      (workInProgress.deletions = null));\n  workInProgress.flags = current.flags & 65011712;\n  workInProgress.childLanes = current.childLanes;\n  workInProgress.lanes = current.lanes;\n  workInProgress.child = current.child;\n  workInProgress.memoizedProps = current.memoizedProps;\n  workInProgress.memoizedState = current.memoizedState;\n  workInProgress.updateQueue = current.updateQueue;\n  pendingProps = current.dependencies;\n  workInProgress.dependencies =\n    null === pendingProps\n      ? null\n      : { lanes: pendingProps.lanes, firstContext: pendingProps.firstContext };\n  workInProgress.sibling = current.sibling;\n  workInProgress.index = current.index;\n  workInProgress.ref = current.ref;\n  workInProgress.refCleanup = current.refCleanup;\n  return workInProgress;\n}\nfunction resetWorkInProgress(workInProgress, renderLanes) {\n  workInProgress.flags &= 65011714;\n  var current = workInProgress.alternate;\n  null === current\n    ? ((workInProgress.childLanes = 0),\n      (workInProgress.lanes = renderLanes),\n      (workInProgress.child = null),\n      (workInProgress.subtreeFlags = 0),\n      (workInProgress.memoizedProps = null),\n      (workInProgress.memoizedState = null),\n      (workInProgress.updateQueue = null),\n      (workInProgress.dependencies = null),\n      (workInProgress.stateNode = null))\n    : ((workInProgress.childLanes = current.childLanes),\n      (workInProgress.lanes = current.lanes),\n      (workInProgress.child = current.child),\n      (workInProgress.subtreeFlags = 0),\n      (workInProgress.deletions = null),\n      (workInProgress.memoizedProps = current.memoizedProps),\n      (workInProgress.memoizedState = current.memoizedState),\n      (workInProgress.updateQueue = current.updateQueue),\n      (workInProgress.type = current.type),\n      (renderLanes = current.dependencies),\n      (workInProgress.dependencies =\n        null === renderLanes\n          ? null\n          : {\n              lanes: renderLanes.lanes,\n              firstContext: renderLanes.firstContext\n            }));\n  return workInProgress;\n}\nfunction createFiberFromTypeAndProps(\n  type,\n  key,\n  pendingProps,\n  owner,\n  mode,\n  lanes\n) {\n  var fiberTag = 0;\n  owner = type;\n  if ("function" === typeof type) shouldConstruct(type) && (fiberTag = 1);\n  else if ("string" === typeof type)\n    fiberTag = isHostHoistableType(\n      type,\n      pendingProps,\n      contextStackCursor.current\n    )\n      ? 26\n      : "html" === type || "head" === type || "body" === type\n        ? 27\n        : 5;\n  else\n    a: switch (type) {\n      case REACT_ACTIVITY_TYPE:\n        return (\n          (type = createFiberImplClass(31, pendingProps, key, mode)),\n          (type.elementType = REACT_ACTIVITY_TYPE),\n          (type.lanes = lanes),\n          type\n        );\n      case REACT_FRAGMENT_TYPE:\n        return createFiberFromFragment(pendingProps.children, mode, lanes, key);\n      case REACT_STRICT_MODE_TYPE:\n        fiberTag = 8;\n        mode |= 24;\n        break;\n      case REACT_PROFILER_TYPE:\n        return (\n          (type = createFiberImplClass(12, pendingProps, key, mode | 2)),\n          (type.elementType = REACT_PROFILER_TYPE),\n          (type.lanes = lanes),\n          type\n        );\n      case REACT_SUSPENSE_TYPE:\n        return (\n          (type = createFiberImplClass(13, pendingProps, key, mode)),\n          (type.elementType = REACT_SUSPENSE_TYPE),\n          (type.lanes = lanes),\n          type\n        );\n      case REACT_SUSPENSE_LIST_TYPE:\n        return (\n          (type = createFiberImplClass(19, pendingProps, key, mode)),\n          (type.elementType = REACT_SUSPENSE_LIST_TYPE),\
1n          (type.lanes = lanes),\n          type\n        );\n      default:\n        if ("object" === typeof type && null !== type)\n          switch (type.$$typeof) {\n            case REACT_PROVIDER_TYPE:\n            case REACT_CONTEXT_TYPE:\n              fiberTag = 10;\n              break a;\n            case REACT_CONSUMER_TYPE:\n              fiberTag = 9;\n              break a;\n            case REACT_FORWARD_REF_TYPE:\n              fiberTag = 11;\n              break a;\n            case REACT_MEMO_TYPE:\n              fiberTag = 14;\n              break a;\n            case REACT_LAZY_TYPE:\n              fiberTag = 16;\n              owner = null;\n              break a;\n          }\n        fiberTag = 29;\n        pendingProps = Error(\n          formatProdErrorMessage(130, null === type ? "null" : typeof type, "")\n        );\n        owner = null;\n    }\n  key = createFiberImplClass(fiberTag, pendingProps, key, mode);\n  key.elementType = type;\n  key.type = owner;\n  key.lanes = lanes;\n  return key;\n}\nfunction createFiberFromFragment(elements, mode, lanes, key) {\n  elements = createFiberImplClass(7, elements, key, mode);\n  elements.lanes = lanes;\n  return elements;\n}\nfunction createFiberFromText(content, mode, lanes) {\n  content = createFiberImplClass(6, content, null, mode);\n  content.lanes = lanes;\n  return content;\n}\nfunction createFiberFromPortal(portal, mode, lanes) {\n  mode = createFiberImplClass(\n    4,\n    null !== portal.children ? portal.children : [],\n    portal.key,\n    mode\n  );\n  mode.lanes = lanes;\n  mode.stateNode = {\n    containerInfo: portal.containerInfo,\n    pendingChildren: null,\n    implementation: portal.implementation\n  };\n  return mode;\n}\nvar forkStack = [],\n  forkStackIndex = 0,\n  treeForkProvider = null,\n  treeForkCount = 0,\n  idStack = [],\n  idStackIndex = 0,\n  treeContextProvider = null,\n  treeContextId = 1,\n  treeContextOverflow = "";\nfunction pushTreeFork(workInProgress, totalChildren) {\n  forkStack[forkStackIndex++] = treeForkCount;\n  forkStack[forkStackIndex++] = treeForkProvider;\n  treeForkProvider = workInProgress;\n  treeForkCount = totalChildren;\n}\nfunction pushTreeId(workInProgress, totalChildren, index) {\n  idStack[idStackIndex++] = treeContextId;\n  idStack[idStackIndex++] = treeContextOverflow;\n  idStack[idStackIndex++] = treeContextProvider;\n  treeContextProvider = workInProgress;\n  var baseIdWithLeadingBit = treeContextId;\n  workInProgress = treeContextOverflow;\n  var baseLength = 32 - clz32(baseIdWithLeadingBit) - 1;\n  baseIdWithLeadingBit &= ~(1 << baseLength);\n  index += 1;\n  var length = 32 - clz32(totalChildren) + baseLength;\n  if (30 < length) {\n    var numberOfOverflowBits = baseLength - (baseLength % 5);\n    length = (\n      baseIdWithLeadingBit &\n      ((1 << numberOfOverflowBits) - 1)\n    ).toString(32);\n    baseIdWithLeadingBit >>= numberOfOverflowBits;\n    baseLength -= numberOfOverflowBits;\n    treeContextId =\n      (1 << (32 - clz32(totalChildren) + baseLength)) |\n      (index << baseLength) |\n      baseIdWithLeadingBit;\n    treeContextOverflow = length + workInProgress;\n  } else\n    (treeContextId =\n      (1 << length) | (index << baseLength) | baseIdWithLeadingBit),\n      (treeContextOverflow = workInProgress);\n}\nfunction pushMaterializedTreeId(workInProgress) {\n  null !== workInProgress.return &&\n    (pushTreeFork(workInProgress, 1), pushTreeId(workInProgress, 1, 0));\n}\nfunction popTreeContext(workInProgress) {\n  for (; workInProgress === treeForkProvider; )\n    (treeForkProvider = forkStack[--forkStackIndex]),\n      (forkStack[forkStackIndex] = null),\n      (treeForkCount = forkStack[--forkStackIndex]),\n      (forkStack[forkStackIndex] = null);\n  for (; workInProgress === treeContextProvider; )\n    (treeContextProvider = idStack[--idStackIndex]),\n      (idStack[idStackIndex] = null),\n      (treeContextOverflow = idStack[--idStackIndex]),\n      (idStack[idStackIndex] = null),\n      (treeContextId = idStack[--idStackIndex]),\n      (idStack[idStackIndex] = null);\n}\nvar hydrationParentFiber = null,\n  nextHydratableInstance = null,\n  isHydrating = !1,\n  hydrationErrors = null,\n  rootOrSingletonContext = !1,\n  HydrationMismatchException = Error(formatProdErrorMessage(519));\nfunction throwOnHydrationMismatch(fiber) {\n  var error = Error(formatProdErrorMessage(418, ""));\n  queueHydrationError(createCapturedValueAtFiber(error, fiber));\n  throw HydrationMismatchException;\n}\nfunction prepareToHydrateHostInstance(fiber) {\n  var instance = f
1iber.stateNode,\n    type = fiber.type,\n    props = fiber.memoizedProps;\n  instance[internalInstanceKey] = fiber;\n  instance[internalPropsKey] = props;\n  switch (type) {\n    case "dialog":\n      listenToNonDelegatedEvent("cancel", instance);\n      listenToNonDelegatedEvent("close", instance);\n      break;\n    case "iframe":\n    case "object":\n    case "embed":\n      listenToNonDelegatedEvent("load", instance);\n      break;\n    case "video":\n    case "audio":\n      for (type = 0; type < mediaEventTypes.length; type++)\n        listenToNonDelegatedEvent(mediaEventTypes[type], instance);\n      break;\n    case "source":\n      listenToNonDelegatedEvent("error", instance);\n      break;\n    case "img":\n    case "image":\n    case "link":\n      listenToNonDelegatedEvent("error", instance);\n      listenToNonDelegatedEvent("load", instance);\n      break;\n    case "details":\n      listenToNonDelegatedEvent("toggle", instance);\n      break;\n    case "input":\n      listenToNonDelegatedEvent("invalid", instance);\n      initInput(\n        instance,\n        props.value,\n        props.defaultValue,\n        props.checked,\n        props.defaultChecked,\n        props.type,\n        props.name,\n        !0\n      );\n      track(instance);\n      break;\n    case "select":\n      listenToNonDelegatedEvent("invalid", instance);\n      break;\n    case "textarea":\n      listenToNonDelegatedEvent("invalid", instance),\n        initTextarea(instance, props.value, props.defaultValue, props.children),\n        track(instance);\n  }\n  type = props.children;\n  ("string" !== typeof type &&\n    "number" !== typeof type &&\n    "bigint" !== typeof type) ||\n  instance.textContent === "" + type ||\n  !0 === props.suppressHydrationWarning ||\n  checkForUnmatchedText(instance.textContent, type)\n    ? (null != props.popover &&\n        (listenToNonDelegatedEvent("beforetoggle", instance),\n        listenToNonDelegatedEvent("toggle", instance)),\n      null != props.onScroll && listenToNonDelegatedEvent("scroll", instance),\n      null != props.onScrollEnd &&\n        listenToNonDelegatedEvent("scrollend", instance),\n      null != props.onClick && (instance.onclick = noop$1),\n      (instance = !0))\n    : (instance = !1);\n  instance || throwOnHydrationMismatch(fiber);\n}\nfunction popToNextHostParent(fiber) {\n  for (hydrationParentFiber = fiber.return; hydrationParentFiber; )\n    switch (hydrationParentFiber.tag) {\n      case 5:\n      case 13:\n        rootOrSingletonContext = !1;\n        return;\n      case 27:\n      case 3:\n        rootOrSingletonContext = !0;\n        return;\n      default:\n        hydrationParentFiber = hydrationParentFiber.return;\n    }\n}\nfunction popHydrationState(fiber) {\n  if (fiber !== hydrationParentFiber) return !1;\n  if (!isHydrating) return popToNextHostParent(fiber), (isHydrating = !0), !1;\n  var tag = fiber.tag,\n    JSCompiler_temp;\n  if ((JSCompiler_temp = 3 !== tag && 27 !== tag)) {\n    if ((JSCompiler_temp = 5 === tag))\n      (JSCompiler_temp = fiber.type),\n        (JSCompiler_temp =\n          !("form" !== JSCompiler_temp && "button" !== JSCompiler_temp) ||\n          shouldSetTextContent(fiber.type, fiber.memoizedProps));\n    JSCompiler_temp = !JSCompiler_temp;\n  }\n  JSCompiler_temp && nextHydratableInstance && throwOnHydrationMismatch(fiber);\n  popToNextHostParent(fiber);\n  if (13 === tag) {\n    fiber = fiber.memoizedState;\n    fiber = null !== fiber ? fiber.dehydrated : null;\n    if (!fiber) throw Error(formatProdErrorMessage(317));\n    a: {\n      fiber = fiber.nextSibling;\n      for (tag = 0; fiber; ) {\n        if (8 === fiber.nodeType)\n          if (((JSCompiler_temp = fiber.data), "/$" === JSCompiler_temp)) {\n            if (0 === tag) {\n              nextHydratableInstance = getNextHydratable(fiber.nextSibling);\n              break a;\n            }\n            tag--;\n          }
1 else\n            ("$" !== JSCompiler_temp &&\n              "$!" !== JSCompiler_temp &&\n              "$?" !== JSCompiler_temp) ||\n              tag++;\n        fiber = fiber.nextSibling;\n      }\n      nextHydratableInstance = null;\n    }\n  } else\n    27 === tag\n      ? ((tag = nextHydratableInstance),\n        isSingletonScope(fiber.type)\n          ? ((fiber = previousHydratableOnEnteringScopedSingleton),\n            (previousHydratableOnEnteringScopedSingleton = null),\n            (nextHydratableInstance = fiber))\n          : (nextHydratableInstance = tag))\n      : (nextHydratableInstance = hydrationParentFiber\n          ? getNextHydratable(fiber.stateNode.nextSibling)\n          : null);\n  return !0;\n}\nfunction resetHydrationState() {\n  nextHydratableInstance = hydrationParentFiber = null;\n  isHydrating = !1;\n}\nfunction upgradeHydrationErrorsToRecoverable() {\n  var queuedErrors = hydrationErrors;\n  null !== queuedErrors &&\n    (null === workInProgressRootRecoverableErrors\n      ? (workInProgressRootRecoverableErrors = queuedErrors)\n      : workInProgressRootRecoverableErrors.push.apply(\n          workInProgressRootRecoverableErrors,\n          queuedErrors\n        ),\n    (hydrationErrors = null));\n  return queuedErrors;\n}\nfunction queueHydrationError(error) {\n  null === hydrationErrors\n    ? (hydrationErrors = [error])\n    : hydrationErrors.push(error);\n}\nvar valueCursor = createCursor(null),\n  currentlyRenderingFiber$1 = null,\n  lastContextDependency = null;\nfunction pushProvider(providerFiber, context, nextValue) {\n  push(valueCursor, context._currentValue);\n  context._currentValue = nextValue;\n}\nfunction popProvider(context) {\n  context._currentValue = valueCursor.current;\n  pop(valueCursor);\n}\nfunction scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) {\n  for (; null !== parent; ) {\n    var alternate = parent.alternate;\n    (parent.childLanes & renderLanes) !== renderLanes\n      ? ((parent.childLanes |= renderLanes),\n        null !== alternate && (alternate.childLanes |= renderLanes))\n      : null !== alternate &&\n        (alternate.childLanes & renderLanes) !== renderLanes &&\n        (alternate.childLanes |= renderLanes);\n    if (parent === propagationRoot) break;\n    parent = parent.return;\n  }\n}\nfunction propagateContextChanges(\n  workInProgress,\n  contexts,\n  renderLanes,\n  forcePropagateEntireTree\n) {\n  var fiber = workInProgress.child;\n  null !== fiber && (fiber.return = workInProgress);\n  for (; null !== fiber; ) {\n    var list = fiber.dependencies;\n    if (null !== list) {\n      var nextFiber = fiber.child;\n      list = list.firstContext;\n      a: for (; null !== list; ) {\n        var dependency = list;\n        list = fiber;\n        for (var i = 0; i < contexts.length; i++)\n          if (dependency.context === contexts[i]) {\n            list.lanes |= renderLanes;\n            dependency = list.alternate;\n            null !== dependency && (dependency.lanes |= renderLanes);\n            scheduleContextWorkOnParentPath(\n              list.return,\n              renderLanes,\n              workInProgress\n            );\n            forcePropagateEntireTree || (nextFiber = null);\n            break a;\n          }\n        list = dependency.next;\n      }\n    } else if (18 === fiber.tag) {\n      nextFiber = fiber.return;\n      if (null === nextFiber) throw Error(formatProdErrorMessage(341));\n      nextFiber.lanes |= renderLanes;\n      list = nextFiber.alternate;\n      null !== list && (list.lanes |= renderLanes);\n      scheduleContextWorkOnParentPath(nextFiber, renderLanes, workInProgress);\n      nextFiber = null;\n    } else nextFiber = fiber.child;\n    if (null !== nextFiber) nextFiber.return = fiber;\n    else\n      for (nextFiber = fiber; null !== nextFiber; ) {\n        if (nextFiber === workInProgress) {\n          nextFiber = null;\n          break;\n        }\n        fiber = nextFiber.sibling;\n        if (null !== fiber) {\n          fiber.return = nextFiber.return;\n          nextFiber = fiber;\n          break;\n        }\n        nextFiber = nextFiber.return;\n      }\n    fiber = nextFiber;\n  }\n}\nfunction propagateParentContextChanges(\n  current,\n  workInProgress,\n  renderLanes,\n  forcePropagateEntireTree\n) {\n  current = null;\n  for (\n    var parent = workInProgress, isInsidePropagationBailout = !1;\n    null !== parent;\n\n  ) {\n    if (!isInsidePropagationBailout)\n      if (0 !== (parent.flags & 524288)) isInsidePropagationBailout = !0;\n      else if (0 !== (parent.flags & 262144)) break;\n    if (10 === parent.tag) {\n      var currentParent = parent.alternate;\n      if (null === currentParent) throw Error(formatProdErrorMessage(387));\n      currentParent = currentParent.memoizedProps;\n      if (null !== currentParent) {\n        var context = parent.type;\n        objectIs(parent.pendingProps.value, currentParent.value) ||\n          (null !== current ? current.push(context) : (current = [context]));\n      }\n    } else if (parent === hostTransitionProviderCursor.current) {\n      currentParent = parent.alternate;\n      if (null === currentParent) throw Error(formatProdErrorMessage(387));\n      currentParent.memoizedState.memoizedState !==\n        parent.memoizedState.memoizedState &&\n        (null !== current\n          ? current.push(HostTransitionContext)\n          : (current = [HostTransitionContext]));\n    }\n    parent = parent.return;\n  }\n  null !== current &&\n    propagateContextChanges(\n      workInProgress,\n      current,\n      renderLanes,\n      forcePropagateEntireTree\n    );\n  workInProgress.flags |= 262144;\n}\nfunction checkIfContextChanged(currentDependencies) {\n  for (\n    currentDependencies = currentDependencies.firstContext;\n    null !== currentDependencies;\n\n  ) {\n    if (\n      !objectIs(\n        currentDependencies.context._currentValue,\n        currentDependencies.memoizedValue\n      )\n    )\n      return !0;\n    currentDependencies = currentDependencies.next;\n  }\n  return !1;\n}\nfunction prepareToReadContext(workInProgress) {\n  currentlyRenderingFiber$1 = workInProgress;\n  lastContextDependency = null;\n  workInProgress = workInProgress.dependencies;\n  null !== workInProgress && (workInProgress.firstContext = null);\n}\nfunction readContext(context) {\n  return readContextForConsumer(currentlyRenderingFiber$1, context);\n}\nfunction readContextDuringReconciliation(consumer, context) {\n  null === currentlyRenderingFiber$1 && prepareToReadContext(consumer);\n  return readContextForConsumer(consumer, context);\n}\nfunction readContextForConsumer(consumer, context) {\n  var value = context._currentValue;\n  context = { context: context, memoizedValue: value, next: null };\n  if (null === lastContextDependency) {\n    if (null === consumer) throw Error(formatProdErrorMessage(308));\n    lastContextDependency = context;\n    consumer.dependencies = { lanes: 0, firstContext: context };\n    consumer.flags |= 524288;\n  } else lastContextDependency = lastContextDependency.next = context;\n  return value;\n}\nvar AbortControllerLocal =\n    "undefined" !== typeof AbortController\n      ? AbortController\n      : function () {\n          var listeners = [],\n            signal = (this.signal = {\n              aborted: !1,\n              addEventListener: function (type, listener) {\n                listeners.push(listener);\n              }\n            });\n          this.abort = function () {\n            signal.aborted = !0;
1\n            listeners.forEach(function (listener) {\n              return listener();\n            });\n          };\n        },\n  scheduleCallback$2 = Scheduler.unstable_scheduleCallback,\n  NormalPriority = Scheduler.unstable_NormalPriority,\n  CacheContext = {\n    $$typeof: REACT_CONTEXT_TYPE,\n    Consumer: null,\n    Provider: null,\n    _currentValue: null,\n    _currentValue2: null,\n    _threadCount: 0\n  };\nfunction createCache() {\n  return {\n    controller: new AbortControllerLocal(),\n    data: new Map(),\n    refCount: 0\n  };\n}\nfunction releaseCache(cache) {\n  cache.refCount--;\n  0 === cache.refCount &&\n    scheduleCallback$2(NormalPriority, function () {\n      cache.controller.abort();\n    });\n}\nvar currentEntangledListeners = null,\n  currentEntangledPendingCount = 0,\n  currentEntangledLane = 0,\n  currentEntangledActionThenable = null;\nfunction entangleAsyncAction(transition, thenable) {\n  if (null === currentEntangledListeners) {\n    var entangledListeners = (currentEntangledListeners = []);\n    currentEntangledPendingCount = 0;\n    currentEntangledLane = requestTransitionLane();\n    currentEntangledActionThenable = {\n      status: "pending",\n      value: void 0,\n      then: function (resolve) {\n        entangledListeners.push(resolve);\n      }\n    };\n  }\n  currentEntangledPendingCount++;\n  thenable.then(pingEngtangledActionScope, pingEngtangledActionScope);\n  return thenable;\n}\nfunction pingEngtangledActionScope() {\n  if (\n    0 === --currentEntangledPendingCount &&\n    null !== currentEntangledListeners\n  ) {\n    null !== currentEntangledActionThenable &&\n      (currentEntangledActionThenable.status = "fulfilled");\n    var listeners = currentEntangledListeners;\n    currentEntangledListeners = null;\n    currentEntangledLane = 0;\n    currentEntangledActionThenable = null;\n    for (var i = 0; i < listeners.length; i++) (0, listeners[i])();\n  }\n}\nfunction chainThenableValue(thenable, result) {\n  var listeners = [],\n    thenableWithOverride = {\n      status: "pending",\n      value: null,\n      reason: null,\n      then: function (resolve) {\n        listeners.push(resolve);\n      }\n    };\n  thenable.then(\n    function () {\n      thenableWithOverride.status = "fulfilled";\n      thenableWithOverride.value = result;\n      for (var i = 0; i < listeners.length; i++) (0, listeners[i])(result);\n    },\n    function (error) {\n      thenableWithOverride.status = "rejected";\n      thenableWithOverride.reason = error;\n      for (error = 0; error < listeners.length; error++)\n        (0, listeners[error])(void 0);\n    }\n  );\n  return thenableWithOverride;\n}\nvar prevOnStartTransitionFinish = ReactSharedInternals.S;\nReactSharedInternals.S = function (transition, returnValue) {\n  "object" === typeof returnValue &&\n    null !== returnValue &&\n    "function" === typeof returnValue.then &&\n    entangleAsyncAction(transition, returnValue);\n  null !== prevOnStartTransitionFinish &&\n    prevOnStartTransitionFinish(transition, returnValue);\n};\nvar resumedCache = createCursor(null);\nfunction peekCacheFromPool() {\n  var cacheResumedFromPreviousRender = resumedCache.current;\n  return null !== cacheResumedFromPreviousRender\n    ? cacheResumedFromPreviousRender\n    : workInProgressRoot.pooledCache;\n}\nfunction pushTransition(offscreenWorkInProgress, prevCachePool) {\n  null === prevCachePool\n    ? push(resumedCache, resumedCache.current)\n    : push(resumedCache, prevCachePool.pool);\n}\nfunction getSuspendedCache() {\n  var cacheFromPool = peekCacheFromPool();\n  return null === cacheFromPool\n    ? null\n    : { parent: CacheContext._currentValue, pool: cacheFromPool };\n}\nvar SuspenseException = Error(formatProdErrorMessage(460)),\n  SuspenseyCommitException = Error(formatProdErrorMessage(474)),\n  SuspenseActionException = Error(formatProdErrorMessage(542)),\n  noopSuspenseyCommitThenable = { then: function () {} };\nfunction isThenableResolved(thenable) {\n  thenable = thenable.status;\n  return "fulfilled" === thenable || "rejected" === thenable;\n}\nfunction noop$3() {}\nfunction trackUsedThenable(thenableState, thenable, index) {\n  index = thenableState[index];
1\n  void 0 === index\n    ? thenableState.push(thenable)\n    : index !== thenable && (thenable.then(noop$3, noop$3), (thenable = index));\n  switch (thenable.status) {\n    case "fulfilled":\n      return thenable.value;\n    case "rejected":\n      throw (\n        ((thenableState = thenable.reason),\n        checkIfUseWrappedInAsyncCatch(thenableState),\n        thenableState)\n      );\n    default:\n      if ("string" === typeof thenable.status) thenable.then(noop$3, noop$3);\n      else {\n        thenableState = workInProgressRoot;\n        if (null !== thenableState && 100 < thenableState.shellSuspendCounter)\n          throw Error(formatProdErrorMessage(482));\n        thenableState = thenable;\n        thenableState.status = "pending";\n        thenableState.then(\n          function (fulfilledValue) {\n            if ("pending" === thenable.status) {\n              var fulfilledThenable = thenable;\n              fulfilledThenable.status = "fulfilled";\n              fulfilledThenable.value = fulfilledValue;\n            }\n          },\n          function (error) {\n            if ("pending" === thenable.status) {\n              var rejectedThenable = thenable;\n              rejectedThenable.status = "rejected";\n              rejectedThenable.reason = error;\n            }\n          }\n        );\n      }\n      switch (thenable.status) {\n        case "fulfilled":\n          return thenable.value;\n        case "rejected":\n          throw (\n            ((thenableState = thenable.reason),\n            checkIfUseWrappedInAsyncCatch(thenableState),\n            thenableState)\n          );\n      }\n      suspendedThenable = thenable;\n      throw SuspenseException;\n  }\n}\nvar suspendedThenable = null;\nfunction getSuspendedThenable() {\n  if (null === suspendedThenable) throw Error(formatProdErrorMessage(459));\n  var thenable = suspendedThenable;\n  suspendedThenable = null;\n  return thenable;\n}\nfunction checkIfUseWrappedInAsyncCatch(rejectedReason) {\n  if (\n    rejectedReason === SuspenseException ||\n    rejectedReason === SuspenseActionException\n  )\n    throw Error(formatProdErrorMessage(483));\n}\nvar hasForceUpdate = !1;\nfunction initializeUpdateQueue(fiber) {\n  fiber.updateQueue = {\n    baseState: fiber.memoizedState,\n    firstBaseUpdate: null,\n    lastBaseUpdate: null,\n    shared: { pending: null, lanes: 0, hiddenCallbacks: null },\n    callbacks: null\n  };\n}\nfunction cloneUpdateQueue(current, workInProgress) {\n  current = current.updateQueue;\n  workInProgress.updateQueue === current &&\n    (workInProgress.updateQueue = {\n      baseState: current.baseState,\n      firstBaseUpdate: current.firstBaseUpdate,\n      lastBaseUpdate: current.lastBaseUpdate,\n      shared: current.shared,\n      callbacks: null\n    });\n}\nfunction createUpdate(lane) {\n  return { lane: lane, tag: 0, payload: null, callback: null, next: null };\n}\nfunction enqueueUpdate(fiber, update, lane) {\n  var updateQueue = fiber.updateQueue;\n  if (null === updateQueue) return null;\n  updateQueue = updateQueue.shared;\n  if (0 !== (executionContext & 2)) {\n    var pending = updateQueue.pending;\n    null === pending\n      ? (update.next = update)\n      : ((update.next = pending.next), (pending.next = update));\n    updateQueue.pending = update;\n    update = getRootForUpdatedFiber(fiber);\n    markUpdateLaneFromFiberToRoot(fiber, null, lane);\n    return update;\n  }\n  enqueueUpdate$1(fiber, updateQueue, update, lane);\n  return getRootForUpdatedFiber(fiber);\n}\nfunction entangleTransitions(root, fiber, lane) {\n  fiber = fiber.updateQueue;\n  if (null !== fiber && ((fiber = fiber.shared), 0 !== (lane & 4194048))) {\n    var queueLanes = fiber.lanes;\n    queueLanes &= root.pendingLanes;\n    lane |= queueLanes;\n    fiber.lanes = lane;\n    markRootEntangled(root, lane);\n  }\n}\nfunction enqueueCapturedUpdate(workInProgress, capturedUpdate) {\n  var queue = workInProgress.updateQueue,\n    current = workInProgress.alternate;\n  if (\n    null !== current &&\n    ((current = current.updateQueue), queue === current)\n  ) {\n    var newFirst = null,\n      newLast = null;\n    queue = queue.firstBaseUpdate;\n    if (null !== queue) {\n      do {\n        var clone = {\n          lane: queue.lane,\n          tag: queue.tag,\n          payload: queue.payload,\n          callback: null,\n          next: null\n        };\n        null === newLast\n          ? (newFirst = newLast = clone)\n          : (newLast = newLast.next = clone);\n        queue = queue.next;\n      } while (null !== queue);\n      null === newLast\n        ? (newFirst = newLast = capturedUpdate)\n        : (newLast = newLast.next = capturedUpdate);\n    } else newFirst = newLast = capturedUpdate;\n    queue = {\n      baseState: current.baseState,\n      firstBaseUpdate: newFirst,\n      lastBaseUpdate: newLast,\n      shared: current.shared,\n      callbacks: current.callbacks\n    };\n    workInProgress.updateQueue = queue;\n    return;\n  }\n  workInProgress = queue.lastBaseUpdate;\n  null === workInProgress\n    ? (queue.firstBaseUpdate = capturedUpdate)\n    : (workInProgress.next = capturedUpdate);\n  queue.lastBaseUpdate = capturedUpdate;\n}\nvar didReadFromEntangledAsyncAction = !1;
1\nfunction suspendIfUpdateReadFromEntangledAsyncAction() {\n  if (didReadFromEntangledAsyncAction) {\n    var entangledActionThenable = currentEntangledActionThenable;\n    if (null !== entangledActionThenable) throw entangledActionThenable;\n  }\n}\nfunction processUpdateQueue(\n  workInProgress$jscomp$0,\n  props,\n  instance$jscomp$0,\n  renderLanes\n) {\n  didReadFromEntangledAsyncAction = !1;\n  var queue = workInProgress$jscomp$0.updateQueue;\n  hasForceUpdate = !1;\n  var firstBaseUpdate = queue.firstBaseUpdate,\n    lastBaseUpdate = queue.lastBaseUpdate,\n    pendingQueue = queue.shared.pending;\n  if (null !== pendingQueue) {\n    queue.shared.pending = null;\n    var lastPendingUpdate = pendingQueue,\n      firstPendingUpdate = lastPendingUpdate.next;\n    lastPendingUpdate.next = null;\n    null === lastBaseUpdate\n      ? (firstBaseUpdate = firstPendingUpdate)\n      : (lastBaseUpdate.next = firstPendingUpdate);\n    lastBaseUpdate = lastPendingUpdate;\n    var current = workInProgress$jscomp$0.alternate;\n    null !== current &&\n      ((current = current.updateQueue),\n      (pendingQueue = current.lastBaseUpdate),\n      pendingQueue !== lastBaseUpdate &&\n        (null === pendingQueue\n          ? (current.firstBaseUpdate = firstPendingUpdate)\n          : (pendingQueue.next = firstPendingUpdate),\n        (current.lastBaseUpdate = lastPendingUpdate)));\n  }\n  if (null !== firstBaseUpdate) {\n    var newState = queue.baseState;\n    lastBaseUpdate = 0;\n    current = firstPendingUpdate = lastPendingUpdate = null;\n    pendingQueue = firstBaseUpdate;\n    do {\n      var updateLane = pendingQueue.lane & -536870913,\n        isHiddenUpdate = updateLane !== pendingQueue.lane;\n      if (\n        isHiddenUpdate\n          ? (workInProgressRootRenderLanes & updateLane) === updateLane\n          : (renderLanes & updateLane) === updateLane\n      ) {\n        0 !== updateLane &&\n          updateLane === currentEntangledLane &&\n          (didReadFromEntangledAsyncAction = !0);\n        null !== current &&\n          (current = current.next =\n            {\n              lane: 0,\n              tag: pendingQueue.tag,\n              payload: pendingQueue.payload,\n              callback: null,\n              next: null\n            });\n        a: {\n          var workInProgress = workInProgress$jscomp$0,\n            update = pendingQueue;\n          updateLane = props;\n          var instance = instance$jscomp$0;\n          switch (update.tag) {\n            case 1:\n              workInProgress = update.payload;\n              if ("function" === typeof workInProgress) {\n                newState = workInProgress.call(instance, newState, updateLane);\n                break a;\n              }\n              newState = workInProgress;\n              break a;\n            case 3:\n              workInProgress.flags = (workInProgress.flags & -65537) | 128;\n            case 0:\n              workInProgress = update.payload;\n              updateLane =\n                "function" === typeof workInProgress\n                  ? workInProgress.call(instance, newState, updateLane)\n                  : workInProgress;\n              if (null === updateLane || void 0 === updateLane) break a;\n              newState = assign({}, newState, updateLane);\n              break a;\n            case 2:\n              hasForceUpdate = !0;\n          }\n        }\n        updateLane = pendingQueue.callback;\n        null !== updateLane &&\n          ((workInProgress$jscomp$0.flags |= 64),\n          isHiddenUpdate && (workInProgress$jscomp$0.flags |= 8192),\n          (isHiddenUpdate = queue.callbacks),\n          null === isHiddenUpdate\n            ? (queue.callbacks = [updateLane])\n            : isHiddenUpdate.push(updateLane));\n      } else\n        (isHiddenUpdate = {\n          lane: updateLane,\n          tag: pendingQueue.tag,\n          payload: pendingQueue.payload,\n          callback: pendingQueue.callback,\n          next: null\n        }),\n          null === current\n            ? ((firstPendingUpdate = current = isHiddenUpdate),\n              (lastPendingUpdate = newState))\n            : (current = current.next = isHiddenUpdate),\n          (lastBaseUpdate |= updateLane);\n      pendingQueue = pendingQueue.next;
1\n      if (null === pendingQueue)\n        if (((pendingQueue = queue.shared.pending), null === pendingQueue))\n          break;\n        else\n          (isHiddenUpdate = pendingQueue),\n            (pendingQueue = isHiddenUpdate.next),\n            (isHiddenUpdate.next = null),\n            (queue.lastBaseUpdate = isHiddenUpdate),\n            (queue.shared.pending = null);\n    } while (1);\n    null === current && (lastPendingUpdate = newState);\n    queue.baseState = lastPendingUpdate;\n    queue.firstBaseUpdate = firstPendingUpdate;\n    queue.lastBaseUpdate = current;\n    null === firstBaseUpdate && (queue.shared.lanes = 0);\n    workInProgressRootSkippedLanes |= lastBaseUpdate;\n    workInProgress$jscomp$0.lanes = lastBaseUpdate;\n    workInProgress$jscomp$0.memoizedState = newState;\n  }\n}\nfunction callCallback(callback, context) {\n  if ("function" !== typeof callback)\n    throw Error(formatProdErrorMessage(191, callback));\n  callback.call(context);\n}\nfunction commitCallbacks(updateQueue, context) {\n  var callbacks = updateQueue.callbacks;\n  if (null !== callbacks)\n    for (\n      updateQueue.callbacks = null, updateQueue = 0;\n      updateQueue < callbacks.length;\n      updateQueue++\n    )\n      callCallback(callbacks[updateQueue], context);\n}\nvar currentTreeHiddenStackCursor = createCursor(null),\n  prevEntangledRenderLanesCursor = createCursor(0);\nfunction pushHiddenContext(fiber, context) {\n  fiber = entangledRenderLanes;\n  push(prevEntangledRenderLanesCursor, fiber);\n  push(currentTreeHiddenStackCursor, context);\n  entangledRenderLanes = fiber | context.baseLanes;\n}\nfunction reuseHiddenContextOnStack() {\n  push(prevEntangledRenderLanesCursor, entangledRenderLanes);\n  push(currentTreeHiddenStackCursor, currentTreeHiddenStackCursor.current);\n}\nfunction popHiddenContext() {\n  entangledRenderLanes = prevEntangledRenderLanesCursor.current;\n  pop(currentTreeHiddenStackCursor);\n  pop(prevEntangledRenderLanesCursor);\n}\nvar renderLanes = 0,\n  currentlyRenderingFiber = null,\n  currentHook = null,\n  workInProgressHook = null,\n  didScheduleRenderPhaseUpdate = !1,\n  didScheduleRenderPhaseUpdateDuringThisPass = !1,\n  shouldDoubleInvokeUserFnsInHooksDEV = !1,\n  localIdCounter = 0,\n  thenableIndexCounter$1 = 0,\n  thenableState$1 = null,\n  globalClientIdCounter = 0;\nfunction throwInvalidHookError() {\n  throw Error(formatProdErrorMessage(321));\n}\nfunction areHookInputsEqual(nextDeps, prevDeps) {\n  if (null === prevDeps) return !1;\n  for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++)\n    if (!objectIs(nextDeps[i], prevDeps[i])) return !1;\n  return !0;\n}\nfunction renderWithHooks(\n  current,\n  workInProgress,\n  Component,\n  props,\n  secondArg,\n  nextRenderLanes\n) {\n  renderLanes = nextRenderLanes;\n  currentlyRenderingFiber = workInProgress;\n  workInProgress.memoizedState = null;\n  workInProgress.updateQueue = null;\n  workInProgress.lanes = 0;\n  ReactSharedInternals.H =\n    null === current || null === current.memoizedState\n      ? HooksDispatcherOnMount\n      : HooksDispatcherOnUpdate;\n  shouldDoubleInvokeUserFnsInHooksDEV = !1;\n  nextRenderLanes = Component(props, secondArg);\n  shouldDoubleInvokeUserFnsInHooksDEV = !1;\n  didScheduleRenderPhaseUpdateDuringThisPass &&\n    (nextRenderLanes = renderWithHooksAgain(\n      workInProgress,\n      Component,\n      props,\n      secondArg\n    ));\n  finishRenderingHooks(current);\n  return nextRenderLanes;\n}\nfunction finishRenderingHooks(current) {\n  ReactSharedInternals.H = ContextOnlyDispatcher;\n  var didRenderTooFewHooks = null !== currentHook && null !== currentHook.next;\n  renderLanes = 0;\n  workInProgressHook = currentHook = currentlyRenderingFiber = null;\n  didScheduleRenderPhaseUpdate = !1;\n  thenableIndexCounter$1 = 0;\n  thenableState$1 = null;\n  if (didRenderTooFewHooks) throw Error(formatProdErrorMessage(300));\n  null === current ||\n    didReceiveUpdate ||\n    ((current = current.dependencies),\n    null !== current &&\n      checkIfContextChanged(current) &&\n      (didReceiveUpdate = !0));\n}\nfunction renderWithHooksAgain(workInProgress, Component, props, secondArg) {\n  currentlyRenderingFiber = workInProgress;\n  var numberOfReRenders = 0;
1\n  do {\n    didScheduleRenderPhaseUpdateDuringThisPass && (thenableState$1 = null);\n    thenableIndexCounter$1 = 0;\n    didScheduleRenderPhaseUpdateDuringThisPass = !1;\n    if (25 <= numberOfReRenders) throw Error(formatProdErrorMessage(301));\n    numberOfReRenders += 1;\n    workInProgressHook = currentHook = null;\n    if (null != workInProgress.updateQueue) {\n      var children = workInProgress.updateQueue;\n      children.lastEffect = null;\n      children.events = null;\n      children.stores = null;\n      null != children.memoCache && (children.memoCache.index = 0);\n    }\n    ReactSharedInternals.H = HooksDispatcherOnRerender;\n    children = Component(props, secondArg);\n  } while (didScheduleRenderPhaseUpdateDuringThisPass);\n  return children;\n}\nfunction TransitionAwareHostComponent() {\n  var dispatcher = ReactSharedInternals.H,\n    maybeThenable = dispatcher.useState()[0];\n  maybeThenable =\n    "function" === typeof maybeThenable.then\n      ? useThenable(maybeThenable)\n      : maybeThenable;\n  dispatcher = dispatcher.useState()[0];\n  (null !== currentHook ? currentHook.memoizedState : null) !== dispatcher &&\n    (currentlyRenderingFiber.flags |= 1024);\n  return maybeThenable;\n}\nfunction checkDidRenderIdHook() {\n  var didRenderIdHook = 0 !== localIdCounter;\n  localIdCounter = 0;\n  return didRenderIdHook;\n}\nfunction bailoutHooks(current, workInProgress, lanes) {\n  workInProgress.updateQueue = current.updateQueue;\n  workInProgress.flags &= -2053;\n  current.lanes &= ~lanes;\n}\nfunction resetHooksOnUnwind(workInProgress) {\n  if (didScheduleRenderPhaseUpdate) {\n    for (\n      workInProgress = workInProgress.memoizedState;\n      null !== workInProgress;\n\n    ) {\n      var queue = workInProgress.queue;\n      null !== queue && (queue.pending = null);\n      workInProgress = workInProgress.next;\n    }\n    didScheduleRenderPhaseUpdate = !1;\n  }\n  renderLanes = 0;\n  workInProgressHook = currentHook = currentlyRenderingFiber = null;\n  didScheduleRenderPhaseUpdateDuringThisPass = !1;\n  thenableIndexCounter$1 = localIdCounter = 0;\n  thenableState$1 = null;\n}\nfunction mountWorkInProgressHook() {\n  var hook = {\n    memoizedState: null,\n    baseState: null,\n    baseQueue: null,\n    queue: null,\n    next: null\n  };\n  null === workInProgressHook\n    ? (currentlyRenderingFiber.memoizedState = workInProgressHook = hook)\n    : (workInProgressHook = workInProgressHook.next = hook);\n  return workInProgressHook;\n}\nfunction updateWorkInProgressHook() {\n  if (null === currentHook) {\n    var nextCurrentHook = currentlyRenderingFiber.alternate;\n    nextCurrentHook =\n      null !== nextCurrentHook ? nextCurrentHook.memoizedState : null;\n  } else nextCurrentHook = currentHook.next;\n  var nextWorkInProgressHook =\n    null === workInProgressHook\n      ? currentlyRenderingFiber.memoizedState\n      : workInProgressHook.next;\n  if (null !== nextWorkInProgressHook)\n    (workInProgressHook = nextWorkInProgressHook),\n      (currentHook = nextCurrentHook);\n  else {\n    if (null === nextCurrentHook) {\n      if (null === currentlyRenderingFiber.alternate)\n        throw Error(formatProdErrorMessage(467));\n      throw Error(formatProdErrorMessage(310));\n    }\n    currentHook = nextCurrentHook;\n    nextCurrentHook = {\n      memoizedState: currentHook.memoizedState,\n      baseState: currentHook.baseState,\n      baseQueue: currentHook.baseQueue,\n      queue: currentHook.queue,\n      next: null\n    };\n    null === workInProgressHook\n      ? (currentlyRenderingFiber.memoizedState = workInProgressHook =\n          nextCurrentHook)\n      : (workInProgressHook = workInProgressHook.next = nextCurrentHook);\n  }\n  return workInProgressHook;\n}\nfunction createFunctionComponentUpdateQueue() {\n  return { lastEffect: null, events: null, stores: null, memoCache: null };\n}\nfunction useThenable(thenable) {\n  var index = thenableIndexCounter$1;\n  thenableIndexCounter$1 += 1;\n  null === thenableState$1 && (thenableState$1 = []);\n  thenable = trackUsedThenable(thenableState$1, thenable, index);\n  index = currentlyRenderingFiber;\n  null ===\n    (null === workInProgressHook\n      ? index.memoizedState\n      : workInProgressHook.next) &&\n    ((index = index.alternate),\n    (ReactSharedInternals.H =\n      null === index || null === index.memoizedState\n        ? HooksDispatcherOnMount\n        : HooksDispatcherOnUpdate));\n  return thenable;\n}\nfunction use(usable) {\n  if (null !== usable && "object" === typeof usable) {\n    if ("function" === typeof usable.then) return useThenable(usable);\n    if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable);\n  }\n  throw Error(formatProdErrorMessage(438, String(usable)));\n}\nfunction useMemoCache(size) {\n  var memoCache = null,\n    updateQueue = currentlyRenderingFiber.updateQueue;\n  null !== updateQueue && (memoCache = updateQueue.memoCache);\n  if (null == memoCache) {\n    var current = currentlyRenderingFiber.alternate;\n    null !== current &&\n      ((current = current.updateQueue),\n      null !== current &&\n        ((current = current.memoCache),\n        null != current &&\n          (memoCache = {\n            data: current.data.map(function (array) {\n              return array.slice();\n            }),\n            index: 0\n          })));\n  }\n  null == memoCache && (memoCache = { data: [], index: 0 });\n  null === updateQueue &&\n    ((updateQueue = createFunctionComponentUpdateQueue()),\n    (currentlyRenderingFiber.updateQueue = updateQueue));\n  updateQueue.memoCache = memoCache;\n  updateQueue = memoCache.data[memoCache.index];\n  if (void 0 === updateQueue)\n    for (\n      updateQueue = memoCache.data[memoCache.index] = Array(size), current = 0;\n      current < size;\n      current++\n    )\n      updateQueue[current] = REACT_MEMO_CACHE_SENTINEL;\n  memoCache.index++;\n  return updateQueue;\n}\nfunction basicStateReducer(state, action) {\n  return "function" === typeof action ? action(state) : action;\n}\nfunction updateReducer(reducer) {\n  var hook = updateWorkInProgressHook();\n  return updateReducerImpl(hook, currentHook, reducer);\n}\nfunction updateReducerImpl(hook, current, reducer) {\n  var queue = hook.queue;\n  if (null === queue) throw Error(formatProdErrorMessage(311));\n  queue.lastRenderedReducer = reducer;\n  var baseQueue = hook.baseQueue,\n    pendingQueue = queue.pending;\n  if (null !== pendingQueue) {\n    if (null !== baseQueue) {\n      var baseFirst = baseQueue.next;\n      baseQueue.next = pendingQueue.next;\n      pendingQueue.next = baseFirst;\n    }\n    current.baseQueue = baseQueue = pendingQueue;\n    queue.pending = null;\n  }\n  pendingQueue = hook.baseState;\n  if (null === baseQueue) hook.memoizedState = pendingQueue;\n  else {\n    current = baseQueue.next;\n    var newBaseQueueFirst = (baseFirst = null),\n      newBaseQueueLast = null,\n      update = current,\n      didReadFromEntangledAsyncAction$32 = !1;\n    do {\n      var updateLane = update.lane & -536870913;\n      if (\n        updateLane !== update.lane\n          ? (workInProgressRootRenderLanes & updateLane) === updateLane\n          : (renderLanes & updateLane) === updateLane\n      ) {\n        var revertLane = update.revertLane;\n        if (0 === revertLane)\n          null !== newBaseQueueLast &&\
1n            (newBaseQueueLast = newBaseQueueLast.next =\n              {\n                lane: 0,\n                revertLane: 0,\n                action: update.action,\n                hasEagerState: update.hasEagerState,\n                eagerState: update.eagerState,\n                next: null\n              }),\n            updateLane === currentEntangledLane &&\n              (didReadFromEntangledAsyncAction$32 = !0);\n        else if ((renderLanes & revertLane) === revertLane) {\n          update = update.next;\n          revertLane === currentEntangledLane &&\n            (didReadFromEntangledAsyncAction$32 = !0);\n          continue;\n        } else\n          (updateLane = {\n            lane: 0,\n            revertLane: update.revertLane,\n            action: update.action,\n            hasEagerState: update.hasEagerState,\n            eagerState: update.eagerState,\n            next: null\n          }),\n            null === newBaseQueueLast\n              ? ((newBaseQueueFirst = newBaseQueueLast = updateLane),\n                (baseFirst = pendingQueue))\n              : (newBaseQueueLast = newBaseQueueLast.next = updateLane),\n            (currentlyRenderingFiber.lanes |= revertLane),\n            (workInProgressRootSkippedLanes |= revertLane);\n        updateLane = update.action;\n        shouldDoubleInvokeUserFnsInHooksDEV &&\n          reducer(pendingQueue, updateLane);\n        pendingQueue = update.hasEagerState\n          ? update.eagerState\n          : reducer(pendingQueue, updateLane);\n      } else\n        (revertLane = {\n          lane: updateLane,\n          revertLane: update.revertLane,\n          action: update.action,\n          hasEagerState: update.hasEagerState,\n          eagerState: update.eagerState,\n          next: null\n        }),\n          null === newBaseQueueLast\n            ? ((newBaseQueueFirst = newBaseQueueLast = revertLane),\n              (baseFirst = pendingQueue))\n            : (newBaseQueueLast = newBaseQueueLast.next = revertLane),\n          (currentlyRenderingFiber.lanes |= updateLane),\n          (workInProgressRootSkippedLanes |= updateLane);\n      update = update.next;\n    } while (null !== update && update !== current);\n    null === newBaseQueueLast\n      ? (baseFirst = pendingQueue)\n      : (newBaseQueueLast.next = newBaseQueueFirst);\n    if (\n      !objectIs(pendingQueue, hook.memoizedState) &&\n      ((didReceiveUpdate = !0),\n      didReadFromEntangledAsyncAction$32 &&\n        ((reducer = currentEntangledActionThenable), null !== reducer))\n    )\n      throw reducer;\n    hook.memoizedState = pendingQueue;\n    hook.baseState = baseFirst;\n    hook.baseQueue = newBaseQueueLast;\n    queue.lastRenderedState = pendingQueue;\n  }\n  null === baseQueue && (queue.lanes = 0);\n  return [hook.memoizedState, queue.dispatch];\n}\nfunction rerenderReducer(reducer) {\n  var hook = updateWorkInProgressHook(),\n    queue = hook.queue;\n  if (null === queue) throw Error(formatProdErrorMessage(311));\n  queue.lastRenderedReducer = reducer;\n  var dispatch = queue.dispatch,\n    lastRenderPhaseUpdate = queue.pending,\n    newState = hook.memoizedState;\n  if (null !== lastRenderPhaseUpdate) {\n    queue.pending = null;\n    var update = (lastRenderPhaseUpdate = lastRenderPhaseUpdate.next);\n    do (newState = reducer(newState, update.action)), (update = update.next);\n    while (update !== lastRenderPhaseUpdate);\n    objectIs(newState, hook.memoizedState) || (didReceiveUpdate = !0);\n    hook.memoizedState = newState;\n    null === hook.baseQueue && (hook.baseState = newState);\n    queue.lastRenderedState = newState;\n  }\n  return [newState, dispatch];\n}\nfunction updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {\n  var fiber = currentlyRenderingFiber,\n    hook = updateWorkInProgressHook(),\n    isHydrating$jscomp$0 = isHydrating;\n  if (isHydrating$jscomp$0) {\n    if (void 0 === getServerSnapshot) throw Error(formatProdErrorMessage(407));\n    getServerSnapshot = getServerSnapshot();\n  } else getServerSnapshot = getSnapshot();\n  var snapshotChanged = !objectIs(\n    (currentHook || hook).memoizedState,\n    getServerSnapshot\n  );\n  snapshotChanged &&\n    ((hook.memoizedState = getServerSnapshot), (didReceiveUpdate = !0));\n  hook = hook.queue;\n  var create = subscribeToStore.bind(null, fiber, hook, subscribe);\n  updateEffectImpl(2048, 8, create, [subscribe]);\n  if (\n    hook.getSnapshot !== getSnapshot ||\n    snapshotChanged ||\n    (null !== workInProgressHook && workInProgressHook.memoizedState.tag & 1)\n  ) {\n    fiber.flags |= 2048;
1\n    pushSimpleEffect(\n      9,\n      createEffectInstance(),\n      updateStoreInstance.bind(\n        null,\n        fiber,\n        hook,\n        getServerSnapshot,\n        getSnapshot\n      ),\n      null\n    );\n    if (null === workInProgressRoot) throw Error(formatProdErrorMessage(349));\n    isHydrating$jscomp$0 ||\n      0 !== (renderLanes & 124) ||\n      pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n  }\n  return getServerSnapshot;\n}\nfunction pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {\n  fiber.flags |= 16384;\n  fiber = { getSnapshot: getSnapshot, value: renderedSnapshot };\n  getSnapshot = currentlyRenderingFiber.updateQueue;\n  null === getSnapshot\n    ? ((getSnapshot = createFunctionComponentUpdateQueue()),\n      (currentlyRenderingFiber.updateQueue = getSnapshot),\n      (getSnapshot.stores = [fiber]))\n    : ((renderedSnapshot = getSnapshot.stores),\n      null === renderedSnapshot\n        ? (getSnapshot.stores = [fiber])\n        : renderedSnapshot.push(fiber));\n}\nfunction updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {\n  inst.value = nextSnapshot;\n  inst.getSnapshot = getSnapshot;\n  checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n}\nfunction subscribeToStore(fiber, inst, subscribe) {\n  return subscribe(function () {\n    checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n  });\n}\nfunction checkIfSnapshotChanged(inst) {\n  var latestGetSnapshot = inst.getSnapshot;\n  inst = inst.value;\n  try {\n    var nextValue = latestGetSnapshot();\n    return !objectIs(inst, nextValue);\n  } catch (error) {\n    return !0;\n  }\n}\nfunction forceStoreRerender(fiber) {\n  var root = enqueueConcurrentRenderForLane(fiber, 2);\n  null !== root && scheduleUpdateOnFiber(root, fiber, 2);\n}\nfunction mountStateImpl(initialState) {\n  var hook = mountWorkInProgressHook();\n  if ("function" === typeof initialState) {\n    var initialStateInitializer = initialState;\n    initialState = initialStateInitializer();\n    if (shouldDoubleInvokeUserFnsInHooksDEV) {\n      setIsStrictModeForDevtools(!0);\n      try {\n        initialStateInitializer();\n      } finally {\n        setIsStrictModeForDevtools(!1);\n      }\n    }\n  }\n  hook.memoizedState = hook.baseState = initialState;\n  hook.queue = {\n    pending: null,\n    lanes: 0,\n    dispatch: null,\n    lastRenderedReducer: basicStateReducer,\n    lastRenderedState: initialState\n  };\n  return hook;\n}\nfunction updateOptimisticImpl(hook, current, passthrough, reducer) {\n  hook.baseState = passthrough;\n  return updateReducerImpl(\n    hook,\n    currentHook,\n    "function" === typeof reducer ? reducer : basicStateReducer\n  );\n}\nfunction dispatchActionState(\n  fiber,\n  actionQueue,\n  setPendingState,\n  setState,\n  payload\n) {\n  if (isRenderPhaseUpdate(fiber)) throw Error(formatProdErrorMessage(485));\n  fiber = actionQueue.action;\n  if (null !== fiber) {\n    var actionNode = {\n      payload: payload,\n      action: fiber,\n      next: null,\n      isTransition: !0,\n      status: "pending",\n      value: null,\n      reason: null,\n      listeners: [],\n      then: function (listener) {\n        actionNode.listeners.push(listener);\n      }\n    };\n    null !== ReactSharedInternals.T\n      ? setPendingState(!0)\n      : (actionNode.isTransition = !1);\n    setState(actionNode);\n    setPendingState = actionQueue.pending;\n    null === setPendingState\n      ? ((actionNode.next = actionQueue.pending = actionNode),\n        runActionStateAction(actionQueue, actionNode))\n      : ((actionNode.next = setPendingState.next),\n        (actionQueue.pending = setPendingState.next = actionNode));\n  }\n}\nfunction runActionStateAction(actionQueue, node) {\n  var action = node.action,\n    payload = node.payload,\n    prevState = actionQueue.state;\n  if (node.isTransition) {\n    var prevTransition = ReactSharedInternals.T,\n      currentTransition = {};\n    ReactSharedInternals.T = currentTransition;\n    try {\n      var returnValue = action(prevState, payload),\n        onStartTransitionFinish = ReactSharedInternals.S;\n      null !== onStartTransitionFinish &&\n        onStartTransitionFinish(currentTransition, returnValue);\n      handleActionReturnValue(actionQueue, node, returnValue);\n    } catch (error) {\n      onActionError(actionQueue, node, error);\n    } finally {\n      ReactSharedInternals.T = prevTransition;\n    }\n  } else\n    try {\n      (prevTransition = action(prevState, payload)),\n        handleActionReturnValue(actionQueue, node, prevTransition);\n    } catch (error$38) {\n      onActionError(actionQueue, node, error$38);\n    }\n}\nfunction handleActionReturnValue(actionQueue, node, returnValue) {\n  null !== returnValue &&\n  "object" === typeof returnValue &&\n  "function" === typeof returnValue.then\n    ? returnValue.then(\n        function (nextState) {\n          onActionSuccess(action
1Queue, node, nextState);\n        },\n        function (error) {\n          return onActionError(actionQueue, node, error);\n        }\n      )\n    : onActionSuccess(actionQueue, node, returnValue);\n}\nfunction onActionSuccess(actionQueue, actionNode, nextState) {\n  actionNode.status = "fulfilled";\n  actionNode.value = nextState;\n  notifyActionListeners(actionNode);\n  actionQueue.state = nextState;\n  actionNode = actionQueue.pending;\n  null !== actionNode &&\n    ((nextState = actionNode.next),\n    nextState === actionNode\n      ? (actionQueue.pending = null)\n      : ((nextState = nextState.next),\n        (actionNode.next = nextState),\n        runActionStateAction(actionQueue, nextState)));\n}\nfunction onActionError(actionQueue, actionNode, error) {\n  var last = actionQueue.pending;\n  actionQueue.pending = null;\n  if (null !== last) {\n    last = last.next;\n    do\n      (actionNode.status = "rejected"),\n        (actionNode.reason = error),\n        notifyActionListeners(actionNode),\n        (actionNode = actionNode.next);\n    while (actionNode !== last);\n  }\n  actionQueue.action = null;\n}\nfunction notifyActionListeners(actionNode) {\n  actionNode = actionNode.listeners;\n  for (var i = 0; i < actionNode.length; i++) (0, actionNode[i])();\n}\nfunction actionStateReducer(oldState, newState) {\n  return newState;\n}\nfunction mountActionState(action, initialStateProp) {\n  if (isHydrating) {\n    var ssrFormState = workInProgressRoot.formState;\n    if (null !== ssrFormState) {\n      a: {\n        var JSCompiler_inline_result = currentlyRenderingFiber;\n        if (isHydrating) {\n          if (nextHydratableInstance) {\n            b: {\n              var JSCompiler_inline_result$jscomp$0 = nextHydratableInstance;\n              for (\n                var inRootOrSingleton = rootOrSingletonContext;\n                8 !== JSCompiler_inline_result$jscomp$0.nodeType;\n\n              ) {\n                if (!inRootOrSingleton) {\n                  JSCompiler_inline_result$jscomp$0 = null;\n                  break b;\n                }\n                JSCompiler_inline_result$jscomp$0 = getNextHydratable(\n                  JSCompiler_inline_result$jscomp$0.nextSibling\n                );\n                if (null === JSCompiler_inline_result$jscomp$0) {\n                  JSCompiler_inline_result$jscomp$0 = null;\n                  break b;\n                }\n              }\n              inRootOrSingleton = JSCompiler_inline_result$jscomp$0.data;\n              JSCompiler_inline_result$jscomp$0 =\n                "F!" === inRootOrSingleton || "F" === inRootOrSingleton\n                  ? JSCompiler_inline_result$jscomp$0\n                  : null;\n            }\n            if (JSCompiler_inline_result$jscomp$0) {\n              nextHydratableInstance = getNextHydratable(\n                JSCompiler_inline_result$jscomp$0.nextSibling\n              );\n              JSCompiler_inline_result =\n                "F!" === JSCompiler_inline_result$jscomp$0.data;\n              break a;\n            }\n          }\n          throwOnHydrationMismatch(JSCompiler_inline_result);\n        }\n        JSCompiler_inline_result = !1;\n      }\n      JSCompiler_inline_result && (initialStateProp = ssrFormState[0]);\n    }\n  }\n  ssrFormState = mountWorkInProgressHook();\n  ssrFormState.memoizedState = ssrFormState.baseState = initialStateProp;\n  JSCompiler_inline_result = {\n    pending: null,\n    lanes: 0,\n    dispatch: null,\n    lastRenderedReducer: actionStateReducer,\n    lastRenderedState: initialStateProp\n  };\n  ssrFormState.queue = JSCompiler_inline_result;\n  ssrFormState = dispatchSetState.bind(\n    null,\n    currentlyRenderingFiber,\n    JSCompiler_inline_result\n  );\n  JSCompiler_inline_result.dispatch = ssrFormState;\n  JSCompiler_inline_result = mountStateImpl(!1);\n  inRootOrSingleton = dispatchOptimisticSetState.bind(\n    null,\n    currentlyRenderingFiber,\n    !1,\n    JSCompiler_inline_result.queue\n  );\n  JSCompiler_inline_result = mountWorkInProgressHook();\n  JSCompiler_inline_result$jscomp$0 = {\n    state: initialStateProp,\n    dispatch: null,\n    action: action,\n    pending: null\n  };\n  JSCompiler_inline_result.queue = JSCompiler_inline_result$jscomp$0;\n  ssrFormState = dispatchActionState.bind(\n    null,\n    currentlyRenderingFiber,\n    JSCompiler_inline_result$jscomp$0,\n    inRootOrSingleton,\n    ssrFormState\n  );\n  JSCompiler_inline_result$jscomp$0.dispatch = ssrFormState;\n  JSCompiler_inline_result.memoizedState = action;\n  return [initialStateProp, ssrFormState, !1];\n}\nfunction updateActionState(action) {\n  var stateHook = updateWorkInProgressHook();\n  return updateActionStateImpl(stateHook, currentHook, action);\n}\nfunction updateActionStateImpl(stateHook, currentStateHook, action) {\n  currentStateHook = updateReducerImpl(\n    stateHook,\n    currentStateHook,\n    actionStateReducer\n  )[0];\n  stateHook = updateReducer(basicStateReducer)[0];\n  if (\n    "object" === typeof currentStateHook &&\n    null !== currentStateHook &&\n    "function" === typeof currentStateHook.then\n  )\n    try {\n      var state = useThenable(currentStateHook);\n    } catch (x) {\n      if (x === SuspenseException) throw SuspenseActionException;\n      throw x;\n    }\n  else state = currentStateHook;\n  currentStateHook = updateWorkInProgressHook();\n  var actionQueue = currentStateHook.queue,\n    dispatch = actionQueue.dispatch;\n  action !== currentStateHook.memoizedState &&\n    ((currentlyRenderingFiber.flags |= 2048),\n    pushSimpleEffect(\n      9,\n      createEffe
1ctInstance(),\n      actionStateActionEffect.bind(null, actionQueue, action),\n      null\n    ));\n  return [state, dispatch, stateHook];\n}\nfunction actionStateActionEffect(actionQueue, action) {\n  actionQueue.action = action;\n}\nfunction rerenderActionState(action) {\n  var stateHook = updateWorkInProgressHook(),\n    currentStateHook = currentHook;\n  if (null !== currentStateHook)\n    return updateActionStateImpl(stateHook, currentStateHook, action);\n  updateWorkInProgressHook();\n  stateHook = stateHook.memoizedState;\n  currentStateHook = updateWorkInProgressHook();\n  var dispatch = currentStateHook.queue.dispatch;\n  currentStateHook.memoizedState = action;\n  return [stateHook, dispatch, !1];\n}\nfunction pushSimpleEffect(tag, inst, create, createDeps) {\n  tag = { tag: tag, create: create, deps: createDeps, inst: inst, next: null };\n  inst = currentlyRenderingFiber.updateQueue;\n  null === inst &&\n    ((inst = createFunctionComponentUpdateQueue()),\n    (currentlyRenderingFiber.updateQueue = inst));\n  create = inst.lastEffect;\n  null === create\n    ? (inst.lastEffect = tag.next = tag)\n    : ((createDeps = create.next),\n      (create.next = tag),\n      (tag.next = createDeps),\n      (inst.lastEffect = tag));\n  return tag;\n}\nfunction createEffectInstance() {\n  return { destroy: void 0, resource: void 0 };\n}\nfunction updateRef() {\n  return updateWorkInProgressHook().memoizedState;\n}\nfunction mountEffectImpl(fiberFlags, hookFlags, create, createDeps) {\n  var hook = mountWorkInProgressHook();\n  createDeps = void 0 === createDeps ? null : createDeps;\n  currentlyRenderingFiber.flags |= fiberFlags;\n  hook.memoizedState = pushSimpleEffect(\n    1 | hookFlags,\n    createEffectInstance(),\n    create,\n    createDeps\n  );\n}\nfunction updateEffectImpl(fiberFlags, hookFlags, create, deps) {\n  var hook = updateWorkInProgressHook();\n  deps = void 0 === deps ? null : deps;\n  var inst = hook.memoizedState.inst;\n  null !== currentHook &&\n  null !== deps &&\n  areHookInputsEqual(deps, currentHook.memoizedState.deps)\n    ? (hook.memoizedState = pushSimpleEffect(hookFlags, inst, create, deps))\n    : ((currentlyRenderingFiber.flags |= fiberFlags),\n      (hook.memoizedState = pushSimpleEffect(\n        1 | hookFlags,\n        inst,\n        create,\n        deps\n      )));\n}\nfunction mountEffect(create, createDeps) {\n  mountEffectImpl(8390656, 8, create, createDeps);\n}\nfunction updateEffect(create, createDeps) {\n  updateEffectImpl(2048, 8, create, createDeps);\n}\nfunction updateInsertionEffect(create, deps) {\n  return updateEffectImpl(4, 2, create, deps);\n}\nfunction updateLayoutEffect(create, deps) {\n  return updateEffectImpl(4, 4, create, deps);\n}\nfunction imperativeHandleEffect(create, ref) {\n  if ("function" === typeof ref) {\n    create = create();\n    var refCleanup = ref(create);\n    return function () {\n      "function" === typeof refCleanup ? refCleanup() : ref(null);\n    };\n  }\n  if (null !== ref && void 0 !== ref)\n    return (\n      (create = create()),\n      (ref.current = create),\n      function () {\n        ref.current = null;\n      }\n    );\n}\nfunction updateImperativeHandle(ref, create, deps) {\n  deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n  updateEffectImpl(4, 4, imperativeHandleEffect.bind(null, create, ref), deps);\n}\nfunction mountDebugValue() {}\nfunction updateCallback(callback, deps) {\n  var hook = updateWorkInProgressHook();\n  deps = void 0 === deps ? null : deps;\n  var prevState = hook.memoizedState;\n  if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n    return prevState[0];\n  hook.memoizedState = [callback, deps];\n  return callback;\n}\nfunction updateMemo(nextCreate, deps) {\n  var hook = updateWorkInProgressHook();\n  deps = void 0 === deps ? null : deps;\n  var prevState = hook.memoizedState;\n  if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n    return prevState[0];\n  prevState = nextCreate();\n  if (shouldDoubleInvokeUserFnsInHooksDEV) {\n    setIsStrictModeForDevtools(!0);\n    try {\n      nextCreate();\n    } finally {\n      setIsStrictModeForDevtools(!1);\n    }\n  }\n  hook.memoizedState = [prevState, deps];\n  return prevState;\n}\nfunction mountDeferredValueImpl(hook, value, initialValue) {\n  if (void 0 === initialValue || 0 !== (renderLanes & 1073741824))\n    return (hook.memoizedState = value);\n  hook.memoizedState = initialValue;\n  hook = requestDeferredLane();\n  currentlyRenderingFiber.lanes |= hook;\n  workInProgressRootSkippedLanes |= hook;\n  return initialValue;\n}\nfunction updateDeferredValueImpl(hook, prevValue, value, initialValue) {\n  if (objectIs(value, prevValue)) return value;\n  if (null !== currentTreeHiddenStackCursor.current)\n    return (\n      (hook = mountDeferredValueImpl(hook, value, initialValue)),\n      objectIs(hook, prevValue) || (didReceiveUpdate = !0),\n      hook\n    );\n  if (0 === (renderLanes & 42))\n    return (didReceiveUpdate = !0), (hook.memoizedState = value);\n  hook = requestDeferredLane();\n  currentlyRenderingFiber.lanes |= hook;\n  workInProgressRootSkippedLanes |= hook;\n  return prevValue;\n}\nfunction startTransition(fiber, queue, pendingState, finishedState, callback) {\n  var previousPriority = ReactDOMSharedInternals.p;\n  ReactDOMSharedInternals.p =\n    0 !== previousPriority && 8 > previousPriority ? previousPriority : 8;\n  var prevTransition = ReactSharedInternals.T,\n    currentTransition = {};\n  ReactSharedInternals.T = currentTransition;\n  dispatchOptimisticSetState(fiber, !1, queue, pendingState);\n  try {\n    var returnValue = callback(),\n      onStartTransitionFinish = ReactSharedInternals.S;\n    null !== onStartTransitionFinish &&\n      onStartTransitionFinish(currentTransition, returnValue);\n    if (\n      null !== returnValue &&\n      "object" === typeof returnValue &&\n      "function" === typeof returnValue.then\n    ) {\n      var thenableForFinishedState = chainThenableValue(\n        returnValue,\n        finishedState\n      );\n      dispatchSetStateInternal(\n        fiber,\n        queue,\n        thenableForFinishedState,\n        requestUpdateLane(fiber)\n      );\n    } else\n      dispatchSetStateInternal(\n        fiber,\n        queue,\n        finishedState,\n        requestUpdateLane(fiber)\n      );\n  } catch (error) {\n    dispatchSetStateInternal(\n      fiber,\n      queue,\n      { then: function () {}, status: "rejected", reason: error },\n      requestUpdateLane()\n    );\n  } finally {\n    (ReactDOMSharedInternals.p = previousPriority),\n      (ReactSharedInternals.T = prevTransition);\n  }\n}\nfunction noop$2() {}\nfunction startHostTransition(formFiber, pendingState, action, formData) {\n  if (5 !== formFiber.tag) throw Error(formatProdErrorMessage(476));\n  var queue = ensureFormComponentIsStateful(formFiber).queue;\n  startTransition(\n    formFiber,\n    queue,\n    pendingState,\n    sharedNotPendingOb
1ject,\n    null === action\n      ? noop$2\n      : function () {\n          requestFormReset$1(formFiber);\n          return action(formData);\n        }\n  );\n}\nfunction ensureFormComponentIsStateful(formFiber) {\n  var existingStateHook = formFiber.memoizedState;\n  if (null !== existingStateHook) return existingStateHook;\n  existingStateHook = {\n    memoizedState: sharedNotPendingObject,\n    baseState: sharedNotPendingObject,\n    baseQueue: null,\n    queue: {\n      pending: null,\n      lanes: 0,\n      dispatch: null,\n      lastRenderedReducer: basicStateReducer,\n      lastRenderedState: sharedNotPendingObject\n    },\n    next: null\n  };\n  var initialResetState = {};\n  existingStateHook.next = {\n    memoizedState: initialResetState,\n    baseState: initialResetState,\n    baseQueue: null,\n    queue: {\n      pending: null,\n      lanes: 0,\n      dispatch: null,\n      lastRenderedReducer: basicStateReducer,\n      lastRenderedState: initialResetState\n    },\n    next: null\n  };\n  formFiber.memoizedState = existingStateHook;\n  formFiber = formFiber.alternate;\n  null !== formFiber && (formFiber.memoizedState = existingStateHook);\n  return existingStateHook;\n}\nfunction requestFormReset$1(formFiber) {\n  var resetStateQueue = ensureFormComponentIsStateful(formFiber).next.queue;\n  dispatchSetStateInternal(formFiber, resetStateQueue, {}, requestUpdateLane());\n}\nfunction useHostTransitionStatus() {\n  return readContext(HostTransitionContext);\n}\nfunction updateId() {\n  return updateWorkInProgressHook().memoizedState;\n}\nfunction updateRefresh() {\n  return updateWorkInProgressHook().memoizedState;\n}\nfunction refreshCache(fiber) {\n  for (var provider = fiber.return; null !== provider; ) {\n    switch (provider.tag) {\n      case 24:\n      case 3:\n        var lane = requestUpdateLane();\n        fiber = createUpdate(lane);\n        var root$41 = enqueueUpdate(provider, fiber, lane);\n        null !== root$41 &&\n          (scheduleUpdateOnFiber(root$41, provider, lane),\n          entangleTransitions(root$41, provider, lane));\n        provider = { cache: createCache() };\n        fiber.payload = provider;\n        return;\n    }\n    provider = provider.return;\n  }\n}\nfunction dispatchReducerAction(fiber, queue, action) {\n  var lane = requestUpdateLane();\n  action = {\n    lane: lane,\n    revertLane: 0,\n    action: action,\n    hasEagerState: !1,\n    eagerState: null,\n    next: null\n  };\n  isRenderPhaseUpdate(fiber)\n    ? enqueueRenderPhaseUpdate(queue, action)\n    : ((action = enqueueConcurrentHookUpdate(fiber, queue, action, lane)),\n      null !== action &&\n        (scheduleUpdateOnFiber(action, fiber, lane),\n        entangleTransitionUpdate(action, queue, lane)));\n}\nfunction dispatchSetState(fiber, queue, action) {\n  var lane = requestUpdateLane();\n  dispatchSetStateInternal(fiber, queue, action, lane);\n}\nfunction dispatchSetStateInternal(fiber, queue, action, lane) {\n  var update = {\n    lane: lane,\n    revertLane: 0,\n    action: action,\n    hasEagerState: !1,\n    eagerState: null,\n    next: null\n  };\n  if (isRenderPhaseUpdate(fiber)) enqueueRenderPhaseUpdate(queue, update);\n  else {\n    var alternate = fiber.alternate;\n    if (\n      0 === fiber.lanes &&\n      (null === alternate || 0 === alternate.lanes) &&\n      ((alternate = queue.lastRenderedReducer), null !== alternate)\n    )\n      try {\n        var currentState = queue.lastRenderedState,\n          eagerState = alternate(currentState, action);\n        update.hasEagerState = !0;\n        update.eagerState = eagerState;\n        if (objectIs(eagerState, currentState))\n          return (\n            enqueueUpdate$1(fiber, queue, update, 0),\n            null === workInProgressRoot && finishQueueingConcurrentUpdates(),\n            !1\n          );\n      } catch (error) {\n      } finally {\n      }\n    action = enqueueConcurrentHookUpdate(fiber, queue, update, lane);\n    if (null !== action)\n      return (\n        scheduleUpdateOnFiber(action, fiber, lane),\n        entangleTransitionUpdate(action, queue, lane),\n        !0\n      );\n  }\n  return !1;\n}\nfunction dispatchOptimisticSetState(fiber, throwIfDuringRender, queue, action) {\n  action = {\n    lane: 2,\n    revertLane: requestTransitionLane(),\n    action: action,\n    hasEagerState: !1,\n    eagerState: null,\n    next: null\n  };\n  if (isRenderPhaseUpdate(fiber)) {\n    if (throwIfDuringRender) throw Error(formatProdErrorMessage(479));\n  }
1 else\n    (throwIfDuringRender = enqueueConcurrentHookUpdate(\n      fiber,\n      queue,\n      action,\n      2\n    )),\n      null !== throwIfDuringRender &&\n        scheduleUpdateOnFiber(throwIfDuringRender, fiber, 2);\n}\nfunction isRenderPhaseUpdate(fiber) {\n  var alternate = fiber.alternate;\n  return (\n    fiber === currentlyRenderingFiber ||\n    (null !== alternate && alternate === currentlyRenderingFiber)\n  );\n}\nfunction enqueueRenderPhaseUpdate(queue, update) {\n  didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate =\n    !0;\n  var pending = queue.pending;\n  null === pending\n    ? (update.next = update)\n    : ((update.next = pending.next), (pending.next = update));\n  queue.pending = update;\n}\nfunction entangleTransitionUpdate(root, queue, lane) {\n  if (0 !== (lane & 4194048)) {\n    var queueLanes = queue.lanes;\n    queueLanes &= root.pendingLanes;\n    lane |= queueLanes;\n    queue.lanes = lane;\n    markRootEntangled(root, lane);\n  }\n}\nvar ContextOnlyDispatcher = {\n    readContext: readContext,\n    use: use,\n    useCallback: throwInvalidHookError,\n    useContext: throwInvalidHookError,\n    useEffect: throwInvalidHookError,\n    useImperativeHandle: throwInvalidHookError,\n    useLayoutEffect: throwInvalidHookError,\n    useInsertionEffect: throwInvalidHookError,\n    useMemo: throwInvalidHookError,\n    useReducer: throwInvalidHookError,\n    useRef: throwInvalidHookError,\n    useState: throwInvalidHookError,\n    useDebugValue: throwInvalidHookError,\n    useDeferredValue: throwInvalidHookError,\n    useTransition: throwInvalidHookError,\n    useSyncExternalStore: throwInvalidHookError,\n    useId: throwInvalidHookError,\n    useHostTransitionStatus: throwInvalidHookError,\n    useFormState: throwInvalidHookError,\n    useActionState: throwInvalidHookError,\n    useOptimistic: throwInvalidHookError,\n    useMemoCache: throwInvalidHookError,\n    useCacheRefresh: throwInvalidHookError\n  },\n  HooksDispatcherOnMount = {\n    readContext: readContext,\n    use: use,\n    useCallback: function (callback, deps) {\n      mountWorkInProgressHook().memoizedState = [\n        callback,\n        void 0 === deps ? null : deps\n      ];\n      return callback;\n    },\n    useContext: readContext,\n    useEffect: mountEffect,\n    useImperativeHandle: function (ref, create, deps) {\n      deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n      mountEffectImpl(\n        4194308,\n        4,\n        imperativeHandleEffect.bind(null, create, ref),\n        deps\n      );\n    },\n    useLayoutEffect: function (create, deps) {\n      return mountEffectImpl(4194308, 4, create, deps);\n    },\n    useInsertionEffect: function (create, deps) {\n      mountEffectImpl(4, 2, create, deps);\n    },\n    useMemo: function (nextCreate, deps) {\n      var hook = mountWorkInProgressHook();\n      deps = void 0 === deps ? null : deps;\n      var nextValue = nextCreate();\n      if (shouldDoubleInvokeUserFnsInHooksDEV) {\n        setIsStrictModeForDevtools(!0);\n        try {\n          nextCreate();\n        } finally {\n          setIsStrictModeForDevtools(!1);\n        }\n      }\n      hook.memoizedState = [nextValue, deps];\n      return nextValue;\n    },\n    useReducer: function (reducer, initialArg, init) {\n      var hook = mountWorkInProgressHook();\n      if (void 0 !== init) {\n        var initialState = init(initialArg);\n        if (shouldDoubleInvokeUserFnsInHooksDEV) {\n          setIsStrictModeForDevtools(!0);\n          try {\n            init(initialArg);\n          } finally {\n            setIsStrictModeForDevtools(!1);\n          }\n        }\n      } else initialState = initialArg;\n      hook.memoizedState = hook.baseState = initialState;\n      reducer = {\n        pending: null,\n        lanes: 0,\n        dispatch: null,\n        lastRenderedReducer: reducer,\n        lastRenderedState: initialState\n      };\n      hook.queue = reducer;\n      reducer = reducer.dispatch = dispatchReducerAction.bind(\n        null,\n        currentlyRenderingFiber,\n        reducer\n      );\n      return [hook.memoizedState, reducer];\n    }
1,\n    useRef: function (initialValue) {\n      var hook = mountWorkInProgressHook();\n      initialValue = { current: initialValue };\n      return (hook.memoizedState = initialValue);\n    },\n    useState: function (initialState) {\n      initialState = mountStateImpl(initialState);\n      var queue = initialState.queue,\n        dispatch = dispatchSetState.bind(null, currentlyRenderingFiber, queue);\n      queue.dispatch = dispatch;\n      return [initialState.memoizedState, dispatch];\n    },\n    useDebugValue: mountDebugValue,\n    useDeferredValue: function (value, initialValue) {\n      var hook = mountWorkInProgressHook();\n      return mountDeferredValueImpl(hook, value, initialValue);\n    },\n    useTransition: function () {\n      var stateHook = mountStateImpl(!1);\n      stateHook = startTransition.bind(\n        null,\n        currentlyRenderingFiber,\n        stateHook.queue,\n        !0,\n        !1\n      );\n      mountWorkInProgressHook().memoizedState = stateHook;\n      return [!1, stateHook];\n    },\n    useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {\n      var fiber = currentlyRenderingFiber,\n        hook = mountWorkInProgressHook();\n      if (isHydrating) {\n        if (void 0 === getServerSnapshot)\n          throw Error(formatProdErrorMessage(407));\n        getServerSnapshot = getServerSnapshot();\n      } else {\n        getServerSnapshot = getSnapshot();\n        if (null === workInProgressRoot)\n          throw Error(formatProdErrorMessage(349));\n        0 !== (workInProgressRootRenderLanes & 124) ||\n          pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n      }\n      hook.memoizedState = getServerSnapshot;\n      var inst = { value: getServerSnapshot, getSnapshot: getSnapshot };\n      hook.queue = inst;\n      mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [\n        subscribe\n      ]);\n      fiber.flags |= 2048;\n      pushSimpleEffect(\n        9,\n        createEffectInstance(),\n        updateStoreInstance.bind(\n          null,\n          fiber,\n          inst,\n          getServerSnapshot,\n          getSnapshot\n        ),\n        null\n      );\n      return getServerSnapshot;\n    },\n    useId: function () {\n      var hook = mountWorkInProgressHook(),\n        identifierPrefix = workInProgressRoot.identifierPrefix;\n      if (isHydrating) {\n        var JSCompiler_inline_result = treeContextOverflow;\n        var idWithLeadingBit = treeContextId;\n        JSCompiler_inline_result =\n          (\n            idWithLeadingBit & ~(1 << (32 - clz32(idWithLeadingBit) - 1))\n          ).toString(32) + JSCompiler_inline_result;\n        identifierPrefix =\n          "\\u00ab" + identifierPrefix + "R" + JSCompiler_inline_result;\n        JSCompiler_inline_result = localIdCounter++;\n        0 < JSCompiler_inline_result &&\n          (identifierPrefix += "H" + JSCompiler_inline_result.toString(32));\n        identifierPrefix += "\\u00bb";\n      } else\n        (JSCompiler_inline_result = globalClientIdCounter++),\n          (identifierPrefix =\n            "\\u00ab" +\n            identifierPrefix +\n            "r" +\n            JSCompiler_inline_result.toString(32) +\n            "\\u00bb");\n      return (hook.memoizedState = identifierPrefix);\n    },\n    useHostTransitionStatus: useHostTransitionStatus,\n    useFormState: mountActionState,\n    useActionState: mountActionState,\n    useOptimistic: function (passthrough) {\n      var hook = mountWorkInProgressHook();\n      hook.memoizedState = hook.baseState = passthrough;\n      var queue = {\n        pending: null,\n        lanes: 0,\n        dispatch: null,\n        lastRenderedReducer: null,\n        lastRenderedState: null\n      };\n      hook.queue = queue;\n      hook = dispatchOptimisticSetState.bind(\n        null,\n        currentlyRenderingFiber,\n        !0,\n        queue\n      );\n      queue.dispatch = hook;\n      return [passthrough, hook];\n    },\n    useMemoCache: useMemoCache,\n    useCacheRefresh: function () {\n      return (mountWorkInProgressHook().memoizedState = refreshCache.bind(\n        null,\n        currentlyRenderingFiber\n      ));\n    }\n  },\n  HooksDispatcherOnUpdate = {\n    readContext: readContext,\n    use: use,\n    useCallback: updateCallback,\n    useContext: readContext,\n    useEffect: updateEffect,\n    useImperativeHandle: updateImperativeHandle,\n    useInsertionEffect: updateInsertionEffect,\n    useLayoutEffect: updateLayoutEffect,\n    useMemo: updateMemo,\n    useReducer: updateReducer,\n    useRef
1: updateRef,\n    useState: function () {\n      return updateReducer(basicStateReducer);\n    },\n    useDebugValue: mountDebugValue,\n    useDeferredValue: function (value, initialValue) {\n      var hook = updateWorkInProgressHook();\n      return updateDeferredValueImpl(\n        hook,\n        currentHook.memoizedState,\n        value,\n        initialValue\n      );\n    },\n    useTransition: function () {\n      var booleanOrThenable = updateReducer(basicStateReducer)[0],\n        start = updateWorkInProgressHook().memoizedState;\n      return [\n        "boolean" === typeof booleanOrThenable\n          ? booleanOrThenable\n          : useThenable(booleanOrThenable),\n        start\n      ];\n    },\n    useSyncExternalStore: updateSyncExternalStore,\n    useId: updateId,\n    useHostTransitionStatus: useHostTransitionStatus,\n    useFormState: updateActionState,\n    useActionState: updateActionState,\n    useOptimistic: function (passthrough, reducer) {\n      var hook = updateWorkInProgressHook();\n      return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n    },\n    useMemoCache: useMemoCache,\n    useCacheRefresh: updateRefresh\n  },\n  HooksDispatcherOnRerender = {\n    readContext: readContext,\n    use: use,\n    useCallback: updateCallback,\n    useContext: readContext,\n    useEffect: updateEffect,\n    useImperativeHandle: updateImperativeHandle,\n    useInsertionEffect: updateInsertionEffect,\n    useLayoutEffect: updateLayoutEffect,\n    useMemo: updateMemo,\n    useReducer: rerenderReducer,\n    useRef: updateRef,\n    useState: function () {\n      return rerenderReducer(basicStateReducer);\n    },\n    useDebugValue: mountDebugValue,\n    useDeferredValue: function (value, initialValue) {\n      var hook = updateWorkInProgressHook();\n      return null === currentHook\n        ? mountDeferredValueImpl(hook, value, initialValue)\n        : updateDeferredValueImpl(\n            hook,\n            currentHook.memoizedState,\n            value,\n            initialValue\n          );\n    },\n    useTransition: function () {\n      var booleanOrThenable = rerenderReducer(basicStateReducer)[0],\n        start = updateWorkInProgressHook().memoizedState;\n      return [\n        "boolean" === typeof booleanOrThenable\n          ? booleanOrThenable\n          : useThenable(booleanOrThenable),\n        start\n      ];\n    },\n    useSyncExternalStore: updateSyncExternalStore,\n    useId: updateId,\n    useHostTransitionStatus: useHostTransitionStatus,\n    useFormState: rerenderActionState,\n    useActionState: rerenderActionState,\n    useOptimistic: function (passthrough, reducer) {\n      var hook = updateWorkInProgressHook();\n      if (null !== currentHook)\n        return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n      hook.baseState = passthrough;\n      return [passthrough, hook.queue.dispatch];\n    },\n    useMemoCache: useMemoCache,\n    useCacheRefresh: updateRefresh\n  },\n  thenableState = null,\n  thenableIndexCounter = 0;\nfunction unwrapThenable(thenable) {\n  var index = thenableIndexCounter;\n  thenableIndexCounter += 1;\n  null === thenableState && (thenableState = []);\n  return trackUsedThenable(thenableState, thenable, index);\n}\nfunction coerceRef(workInProgress, element) {\n  element = element.props.ref;\n  workInProgress.ref = void 0 !== element ? element : null;\n}\nfunction throwOnInvalidObjectType(returnFiber, newChild) {\n  if (newChild.$$typeof === REACT_LEGACY_ELEMENT_TYPE)\n    throw Error(formatProdErrorMessage(525));\n  returnFiber = Object.prototype.toString.call(newChild);\n  throw Error(\n    formatProdErrorMessage(\n      31,\n      "[object Object]" === returnFiber\n        ? "object with keys {" + Object.keys(newChild).join(", ") + "}"\n        : returnFiber\n    )\n  );\n}\nfunction resolveLazy(lazyType) {\n  var init = lazyType._init;\n  return init(lazyType._payload);\n}\nfunction createChildReconciler(shouldTrackSideEffects) {\n  function deleteChild(returnFiber, childToDelete) {\n    if (shouldTrackSideEffects) {\n      var deleti
1ons = returnFiber.deletions;\n      null === deletions\n        ? ((returnFiber.deletions = [childToDelete]), (returnFiber.flags |= 16))\n        : deletions.push(childToDelete);\n    }\n  }\n  function deleteRemainingChildren(returnFiber, currentFirstChild) {\n    if (!shouldTrackSideEffects) return null;\n    for (; null !== currentFirstChild; )\n      deleteChild(returnFiber, currentFirstChild),\n        (currentFirstChild = currentFirstChild.sibling);\n    return null;\n  }\n  function mapRemainingChildren(currentFirstChild) {\n    for (var existingChildren = new Map(); null !== currentFirstChild; )\n      null !== currentFirstChild.key\n        ? existingChildren.set(currentFirstChild.key, currentFirstChild)\n        : existingChildren.set(currentFirstChild.index, currentFirstChild),\n        (currentFirstChild = currentFirstChild.sibling);\n    return existingChildren;\n  }\n  function useFiber(fiber, pendingProps) {\n    fiber = createWorkInProgress(fiber, pendingProps);\n    fiber.index = 0;\n    fiber.sibling = null;\n    return fiber;\n  }\n  function placeChild(newFiber, lastPlacedIndex, newIndex) {\n    newFiber.index = newIndex;\n    if (!shouldTrackSideEffects)\n      return (newFiber.flags |= 1048576), lastPlacedIndex;\n    newIndex = newFiber.alternate;\n    if (null !== newIndex)\n      return (\n        (newIndex = newIndex.index),\n        newIndex < lastPlacedIndex\n          ? ((newFiber.flags |= 67108866), lastPlacedIndex)\n          : newIndex\n      );\n    newFiber.flags |= 67108866;\n    return lastPlacedIndex;\n  }\n  function placeSingleChild(newFiber) {\n    shouldTrackSideEffects &&\n      null === newFiber.alternate &&\n      (newFiber.flags |= 67108866);\n    return newFiber;\n  }\n  function updateTextNode(returnFiber, current, textContent, lanes) {\n    if (null === current || 6 !== current.tag)\n      return (\n        (current = createFiberFromText(textContent, returnFiber.mode, lanes)),\n        (current.return = returnFiber),\n        current\n      );\n    current = useFiber(current, textContent);\n    current.return = returnFiber;\n    return current;\n  }\n  function updateElement(returnFiber, current, element, lanes) {\n    var elementType = element.type;\n    if (elementType === REACT_FRAGMENT_TYPE)\n      return updateFragment(\n        returnFiber,\n        current,\n        element.props.children,\n        lanes,\n        element.key\n      );\n    if (\n      null !== current &&\n      (current.elementType === elementType ||\n        ("object" === typeof elementType &&\n          null !== elementType &&\n          elementType.$$typeof === REACT_LAZY_TYPE &&\n          resolveLazy(elementType) === current.type))\n    )\n      return (\n        (current = useFiber(current, element.props)),\n        coerceRef(current, element),\n        (current.return = returnFiber),\n        current\n      );\n    current = createFiberFromTypeAndProps(\n      element.type,\n      element.key,\n      element.props,\n      null,\n      returnFiber.mode,\n      lanes\n    );\n    coerceRef(current, element);\n    current.return = returnFiber;\n    return current;\n  }\n  function updatePortal(returnFiber, current, portal, lanes) {\n    if (\n      null === current ||\n      4 !== current.tag ||\n      current.stateNode.containerInfo !== portal.containerInfo ||\n      current.stateNode.implementation !== portal.implementation\n    )\n      return (\n        (current = createFiberFromPortal(portal, returnFiber.mode, lanes)),\n        (current.return = returnFiber),\n        current\n      );\n    current = useFiber(current, portal.children || []);\n    current.return = returnFiber;\n    return current;\n  }\n  function updateFragment(returnFiber, current, fragment, lanes, key) {\n    if (null === current || 7 !== current.tag)\n      return (\n        (current = createFiberFromFragment(\n          fragment,\n          returnFiber.mode,\n          lanes,\n          key\n        )),\n        (current.return = returnFiber),\n        current\n      );\n    current = useFiber(current, fragment);\n    current.return = returnFiber;\n    return current;\n  }\n  function createChild(returnFiber, newChild, lanes) {\n    if (\n      ("string" === typeof newChild && "" !== newChild) ||\n      "number" === typeof newChild ||\n      "bigint" === typeof newChild\n    )\n      return (\n        (newChild = createFiberFromText(\n          "" + newChild,\n          returnFiber.mode,\n          lanes\n        )),\n        (newChild.return = returnFiber),\n        newChild\n      );\n    if ("object" === typeof newChild && null !== newChild) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          return (\n            (lanes = createFiberFromTypeAndProps(\n              newChild.type,\n              newChild.key,\n              newChild.props,\n              null,\n              returnFiber.mode,\n              lanes\n            )),\n            coerceRef(lanes, newChild),\n            (lanes.return = returnFiber),\n            lanes\n          );\n        case REACT_PORTAL_TYPE:\n          return (\n            (newChild = createFiberFromPortal(\n              newChild,\n              returnFiber.mode,\n              lanes\n            )),\n            (newChild.return = returnFiber),\n            newChild\n          );\n        case REACT_LAZY_TYPE:\n          var init = newChild._init;\n          newChild = init(newChild._payload);\n          return createChild(returnFiber, newChild, lanes);\n      }\n      if (isArrayImpl(newChild) || getIteratorFn(newChild))\n        return (\n          (newChild = createFiberFromFragment(\n            newChild,\n            returnFiber.mode,\n            lanes,\n            null\n          )),\n          (newChild.return = returnFiber),\n          newChild\n        );\n      if ("function" === typeof newChild.then)\n        return createChild(returnFiber, unwrapThenable(newChild), lanes);\n      if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n        return createChild(\n          returnFiber,\n          readContextDuringReconciliation(returnFiber, newChild),\n          lanes\n        );
1\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n    return null;\n  }\n  function updateSlot(returnFiber, oldFiber, newChild, lanes) {\n    var key = null !== oldFiber ? oldFiber.key : null;\n    if (\n      ("string" === typeof newChild && "" !== newChild) ||\n      "number" === typeof newChild ||\n      "bigint" === typeof newChild\n    )\n      return null !== key\n        ? null\n        : updateTextNode(returnFiber, oldFiber, "" + newChild, lanes);\n    if ("object" === typeof newChild && null !== newChild) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          return newChild.key === key\n            ? updateElement(returnFiber, oldFiber, newChild, lanes)\n            : null;\n        case REACT_PORTAL_TYPE:\n          return newChild.key === key\n            ? updatePortal(returnFiber, oldFiber, newChild, lanes)\n            : null;\n        case REACT_LAZY_TYPE:\n          return (\n            (key = newChild._init),\n            (newChild = key(newChild._payload)),\n            updateSlot(returnFiber, oldFiber, newChild, lanes)\n          );\n      }\n      if (isArrayImpl(newChild) || getIteratorFn(newChild))\n        return null !== key\n          ? null\n          : updateFragment(returnFiber, oldFiber, newChild, lanes, null);\n      if ("function" === typeof newChild.then)\n        return updateSlot(\n          returnFiber,\n          oldFiber,\n          unwrapThenable(newChild),\n          lanes\n        );\n      if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n        return updateSlot(\n          returnFiber,\n          oldFiber,\n          readContextDuringReconciliation(returnFiber, newChild),\n          lanes\n        );\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n    return null;\n  }\n  function updateFromMap(\n    existingChildren,\n    returnFiber,\n    newIdx,\n    newChild,\n    lanes\n  ) {\n    if (\n      ("string" === typeof newChild && "" !== newChild) ||\n      "number" === typeof newChild ||\n      "bigint" === typeof newChild\n    )\n      return (\n        (existingChildren = existingChildren.get(newIdx) || null),\n        updateTextNode(returnFiber, existingChildren, "" + newChild, lanes)\n      );\n    if ("object" === typeof newChild && null !== newChild) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          return (\n            (existingChildren =\n              existingChildren.get(\n                null === newChild.key ? newIdx : newChild.key\n              ) || null),\n            updateElement(returnFiber, existingChildren, newChild, lanes)\n          );\n        case REACT_PORTAL_TYPE:\n          return (\n            (existingChildren =\n              existingChildren.get(\n                null === newChild.key ? newIdx : newChild.key\n              ) || null),\n            updatePortal(returnFiber, existingChildren, newChild, lanes)\n          );\n        case REACT_LAZY_TYPE:\n          var init = newChild._init;\n          newChild = init(newChild._payload);\n          return updateFromMap(\n            existingChildren,\n            returnFiber,\n            newIdx,\n            newChild,\n            lanes\n          );\n      }\n      if (isArrayImpl(newChild) || getIteratorFn(newChild))\n        return (\n          (existingChildren = existingChildren.get(newIdx) || null),\n          updateFragment(returnFiber, existingChildren, newChild, lanes, null)\n        );\n      if ("function" === typeof newChild.then)\n        return updateFromMap(\n          existingChildren,\n          returnFiber,\n          newIdx,\n          unwrapThenable(newChild),\n          lanes\n        );\n      if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n        return updateFromMap(\n          existingChildren,\n          returnFiber,\n          newIdx,\n          readContextDuringReconciliation(returnFiber, newChild),\n          lanes\n        );\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n    return null;\n  }\n  function reconcileChildrenArray(\n    returnFiber,\n    currentFirstChild,\n    newChildren,\n    lanes\n  ) {\n    for (\n      var resultingFirstChild = null,\n        previousNewFiber = null,\n        oldFiber = currentFirstChild,\n        newIdx = (currentFirstChild = 0),\n        nextOldFiber = null;\n      null !== oldFiber && newIdx < newChildren.length;\n      newIdx++\n    ) {\n      oldFiber.index > newIdx\n        ? ((nextOldFiber = oldFiber), (oldFiber = null))\n        : (nextOldFiber = oldFiber.sibling);\n      var newFiber = updateSlot(\n        returnFiber,\n        oldFiber,\n        newChildren[newIdx],\n        lanes\n      );\n      if (null === newFiber) {\n        null === oldFiber && (oldFiber = nextOldFiber);\n        break;\n      }\n      shouldTrackSideEffects &&\n        oldFiber &&\n        null === newFiber.alternate &&\n        deleteChild(returnFiber, oldFiber);\n      currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n      null === previousNewFiber\n        ? (resultingFirstChild = newFiber)\n        : (previousNewFiber.sibling = newFiber);\n      previousNewFiber = newFiber;\n      oldFiber = nextOldFiber;\n    }\n    if (newIdx === newChildren.length)\n      return (\n        deleteRemainingChildren(returnFiber, oldFiber),\n        isHydrating && pushTreeFork(returnFiber, newIdx),\
1n        resultingFirstChild\n      );\n    if (null === oldFiber) {\n      for (; newIdx < newChildren.length; newIdx++)\n        (oldFiber = createChild(returnFiber, newChildren[newIdx], lanes)),\n          null !== oldFiber &&\n            ((currentFirstChild = placeChild(\n              oldFiber,\n              currentFirstChild,\n              newIdx\n            )),\n            null === previousNewFiber\n              ? (resultingFirstChild = oldFiber)\n              : (previousNewFiber.sibling = oldFiber),\n            (previousNewFiber = oldFiber));\n      isHydrating && pushTreeFork(returnFiber, newIdx);\n      return resultingFirstChild;\n    }\n    for (\n      oldFiber = mapRemainingChildren(oldFiber);\n      newIdx < newChildren.length;\n      newIdx++\n    )\n      (nextOldFiber = updateFromMap(\n        oldFiber,\n        returnFiber,\n        newIdx,\n        newChildren[newIdx],\n        lanes\n      )),\n        null !== nextOldFiber &&\n          (shouldTrackSideEffects &&\n            null !== nextOldFiber.alternate &&\n            oldFiber.delete(\n              null === nextOldFiber.key ? newIdx : nextOldFiber.key\n            ),\n          (currentFirstChild = placeChild(\n            nextOldFiber,\n            currentFirstChild,\n            newIdx\n          )),\n          null === previousNewFiber\n            ? (resultingFirstChild = nextOldFiber)\n            : (previousNewFiber.sibling = nextOldFiber),\n          (previousNewFiber = nextOldFiber));\n    shouldTrackSideEffects &&\n      oldFiber.forEach(function (child) {\n        return deleteChild(returnFiber, child);\n      });\n    isHydrating && pushTreeFork(returnFiber, newIdx);\n    return resultingFirstChild;\n  }\n  function reconcileChildrenIterator(\n    returnFiber,\n    currentFirstChild,\n    newChildren,\n    lanes\n  ) {\n    if (null == newChildren) throw Error(formatProdErrorMessage(151));\n    for (\n      var resultingFirstChild = null,\n        previousNewFiber = null,\n        oldFiber = currentFirstChild,\n        newIdx = (currentFirstChild = 0),\n        nextOldFiber = null,\n        step = newChildren.next();\n      null !== oldFiber && !step.done;\n      newIdx++, step = newChildren.next()\n    ) {\n      oldFiber.index > newIdx\n        ? ((nextOldFiber = oldFiber), (oldFiber = null))\n        : (nextOldFiber = oldFiber.sibling);\n      var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);\n      if (null === newFiber) {\n        null === oldFiber && (oldFiber = nextOldFiber);\n        break;\n      }\n      shouldTrackSideEffects &&\n        oldFiber &&\n        null === newFiber.alternate &&\n        deleteChild(returnFiber, oldFiber);\n      currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n      null === previousNewFiber\n        ? (resultingFirstChild = newFiber)\n        : (previousNewFiber.sibling = newFiber);\n      previousNewFiber = newFiber;\n      oldFiber = nextOldFiber;\n    }\n    if (step.done)\n      return (\n        deleteRemainingChildren(returnFiber, oldFiber),\n        isHydrating && pushTreeFork(returnFiber, newIdx),\n        resultingFirstChild\n      );\n    if (null === oldFiber) {\n      for (; !step.done; newIdx++, step = newChildren.next())\n        (step = createChild(returnFiber, step.value, lanes)),\n          null !== step &&\n            ((currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n            null === previousNewFiber\n              ? (resultingFirstChild = step)\n              : (previousNewFiber.sibling = step),\n            (previousNewFiber = step));\n      isHydrating && pushTreeFork(returnFiber, newIdx);\n      return resultingFirstChild;\n    }\n    for (\n      oldFiber = mapRemainingChildren(oldFiber);\n      !step.done;\n      newIdx++, step = newChildren.next()\n    )\n      (step = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes)),\n        null !== step &&\n          (shouldTrackSideEffects &&\n            null !== step.alternate &&\n            oldFiber.delete(null === step.key ? newIdx : step.key),\n          (currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n          null === previousNewFiber\n            ? (resultingFirstChild = step)\n            : (previousNewFiber.sibling = step),\n          (previousNewFiber = step));\n    shouldTrackSideEffects &&\n      oldFiber.forEach(function (child) {\n        return deleteChild(returnFiber, child);\n      });\n    isHydrating && pushTreeFork(returnFiber, newIdx);\n    return resultingFirstChild;\n  }\n  function reconcileChildFibersImpl(\n    returnFiber,\n    currentFirstChild,\n    newChild,\n    lanes\n  ) {\n    "object" === typeof newChild &&\n      null !== newChild &&\n      newChild.type === REACT_FRAGMENT_TYPE &&\n      null === newChild.key &&\n      (newChild = newChild.props.children);\n    if ("object" === typeof newChild && null !== newChild) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          a: {\n            for (var key = newChild.key; null !== currentFirstChild; ) {\n              if (currentFirstChild.key === key) {\n                key = newChild.type;\n                if (key === REACT_FRAGMENT_TYPE) {\n                  if (7 === currentFirstChild.tag) {\n                    deleteRemainingChildren(\n                      returnFiber,\n                      currentFirstChild.sibling\n                    );\n                    lanes = useFiber(\n                      currentFirstChild,\n                      newChild.props.children\n                    );\n                    lanes.return = returnFiber;\n                    returnFiber = lanes;\n                    break a;\n                  }\n                } else if (\n                  currentFirstChild.elementType === key ||\n                  ("object" === typeof key &&\n                    null !== key &&\n                    key.$$typeof === REACT_LAZY_TYPE &&\n                    resolveLazy(key) === currentFirstChild.type)\n                ) {\n                  deleteRemainingChildren(\n                    returnFiber,\n                    currentFirstChild.sibling\n                  );\n                  lanes = useFiber(currentFirstChild, newChild.props);\n                  coerceRef(lanes, newChild);\n                  lanes.return = returnFiber;\n                  returnFiber = lanes;\n                  break a;\n                }\n                deleteRemainingChildren(returnFiber, currentFirstChild);\n                break;\n              } else deleteChild(returnFiber, currentFirstChild);\n              currentFirstChild = currentFirstChild.sibling;\n            }\n            newChild.type === REACT_FRAGMENT_TYPE\n              ? ((lanes = createFiberFromFragment(\n                  newChild.props.children,\n                  returnFiber.mode,\n                  lanes,\n                  newChild.key\n                )),\n                (lanes.return = returnFiber),\n                (returnFiber = lanes))\n              : ((lanes = createFiberFromTypeAndProps(\n                  newChild.type,\n                  newChild.key,\n                  newChild.props,\n                  null,\n                  returnFiber.mode,\n                  lanes\n                )),\n                coerceRef(lanes, newChild),\n                (lanes.return = returnFiber),\n                (returnFiber = lanes));\n          }\n          return placeSingleChild(returnFiber);\n        case REACT_PORTAL_TYPE:\n          a: {\n            for (key = newChild.key; null !== currentFirstChild; ) {\n              if (currentFirstChild.key === key)\n                if (\n                  4 === currentFirstChild.tag &&\
1n                  currentFirstChild.stateNode.containerInfo ===\n                    newChild.containerInfo &&\n                  currentFirstChild.stateNode.implementation ===\n                    newChild.implementation\n                ) {\n                  deleteRemainingChildren(\n                    returnFiber,\n                    currentFirstChild.sibling\n                  );\n                  lanes = useFiber(currentFirstChild, newChild.children || []);\n                  lanes.return = returnFiber;\n                  returnFiber = lanes;\n                  break a;\n                } else {\n                  deleteRemainingChildren(returnFiber, currentFirstChild);\n                  break;\n                }\n              else deleteChild(returnFiber, currentFirstChild);\n              currentFirstChild = currentFirstChild.sibling;\n            }\n            lanes = createFiberFromPortal(newChild, returnFiber.mode, lanes);\n            lanes.return = returnFiber;\n            returnFiber = lanes;\n          }\n          return placeSingleChild(returnFiber);\n        case REACT_LAZY_TYPE:\n          return (\n            (key = newChild._init),\n            (newChild = key(newChild._payload)),\n            reconcileChildFibersImpl(\n              returnFiber,\n              currentFirstChild,\n              newChild,\n              lanes\n            )\n          );\n      }\n      if (isArrayImpl(newChild))\n        return reconcileChildrenArray(\n          returnFiber,\n          currentFirstChild,\n          newChild,\n          lanes\n        );\n      if (getIteratorFn(newChild)) {\n        key = getIteratorFn(newChild);\n        if ("function" !== typeof key) throw Error(formatProdErrorMessage(150));\n        newChild = key.call(newChild);\n        return reconcileChildrenIterator(\n          returnFiber,\n          currentFirstChild,\n          newChild,\n          lanes\n        );\n      }\n      if ("function" === typeof newChild.then)\n        return reconcileChildFibersImpl(\n          returnFiber,\n          currentFirstChild,\n          unwrapThenable(newChild),\n          lanes\n        );\n      if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n        return reconcileChildFibersImpl(\n          returnFiber,\n          currentFirstChild,\n          readContextDuringReconciliation(returnFiber, newChild),\n          lanes\n        );\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n    return ("string" === typeof newChild && "" !== newChild) ||\n      "number" === typeof newChild ||\n      "bigint" === typeof newChild\n      ? ((newChild = "" + newChild),\n        null !== currentFirstChild && 6 === currentFirstChild.tag\n          ? (deleteRemainingChildren(returnFiber, currentFirstChild.sibling),\n            (lanes = useFiber(currentFirstChild, newChild)),\n            (lanes.return = returnFiber),\n            (returnFiber = lanes))\n          : (deleteRemainingChildren(returnFiber, currentFirstChild),\n            (lanes = createFiberFromText(newChild, returnFiber.mode, lanes)),\n            (lanes.return = returnFiber),\n            (returnFiber = lanes)),\n        placeSingleChild(returnFiber))\n      : deleteRemainingChildren(returnFiber, currentFirstChild);\n  }\n  return function (returnFiber, currentFirstChild, newChild, lanes) {\n    try {\n      thenableIndexCounter = 0;\n      var firstChildFiber = reconcileChildFibersImpl(\n        returnFiber,\n        currentFirstChild,\n        newChild,\n        lanes\n      );\n      thenableState = null;\n      return firstChildFiber;\n    } catch (x) {\n      if (x === SuspenseException || x === SuspenseActionException) throw x;\n      var fiber = createFiberImplClass(29, x, null, returnFiber.mode);\n      fiber.lanes = lanes;\n      fiber.return = returnFiber;\n      return fiber;\n    } finally {\n    }\n  };\n}\nvar reconcileChildFibers = createChildReconciler(!0),\n  mountChildFibers = createChildReconciler(!1),\n  suspenseHandlerStackCursor = createCursor(null),\n  shellBoundary = null;\nfunction pushPrimaryTreeSuspenseHandler(handler) {\n  var current = handler.alternate;\n  push(suspenseStackCursor, suspenseStackCursor.current & 1);\n  push(suspenseHandlerStackCursor, handler);\n  null === shellBoundary &&\n    (null === current || null !== currentTreeHiddenStackCursor.current\n      ? (shellBoundary = handler)\n      : null !== current.memoizedState && (shellBoundary = handler));\n}\nfunction pushOffscreenSuspenseHandler(fiber) {\n  if (22 === fiber.tag) {\n    if (\n      (push(suspenseStackCursor, suspenseStackCursor.current),\n      push(suspenseHandlerStackCursor, fiber),\n      null === shellBoundary)\n    ) {\n      var current = fiber.alternate;\n      null !== current &&\n        null !== current.memoizedState &&\n        (shellBoundary = fiber);\n    }\n  } else reuseSuspenseHandlerOnStack(fiber);\n}\nfunction reuseSuspenseHandlerOnStack() {\n  push(suspenseStackCursor, suspenseStackCursor.current);\n  push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current);\n}\nfunction popSuspenseHandler(fiber) {\n  pop(suspenseHandlerStackCursor);\n  shellBoundary === fiber && (shellBoundary = null);\n  pop(suspenseStackCursor);\n}\nvar suspenseStackCursor = createCursor(0);\nfunction findFirstSuspended(row) {\n  for (var node = row; null !== node; ) {\n    if (13 === node.tag) {\n      var state = node.memoizedState;\n      if (\n        null !== state &&\n        ((state = state.dehydrated),\n        null === state ||\n          "$?" === state.data ||\n          isSuspenseInstanceFallback(state))\n      )\n        return node;\n    } else if (19 === node.tag && void 0 !== node.memoizedProps.revealOrder) {\n      if (0 !== (node.flags & 128)) return node;\n    } else if (null !== node.child) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n    if (node === row) break;\n    for (; null === node.sibling; ) {\n      if (null === node.return || node.return === row) return null;\n      node = node.return;\n    }\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n  return null;\n}\nfunction applyDerivedStateFromProps(\n  workInProgress,\n  ctor,\n  getDerivedStateFromProps,\n  nextProps\n) {\n  ctor = workInProgress.memoizedState;\n  getDerivedStateFromProps = getDerivedStateFromProps(nextProps, ctor);\n  getDerivedStateFromProps =\n    null === getDerivedStateFromProps || void 0 === getDerivedStateFromProps\n      ? ctor\n      : assign({}, ctor, getDerivedStateFromProps);\n  workInProgress.memoizedState = getDerivedStateFromProps;\n  0 === workInProgress.lanes &&\n    (workInProgress.updateQueue.baseState = getDerivedStateFromProps);\n}\nvar classComponentUpdater = {\n  enqueueSetState: function (inst, payload, callback) {\n    inst = inst._reactInternals;\n    var lane = requestUpdateLane(),\n      update = createUpdate(lane);\n    update.payload = payload;\n    void 0 !== callback && null !== callback && (update.callback = callback);\n    payload = enqueueUpdate(inst, update, lane);\n    null !== payload &&\n      (scheduleUpdateOnFiber(payload, inst, lane),\n      entangleTransitions(payload, inst, lane));\n  },\n  enqueueReplaceState: function (inst, payload, callback) {\n    inst = inst._reactInternals;\n    var lane = requestUpdateLane(),\n      update = createUpdate(lane);\n    update.tag = 1;\n    update.payload = payload;\n    void 0 !== callback && null !== callback && (update.callback = callback);\n    payload = enqueueUpdate(inst, update, lane);\n    null !== payload &&\n      (scheduleUpdateOnFiber(payload, inst, lane),\n      entangleTransitions(payload, inst, lane));\n  },\n  enqueueForceUpdate: function (inst, callback) {\n    inst = inst._reactInternals;\n    var lane = requestUpdateLane(),\n      update = createUpdate(lane);\n    update.tag = 2;\n    void 0 !== callback && null !== callback && (update.callback = callback);\n    callback = enqueueUpdate(inst, update, lane);\n    null !== callback &&\n      (scheduleUpdateOnFiber(callback, inst, lane),\n      entangleTransitions(callback, inst, lane));\n  }\n};\nfunction checkShouldComponentUpdate(\n  workInProgress,\n  ctor,\n  oldProps,\n  newProps,\n  oldState,\n  newState,\n  nextContext\n) {\n  workInProgress = workInProgress.stateNode;\n  return "function" === typeof workInProgress.shouldComponentUpdate\n    ? workInProgress.shouldComponentUpdate(newProps, newState, nextContext)\n    : ctor.prototype && ctor.prototype.isPureReactComponent\n      ? !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState)\n      : !0;\n}\nfunction callComponentWillReceiveProps(\n  workInProgress,\n  instance,\n  newProps,\n  nextContext\n) {\n  workInProgress = instance.state;\n  "function" === typeof instance.componentWillReceiveProps &&\n    instance.componentWillReceiveProps(newProps, nextContext);\n  "function" === typeof instance.UNSAFE_componentWillReceiveProps &&\n    instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);\n  instance.state !== workInProgress &&\n    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n}
1\nfunction resolveClassComponentProps(Component, baseProps) {\n  var newProps = baseProps;\n  if ("ref" in baseProps) {\n    newProps = {};\n    for (var propName in baseProps)\n      "ref" !== propName && (newProps[propName] = baseProps[propName]);\n  }\n  if ((Component = Component.defaultProps)) {\n    newProps === baseProps && (newProps = assign({}, newProps));\n    for (var propName$73 in Component)\n      void 0 === newProps[propName$73] &&\n        (newProps[propName$73] = Component[propName$73]);\n  }\n  return newProps;\n}\nvar reportGlobalError =\n  "function" === typeof reportError\n    ? reportError\n    : function (error) {\n        if (\n          "object" === typeof window &&\n          "function" === typeof window.ErrorEvent\n        ) {\n          var event = new window.ErrorEvent("error", {\n            bubbles: !0,\n            cancelable: !0,\n            message:\n              "object" === typeof error &&\n              null !== error &&\n              "string" === typeof error.message\n                ? String(error.message)\n                : String(error),\n            error: error\n          });\n          if (!window.dispatchEvent(event)) return;\n        } else if (\n          "object" === typeof process &&\n          "function" === typeof process.emit\n        ) {\n          process.emit("uncaughtException", error);\n          return;\n        }\n        console.error(error);\n      };\nfunction defaultOnUncaughtError(error) {\n  reportGlobalError(error);\n}\nfunction defaultOnCaughtError(error) {\n  console.error(error);\n}\nfunction defaultOnRecoverableError(error) {\n  reportGlobalError(error);\n}\nfunction logUncaughtError(root, errorInfo) {\n  try {\n    var onUncaughtError = root.onUncaughtError;\n    onUncaughtError(errorInfo.value, { componentStack: errorInfo.stack });\n  } catch (e$74) {\n    setTimeout(function () {\n      throw e$74;\n    });\n  }\n}\nfunction logCaughtError(root, boundary, errorInfo) {\n  try {\n    var onCaughtError = root.onCaughtError;\n    onCaughtError(errorInfo.value, {\n      componentStack: errorInfo.stack,\n      errorBoundary: 1 === boundary.tag ? boundary.stateNode : null\n    });\n  } catch (e$75) {\n    setTimeout(function () {\n      throw e$75;\n    });\n  }\n}\nfunction createRootErrorUpdate(root, errorInfo, lane) {\n  lane = createUpdate(lane);\n  lane.tag = 3;\n  lane.payload = { element: null };\n  lane.callback = function () {\n    logUncaughtError(root, errorInfo);\n  };\n  return lane;\n}\nfunction createClassErrorUpdate(lane) {\n  lane = createUpdate(lane);\n  lane.tag = 3;\n  return lane;\n}\nfunction initializeClassErrorUpdate(update, root, fiber, errorInfo) {\n  var getDerivedStateFromError = fiber.type.getDerivedStateFromError;\n  if ("function" === typeof getDerivedStateFromError) {\n    var error = errorInfo.value;\n    update.payload = function () {\n      return getDerivedStateFromError(error);\n    };\n    update.callback = function () {\n      logCaughtError(root, fiber, errorInfo);\n    };\n  }\n  var inst = fiber.stateNode;\n  null !== inst &&\n    "function" === typeof inst.componentDidCatch &&\n    (update.callback = function () {\n      logCaughtError(root, fiber, errorInfo);\n      "function" !== typeof getDerivedStateFromError &&\n        (null === legacyErrorBoundariesThatAlreadyFailed\n          ? (legacyErrorBoundariesThatAlreadyFailed = new Set([this]))\n          : legacyErrorBoundariesThatAlreadyFailed.add(this));\n      var stack = errorInfo.stack;\n      this.componentDidCatch(errorInfo.value, {\n        componentStack: null !== stack ? stack : ""\n      });\n    });\n}\nfunction throwException(\n  root,\n  returnFiber,\n  sourceFiber,\n  value,\n  rootRenderLanes\n) {\n  sourceFiber.flags |= 32768;\n  if (\n    null !== value &&\n    "object" === typeof value &&\n    "function" === typeof value.then\n  ) {\n    returnFiber = sourceFiber.alternate;\n    null !== returnFiber &&\n      propagateParentContextChanges(\n        returnFiber,\n        sourceFiber,\n        rootRenderLanes,\n        !0\n      );\n    sourceFiber = suspenseHandlerStackCursor.current;\n    if (null !== sourceFiber) {\n      switch (sourceFiber.tag) {\n        case 13:\n          return (\n            null === shellBoundary\n              ? renderDidSuspendDelayIfPossible()\n              : null === sourceFiber.alternate &&\n                0 === workInProgressRootExitStatus &&\n                (workInProgressRootExitStatus = 3),\n            (sourceFiber.flags &= -257),\n            (sourceFiber.flags |= 65536),\n            (sourceFiber.lanes = rootRenderLanes),\n            value === noopSuspenseyCommitThenable\n              ? (sourceFiber.flags |= 16384)\n              : ((returnFiber = sourceFiber.updateQueue),\n                null === returnFiber\n                  ? (sourceFiber.updateQueue = new Set([value]))\n                  : returnFiber.add(value),\n                attachPingListener(root, value, rootRen
1derLanes)),\n            !1\n          );\n        case 22:\n          return (\n            (sourceFiber.flags |= 65536),\n            value === noopSuspenseyCommitThenable\n              ? (sourceFiber.flags |= 16384)\n              : ((returnFiber = sourceFiber.updateQueue),\n                null === returnFiber\n                  ? ((returnFiber = {\n                      transitions: null,\n                      markerInstances: null,\n                      retryQueue: new Set([value])\n                    }),\n                    (sourceFiber.updateQueue = returnFiber))\n                  : ((sourceFiber = returnFiber.retryQueue),\n                    null === sourceFiber\n                      ? (returnFiber.retryQueue = new Set([value]))\n                      : sourceFiber.add(value)),\n                attachPingListener(root, value, rootRenderLanes)),\n            !1\n          );\n      }\n      throw Error(formatProdErrorMessage(435, sourceFiber.tag));\n    }\n    attachPingListener(root, value, rootRenderLanes);\n    renderDidSuspendDelayIfPossible();\n    return !1;\n  }\n  if (isHydrating)\n    return (\n      (returnFiber = suspenseHandlerStackCursor.current),\n      null !== returnFiber\n        ? (0 === (returnFiber.flags & 65536) && (returnFiber.flags |= 256),\n          (returnFiber.flags |= 65536),\n          (returnFiber.lanes = rootRenderLanes),\n          value !== HydrationMismatchException &&\n            ((root = Error(formatProdErrorMessage(422), { cause: value })),\n            queueHydrationError(createCapturedValueAtFiber(root, sourceFiber))))\n        : (value !== HydrationMismatchException &&\n            ((returnFiber = Error(formatProdErrorMessage(423), {\n              cause: value\n            })),\n            queueHydrationError(\n              createCapturedValueAtFiber(returnFiber, sourceFiber)\n            )),\n          (root = root.current.alternate),\n          (root.flags |= 65536),\n          (rootRenderLanes &= -rootRenderLanes),\n          (root.lanes |= rootRenderLanes),\n          (value = createCapturedValueAtFiber(value, sourceFiber)),\n          (rootRenderLanes = createRootErrorUpdate(\n            root.stateNode,\n            value,\n            rootRenderLanes\n          )),\n          enqueueCapturedUpdate(root, rootRenderLanes),\n          4 !== workInProgressRootExitStatus &&\n            (workInProgressRootExitStatus = 2)),\n      !1\n    );\n  var wrapperError = Error(formatProdErrorMessage(520), { cause: value });\n  wrapperError = createCapturedValueAtFiber(wrapperError, sourceFiber);\n  null === workInProgressRootConcurrentErrors\n    ? (workInProgressRootConcurrentErrors = [wrapperError])\n    : workInProgressRootConcurrentErrors.push(wrapperError);\n  4 !== workInProgressRootExitStatus && (workInProgressRootExitStatus = 2);\n  if (null === returnFiber) return !0;\n  value = createCapturedValueAtFiber(value, sourceFiber);\n  sourceFiber = returnFiber;\n  do {\n    switch (sourceFiber.tag) {\n      case 3:\n        return (\n          (sourceFiber.flags |= 65536),\n          (root = rootRenderLanes & -rootRenderLanes),\n          (sourceFiber.lanes |= root),\n          (root = createRootErrorUpdate(sourceFiber.stateNode, value, root)),\n          enqueueCapturedUpdate(sourceFiber, root),\n          !1\n        );\n      case 1:\n        if (\n          ((returnFiber = sourceFiber.type),\n          (wrapperError = sourceFiber.stateNode),\n          0 === (sourceFiber.flags & 128) &&\n            ("function" === typeof returnFiber.getDerivedStateFromError ||\n              (null !== wrapperError &&\n                "function" === typeof wrapperError.componentDidCatch &&\n                (null === legacyErrorBoundariesThatAlreadyFailed ||\n                  !legacyErrorBoundariesThatAlreadyFailed.has(wrapperError)))))\n        )\n          return (\n            (sourceFiber.flags |= 65536),\n            (rootRenderLanes &= -rootRenderLanes),\n            (sourceFiber.lanes |= rootRenderLanes),\n            (rootRenderLanes = createClassErrorUpdate(rootRenderLanes)),\n            initializeClassErrorUpdate(\n              rootRen
1derLanes,\n              root,\n              sourceFiber,\n              value\n            ),\n            enqueueCapturedUpdate(sourceFiber, rootRenderLanes),\n            !1\n          );\n    }\n    sourceFiber = sourceFiber.return;\n  } while (null !== sourceFiber);\n  return !1;\n}\nvar SelectiveHydrationException = Error(formatProdErrorMessage(461)),\n  didReceiveUpdate = !1;\nfunction reconcileChildren(current, workInProgress, nextChildren, renderLanes) {\n  workInProgress.child =\n    null === current\n      ? mountChildFibers(workInProgress, null, nextChildren, renderLanes)\n      : reconcileChildFibers(\n          workInProgress,\n          current.child,\n          nextChildren,\n          renderLanes\n        );\n}\nfunction updateForwardRef(\n  current,\n  workInProgress,\n  Component,\n  nextProps,\n  renderLanes\n) {\n  Component = Component.render;\n  var ref = workInProgress.ref;\n  if ("ref" in nextProps) {\n    var propsWithoutRef = {};\n    for (var key in nextProps)\n      "ref" !== key && (propsWithoutRef[key] = nextProps[key]);\n  } else propsWithoutRef = nextProps;\n  prepareToReadContext(workInProgress);\n  nextProps = renderWithHooks(\n    current,\n    workInProgress,\n    Component,\n    propsWithoutRef,\n    ref,\n    renderLanes\n  );\n  key = checkDidRenderIdHook();\n  if (null !== current && !didReceiveUpdate)\n    return (\n      bailoutHooks(current, workInProgress, renderLanes),\n      bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n    );\n  isHydrating && key && pushMaterializedTreeId(workInProgress);\n  workInProgress.flags |= 1;\n  reconcileChildren(current, workInProgress, nextProps, renderLanes);\n  return workInProgress.child;\n}\nfunction updateMemoComponent(\n  current,\n  workInProgress,\n  Component,\n  nextProps,\n  renderLanes\n) {\n  if (null === current) {\n    var type = Component.type;\n    if (\n      "function" === typeof type &&\n      !shouldConstruct(type) &&\n      void 0 === type.defaultProps &&\n      null === Component.compare\n    )\n      return (\n        (workInProgress.tag = 15),\n        (workInProgress.type = type),\n        updateSimpleMemoComponent(\n          current,\n          workInProgress,\n          type,\n          nextProps,\n          renderLanes\n        )\n      );\n    current = createFiberFromTypeAndProps(\n      Component.type,\n      null,\n      nextProps,\n      workInProgress,\n      workInProgress.mode,\n      renderLanes\n    );\n    current.ref = workInProgress.ref;\n    current.return = workInProgress;\n    return (workInProgress.child = current);\n  }\n  type = current.child;\n  if (!checkScheduledUpdateOrContext(current, renderLanes)) {\n    var prevProps = type.memoizedProps;\n    Component = Component.compare;\n    Component = null !== Component ? Component : shallowEqual;\n    if (Component(prevProps, nextProps) && current.ref === workInProgress.ref)\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n  }\n  workInProgress.flags |= 1;\n  current = createWorkInProgress(type, nextProps);\n  current.ref = workInProgress.ref;\n  current.return = workInProgress;\n  return (workInProgress.child = current);\n}\nfunction updateSimpleMemoComponent(\n  current,\n  workInProgress,\n  Component,\n  nextProps,\n  renderLanes\n) {\n  if (null !== current) {\n    var prevProps = current.memoizedProps;\n    if (\n      shallowEqual(prevProps, nextProps) &&\n      current.ref === workInProgress.ref\n    )\n      if (\n        ((didReceiveUpdate = !1),\n        (workInProgress.pendingProps = nextProps = prevProps),\n        checkScheduledUpdateOrContext(current, renderLanes))\n      )\n        0 !== (current.flags & 131072) && (didReceiveUpdate = !0);\n      else\n        return (\n          (workInProgress.lanes = current.lanes),\n          bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n        );\n  }\n  return updateFunctionComponent(\n    current,\n    workInProgress,\n    Component,\n    nextProps,\n    renderLanes\n  );\n}\nfunction updateOffscreenComponent(current, workInProgress, renderLanes) {\n  var nextProps = workInProgress.pendingProps,\n    nextChildren = nextProps.children,\n    prevState = null !== current ? current.memoizedState : null;\n  if ("hidden" === nextProps.mode) {\n    if (0 !== (workInProgress.flags & 128)) {\n      nextProps =\n        null !== prevState ? prevState.baseLanes | renderLanes : renderLanes;\n      if (null !== current) {\n        nextChildren = workInProgress.child = current.child;\n        for (prevState = 0; null !== nextChildren; )\n          (prevState =\n            prevState | nextChildren.lanes | nextChildren.childLanes),\n            (nextChildren = nextChildren.sibling);\n        workInProgress.childLanes = prevState & ~nextProps;\n      } else (workInProgress.childLanes = 0), (workInProgress.child = null);\n      return deferHiddenOffscreenComponent(\n        current,\n        workInProgress,\n        nextProps,\n        renderLanes\n      );\n    }\n    if (0 !== (renderLanes & 536870912))\n      (workInProgress.memoizedState = { baseLanes: 0, cachePool: null }),\n        null !== current &&\n          pushTransition(\n            workInProgress,\n            null !== prevState ? prevState.cachePool : null\n          ),\n        null !== prevState\n          ? pushHiddenContext(workInProgress, prevState)\n          : reuseHiddenContextOnStack(),\n        pushOffscreenSuspenseHandler(workInProgress);\n    else\n      return (\n        (workInProgress.lanes = workInProgress.childLanes = 536870912),\n        deferHiddenOffscreenComponent(\n          current,\n          workInProgress,\n          null !== prevState ? prevState.baseLanes | renderLanes : renderLanes,\n          renderLanes\n        )\n      );\n  } else\n    null !== prevState\n      ? (pushTransition(workInProgress, prevState.cachePool),\n        pushHiddenContext(workInProgress, prevState),\n        reuseSuspenseHandlerOnStack(workInProgress),\n        (workInProgress.memoizedState = null))\n      : (null !== current && pushTransition(workInProgress, null),\n        reuseHiddenContextOnStack(),\n        reuseSuspenseHandlerOnStack(workInProgress));\n  reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n  return workInProgress.child;\n}\nfunction deferHiddenOffscreenComponent(\n  current,\n  workInProgress,\n  nextBaseLanes,\n  renderLanes\n) {\n  var JSCompiler_inline_result = peekCacheFromPool();\n  JSCompiler_inline_result =\n    null === JSCompiler_inline_result\n      ? null\n      : { parent: CacheContext._currentValue, pool: JSCompiler_inline_result };\n  workInProgress.memoizedState = {\n    baseLanes: nextBaseLanes,\n    cachePool: JSCompiler_inline_result\n  };\n  null !== current && pushTransition(workInProgress, null);\n  reuseHiddenContextOnStack();\n  pushOffscreenSuspenseHandler(workInProgress);\n  null !== current &&\n    propagateParentContextChanges(current, workInProgress, renderLanes, !0);\n  return null;\n}\nfunction markRef(current, workInProgress) {\n  var ref = workInProgress.ref;\n  if (null === ref)\n    null !== current &&\n      null !== current.ref &&\n      (workInProgress.flags |= 4194816);\n  else {\n    if ("function" !== typeof ref && "object" !== typeof ref)\n      throw Error(formatProdErrorMessage(284));\n    if (null === current || current.ref !== ref)\n      workInProgress.flags |= 4194816;\n  }\n}\nfunction updateFunctionComponent(\n  current,\n  workInProgress,\n  Component,\n  nextProps,\n  renderLanes\n) {\n  prepareToReadContext(workInProgress);\n  Component = renderWithHooks(\n    current,\n    workInProgress,\n    Component,\n    nextProps,\n    void 0,\n    renderLanes\n  );\n  nextProps = checkDidRenderIdHook();\n  if (null !== current && !didReceiveUpdate)\n    return (\n      bailoutHooks(current, workInProgress, renderLanes),\n      bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n    );\n  isHydrating && nextProps && pushMaterializedTreeId(workInProgress);\n  workInProgress.flags |= 1;\n  reconcileChildren(current, workInProgress, Component, renderLanes);\n  return workInProgress.child;\n}\nfunction replayFunctionComponent(\n  current,\n  workInProgress,\n  nextProps,\n  Component,\n  secondArg,\n  renderLanes\n) {\n  prepareToReadContext(workInProgress);\n  workInProgress.updateQueue = null;\n  nextProps = renderWithHooksAgain(\n    workInProgress,\n    Component,\n    nextProps,\n    secondArg\n  );\n  finishRenderingHooks(current);\n  Component = checkDidRenderIdHook();\n  if (null !== current && !didReceiveUpdate)\n    return (\n      bailoutHooks(current, workInProgress, renderLanes),\n      bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n    );\n  isHydrating && Component && pushMaterializedTreeId(workInProgress);\n  workInProgress.flags |= 1;\n  reconcileChildren(current, workInProgress, nextProps, renderLanes);\n  return workInProgress.child;\n}\nfunction updateClassComponent(\n  current,\n  workInProgress,\n  Component,\n  nextProps,\n  renderLanes\n) {\n  prepareToReadContext(workInProgress);\n  if (null === workInProgress.stateNode) {\n    var context = emptyContextObject,\n      contextType = Component.contextType;\n    "object" === typeof contextType &&\n      null !== contextType &&\n      (context = readContext(contextType));\n    context = new Component(nextProps, context);\n    workInProgress.memoizedState =\n      null !== context.state && void 0 !== context.state ? context.state : null;\n    context.updater = classComponentUpdater;\n    workInProgress.stateNode = context;\n    context._reactInternals = workInProgress;\n    context = workInProgress.stateNode;\n    context.props = nextProps;\n    context.state = workInProgress.memoizedState;\n    context.refs = {};\n    initializeUpdateQueue(workInProgress);\n    contextType = Component.contextType;\n    context.context =\n      "object" === typeof contextType && null !== contextType\n        ? readContext(contextType)\n        : emptyContextObject;\n    context.state = workInProgress.memoizedState;\n    contextType = Component.getDerivedStateFromProps;\n    "function" === typeof contextType &&\n      (applyDerivedStateFromProps(\n        workInProgress,\n        Component,\n        contextType,\n        nextProps\n      ),\n      (context.state = workInProgress.memoizedState));\n    "function" === typeof Component.getDerivedStateFromProps ||\n      "function" === typeof context.getSnapshotBeforeUpdate ||\n      ("function" !== typeof context.UNSAFE_componentWillMount &&\n        "function" !== typeof context.componentWillMount) ||\n      ((contextType = context.state),\n      "function" === typeof context.componentWillMount &&\n        context.componentWillMount(),\n      "function" === typeof context.UNSAFE_componentWillMount &&\n        context.UNSAFE_componentWillMount(),\n      contextType !== context.state &&\n        classComponentUpdater.enqueueReplaceState(context, context.state, null),\n      processUpdateQueue(workInProgress, nextProps, context, renderLanes),\n      suspendIfUpdateReadFromEntangledAsyncAction(),\n      (context.state = workInProgress.memoizedState));\n    "function" === typeof context.componentDidMount &&\n      (workInProgress.flags |= 4194308);\n    nextProps = !0;\n  } else if (null === current) {\n    context = workInProgress.stateNode;\n    var unresolvedOldProps = workInProgress.memoizedProps,\n      oldProps = resolve
1ClassComponentProps(Component, unresolvedOldProps);\n    context.props = oldProps;\n    var oldContext = context.context,\n      contextType$jscomp$0 = Component.contextType;\n    contextType = emptyContextObject;\n    "object" === typeof contextType$jscomp$0 &&\n      null !== contextType$jscomp$0 &&\n      (contextType = readContext(contextType$jscomp$0));\n    var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n    contextType$jscomp$0 =\n      "function" === typeof getDerivedStateFromProps ||\n      "function" === typeof context.getSnapshotBeforeUpdate;\n    unresolvedOldProps = workInProgress.pendingProps !== unresolvedOldProps;\n    contextType$jscomp$0 ||\n      ("function" !== typeof context.UNSAFE_componentWillReceiveProps &&\n        "function" !== typeof context.componentWillReceiveProps) ||\n      ((unresolvedOldProps || oldContext !== contextType) &&\n        callComponentWillReceiveProps(\n          workInProgress,\n          context,\n          nextProps,\n          contextType\n        ));\n    hasForceUpdate = !1;\n    var oldState = workInProgress.memoizedState;\n    context.state = oldState;\n    processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n    suspendIfUpdateReadFromEntangledAsyncAction();\n    oldContext = workInProgress.memoizedState;\n    unresolvedOldProps || oldState !== oldContext || hasForceUpdate\n      ? ("function" === typeof getDerivedStateFromProps &&\n          (applyDerivedStateFromProps(\n            workInProgress,\n            Component,\n            getDerivedStateFromProps,\n            nextProps\n          ),\n          (oldContext = workInProgress.memoizedState)),\n        (oldProps =\n          hasForceUpdate ||\n          checkShouldComponentUpdate(\n            workInProgress,\n            Component,\n            oldProps,\n            nextProps,\n            oldState,\n            oldContext,\n            contextType\n          ))\n          ? (contextType$jscomp$0 ||\n              ("function" !== typeof context.UNSAFE_componentWillMount &&\n                "function" !== typeof context.componentWillMount) ||\n              ("function" === typeof context.componentWillMount &&\n                context.componentWillMount(),\n              "function" === typeof context.UNSAFE_componentWillMount &&\n                context.UNSAFE_componentWillMount()),\n            "function" === typeof context.componentDidMount &&\n              (workInProgress.flags |= 4194308))\n          : ("function" === typeof context.componentDidMount &&\n              (workInProgress.flags |= 4194308),\n            (workInProgress.memoizedProps = nextProps),\n            (workInProgress.memoizedState = oldContext)),\n        (context.props = nextProps),\n        (context.state = oldContext),\n        (context.context = contextType),\n        (nextProps = oldProps))\n      : ("function" === typeof context.componentDidMount &&\n          (workInProgress.flags |= 4194308),\n        (nextProps = !1));\n  } else {\n    context = workInProgress.stateNode;\n    cloneUpdateQueue(current, workInProgress);\n    contextType = workInProgress.memoizedProps;\n    contextType$jscomp$0 = resolveClassComponentProps(Component, contextType);\n    context.props = contextType$jscomp$0;\n    getDerivedStateFromProps = workInProgress.pendingProps;\n    oldState = context.context;\n    oldContext = Component.contextType;\n    oldProps = emptyContextObject;\n    "object" === typeof oldContext &&\n      null !== oldContext &&\n      (oldProps = readContext(oldContext));\n    unresolvedOldProps = Component.getDerivedStateFromProps;\n    (oldContext =\n      "function" === typeof unresolvedOldProps ||\n      "function" === typeof context.getSnapshotBeforeUpdate) ||\n      ("function" !== typeof context.UNSAFE_componentWillReceiveProps &&\n        "function" !== typeof context.componentWillReceiveProps) ||\n      ((contextType !== getDerivedStateFromProps || oldState !== oldProps) &&\n        callComponentWillReceiveProps(\n          workInProgress,\n          context,\n          nextProps,\n          oldProps\n        ));\n    hasForceUpdate = !1;\n    oldState = workInProgress.memoizedState;\n    context.state = oldState;\n    processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n    suspendIfUpdateReadFromEntangledAsyncAction();\n    var newState = workInProgress.memoizedState;\n    contextType !== getDerivedStateFromProps ||\n    oldState !== newState ||\n    hasForceUpdate ||\n    (null !== current &&\n      null !== current.dependencies &&\n      checkIfContextChanged(current.dependencies))\n      ? ("function" === typeof unresolvedOldProps &&\n          (applyDerivedStateFromProps(\n            workInProgress,\n            Component,\n            unresolvedOldProps,\n            nextProps\n          ),\n          (newState = workInProgress.memoizedState)),\n        (contextType$jscomp$0 =\n          hasForceUpdate ||\n          checkShouldComponentUpdate(\n            workInProgress,\n            Component,\n            contextType$jscomp$0,\n            nextProps,\n            oldState,\n            newState,\n            oldProps\n          ) ||\n          (null !== current &&\n            null !== current.dependencies &&\n            checkIfContextChanged(current.dependencies)))\n          ? (oldContext ||\n              ("function" !== typeof context.UNSAFE_componentWillUpdate &&\n                "function" !== typeof context.componentWillUpdate) ||\n              ("function" === typeof context.componentWillUpdate &&\n                context.componentWillUpdate(nextProps, newState, oldProps),\n              "function" === typeof context.UNSAFE_componentWillUpdate &&\n                context.UNSAFE_componentWillUpdate(\n                  nextProps,\n                  newState,\n                  oldProps\n                )),\n            "function" === typeof context.componentDidUpdate &&\n              (workInProgress.flags |= 4),\n            "function" === typeof context.getSnapshotBeforeUpdate &&\n              (workInProgress.flags |= 1024))\n          : ("function" !== typeof context.componentDidUpdate ||\n              (contextType === current.memoizedProps &&\n                oldState === current.memoizedState) ||\n              (workInProgress.flags |= 4),\n            "function" !== typeof context.getSnapshotBeforeUpdate ||\n              (contextType === current.memoizedProps &&\n                oldState === current.memoizedState) ||\n              (workInProgress.flags |= 1024),\n            (workInProgress.memoizedProps = nextProps),\n            (workInProgress.memoizedState = newState)),\n        (context.props = nextProps),\n        (context.state = newState),\n        (context.context = oldProps),\n        (nextProps = contextType$jscomp$0))\n      : ("function" !== typeof context.componentDidUpdate ||\n          (contextType === current.memoizedProps &&\n            oldState === current.memoizedState) ||\n          (workInProgress.flags |= 4),\n        "function" !== typeof context.getSnapshotBeforeUpdate ||\n          (contextType === current.memoizedProps &&\n            oldState === current.memoizedState) ||\n          (workInProgress.flags |= 1024),\n        (nextProps = !1));\n  }\n  context = nextProps;\n  markRef(current, workInProgress);\n  nextProps = 0 !== (workInProgress.flags & 128);\n  context || nextProps\n    ? ((context = workInProgress.stateNode),\n      (Component =\n        nextProps && "function" !== typeof Component.getDerivedStateFromError\n          ? null\n          : context.render()),\n      (workInProgress.flags |= 1),\n      null !== current && nextProps\n        ? ((workInProgress.child = reconcileChildFibers(\n            workInProgress,\n            current.child,\n            null,\n            renderLanes\n          )),\n          (workInProgress.child = reconcileChildFibers(\n            workInProgress,\n            null,\n            Component,\n            renderLanes\n          )))\n        : reconcileChildren(current, workInProgress, Component, renderLanes),\n      (workInProgress.memoizedState = context.state),\n      (current = workInProgress.child))\n    : (current = bailoutOnAlreadyFinishedWork(\n        current,\n        workInProgress,\n        renderLanes\n      ));\n  return current;\n}\nfunction mountHostRootWithoutHydrating(\n  current,\n  workInProgress,\n  nextChildren,\n  renderLanes\n) {\n  resetHydrationState();\n  workInProgress.flags |= 256;\n  reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n  return workInProgress.child;\n}\nvar SUSPENDED_MARKER = {\n  dehydrated: null,\n  treeContext: null,\n  retryLane: 0,\n  hydrationErrors: null\n};\nfunction mountSuspenseOffscreenState(renderLanes) {\n  return { baseLanes: renderLanes, cachePool: getSuspendedCache() };\n}\nfunction getRemainingWorkInPrimaryTree(\n  current,\n  primaryTreeDidDefer,\n  renderLanes\n) {\n  current = null !== current ? current.childLanes & ~renderLanes : 0;\n  primaryTreeDidDefer && (current |= workInProgressDeferredLane);\n  return current;\n}\nfunction updateSuspenseComponent(current, workInProgress, renderLanes) {\n  var nextProps = workInProgress.pendingProps,\n    showFallback = !1,\n    didSuspend = 0 !== (workInProgress.flags & 128),\n    JSCompiler_temp;\n  (JSCompiler_temp = didSuspend) ||\n    (JSCompiler_temp =\n      null !== current && null === current.memoizedState\n        ? !1\n        : 0 !== (suspenseStackCursor.current & 2));
1\n  JSCompiler_temp && ((showFallback = !0), (workInProgress.flags &= -129));\n  JSCompiler_temp = 0 !== (workInProgress.flags & 32);\n  workInProgress.flags &= -33;\n  if (null === current) {\n    if (isHydrating) {\n      showFallback\n        ? pushPrimaryTreeSuspenseHandler(workInProgress)\n        : reuseSuspenseHandlerOnStack(workInProgress);\n      if (isHydrating) {\n        var nextInstance = nextHydratableInstance,\n          JSCompiler_temp$jscomp$0;\n        if ((JSCompiler_temp$jscomp$0 = nextInstance)) {\n          c: {\n            JSCompiler_temp$jscomp$0 = nextInstance;\n            for (\n              nextInstance = rootOrSingletonContext;\n              8 !== JSCompiler_temp$jscomp$0.nodeType;\n\n            ) {\n              if (!nextInstance) {\n                nextInstance = null;\n                break c;\n              }\n              JSCompiler_temp$jscomp$0 = getNextHydratable(\n                JSCompiler_temp$jscomp$0.nextSibling\n              );\n              if (null === JSCompiler_temp$jscomp$0) {\n                nextInstance = null;\n                break c;\n              }\n            }\n            nextInstance = JSCompiler_temp$jscomp$0;\n          }\n          null !== nextInstance\n            ? ((workInProgress.memoizedState = {\n                dehydrated: nextInstance,\n                treeContext:\n                  null !== treeContextProvider\n                    ? { id: treeContextId, overflow: treeContextOverflow }\n                    : null,\n                retryLane: 536870912,\n                hydrationErrors: null\n              }),\n              (JSCompiler_temp$jscomp$0 = createFiberImplClass(\n                18,\n                null,\n                null,\n                0\n              )),\n              (JSCompiler_temp$jscomp$0.stateNode = nextInstance),\n              (JSCompiler_temp$jscomp$0.return = workInProgress),\n              (workInProgress.child = JSCompiler_temp$jscomp$0),\n              (hydrationParentFiber = workInProgress),\n              (nextHydratableInstance = null),\n              (JSCompiler_temp$jscomp$0 = !0))\n            : (JSCompiler_temp$jscomp$0 = !1);\n        }\n        JSCompiler_temp$jscomp$0 || throwOnHydrationMismatch(workInProgress);\n      }\n      nextInstance = workInProgress.memoizedState;\n      if (\n        null !== nextInstance &&\n        ((nextInstance = nextInstance.dehydrated), null !== nextInstance)\n      )\n        return (\n          isSuspenseInstanceFallback(nextInstance)\n            ? (workInProgress.lanes = 32)\n            : (workInProgress.lanes = 536870912),\n          null\n        );\n      popSuspenseHandler(workInProgress);\n    }\n    nextInstance = nextProps.children;\n    nextProps = nextProps.fallback;\n    if (showFallback)\n      return (\n        reuseSuspenseHandlerOnStack(workInProgress),\n        (showFallback = workInProgress.mode),\n        (nextInstance = mountWorkInProgressOffscreenFiber(\n          { mode: "hidden", children: nextInstance },\n          showFallback\n        )),\n        (nextProps = createFiberFromFragment(\n          nextProps,\n          showFallback,\n          renderLanes,\n          null\n        )),\n        (nextInstance.return = workInProgress),\n        (nextProps.return = workInProgress),\n        (nextInstance.sibling = nextProps),\n        (workInProgress.child = nextInstance),\n        (showFallback = workInProgress.child),\n        (showFallback.memoizedState = mountSuspenseOffscreenState(renderLanes)),\n        (showFallback.childLanes = getRemainingWorkInPrimaryTree(\n          current,\n          JSCompiler_temp,\n          renderLanes\n        )),\n        (workInProgress.memoizedState = SUSPENDED_MARKER),\n        nextProps\n      );\n    pushPrimaryTreeSuspenseHandler(workInProgress);\n    return mountSuspensePrimaryChildren(workInProgress, nextInstance);\n  }\n  JSCompiler_temp$jscomp$0 = current.memoizedState;\n  if (\n    null !== JSCompiler_temp$jscomp$0 &&\n    ((nextInstance = JSCompiler_temp$jscomp$0.dehydrated),\n    null !== nextInstance)\n  ) {\n    if (didSuspend)\n      workInProgress.flags & 256\n        ? (pushPrimaryTreeSuspenseHandler(workInProgress),\n          (workInProgress.flags &= -257),\n          (workInProgress = retrySuspenseComponentWithoutHydrating(\n            current,\n            workInProgress,\n            renderLanes\n          )))\n        : null !== workInProgress.memoizedState\n          ? (reuseSuspenseHandlerOnStack(workInProgress),\n            (workInProgress.child = current.child),\n            (workInProgress.flags |= 128),\n            (workInProgress = null))\n          : (reuseSuspenseHandlerOnStack(workInProgress),\n            (showFallback = nextProps.fallback),\n            (nextInstance = workInProgress.mode),\n            (nextProps = mountWorkInProgressOffscreenFiber(\n              { mode: "visible", children: nextProps.children },\n              nextInstance\n            )),\n            (showFallback = createFiberFromFragment(\n              showFallback,\n              nextInstance,\n              renderLanes,\n              null\n            )),\n            (showFallback.flags |= 2),\n            (nextProps.return = w
1orkInProgress),\n            (showFallback.return = workInProgress),\n            (nextProps.sibling = showFallback),\n            (workInProgress.child = nextProps),\n            reconcileChildFibers(\n              workInProgress,\n              current.child,\n              null,\n              renderLanes\n            ),\n            (nextProps = workInProgress.child),\n            (nextProps.memoizedState =\n              mountSuspenseOffscreenState(renderLanes)),\n            (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n              current,\n              JSCompiler_temp,\n              renderLanes\n            )),\n            (workInProgress.memoizedState = SUSPENDED_MARKER),\n            (workInProgress = showFallback));\n    else if (\n      (pushPrimaryTreeSuspenseHandler(workInProgress),\n      isSuspenseInstanceFallback(nextInstance))\n    ) {\n      JSCompiler_temp =\n        nextInstance.nextSibling && nextInstance.nextSibling.dataset;\n      if (JSCompiler_temp) var digest = JSCompiler_temp.dgst;\n      JSCompiler_temp = digest;\n      nextProps = Error(formatProdErrorMessage(419));\n      nextProps.stack = "";\n      nextProps.digest = JSCompiler_temp;\n      queueHydrationError({ value: nextProps, source: null, stack: null });\n      workInProgress = retrySuspenseComponentWithoutHydrating(\n        current,\n        workInProgress,\n        renderLanes\n      );\n    } else if (\n      (didReceiveUpdate ||\n        propagateParentContextChanges(current, workInProgress, renderLanes, !1),\n      (JSCompiler_temp = 0 !== (renderLanes & current.childLanes)),\n      didReceiveUpdate || JSCompiler_temp)\n    ) {\n      JSCompiler_temp = workInProgressRoot;\n      if (\n        null !== JSCompiler_temp &&\n        ((nextProps = renderLanes & -renderLanes),\n        (nextProps =\n          0 !== (nextProps & 42)\n            ? 1\n            : getBumpedLaneForHydrationByLane(nextProps)),\n        (nextProps =\n          0 !== (nextProps & (JSCompiler_temp.suspendedLanes | renderLanes))\n            ? 0\n            : nextProps),\n        0 !== nextProps && nextProps !== JSCompiler_temp$jscomp$0.retryLane)\n      )\n        throw (\n          ((JSCompiler_temp$jscomp$0.retryLane = nextProps),\n          enqueueConcurrentRenderForLane(current, nextProps),\n          scheduleUpdateOnFiber(JSCompiler_temp, current, nextProps),\n          SelectiveHydrationException)\n        );\n      "$?" === nextInstance.data || renderDidSuspendDelayIfPossible();\n      workInProgress = retrySuspenseComponentWithoutHydrating(\n        current,\n        workInProgress,\n        renderLanes\n      );\n    } else\n      "$?" === nextInstance.data\n        ? ((workInProgress.flags |= 192),\n          (workInProgress.child = current.child),\n          (workInProgress = null))\n        : ((current = JSCompiler_temp$jscomp$0.treeContext),\n          (nextHydratableInstance = getNextHydratable(\n            nextInstance.nextSibling\n          )),\n          (hydrationParentFiber = workInProgress),\n          (isHydrating = !0),\n          (hydrationErrors = null),\n          (rootOrSingletonContext = !1),\n          null !== current &&\n            ((idStack[idStackIndex++] = treeContextId),\n            (idStack[idStackIndex++] = treeContextOverflow),\n            (idStack[idStackIndex++] = treeContextProvider),\n            (treeContextId = current.id),\n            (treeContextOverflow = current.overflow),\n            (treeContextProvider = workInProgress)),\n          (workInProgress = mountSuspensePrimaryChildren(\n            workInProgress,\n            nextProps.children\n          )),\n          (workInProgress.flags |= 4096));\n    return workInProgress;\n  }\n  if (showFallback)\n    return (\n      reuseSuspenseHandlerOnStack(workInProgress),\n      (showFallback = nextProps.fallback),\n      (nextInstance = workInProgress.mode),\n      (JSCompiler_temp$jscomp$0 = current.child),\n      (digest = JSCompiler_temp$jscomp$0.sibling),\n      (nextProps = createWorkInProgress(JSCompiler_temp$jscomp$0, {\n        mode: "hidden",\n        children: nextProps.children\n      })),\n      (nextProps.subtreeFlags =\n        JSCompiler_temp$jscomp$0.subtreeFlags & 65011712),\n      null !== digest\n        ? (showFallback = createWorkInProgress(digest, showFallback))\n        : ((showFallback = createFiberFromFragment(\n            showFallback,\n            nextInstance,\n            renderLanes,\n            null\n          )),\n          (showFallback.flags |= 2)),\n      (showFallback.return = w
1orkInProgress),\n      (nextProps.return = workInProgress),\n      (nextProps.sibling = showFallback),\n      (workInProgress.child = nextProps),\n      (nextProps = showFallback),\n      (showFallback = workInProgress.child),\n      (nextInstance = current.child.memoizedState),\n      null === nextInstance\n        ? (nextInstance = mountSuspenseOffscreenState(renderLanes))\n        : ((JSCompiler_temp$jscomp$0 = nextInstance.cachePool),\n          null !== JSCompiler_temp$jscomp$0\n            ? ((digest = CacheContext._currentValue),\n              (JSCompiler_temp$jscomp$0 =\n                JSCompiler_temp$jscomp$0.parent !== digest\n                  ? { parent: digest, pool: digest }\n                  : JSCompiler_temp$jscomp$0))\n            : (JSCompiler_temp$jscomp$0 = getSuspendedCache()),\n          (nextInstance = {\n            baseLanes: nextInstance.baseLanes | renderLanes,\n            cachePool: JSCompiler_temp$jscomp$0\n          })),\n      (showFallback.memoizedState = nextInstance),\n      (showFallback.childLanes = getRemainingWorkInPrimaryTree(\n        current,\n        JSCompiler_temp,\n        renderLanes\n      )),\n      (workInProgress.memoizedState = SUSPENDED_MARKER),\n      nextProps\n    );\n  pushPrimaryTreeSuspenseHandler(workInProgress);\n  renderLanes = current.child;\n  current = renderLanes.sibling;\n  renderLanes = createWorkInProgress(renderLanes, {\n    mode: "visible",\n    children: nextProps.children\n  });\n  renderLanes.return = workInProgress;\n  renderLanes.sibling = null;\n  null !== current &&\n    ((JSCompiler_temp = workInProgress.deletions),\n    null === JSCompiler_temp\n      ? ((workInProgress.deletions = [current]), (workInProgress.flags |= 16))\n      : JSCompiler_temp.push(current));\n  workInProgress.child = renderLanes;\n  workInProgress.memoizedState = null;\n  return renderLanes;\n}\nfunction mountSuspensePrimaryChildren(workInProgress, primaryChildren) {\n  primaryChildren = mountWorkInProgressOffscreenFiber(\n    { mode: "visible", children: primaryChildren },\n    workInProgress.mode\n  );\n  primaryChildren.return = workInProgress;\n  return (workInProgress.child = primaryChildren);\n}\nfunction mountWorkInProgressOffscreenFiber(offscreenProps, mode) {\n  offscreenProps = createFiberImplClass(22, offscreenProps, null, mode);\n  offscreenProps.lanes = 0;\n  offscreenProps.stateNode = {\n    _visibility: 1,\n    _pendingMarkers: null,\n    _retryCache: null,\n    _transitions: null\n  };\n  return offscreenProps;\n}\nfunction retrySuspenseComponentWithoutHydrating(\n  current,\n  workInProgress,\n  renderLanes\n) {\n  reconcileChildFibers(workInProgress, current.child, null, renderLanes);\n  current = mountSuspensePrimaryChildren(\n    workInProgress,\n    workInProgress.pendingProps.children\n  );\n  current.flags |= 2;\n  workInProgress.memoizedState = null;\n  return current;\n}\nfunction scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) {\n  fiber.lanes |= renderLanes;\n  var alternate = fiber.alternate;\n  null !== alternate && (alternate.lanes |= renderLanes);\n  scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot);\n}\nfunction initSuspenseListRenderState(\n  workInProgress,\n  isBackwards,\n  tail,\n  lastContentRow,\n  tailMode\n) {\n  var renderState = workInProgress.memoizedState;\n  null === renderState\n    ? (workInProgress.memoizedState = {\n        isBackwards: isBackwards,\n        rendering: null,\n        renderingStartTime: 0,\n        last: lastContentRow,\n        tail: tail,\n        tailMode: tailMode\n      })\n    : ((renderState.isBackwards = isBackwards),\n      (renderState.rendering = null),\n      (renderState.renderingStartTime = 0),\n      (renderState.last = lastContentRow),\n      (renderState.tail = tail),\n      (renderState.tailMode = tailMode));\n}\nfunction updateSuspenseListComponent(current, workInProgress, renderLanes) {\n  var nextProps = workInProgress.pendingProps,\n    revealOrder = nextProps.revealOrder,\n    tailMode = nextProps.tail;\n  reconcileChildren(current, workInProgress, nextProps.children, renderLanes);\n  nextProps = suspenseStackCursor.current;\n  if (0 !== (nextProps & 2))\n    (nextProps = (nextProps & 1) | 2), (workInProgress.flags |= 128);\n  else {\n    if (null !== current && 0 !== (current.flags & 128))\n      a: for (current = workInProgress.child; null !== current; ) {\n        if (13 === current.tag)\n          null !== current.memoizedState &&\n            scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n        else if (19 === current.tag)\n          scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n        else if (null !== current.child) {\n          current.child.return = current;\n          current = current.child;\n          continue;\n        }\n        if (current === workInProgress) break a;\n        for (; null === current.sibling; ) {\n          if (null === current.return || current.return === workInProgress)\n            break a;\n          current = current.return;\n        }\n        current.sibling.return = current.return;\n        current = current.sibling;\n      }\n    nextProps &= 1;\n  }\n  push(suspenseStackCursor, nextProps);\n  switch (revealOrder) {\n    case "forwards":\n      renderLanes = w
1orkInProgress.child;\n      for (revealOrder = null; null !== renderLanes; )\n        (current = renderLanes.alternate),\n          null !== current &&\n            null === findFirstSuspended(current) &&\n            (revealOrder = renderLanes),\n          (renderLanes = renderLanes.sibling);\n      renderLanes = revealOrder;\n      null === renderLanes\n        ? ((revealOrder = workInProgress.child), (workInProgress.child = null))\n        : ((revealOrder = renderLanes.sibling), (renderLanes.sibling = null));\n      initSuspenseListRenderState(\n        workInProgress,\n        !1,\n        revealOrder,\n        renderLanes,\n        tailMode\n      );\n      break;\n    case "backwards":\n      renderLanes = null;\n      revealOrder = workInProgress.child;\n      for (workInProgress.child = null; null !== revealOrder; ) {\n        current = revealOrder.alternate;\n        if (null !== current && null === findFirstSuspended(current)) {\n          workInProgress.child = revealOrder;\n          break;\n        }\n        current = revealOrder.sibling;\n        revealOrder.sibling = renderLanes;\n        renderLanes = revealOrder;\n        revealOrder = current;\n      }\n      initSuspenseListRenderState(\n        workInProgress,\n        !0,\n        renderLanes,\n        null,\n        tailMode\n      );\n      break;\n    case "together":\n      initSuspenseListRenderState(workInProgress, !1, null, null, void 0);\n      break;\n    default:\n      workInProgress.memoizedState = null;\n  }\n  return workInProgress.child;\n}\nfunction bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) {\n  null !== current && (workInProgress.dependencies = current.dependencies);\n  workInProgressRootSkippedLanes |= workInProgress.lanes;\n  if (0 === (renderLanes & workInProgress.childLanes))\n    if (null !== current) {\n      if (\n        (propagateParentContextChanges(\n          current,\n          workInProgress,\n          renderLanes,\n          !1\n        ),\n        0 === (renderLanes & workInProgress.childLanes))\n      )\n        return null;\n    } else return null;\n  if (null !== current && workInProgress.child !== current.child)\n    throw Error(formatProdErrorMessage(153));\n  if (null !== workInProgress.child) {\n    current = workInProgress.child;\n    renderLanes = createWorkInProgress(current, current.pendingProps);\n    workInProgress.child = renderLanes;\n    for (renderLanes.return = workInProgress; null !== current.sibling; )\n      (current = current.sibling),\n        (renderLanes = renderLanes.sibling =\n          createWorkInProgress(current, current.pendingProps)),\n        (renderLanes.return = workInProgress);\n    renderLanes.sibling = null;\n  }\n  return workInProgress.child;\n}\nfunction checkScheduledUpdateOrContext(current, renderLanes) {\n  if (0 !== (current.lanes & renderLanes)) return !0;\n  current = current.dependencies;\n  return null !== current && checkIfContextChanged(current) ? !0 : !1;\n}\nfunction attemptEarlyBailoutIfNoScheduledUpdate(\n  current,\n  workInProgress,\n  renderLanes\n) {\n  switch (workInProgress.tag) {\n    case 3:\n      pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n      pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n      resetHydrationState();\n      break;\n    case 27:\n    case 5:\n      pushHostContext(workInProgress);\n      break;\n    case 4:\n      pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n      break;\n    case 10:\n      pushProvider(\n        workInProgress,\n        workInProgress.type,\n        workInProgress.memoizedProps.value\n      );\n      break;\n    case 13:\n      var state = workInProgress.memoizedState;\n      if (null !== state) {\n        if (null !== state.dehydrated)\n          return (\n            pushPrimaryTreeSuspenseHandler(workInProgress),\n            (workInProgress.flags |= 128),\n            null\n          );\n        if (0 !== (renderLanes & workInProgress.child.childLanes))\n          return updateSuspenseComponent(current, workInProgress, renderLanes);\n        pushPrimaryTreeSuspenseHandler(workInProgress);\n        current = bailoutOnAlreadyFinishedWork(\n          current,\n          workInProgress,\n          renderLanes\n        );\n        return null !== current ? current.sibling : null;\n      }\n      pushPrimaryTreeSuspenseHandler(workInProgress);\n      break;\n    case 19:\n      var didSuspendBefore = 0 !== (current.flags & 128);\n      state = 0 !== (renderLanes & workInProgress.childLanes);\n      state ||\n        (propagateParentContextChanges(\n          current,\n          workInProgress,\n          renderLanes,\n          !1\n        ),\n        (state = 0 !== (renderLanes & workInProgress.childLanes)));\n      if (didSuspendBefore) {\n        if (state)\n          return updateSuspenseListComponent(\n            current,\n            workInProgress,\n            renderLanes\n          );\n        workInProgress.flags |= 128;\n      }\n      didSuspendBefore = workInProgress.memoizedState;\n      null !== didSuspendBefore &&\n        ((didSuspendBefore.rendering = null),\n        (didSuspendBefore.tail = null),\n        (didSuspendBefore.lastEffect = null));\n      push(suspenseStackCursor, suspenseStackCursor.current);\n      if (state) break;\n      else return null;\n    case 22:\n    case 23:\n      return (\n        (workInProgress.lanes = 0),\n        updateOffscreenComponent(current, workInProgress, renderLanes)\n      );\n    case 24:\n      pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n  }\n  return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n}\nfunction beginWork(current, workInProgress, renderLanes) {\n  if (null !== current)\n    if (current.memoizedProps !== workInProgress.pendingProps)\n      didReceiveUpdate = !0;\n    else {\n      if (\n        !checkScheduledUpdateOrContext(current, renderLanes) &&\n        0 === (workInProgress.flags & 128)\n      )\n        return (\n          (didReceiveUpdate = !1),\n          attemptEarlyBailoutIfNoScheduledUpdate(\n            current,\n            workInProgress,\n            renderLanes\n          )\n        );\n      didReceiveUpdate = 0 !== (current.flags & 131072) ? !0 : !1;\n    }\n  else\n    (didReceiveUpdate = !1),\n      isHydrating &&\n        0 !== (workInProgress.flags & 1048576) &&\n        pushTreeId(workInProgress, treeForkCount, workInProgress.index);\n  workInProgress.lanes = 0;\n  switch (workInProgress.tag) {\n    case 16:\n      a: {\n        current = workInProgress.pendingProps;\n        var lazyComponent = workInProgress.elementType,\n          init = lazyComponent._init;\n        lazyComponent = init(lazyComponent._payload);\n        workInProgress.type = lazyComponent;\n        if ("function" === typeof lazyComponent)\n          shouldConstruct(lazyComponent)\n            ? ((current = resolve
1ClassComponentProps(lazyComponent, current)),\n              (workInProgress.tag = 1),\n              (workInProgress = updateClassComponent(\n                null,\n                workInProgress,\n                lazyComponent,\n                current,\n                renderLanes\n              )))\n            : ((workInProgress.tag = 0),\n              (workInProgress = updateFunctionComponent(\n                null,\n                workInProgress,\n                lazyComponent,\n                current,\n                renderLanes\n              )));\n        else {\n          if (void 0 !== lazyComponent && null !== lazyComponent)\n            if (\n              ((init = lazyComponent.$$typeof), init === REACT_FORWARD_REF_TYPE)\n            ) {\n              workInProgress.tag = 11;\n              workInProgress = updateForwardRef(\n                null,\n                workInProgress,\n                lazyComponent,\n                current,\n                renderLanes\n              );\n              break a;\n            } else if (init === REACT_MEMO_TYPE) {\n              workInProgress.tag = 14;\n              workInProgress = updateMemoComponent(\n                null,\n                workInProgress,\n                lazyComponent,\n                current,\n                renderLanes\n              );\n              break a;\n            }\n          workInProgress =\n            getComponentNameFromType(lazyComponent) || lazyComponent;\n          throw Error(formatProdErrorMessage(306, workInProgress, ""));\n        }\n      }\n      return workInProgress;\n    case 0:\n      return updateFunctionComponent(\n        current,\n        workInProgress,\n        workInProgress.type,\n        workInProgress.pendingProps,\n        renderLanes\n      );\n    case 1:\n      return (\n        (lazyComponent = workInProgress.type),\n        (init = resolveClassComponentProps(\n          lazyComponent,\n          workInProgress.pendingProps\n        )),\n        updateClassComponent(\n          current,\n          workInProgress,\n          lazyComponent,\n          init,\n          renderLanes\n        )\n      );\n    case 3:\n      a: {\n        pushHostContainer(\n          workInProgress,\n          workInProgress.stateNode.containerInfo\n        );\n        if (null === current) throw Error(formatProdErrorMessage(387));\n        lazyComponent = workInProgress.pendingProps;\n        var prevState = workInProgress.memoizedState;\n        init = prevState.element;\n        cloneUpdateQueue(current, workInProgress);\n        processUpdateQueue(workInProgress, lazyComponent, null, renderLanes);\n        var nextState = workInProgress.memoizedState;\n        lazyComponent = nextState.cache;\n        pushProvider(workInProgress, CacheContext, lazyComponent);\n        lazyComponent !== prevState.cache &&\n          propagateContextChanges(\n            workInProgress,\n            [CacheContext],\n            renderLanes,\n            !0\n          );\n        suspendIfUpdateReadFromEntangledAsyncAction();\n        lazyComponent = nextState.element;\n        if (prevState.isDehydrated)\n          if (\n            ((prevState = {\n              element: lazyComponent,\n              isDehydrated: !1,\n              cache: nextState.cache\n            }),\n            (workInProgress.updateQueue.baseState = prevState),\n            (workInProgress.memoizedState = prevState),\n            workInProgress.flags & 256)\n          ) {\n            workInProgress = mountHostRootWithoutHydrating(\n              current,\n              workInProgress,\n              lazyComponent,\n              renderLanes\n            );\n            break a;\n          } else if (lazyComponent !== init) {\n            init = createCapturedValueAtFiber(\n              Error(formatProdErrorMessage(424)),\n              workInProgress\n            );\n            queueHydrationError(init);\n            workInProgress = mountHostRootWithoutHydrating(\n              current,\n              workInProgress,\n              lazyComponent,\n              renderLanes\n            );\n            break a;\n          } else {\n            current = workInProgress.stateNode.containerInfo;\n            switch (current.nodeType) {\n              case 9:\n                current = current.body;\n                break;\n              default:\n                current =\n                  "HTML" === current.nodeName\n                    ? current.ownerDocument.body\n                    : current;\n            }\n            nextHydratableInstance = getNextHydratable(current.firstChild);\n            hydrationParentFiber = workInProgress;\n            isHydrating = !0;\n            hydrationErrors = null;\n            rootOrSingletonContext = !0;\n            renderLanes = mountChildFibers(\n              workInProgress,\n              null,\n              lazyComponent,\n              renderLanes\n            );\n            for (workInProgress.child = renderLanes; renderLanes; )\n              (renderLanes.flags = (renderLanes.flags & -3) | 4096),\n                (renderLanes = renderLanes.sibling);\n          }\n        else {\n          resetHydrationState();\n          if (lazyComponent === init) {\n            workInProgress = bailoutOnAlreadyFinishedWork(\n              current,\n              workInProgress,\n              renderLanes\n            );\n            break a;\n          }\n          reconcileChildren(\n            current,\n            workInProgress,\n            lazyComponent,\n            renderLanes\n          );\n        }\n        workInProgress = workInProgress.child;\n      }\n      return workInProgress;\n    case 26:\n      return (\n        markRef(current, workInProgress),\n        null === current\n          ? (renderLanes = getResource(\n              workInProgress.type,\n              null,\n              workInProgress.pendingProps,\n              null\n            ))\n            ? (workInProgress.memoizedState = renderLanes)\n            : isHydrating ||\n              ((renderLanes = w
1orkInProgress.type),\n              (current = workInProgress.pendingProps),\n              (lazyComponent = getOwnerDocumentFromRootContainer(\n                rootInstanceStackCursor.current\n              ).createElement(renderLanes)),\n              (lazyComponent[internalInstanceKey] = workInProgress),\n              (lazyComponent[internalPropsKey] = current),\n              setInitialProperties(lazyComponent, renderLanes, current),\n              markNodeAsHoistable(lazyComponent),\n              (workInProgress.stateNode = lazyComponent))\n          : (workInProgress.memoizedState = getResource(\n              workInProgress.type,\n              current.memoizedProps,\n              workInProgress.pendingProps,\n              current.memoizedState\n            )),\n        null\n      );\n    case 27:\n      return (\n        pushHostContext(workInProgress),\n        null === current &&\n          isHydrating &&\n          ((lazyComponent = workInProgress.stateNode =\n            resolveSingletonInstance(\n              workInProgress.type,\n              workInProgress.pendingProps,\n              rootInstanceStackCursor.current\n            )),\n          (hydrationParentFiber = workInProgress),\n          (rootOrSingletonContext = !0),\n          (init = nextHydratableInstance),\n          isSingletonScope(workInProgress.type)\n            ? ((previousHydratableOnEnteringScopedSingleton = init),\n              (nextHydratableInstance = getNextHydratable(\n                lazyComponent.firstChild\n              )))\n            : (nextHydratableInstance = init)),\n        reconcileChildren(\n          current,\n          workInProgress,\n          workInProgress.pendingProps.children,\n          renderLanes\n        ),\n        markRef(current, workInProgress),\n        null === current && (workInProgress.flags |= 4194304),\n        workInProgress.child\n      );\n    case 5:\n      if (null === current && isHydrating) {\n        if ((init = lazyComponent = nextHydratableInstance))\n          (lazyComponent = canHydrateInstance(\n            lazyComponent,\n            workInProgress.type,\n            workInProgress.pendingProps,\n            rootOrSingletonContext\n          )),\n            null !== lazyComponent\n              ? ((workInProgress.stateNode = lazyComponent),\n                (hydrationParentFiber = workInProgress),\n                (nextHydratableInstance = getNextHydratable(\n                  lazyComponent.firstChild\n                )),\n                (rootOrSingletonContext = !1),\n                (init = !0))\n              : (init = !1);\n        init || throwOnHydrationMismatch(workInProgress);\n      }\n      pushHostContext(workInProgress);\n      init = workInProgress.type;\n      prevState = workInProgress.pendingProps;\n      nextState = null !== current ? current.memoizedProps : null;\n      lazyComponent = prevState.children;\n      shouldSetTextContent(init, prevState)\n        ? (lazyComponent = null)\n        : null !== nextState &&\n          shouldSetTextContent(init, nextState) &&\n          (workInProgress.flags |= 32);\n      null !== workInProgress.memoizedState &&\n        ((init = renderWithHooks(\n          current,\n          workInProgress,\n          TransitionAwareHostComponent,\n          null,\n          null,\n          renderLanes\n        )),\n        (HostTransitionContext._currentValue = init));\n      markRef(current, workInProgress);\n      reconcileChildren(current, workInProgress, lazyComponent, renderLanes);\n      return workInProgress.child;\n    case 6:\n      if (null === current && isHydrating) {\n        if ((current = renderLanes = nextHydratableInstance))\n          (renderLanes = canHydrateTextInstance(\n            renderLanes,\n            workInProgress.pendingProps,\n            rootOrSingletonContext\n          )),\n            null !== renderLanes\n              ? ((workInProgress.stateNode = renderLanes),\n                (hydrationParentFiber = workInProgress),\n                (nextHydratableInstance = null),\n                (current = !0))\n              : (current = !1);\n        current || throwOnHydrationMismatch(workInProgress);\n      }\n      return null;\n    case 13:\n      return updateSuspenseComponent(current, workInProgress, renderLanes);\n    case 4:\n      return (\n        pushHostContainer(\n          workInProgress,\n          workInProgress.stateNode.containerInfo\n        ),\n        (lazyComponent = workInProgress.pendingProps),\n        null === current\n          ? (workInProgress.child = reconcileChildFibers(\n              workInProgress,\n              null,\n              lazyComponent,\n              renderLanes\n            ))\n          : reconcileChildren(\n              current,\n              workInProgress,\n              lazyComponent,\n              renderLanes\n            ),\n        workInProgress.child\n      );\n    case 11:\n      return updateForwardRef(\n        current,\n        workInProgress,\n        workInProgress.type,\n        workInProgress.pendingProps,\n        renderLanes\n      );\n    case 7:\n      return (\n        reconcileChildren(\n          current,\n          workInProgress,\n          workInProgress.pendingProps,\n          renderLanes\n        ),\n        workInProgress.child\n      );\n    case 8:\n      return (\n        reconcileChildren(\n          current,\n          workInProgress,\n          workInProgress.pendingProps.children,\n          renderLanes\n        ),\n        workInProgress.child\n      );\n    case 12:\n      return (\n        reconcileChildren(\n          current,\n          workInProgress,\n          workInProgress.pendingProps.children,\n          renderLanes\n        ),\n        workInProgress.child\n      );\n    case 10:\n      return (\n        (lazyComponent = workInProgress.pendingProps),\n        pushProvider(workInProgress, workInProgress.type, lazyComponent.value),\n        reconcileChildren(\n          current,\n          workInProgress,\n          lazyComponent.children,\n          renderLanes\n        ),\n        workInProgress.child\n      );\n    case 9:\n      return (\n        (init = workInProgress.type._context),\n        (lazyComponent = workInProgress.pendingProps.children),\n        prepareToReadContext(workInProgress),\n        (init = readContext(init)),\n        (lazyComponent = lazyComponent(init)),\n        (workInProgress.flags |= 1),\n        reconcileChildren(current, workInProgress, lazyComponent, renderLanes),\n        workInProgress.child\n      );\n    case 14:\n      return updateMemoComponent(\n        current,\n        workInProgress,\n        workInProgress.type,\n        workInProgress.pendingProps,\n        renderLanes\n      );\n    case 15:\n      return updateSimpleMemoComponent(\n        current,\n        workInProgress,\n        workInProgress.type,\n        workInProgress.pendingProps,\n        renderLanes\n      );\n    case 19:\n      return updateSuspenseListComponent(current, workInProgress, renderLanes);\n    case 31:\n      return (\n        (lazyComponent = workInProgress.pendingProps),\n        (renderLanes = w
1orkInProgress.mode),\n        (lazyComponent = {\n          mode: lazyComponent.mode,\n          children: lazyComponent.children\n        }),\n        null === current\n          ? ((renderLanes = mountWorkInProgressOffscreenFiber(\n              lazyComponent,\n              renderLanes\n            )),\n            (renderLanes.ref = workInProgress.ref),\n            (workInProgress.child = renderLanes),\n            (renderLanes.return = workInProgress),\n            (workInProgress = renderLanes))\n          : ((renderLanes = createWorkInProgress(current.child, lazyComponent)),\n            (renderLanes.ref = workInProgress.ref),\n            (workInProgress.child = renderLanes),\n            (renderLanes.return = workInProgress),\n            (workInProgress = renderLanes)),\n        workInProgress\n      );\n    case 22:\n      return updateOffscreenComponent(current, workInProgress, renderLanes);\n    case 24:\n      return (\n        prepareToReadContext(workInProgress),\n        (lazyComponent = readContext(CacheContext)),\n        null === current\n          ? ((init = peekCacheFromPool()),\n            null === init &&\n              ((init = workInProgressRoot),\n              (prevState = createCache()),\n              (init.pooledCache = prevState),\n              prevState.refCount++,\n              null !== prevState && (init.pooledCacheLanes |= renderLanes),\n              (init = prevState)),\n            (workInProgress.memoizedState = {\n              parent: lazyComponent,\n              cache: init\n            }),\n            initializeUpdateQueue(workInProgress),\n            pushProvider(workInProgress, CacheContext, init))\n          : (0 !== (current.lanes & renderLanes) &&\n              (cloneUpdateQueue(current, workInProgress),\n              processUpdateQueue(workInProgress, null, null, renderLanes),\n              suspendIfUpdateReadFromEntangledAsyncAction()),\n            (init = current.memoizedState),\n            (prevState = workInProgress.memoizedState),\n            init.parent !== lazyComponent\n              ? ((init = { parent: lazyComponent, cache: lazyComponent }),\n                (workInProgress.memoizedState = init),\n                0 === workInProgress.lanes &&\n                  (workInProgress.memoizedState =\n                    workInProgress.updateQueue.baseState =\n                      init),\n                pushProvider(workInProgress, CacheContext, lazyComponent))\n              : ((lazyComponent = prevState.cache),\n                pushProvider(workInProgress, CacheContext, lazyComponent),\n                lazyComponent !== init.cache &&\n                  propagateContextChanges(\n                    workInProgress,\n                    [CacheContext],\n                    renderLanes,\n                    !0\n                  ))),\n        reconcileChildren(\n          current,\n          workInProgress,\n          workInProgress.pendingProps.children,\n          renderLanes\n        ),\n        workInProgress.child\n      );\n    case 29:\n      throw workInProgress.pendingProps;\n  }\n  throw Error(formatProdErrorMessage(156, workInProgress.tag));\n}\nfunction markUpdate(workInProgress) {\n  workInProgress.flags |= 4;\n}\nfunction preloadResourceAndSuspendIfNeeded(workInProgress, resource) {\n  if ("stylesheet" !== resource.type || 0 !== (resource.state.loading & 4))\n    workInProgress.flags &= -16777217;\n  else if (((workInProgress.flags |= 16777216), !preloadResource(resource))) {\n    resource = suspenseHandlerStackCursor.current;\n    if (\n      null !== resource &&\n      ((workInProgressRootRenderLanes & 4194048) ===\n      workInProgressRootRenderLanes\n        ? null !== shellBoundary\n        : ((workInProgressRootRenderLanes & 62914560) !==\n            workInProgressRootRenderLanes &&\n            0 === (workInProgressRootRenderLanes & 536870912)) ||\n          resource !== shellBoundary)\n    )\n      throw (\n        ((suspendedThenable = noopSuspenseyCommitThenable),\n        SuspenseyCommitException)\n      );\n    workInProgress.flags |= 8192;\n  }\n}\nfunction scheduleRetryEffect(workInProgress, retryQueue) {\n  null !== retryQueue && (workInProgress.flags |= 4);\n  workInProgress.flags & 16384 &&\n    ((retryQueue =\n      22 !== workInProgress.tag ? claimNextRetryLane() : 536870912),\n    (workInProgress.lanes |= retryQueue),\n    (workInProgressSuspendedRetryLanes |= retryQueue));\n}\nfunction cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {\n  if (!isHydrating)\n    switch (renderState.tailMode) {\n      case "hidden":\n        hasRenderedATailFallback = renderState.tail;
1\n        for (var lastTailNode = null; null !== hasRenderedATailFallback; )\n          null !== hasRenderedATailFallback.alternate &&\n            (lastTailNode = hasRenderedATailFallback),\n            (hasRenderedATailFallback = hasRenderedATailFallback.sibling);\n        null === lastTailNode\n          ? (renderState.tail = null)\n          : (lastTailNode.sibling = null);\n        break;\n      case "collapsed":\n        lastTailNode = renderState.tail;\n        for (var lastTailNode$113 = null; null !== lastTailNode; )\n          null !== lastTailNode.alternate && (lastTailNode$113 = lastTailNode),\n            (lastTailNode = lastTailNode.sibling);\n        null === lastTailNode$113\n          ? hasRenderedATailFallback || null === renderState.tail\n            ? (renderState.tail = null)\n            : (renderState.tail.sibling = null)\n          : (lastTailNode$113.sibling = null);\n    }\n}\nfunction bubbleProperties(completedWork) {\n  var didBailout =\n      null !== completedWork.alternate &&\n      completedWork.alternate.child === completedWork.child,\n    newChildLanes = 0,\n    subtreeFlags = 0;\n  if (didBailout)\n    for (var child$114 = completedWork.child; null !== child$114; )\n      (newChildLanes |= child$114.lanes | child$114.childLanes),\n        (subtreeFlags |= child$114.subtreeFlags & 65011712),\n        (subtreeFlags |= child$114.flags & 65011712),\n        (child$114.return = completedWork),\n        (child$114 = child$114.sibling);\n  else\n    for (child$114 = completedWork.child; null !== child$114; )\n      (newChildLanes |= child$114.lanes | child$114.childLanes),\n        (subtreeFlags |= child$114.subtreeFlags),\n        (subtreeFlags |= child$114.flags),\n        (child$114.return = completedWork),\n        (child$114 = child$114.sibling);\n  completedWork.subtreeFlags |= subtreeFlags;\n  completedWork.childLanes = newChildLanes;\n  return didBailout;\n}\nfunction completeWork(current, workInProgress, renderLanes) {\n  var newProps = workInProgress.pendingProps;\n  popTreeContext(workInProgress);\n  switch (workInProgress.tag) {\n    case 31:\n    case 16:\n    case 15:\n    case 0:\n    case 11:\n    case 7:\n    case 8:\n    case 12:\n    case 9:\n    case 14:\n      return bubbleProperties(workInProgress), null;\n    case 1:\n      return bubbleProperties(workInProgress), null;\n    case 3:\n      renderLanes = workInProgress.stateNode;\n      newProps = null;\n      null !== current && (newProps = current.memoizedState.cache);\n      workInProgress.memoizedState.cache !== newProps &&\n        (workInProgress.flags |= 2048);\n      popProvider(CacheContext);\n      popHostContainer();\n      renderLanes.pendingContext &&\n        ((renderLanes.context = renderLanes.pendingContext),\n        (renderLanes.pendingContext = null));\n      if (null === current || null === current.child)\n        popHydrationState(workInProgress)\n          ? markUpdate(workInProgress)\n          : null === current ||\n            (current.memoizedState.isDehydrated &&\n              0 === (workInProgress.flags & 256)) ||\n            ((workInProgress.flags |= 1024),\n            upgradeHydrationErrorsToRecoverable());\n      bubbleProperties(workInProgress);\n      return null;\n    case 26:\n      return (\n        (renderLanes = workInProgress.memoizedState),\n        null === current\n          ? (markUpdate(workInProgress),\n            null !== renderLanes\n              ? (bubbleProperties(workInProgress),\n                preloadResourceAndSuspendIfNeeded(workInProgress, renderLanes))\n              : (bubbleProperties(workInProgress),\n                (workInProgress.flags &= -16777217)))\n          : renderLanes\n            ? renderLanes !== current.memoizedState\n              ? (markUpdate(workInProgress),\n                bubbleProperties(workInProgress),\n                preloadResourceAndSuspendIfNeeded(workInProgress, renderLanes))\n              : (bubbleProperties(workInProgress),\n                (workInProgress.flags &= -16777217))\n            : (current.memoizedProps !== newProps && markUpdate(workInProgress),\n              bubbleProperties(workInProgress),\n              (workInProgress.flags &= -16777217)),\n        null\n      );\n    case 27:\n      popHostContext(workInProgress);\n      renderLanes = rootInstanceStackCursor.current;\n      var type = workInProgress.type;\n      if (null !== current && null != workInProgress.stateNode)\n        current.memoizedProps !== newProps && markUpdate(workInProgress);
1\n      else {\n        if (!newProps) {\n          if (null === workInProgress.stateNode)\n            throw Error(formatProdErrorMessage(166));\n          bubbleProperties(workInProgress);\n          return null;\n        }\n        current = contextStackCursor.current;\n        popHydrationState(workInProgress)\n          ? prepareToHydrateHostInstance(workInProgress, current)\n          : ((current = resolveSingletonInstance(type, newProps, renderLanes)),\n            (workInProgress.stateNode = current),\n            markUpdate(workInProgress));\n      }\n      bubbleProperties(workInProgress);\n      return null;\n    case 5:\n      popHostContext(workInProgress);\n      renderLanes = workInProgress.type;\n      if (null !== current && null != workInProgress.stateNode)\n        current.memoizedProps !== newProps && markUpdate(workInProgress);\n      else {\n        if (!newProps) {\n          if (null === workInProgress.stateNode)\n            throw Error(formatProdErrorMessage(166));\n          bubbleProperties(workInProgress);\n          return null;\n        }\n        current = contextStackCursor.current;\n        if (popHydrationState(workInProgress))\n          prepareToHydrateHostInstance(workInProgress, current);\n        else {\n          type = getOwnerDocumentFromRootContainer(\n            rootInstanceStackCursor.current\n          );\n          switch (current) {\n            case 1:\n              current = type.createElementNS(\n                "http://www.w3.org/2000/svg",\n                renderLanes\n              );\n              break;\n            case 2:\n              current = type.createElementNS(\n                "http://www.w3.org/1998/Math/MathML",\n                renderLanes\n              );\n              break;\n            default:\n              switch (renderLanes) {\n                case "svg":\n                  current = type.createElementNS(\n                    "http://www.w3.org/2000/svg",\n                    renderLanes\n                  );\n                  break;\n                case "math":\n                  current = type.createElementNS(\n                    "http://www.w3.org/1998/Math/MathML",\n                    renderLanes\n                  );\n                  break;\n                case "script":\n                  current = type.createElement("div");\n                  current.innerHTML = "<script>\\x3c/script>";\n                  current = current.removeChild(current.firstChild);\n                  break;\n                case "select":\n                  current =\n                    "string" === typeof newProps.is\n                      ? type.createElement("select", { is: newProps.is })\n                      : type.createElement("select");\n                  newProps.multiple\n                    ? (current.multiple = !0)\n                    : newProps.size && (current.size = newProps.size);\n                  break;\n                default:\n                  current =\n                    "string" === typeof newProps.is\n                      ? type.createElement(renderLanes, { is: newProps.is })\n                      : type.createElement(renderLanes);\n              }\n          }\n          current[internalInstanceKey] = workInProgress;\n          current[internalPropsKey] = newProps;\n          a: for (type = workInProgress.child; null !== type; ) {\n            if (5 === type.tag || 6 === type.tag)\n              current.appendChild(type.stateNode);\n            else if (4 !== type.tag && 27 !== type.tag && null !== type.child) {\n              type.child.return = type;\n              type = type.child;\n              continue;\n            }\n            if (type === workInProgress) break a;\n            for (; null === type.sibling; ) {\n              if (null === type.return || type.return === workInProgress)\n                break a;\n              type = type.return;\n            }\n            type.sibling.return = type.return;\n            type = type.sibling;\n          }\n          workInProgress.stateNode = current;\n          a: switch (\n            (setInitialProperties(current, renderLanes, newProps), renderLanes)\n          ) {\n            case "button":\n            case "input":\n            case "select":\n            case "textarea":\n              current = !!newProps.autoFocus;\n              break a;\n            case "img":\n              current = !0;\n              break a;\n            default:\n              current = !1;\n          }\n          current && markUpdate(workInProgress);\n        }\n      }\n      bubbleProperties(workInProgress);\n      workInProgress.flags &= -16777217;\n      return null;\n    case 6:\n      if (current && null != workInProgress.stateNode)\n        current.memoizedProps !== newProps && markUpdate(workInProgress);\n      else {\n        if ("string" !== typeof newProps && null === workInProgress.stateNode)\n          throw Error(formatProdErrorMessage(166));\n        current = rootInstanceStackCursor.current;\n        if (popHydrationState(workInProgress)) {\n          current = workInProgress.stateNode;
1\n          renderLanes = workInProgress.memoizedProps;\n          newProps = null;\n          type = hydrationParentFiber;\n          if (null !== type)\n            switch (type.tag) {\n              case 27:\n              case 5:\n                newProps = type.memoizedProps;\n            }\n          current[internalInstanceKey] = workInProgress;\n          current =\n            current.nodeValue === renderLanes ||\n            (null !== newProps && !0 === newProps.suppressHydrationWarning) ||\n            checkForUnmatchedText(current.nodeValue, renderLanes)\n              ? !0\n              : !1;\n          current || throwOnHydrationMismatch(workInProgress);\n        } else\n          (current =\n            getOwnerDocumentFromRootContainer(current).createTextNode(\n              newProps\n            )),\n            (current[internalInstanceKey] = workInProgress),\n            (workInProgress.stateNode = current);\n      }\n      bubbleProperties(workInProgress);\n      return null;\n    case 13:\n      newProps = workInProgress.memoizedState;\n      if (\n        null === current ||\n        (null !== current.memoizedState &&\n          null !== current.memoizedState.dehydrated)\n      ) {\n        type = popHydrationState(workInProgress);\n        if (null !== newProps && null !== newProps.dehydrated) {\n          if (null === current) {\n            if (!type) throw Error(formatProdErrorMessage(318));\n            type = workInProgress.memoizedState;\n            type = null !== type ? type.dehydrated : null;\n            if (!type) throw Error(formatProdErrorMessage(317));\n            type[internalInstanceKey] = workInProgress;\n          } else\n            resetHydrationState(),\n              0 === (workInProgress.flags & 128) &&\n                (workInProgress.memoizedState = null),\n              (workInProgress.flags |= 4);\n          bubbleProperties(workInProgress);\n          type = !1;\n        } else\n          (type = upgradeHydrationErrorsToRecoverable()),\n            null !== current &&\n              null !== current.memoizedState &&\n              (current.memoizedState.hydrationErrors = type),\n            (type = !0);\n        if (!type) {\n          if (workInProgress.flags & 256)\n            return popSuspenseHandler(workInProgress), workInProgress;\n          popSuspenseHandler(workInProgress);\n          return null;\n        }\n      }\n      popSuspenseHandler(workInProgress);\n      if (0 !== (workInProgress.flags & 128))\n        return (workInProgress.lanes = renderLanes), workInProgress;\n      renderLanes = null !== newProps;\n      current = null !== current && null !== current.memoizedState;\n      if (renderLanes) {\n        newProps = workInProgress.child;\n        type = null;\n        null !== newProps.alternate &&\n          null !== newProps.alternate.memoizedState &&\n          null !== newProps.alternate.memoizedState.cachePool &&\n          (type = newProps.alternate.memoizedState.cachePool.pool);\n        var cache$127 = null;\n        null !== newProps.memoizedState &&\n          null !== newProps.memoizedState.cachePool &&\n          (cache$127 = newProps.memoizedState.cachePool.pool);\n        cache$127 !== type && (newProps.flags |= 2048);\n      }\n      renderLanes !== current &&\n        renderLanes &&\n        (workInProgress.child.flags |= 8192);\n      scheduleRetryEffect(workInProgress, workInProgress.updateQueue);\n      bubbleProperties(workInProgress);\n      return null;\n    case 4:\n      return (\n        popHostContainer(),\n        null === current &&\n          listenToAllSupportedEvents(workInProgress.stateNode.containerInfo),\n        bubbleProperties(workInProgress),\n        null\n      );\n    case 10:\n      return (\n        popProvider(workInProgress.type), bubbleProperties(workInProgress), null\n      );\n    case 19:\n      pop(suspenseStackCursor);\n      type = workInProgress.memoizedState;\n      if (null === type) return bubbleProperties(workInProgress), null;\n      newProps = 0 !== (workInProgress.flags & 128);\n      cache$127 = type.rendering;\n      if (null === cache$127)\n        if (newProps) cutOffTailIfNeeded(type, !1);\n        else {\n          if (\n            0 !== workInProgressRootExitStatus ||\n            (null !== current && 0 !== (current.flags & 128))\n          )\n            for (current = workInProgress.child; null !== current; ) {\n              cache$127 = findFirstSuspended(current);\n              if (null !== cache$127) {\n                workInProgress.flags |= 128;\n                cutOffTailIfNeeded(type, !1);\n                current = cache$127.updateQueue;\n                workInProgress.updateQueue = current;\n                scheduleRetryEffect(workInProgress, current);\n                workInProgress.subtreeFlags = 0;\n                current = renderLanes;
1\n                for (renderLanes = workInProgress.child; null !== renderLanes; )\n                  resetWorkInProgress(renderLanes, current),\n                    (renderLanes = renderLanes.sibling);\n                push(\n                  suspenseStackCursor,\n                  (suspenseStackCursor.current & 1) | 2\n                );\n                return workInProgress.child;\n              }\n              current = current.sibling;\n            }\n          null !== type.tail &&\n            now() > workInProgressRootRenderTargetTime &&\n            ((workInProgress.flags |= 128),\n            (newProps = !0),\n            cutOffTailIfNeeded(type, !1),\n            (workInProgress.lanes = 4194304));\n        }\n      else {\n        if (!newProps)\n          if (((current = findFirstSuspended(cache$127)), null !== current)) {\n            if (\n              ((workInProgress.flags |= 128),\n              (newProps = !0),\n              (current = current.updateQueue),\n              (workInProgress.updateQueue = current),\n              scheduleRetryEffect(workInProgress, current),\n              cutOffTailIfNeeded(type, !0),\n              null === type.tail &&\n                "hidden" === type.tailMode &&\n                !cache$127.alternate &&\n                !isHydrating)\n            )\n              return bubbleProperties(workInProgress), null;\n          } else\n            2 * now() - type.renderingStartTime >\n              workInProgressRootRenderTargetTime &&\n              536870912 !== renderLanes &&\n              ((workInProgress.flags |= 128),\n              (newProps = !0),\n              cutOffTailIfNeeded(type, !1),\n              (workInProgress.lanes = 4194304));\n        type.isBackwards\n          ? ((cache$127.sibling = workInProgress.child),\n            (workInProgress.child = cache$127))\n          : ((current = type.last),\n            null !== current\n              ? (current.sibling = cache$127)\n              : (workInProgress.child = cache$127),\n            (type.last = cache$127));\n      }\n      if (null !== type.tail)\n        return (\n          (workInProgress = type.tail),\n          (type.rendering = workInProgress),\n          (type.tail = workInProgress.sibling),\n          (type.renderingStartTime = now()),\n          (workInProgress.sibling = null),\n          (current = suspenseStackCursor.current),\n          push(suspenseStackCursor, newProps ? (current & 1) | 2 : current & 1),\n          workInProgress\n        );\n      bubbleProperties(workInProgress);\n      return null;\n    case 22:\n    case 23:\n      return (\n        popSuspenseHandler(workInProgress),\n        popHiddenContext(),\n        (newProps = null !== workInProgress.memoizedState),\n        null !== current\n          ? (null !== current.memoizedState) !== newProps &&\n            (workInProgress.flags |= 8192)\n          : newProps && (workInProgress.flags |= 8192),\n        newProps\n          ? 0 !== (renderLanes & 536870912) &&\n            0 === (workInProgress.flags & 128) &&\n            (bubbleProperties(workInProgress),\n            workInProgress.subtreeFlags & 6 && (workInProgress.flags |= 8192))\n          : bubbleProperties(workInProgress),\n        (renderLanes = workInProgress.updateQueue),\n        null !== renderLanes &&\n          scheduleRetryEffect(workInProgress, renderLanes.retryQueue),\n        (renderLanes = null),\n        null !== current &&\n          null !== current.memoizedState &&\n          null !== current.memoizedState.cachePool &&\n          (renderLanes = current.memoizedState.cachePool.pool),\n        (newProps = null),\n        null !== workInProgress.memoizedState &&\n          null !== workInProgress.memoizedState.cachePool &&\n          (newProps = workInProgress.memoizedState.cachePool.pool),\n        newProps !== renderLanes && (workInProgress.flags |= 2048),\n        null !== current && pop(resumedCache),\n        null\n      );\n    case 24:\n      return (\n        (renderLanes = null),\n        null !== current && (renderLanes = current.memoizedState.cache),\n        workInProgress.memoizedState.cache !== renderLanes &&\n          (workInProgress.flags |= 2048),\n        popProvi
1der(CacheContext),\n        bubbleProperties(workInProgress),\n        null\n      );\n    case 25:\n      return null;\n    case 30:\n      return null;\n  }\n  throw Error(formatProdErrorMessage(156, workInProgress.tag));\n}\nfunction unwindWork(current, workInProgress) {\n  popTreeContext(workInProgress);\n  switch (workInProgress.tag) {\n    case 1:\n      return (\n        (current = workInProgress.flags),\n        current & 65536\n          ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n          : null\n      );\n    case 3:\n      return (\n        popProvider(CacheContext),\n        popHostContainer(),\n        (current = workInProgress.flags),\n        0 !== (current & 65536) && 0 === (current & 128)\n          ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n          : null\n      );\n    case 26:\n    case 27:\n    case 5:\n      return popHostContext(workInProgress), null;\n    case 13:\n      popSuspenseHandler(workInProgress);\n      current = workInProgress.memoizedState;\n      if (null !== current && null !== current.dehydrated) {\n        if (null === workInProgress.alternate)\n          throw Error(formatProdErrorMessage(340));\n        resetHydrationState();\n      }\n      current = workInProgress.flags;\n      return current & 65536\n        ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n        : null;\n    case 19:\n      return pop(suspenseStackCursor), null;\n    case 4:\n      return popHostContainer(), null;\n    case 10:\n      return popProvider(workInProgress.type), null;\n    case 22:\n    case 23:\n      return (\n        popSuspenseHandler(workInProgress),\n        popHiddenContext(),\n        null !== current && pop(resumedCache),\n        (current = workInProgress.flags),\n        current & 65536\n          ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n          : null\n      );\n    case 24:\n      return popProvider(CacheContext), null;\n    case 25:\n      return null;\n    default:\n      return null;\n  }\n}\nfunction unwindInterruptedWork(current, interruptedWork) {\n  popTreeContext(interruptedWork);\n  switch (interruptedWork.tag) {\n    case 3:\n      popProvider(CacheContext);\n      popHostContainer();\n      break;\n    case 26:\n    case 27:\n    case 5:\n      popHostContext(interruptedWork);\n      break;\n    case 4:\n      popHostContainer();\n      break;\n    case 13:\n      popSuspenseHandler(interruptedWork);\n      break;\n    case 19:\n      pop(suspenseStackCursor);\n      break;\n    case 10:\n      popProvider(interruptedWork.type);\n      break;\n    case 22:\n    case 23:\n      popSuspenseHandler(interruptedWork);\n      popHiddenContext();\n      null !== current && pop(resumedCache);\n      break;\n    case 24:\n      popProvider(CacheContext);\n  }\n}\nfunction commitHookEffectListMount(flags, finishedWork) {\n  try {\n    var updateQueue = finishedWork.updateQueue,\n      lastEffect = null !== updateQueue ? updateQueue.lastEffect : null;\n    if (null !== lastEffect) {\n      var firstEffect = lastEffect.next;\n      updateQueue = firstEffect;\n      do {\n        if ((updateQueue.tag & flags) === flags) {\n          lastEffect = void 0;\n          var create = updateQueue.create,\n            inst = updateQueue.inst;\n          lastEffect = create();\n          inst.destroy = lastEffect;\n        }\n        updateQueue = updateQueue.next;\n      } while (updateQueue !== firstEffect);\n    }\n  } catch (error) {\n    captureCommitPhaseError(finishedWork, finishedWork.return, error);\n  }\n}\nfunction commitHookEffectListUnmount(\n  flags,\n  finishedWork,\n  nearestMountedAncestor$jscomp$0\n) {\n  try {\n    var updateQueue = finishedWork.updateQueue,\n      lastEffect = null !== updateQueue ? updateQueue.lastEffect : null;\n    if (null !== lastEffect) {\n      var firstEffect = lastEffect.next;\n      updateQueue = firstEffect;\n      do {\n        if ((updateQueue.tag & flags) === flags) {\n          var inst = updateQueue.inst,\n            destroy = inst.destroy;
1\n          if (void 0 !== destroy) {\n            inst.destroy = void 0;\n            lastEffect = finishedWork;\n            var nearestMountedAncestor = nearestMountedAncestor$jscomp$0,\n              destroy_ = destroy;\n            try {\n              destroy_();\n            } catch (error) {\n              captureCommitPhaseError(\n                lastEffect,\n                nearestMountedAncestor,\n                error\n              );\n            }\n          }\n        }\n        updateQueue = updateQueue.next;\n      } while (updateQueue !== firstEffect);\n    }\n  } catch (error) {\n    captureCommitPhaseError(finishedWork, finishedWork.return, error);\n  }\n}\nfunction commitClassCallbacks(finishedWork) {\n  var updateQueue = finishedWork.updateQueue;\n  if (null !== updateQueue) {\n    var instance = finishedWork.stateNode;\n    try {\n      commitCallbacks(updateQueue, instance);\n    } catch (error) {\n      captureCommitPhaseError(finishedWork, finishedWork.return, error);\n    }\n  }\n}\nfunction safelyCallComponentWillUnmount(\n  current,\n  nearestMountedAncestor,\n  instance\n) {\n  instance.props = resolveClassComponentProps(\n    current.type,\n    current.memoizedProps\n  );\n  instance.state = current.memoizedState;\n  try {\n    instance.componentWillUnmount();\n  } catch (error) {\n    captureCommitPhaseError(current, nearestMountedAncestor, error);\n  }\n}\nfunction safelyAttachRef(current, nearestMountedAncestor) {\n  try {\n    var ref = current.ref;\n    if (null !== ref) {\n      switch (current.tag) {\n        case 26:\n        case 27:\n        case 5:\n          var instanceToUse = current.stateNode;\n          break;\n        case 30:\n          instanceToUse = current.stateNode;\n          break;\n        default:\n          instanceToUse = current.stateNode;\n      }\n      "function" === typeof ref\n        ? (current.refCleanup = ref(instanceToUse))\n        : (ref.current = instanceToUse);\n    }\n  } catch (error) {\n    captureCommitPhaseError(current, nearestMountedAncestor, error);\n  }\n}\nfunction safelyDetachRef(current, nearestMountedAncestor) {\n  var ref = current.ref,\n    refCleanup = current.refCleanup;\n  if (null !== ref)\n    if ("function" === typeof refCleanup)\n      tr
1y {\n        refCleanup();\n      } catch (error) {\n        captureCommitPhaseError(current, nearestMountedAncestor, error);\n      } finally {\n        (current.refCleanup = null),\n          (current = current.alternate),\n          null != current && (current.refCleanup = null);\n      }\n    else if ("function" === typeof ref)\n      try {\n        ref(null);\n      } catch (error$143) {\n        captureCommitPhaseError(current, nearestMountedAncestor, error$143);\n      }\n    else ref.current = null;\n}\nfunction commitHostMount(finishedWork) {\n  var type = finishedWork.type,\n    props = finishedWork.memoizedProps,\n    instance = finishedWork.stateNode;\n  try {\n    a: switch (type) {\n      case "button":\n      case "input":\n      case "select":\n      case "textarea":\n        props.autoFocus && instance.focus();\n        break a;\n      case "img":\n        props.src\n          ? (instance.src = props.src)\n          : props.srcSet && (instance.srcset = props.srcSet);\n    }\n  } catch (error) {\n    captureCommitPhaseError(finishedWork, finishedWork.return, error);\n  }\n}\nfunction commitHostUpdate(finishedWork, newProps, oldProps) {\
1n  try {\n    var domElement = finishedWork.stateNode;\n    updateProperties(domElement, finishedWork.type, oldProps, newProps);\n    domElement[internalPropsKey] = newProps;\n  } catch (error) {\n    captureCommitPhaseError(finishedWork, finishedWork.return, error);\n  }\n}\nfunction isHostParent(fiber) {\n  return (\n    5 === fiber.tag ||\n    3 === fiber.tag ||\n    26 === fiber.tag ||\n    (27 === fiber.tag && isSingletonScope(fiber.type)) ||\n    4 === fiber.tag\n  );\n}\nfunction getHostSibling(fiber) {\n  a: for (;;) {\n    for (; null === fiber.sibling; ) {\n      if (null === fiber.return || isHostParent(fiber.return)) return null;\n      fiber = fiber.return;\n    }\n    fiber.sibling.return = fiber.return;\n    for (\n      fiber = fiber.sibling;\n      5 !== fiber.tag && 6 !== fiber.tag && 18 !== fiber.tag;\n\n    ) {\n      if (27 === fiber.tag && isSingletonScope(fiber.type)) continue a;\n      if (fiber.flags & 2) continue a;\n      if (null === fiber.child || 4 === fiber.tag) continue a;\n      else (fiber.child.return = fiber), (fiber = fiber.child);\n    }\n    if (!(fiber.flags & 2)) return fiber.stateNode;\n  }\n}\nfunction insertOrAppendPlacementNodeIntoContainer(node, before, parent) {\n  var tag = node.tag;\n  if (5 === tag || 6 === tag)\n    (node = node.stateNode),\n      before\n        ? (9 === parent.nodeType\n            ? parent.body\n            : "HTML" === parent.nodeName\n              ? parent.ownerDocument.body\n              : parent\n          ).insertBefore(node, before)\n        : ((before =\n            9 === parent.nodeType\n              ? parent.body\n              : "HTML" === parent.nodeName\n                ? parent.ownerDocument.body\n                : parent),\n          before.appendChild(node),\n          (parent = parent._reactRootContainer),\n          (null !== parent && void 0 !== parent) ||\n            null !== before.onclick ||\n            (before.onclick = noop$1));\n  else if (\n    4 !== tag &&\n    (27 === tag &&\n      isSingletonScope(node.type) &&\n      ((parent = node.stateNode), (before = null)),\n    (node = node.child),\n    null !== node)\n  )\n    for (\n      insertOrAppendPlacementNodeIntoContainer(node, before, parent),\n        node = node.sibling;\n      null !== node;\n\n    )\n      insertOrAppendPlacementNodeIntoContainer(node, before, parent),\n        (node = node.sibling);\n}\nfunction insertOrAppendPlacementNode(node, before, parent) {\n  var tag = node.tag;\n  if (5 === tag || 6 === tag)\n    (node = node.stateNode),\n      before ? parent.insertBefore(node, before) : parent.appendChild(node);\n  else if (\n    4 !== tag &&\n    (27 === tag && isSingletonScope(node.type) && (parent = node.stateNode),\n    (node = node.child),\n    null !== node)\n  )\n    for (\n      insertOrAppendPlacementNode(node, before, parent), node = node.sibling;\n      null !== node;\n\n    )\n      insertOrAppendPlacementNode(node, before, parent), (node = node.sibling);\n}\nfunction commitHostSingletonAcquisition(finishedWork) {\n  var singleton = finishedWork.stateNode,\n    props = finishedWork.memoizedProps;\n  try {\n    for (\n      var type = finishedWork.type, attributes = singleton.attributes;\n      attributes.length;\n\n    )\n      singleton.removeAttributeNode(attributes[0]);\n    setInitialProperties(singleton, type, props);\n    singleton[internalInstanceKey] = finishedWork;\n    singleton[internalPropsKey] = props;\n  } catch (error) {\n    captureCommitPhaseError(finishedWork, finishedWork.return, error);\n  }\n}\nvar offscreenSubtreeIsHidden = !1,\n  offscreenSubtreeWasHidden = !1,\n  needsFormReset = !1,\n  PossiblyWeakSet = "function" === typeof WeakSet ? WeakSet : Set,\n  nextEffect = null;\nfunction commitBeforeMutationEffects(root, firstChild) {\n  root = root.containerInfo;\n  eventsEnabled = _enabled;\n  root = getActiveElementDeep(root);\n  if (hasSelectionCapabilities(root)) {\n    if ("selectionStart" in root)\n      var JSCompiler_temp = {\n        start: root.selectionStart,\n        end: root.selectionEnd\n      };\n    else\n      a: {\n        JSCompiler_temp =\n          ((JSCompiler_temp = root.ownerDocument) &&\n            JSCompiler_temp.defaultView) ||\n          window;\n        var selection =\n          JSCompiler_temp.getSelection && JSCompiler_temp.getSelection();\n        if (selection && 0 !== selection.rangeCount) {\n          JSCompiler_temp = selection.anchorNode;\n          var anchorOffset = selection.anchorOffset,\n            focusNode = selection.focusNode;\n          selection = selection.focusOffset;\n          try {\n            JSCompiler_temp.nodeType, focusNode.nodeType;\n          } catch (e$20) {\n            JSCompiler_temp = null;\n            break a;\n          }\n          var length = 0,\n            start = -1,\n            end = -1,\n            indexWithinAnchor = 0,\n            indexWithinFocus = 0,\n            node = root,\n            parentNode = null;\n          b: for (;;) {\n            for (var next; ; ) {\n              node !== JSCompiler_temp ||\n                (0 !== anchorOffset && 3 !== node.nodeType) ||\n                (start = length + anchorOffset);\n              node !== focusNode ||\n                (0 !== selection && 3 !== node.nodeType) ||\n                (end = length + selection);\n              3 === node.nodeType && (length += node.nodeValue.length);\n              if (null === (next = node.firstChild)) break;\n              parentNode = node;\n              node = next;\n            }\n            for (;;) {\n              if (node === root) break b;\n              parentNode === JSCompiler_temp &&\n                ++indexWithinAnchor === anchorOffset &&\n                (start = length);\n              parentNode === focusNode &&\n                ++indexWithinFocus === selection &&\n                (end = length);\n              if (null !== (next = node.nextSibling)) break;\n              node = parentNode;\n              parentNode = node.parentNode;\n            }\n            node = next;\n          }\n          JSCompiler_temp =\n            -1 === start || -1 === end ? null : { start: start, end: end };\n        } else JSCompiler_temp = null;\n      }\n    JSCompiler_temp = JSCompiler_temp || { start: 0, end: 0 };\n  } else JSCompiler_temp = null;\n  selectionInformation = { focusedElem: root, selectionRange: JSCompiler_temp };\n  _enabled = !1;\n  for (nextEffect = firstChild; null !== nextEffect; )\n    if (\n      ((firstChild = nextEffect),\n      (root = firstChild.child),\n      0 !== (firstChild.subtreeFlags & 1024) && null !== root)\n    )\n      (root.return = firstChild), (nextEffect = root);\n    else\n      for (; null !== nextEffect; ) {\n        firstChild = nextEffect;\n        focusNode = firstChild.alternate;\n        root = firstChild.flags;\n        switch (firstChild.tag) {\n          case 0:\n            break;\n          case 11:\n          case 15:\n            break;\n          case 1:\n            if (0 !== (root & 1024) && null !== focusNode) {\n              root = void 0;\n              JSCompiler_temp = firstChild;\n              anchorOffset = focusNode.memoizedProps;\n              focusNode = focusNode.memoizedState;\n              selection = JSCompiler_temp.stateNode;\n              try {\n                var resolvedPrevProps = resolve
1ClassComponentProps(\n                  JSCompiler_temp.type,\n                  anchorOffset,\n                  JSCompiler_temp.elementType === JSCompiler_temp.type\n                );\n                root = selection.getSnapshotBeforeUpdate(\n                  resolvedPrevProps,\n                  focusNode\n                );\n                selection.__reactInternalSnapshotBeforeUpdate = root;\n              } catch (error) {\n                captureCommitPhaseError(\n                  JSCompiler_temp,\n                  JSCompiler_temp.return,\n                  error\n                );\n              }\n            }\n            break;\n          case 3:\n            if (0 !== (root & 1024))\n              if (\n                ((root = firstChild.stateNode.containerInfo),\n                (JSCompiler_temp = root.nodeType),\n                9 === JSCompiler_temp)\n              )\n                clearContainerSparingly(root);\n              else if (1 === JSCompiler_temp)\n                switch (root.nodeName) {\n                  case "HEAD":\n                  case "HTML":\n                  case "BODY":\n                    clearContainerSparingly(root);\n                    break;\n                  default:\n                    root.textContent = "";\n                }\n            break;\n          case 5:\n          case 26:\n          case 27:\n          case 6:\n          case 4:\n          case 17:\n            break;\n          default:\n            if (0 !== (root & 1024)) throw Error(formatProdErrorMessage(163));\n        }\n        root = firstChild.sibling;\n        if (null !== root) {\n          root.return = firstChild.return;\n          nextEffect = root;\n          break;\n        }\n        nextEffect = firstChild.return;\n      }\n}\nfunction commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) {\n  var flags = finishedWork.flags;\n  switch (finishedWork.tag) {\n    case 0:\n    case 11:\n    case 15:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      flags & 4 && commitHookEffectListMount(5, finishedWork);\n      break;\n    case 1:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      if (flags & 4)\n        if (((finishedRoot = finishedWork.stateNode), null === current))\n          try {\n            finishedRoot.componentDidMount();\n          } catch (error) {\n            captureCommitPhaseError(finishedWork, finishedWork.return, error);\n          }\n        else {\n          var prevProps = resolveClassComponentProps(\n            finishedWork.type,\n            current.memoizedProps\n          );\n          current = current.memoizedState;\n          try {\n            finishedRoot.componentDidUpdate(\n              prevProps,\n              current,\n              finishedRoot.__reactInternalSnapshotBeforeUpdate\n            );\n          } catch (error$142) {\n            captureCommitPhaseError(\n              finishedWork,\n              finishedWork.return,\n              error$142\n            );\n          }\n        }\n      flags & 64 && commitClassCallbacks(finishedWork);\n      flags & 512 && safelyAttachRef(finishedWork, finishedWork.return);\n      break;\n    case 3:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      if (\n        flags & 64 &&\n        ((finishedRoot = finishedWork.updateQueue), null !== finishedRoot)\n      ) {\n        current = null;\n        if (null !== finishedWork.child)\n          switch (finishedWork.child.tag) {\n            case 27:\n            case 5:\n              current = finishedWork.child.stateNode;\n              break;\n            case 1:\n              current = finishedWork.child.stateNode;\n          }\n        try {\n          commitCallbacks(finishedRoot, current);\n        } catch (error) {\n          captureCommitPhaseError(finishedWork, finishedWork.return, error);\n        }\n      }\n      break;\n    case 27:\n      null === current &&\n        flags & 4 &&\n        commitHostSingletonAcquisition(finishedWork);\n    case 26:\n    case 5:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      null === current && flags & 4 && commitHostMount(finishedWork);\n      flags & 512 && safelyAttachRef(finishedWork, finishedWork.return);\n      break;\n    case 12:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      break;\n    case 13:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      flags & 4 && commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);\n      flags & 64 &&\n        ((finishedRoot = finishedWork.memoizedState),\n        null !== finishedRoot &&\n          ((finishedRoot = finishedRoot.dehydrated),\n          null !== finishedRoot &&\n            ((finishedWork = retryDehydratedSuspenseBoundary.bind(\n              null,\n              finishedWork\n            )),\n            registerSuspenseInstanceRetry(finishedRoot, finishedWork))));\n      break;\n    case 22:\n      flags = null !== finishedWork.memoizedState || offscreenSubtreeIsHidden;\n      if (!flags) {\n        current =\n          (null !== current && null !== current.memoizedState) ||\n          offscreenSubtreeWasHidden;\n        prevProps = offscreenSubtreeIsHidden;\n        var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;\n        offscreenSubtreeIsHidden = flags;\n        (offscreenSubtreeWasHidden = current) && !prevOffscreenSubtreeWasHidden\n          ? recursivelyTraverseReappearLayoutEffects(\n              finishedRoot,\n              finishedWork,\n              0 !== (finishedWork.subtreeFlags & 8772)\n            )\n          : recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n        offscreenSubtreeIsHidden = prevProps;\n        offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;\n      }\n      break;\n    case 30:\n      break;\n    default:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n  }\n}\nfunction detachFiberAfterEffects(fiber) {\n  var alternate = fiber.alternate;\n  null !== alternate &&\n    ((fiber.alternate = null), detachFiberAfterEffects(alternate));\n  fiber.child = null;\n  fiber.deletions = null;\n  fiber.sibling = null;\n  5 === fiber.tag &&\n    ((alternate = fiber.stateNode),\n    null !== alternate && detachDeletedInstance(alternate));\n  fiber.stateNode = null;\n  fiber.return = null;\n  fiber.dependencies = null;\n  fiber.memoizedProps = null;\n  fiber.memoizedState = null;\n  fiber.pendingProps = null;\n  fiber.stateNode = null;\n  fiber.updateQueue = null;\n}\nvar hostParent = null,\n  hostParentIsContainer = !1;\nfunction recursivelyTraverseDeletionEffects(\n  finishedRoot,\n  nearestMountedAncestor,\n  parent\n) {\n  for (parent = parent.child; null !== parent;
1 )\n    commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, parent),\n      (parent = parent.sibling);\n}\nfunction commitDeletionEffectsOnFiber(\n  finishedRoot,\n  nearestMountedAncestor,\n  deletedFiber\n) {\n  if (injectedHook && "function" === typeof injectedHook.onCommitFiberUnmount)\n    try {\n      injectedHook.onCommitFiberUnmount(rendererID, deletedFiber);\n    } catch (err) {}\n  switch (deletedFiber.tag) {\n    case 26:\n      offscreenSubtreeWasHidden ||\n        safelyDetachRef(deletedFiber, nearestMountedAncestor);\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      deletedFiber.memoizedState\n        ? deletedFiber.memoizedState.count--\n        : deletedFiber.stateNode &&\n          ((deletedFiber = deletedFiber.stateNode),\n          deletedFiber.parentNode.removeChild(deletedFiber));\n      break;\n    case 27:\n      offscreenSubtreeWasHidden ||\n        safelyDetachRef(deletedFiber, nearestMountedAncestor);\n      var prevHostParent = hostParent,\n        prevHostParentIsContainer = hostParentIsContainer;\n      isSingletonScope(deletedFiber.type) &&\n        ((hostParent = deletedFiber.stateNode), (hostParentIsContainer = !1));\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      releaseSingletonInstance(deletedFiber.stateNode);\n      hostParent = prevHostParent;\n      hostParentIsContainer = prevHostParentIsContainer;\n      break;\n    case 5:\n      offscreenSubtreeWasHidden ||\n        safelyDetachRef(deletedFiber, nearestMountedAncestor);\n    case 6:\n      prevHostParent = hostParent;\n      prevHostParentIsContainer = hostParentIsContainer;\n      hostParent = null;\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      hostParent = prevHostParent;\n      hostParentIsContainer = prevHostParentIsContainer;\n      if (null !== hostParent)\n        if (hostParentIsContainer)\n          try {\n            (9 === hostParent.nodeType\n              ? hostParent.body\n              : "HTML" === hostParent.nodeName\n                ? hostParent.ownerDocument.body\n                : hostParent\n            ).removeChild(deletedFiber.stateNode);\n          } catch (error) {\n            captureCommitPhaseError(\n              deletedFiber,\n              nearestMountedAncestor,\n              error\n            );\n          }\n        else\n          try {\n            hostParent.removeChild(deletedFiber.stateNode);\n          } catch (error) {\n            captureCommitPhaseError(\n              deletedFiber,\n              nearestMountedAncestor,\n              error\n            );\n          }\n      break;\n    case 18:\n      null !== hostParent &&\n        (hostParentIsContainer\n          ? ((finishedRoot = hostParent),\n            clearSuspenseBoundary(\n              9 === finishedRoot.nodeType\n                ? finishedRoot.body\n                : "HTML" === finishedRoot.nodeName\n                  ? finishedRoot.ownerDocument.body\n                  : finishedRoot,\n              deletedFiber.stateNode\n            ),\n            retryIfBlockedOn(finishedRoot))\n          : clearSuspenseBoundary(hostParent, deletedFiber.stateNode));\n      break;\n    case 4:\n      prevHostParent = hostParent;\n      prevHostParentIsContainer = hostParentIsContainer;\n      hostParent = deletedFiber.stateNode.containerInfo;\n      hostParentIsContainer = !0;\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      hostParent = prevHostParent;\n      hostParentIsContainer = prevHostParentIsContainer;\n      break;\n    case 0:\n    case 11:\n    case 14:\n    case 15:\n      offscreenSubtreeWasHidden ||\n        commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor);\n      offscreenSubtreeWasHidden ||\n        commitHookEffectListUnmount(4, deletedFiber, nearestMountedAncestor);\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      break;\n    case 1:\n      offscreenSubtreeWasHidden ||\n        (safelyDetachRef(deletedFiber, nearestMountedAncestor),\n        (prevHostParent = deletedFiber.stateNode),\n        "function" === typeof prevHostParent.componentWillUnmount &&\n          safelyCallComponentWillUnmount(\n            deletedFiber,\n            nearestMountedAncestor,\n            prevHostParent\n          ));\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      break;\n    case 21:\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      break;\n    case 22:\n      offscreenSubtreeWasHidden =\n        (prevHostParent = offscreenSubtreeWasHidden
1) ||\n        null !== deletedFiber.memoizedState;\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      offscreenSubtreeWasHidden = prevHostParent;\n      break;\n    default:\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n  }\n}\nfunction commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {\n  if (\n    null === finishedWork.memoizedState &&\n    ((finishedRoot = finishedWork.alternate),\n    null !== finishedRoot &&\n      ((finishedRoot = finishedRoot.memoizedState),\n      null !== finishedRoot &&\n        ((finishedRoot = finishedRoot.dehydrated), null !== finishedRoot)))\n  )\n    try {\n      retryIfBlockedOn(finishedRoot);\n    } catch (error) {\n      captureCommitPhaseError(finishedWork, finishedWork.return, error);\n    }\n}\nfunction getRetryCache(finishedWork) {\n  switch (finishedWork.tag) {\n    case 13:\n    case 19:\n      var retryCache = finishedWork.stateNode;\n      null === retryCache &&\n        (retryCache = finishedWork.stateNode = new PossiblyWeakSet());\n      return retryCache;\n    case 22:\n      return (\n        (finishedWork = finishedWork.stateNode),\n        (retryCache = finishedWork._retryCache),\n        null === retryCache &&\n          (retryCache = finishedWork._retryCache = new PossiblyWeakSet()),\n        retryCache\n      );\n    default:\n      throw Error(formatProdErrorMessage(435, finishedWork.tag));\n  }\n}\nfunction attachSuspenseRetryListeners(finishedWork, wakeables) {\n  var retryCache = getRetryCache(finishedWork);\n  wakeables.forEach(function (wakeable) {\n    var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable);\n    retryCache.has(wakeable) ||\n      (retryCache.add(wakeable), wakeable.then(retry, retry));\n  });\n}\nfunction recursivelyTraverseMutationEffects(root$jscomp$0, parentFiber) {\n  var deletions = parentFiber.deletions;\n  if (null !== deletions)\n    for (var i = 0; i < deletions.length; i++) {\n      var childToDelete = deletions[i],\n        root = root$jscomp$0,\n        returnFiber = parentFiber,\n        parent = returnFiber;\n      a: for (; null !== parent; ) {\n        switch (parent.tag) {\n          case 27:\n            if (isSingletonScope(parent.type)) {\n              hostParent = parent.stateNode;\n              hostParentIsContainer = !1;\n              break a;\n            }\n            break;\n          case 5:\n            hostParent = parent.stateNode;\n            hostParentIsContainer = !1;\n            break a;\n          case 3:\n          case 4:\n            hostParent = parent.stateNode.containerInfo;\n            hostParentIsContainer = !0;\n            break a;\n        }\n        parent = parent.return;\n      }\n      if (null === hostParent) throw Error(formatProdErrorMessage(160));\n      commitDeletionEffectsOnFiber(root, returnFiber, childToDelete);\n      hostParent = null;\n      hostParentIsContainer = !1;\n      root = childToDelete.alternate;\n      null !== root && (root.return = null);\n      childToDelete.return = null;\n    }\n  if (parentFiber.subtreeFlags & 13878)\n    for (parentFiber = parentFiber.child; null !== parentFiber; )\n      commitMutationEffectsOnFiber(parentFiber, root$jscomp$0),\n        (parentFiber = parentFiber.sibling);\n}\nvar currentHoistableRoot = null;\nfunction commitMutationEffectsOnFiber(finishedWork, root) {\n  var current = finishedWork.alternate,\n    flags = finishedWork.flags;\n  switch (finishedWork.tag) {\n    case 0:\n    case 11:\n    case 14:\n    case 15:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 4 &&\n        (commitHookEffectListUnmount(3, finishedWork, finishedWork.return),\n        commitHookEffectListMount(3, finishedWork),\n        commitHookEffectListUnmount(5, finishedWork, finishedWork.return));\n      break;\n    case 1:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);
1\n      flags & 512 &&\n        (offscreenSubtreeWasHidden ||\n          null === current ||\n          safelyDetachRef(current, current.return));\n      flags & 64 &&\n        offscreenSubtreeIsHidden &&\n        ((finishedWork = finishedWork.updateQueue),\n        null !== finishedWork &&\n          ((flags = finishedWork.callbacks),\n          null !== flags &&\n            ((current = finishedWork.shared.hiddenCallbacks),\n            (finishedWork.shared.hiddenCallbacks =\n              null === current ? flags : current.concat(flags)))));\n      break;\n    case 26:\n      var hoistableRoot = currentHoistableRoot;\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 512 &&\n        (offscreenSubtreeWasHidden ||\n          null === current ||\n          safelyDetachRef(current, current.return));\n      if (flags & 4) {\n        var currentResource = null !== current ? current.memoizedState : null;\n        flags = finishedWork.memoizedState;\n        if (null === current)\n          if (null === flags)\n            if (null === finishedWork.stateNode) {\n              a: {\n                flags = finishedWork.type;\n                current = finishedWork.memoizedProps;\n                hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;\n                b: switch (flags) {\n                  case "title":\n                    currentResource =\n                      hoistableRoot.getElementsByTagName("title")[0];\n                    if (\n                      !currentResource ||\n                      currentResource[internalHoistableMarker] ||\n                      currentResource[internalInstanceKey] ||\n                      "http://www.w3.org/2000/svg" ===\n                        currentResource.namespaceURI ||\n                      currentResource.hasAttribute("itemprop")\n                    )\n                      (currentResource = hoistableRoot.createElement(flags)),\n                        hoistableRoot.head.insertBefore(\n                          currentResource,\n                          hoistableRoot.querySelector("head > title")\n                        );\n                    setInitialProperties(currentResource, flags, current);\n                    currentResource[internalInstanceKey] = finishedWork;\n                    markNodeAsHoistable(currentResource);\n                    flags = currentResource;\n                    break a;\n                  case "link":\n                    var maybeNodes = getHydratableHoistableCache(\n                      "link",\n                      "href",\n                      hoistableRoot\n                    ).get(flags + (current.href || ""));\n                    if (maybeNodes)\n                      for (var i = 0; i < maybeNodes.length; i++)\n                        if (\n                          ((currentResource = maybeNodes[i]),\n                          currentResource.getAttribute("href") ===\n                            (null == current.href || "" === current.href\n                              ? null\n                              : current.href) &&\n                            currentResource.getAttribute("rel") ===\n                              (null == current.rel ? null : current.rel) &&\n                            currentResource.getAttribute("title") ===\n                              (null == current.title ? null : current.title) &&\n                            currentResource.getAttribute("crossorigin") ===\n                              (null == current.crossOrigin\n                                ? null\n                                : current.crossOrigin))\n                        ) {\n                          maybeNodes.splice(i, 1);\n                          break b;\n                        }\n                    currentResource = hoistableRoot.createElement(flags);\n                    setInitialProperties(currentResource, flags, current);\n                    hoistableRoot.head.appendChild(currentResource);\n                    break;\n                  case "meta":\n                    if (\n                      (maybeNodes = getHydratableHoistableCache(\n                        "meta",\n                        "content",\n                        hoistableRoot\n                      ).get(flags + (current.content || "")))\n                    )\n                      for (i = 0; i < maybeNodes.length; i++)\n                        if (\n                          ((currentResource = maybeNodes[i]),\n                          currentResource.getAttribute("content") ===\n                            (null == current.content\n                              ? null\n                              : "" + current.content) &&\n                            currentResource.getAttribute("name") ===\n                              (null == current.name ? null : current.name) &&\n                            currentResource.getAttribute("property") ===\n                              (null == current.property\n                                ? null\n                                : current.property) &&\n                            currentResource.getAttribute("http-equiv") ===\n                              (null == current.httpEquiv\n                                ? null\n                                : current.httpEquiv) &&\n                            currentResource.getAttribute("charset") 
1===\n                              (null == current.charSet\n                                ? null\n                                : current.charSet))\n                        ) {\n                          maybeNodes.splice(i, 1);\n                          break b;\n                        }\n                    currentResource = hoistableRoot.createElement(flags);\n                    setInitialProperties(currentResource, flags, current);\n                    hoistableRoot.head.appendChild(currentResource);\n                    break;\n                  default:\n                    throw Error(formatProdErrorMessage(468, flags));\n                }\n                currentResource[internalInstanceKey] = finishedWork;\n                markNodeAsHoistable(currentResource);\n                flags = currentResource;\n              }\n              finishedWork.stateNode = flags;\n            } else\n              mountHoistable(\n                hoistableRoot,\n                finishedWork.type,\n                finishedWork.stateNode\n              );\n          else\n            finishedWork.stateNode = acquireResource(\n              hoistableRoot,\n              flags,\n              finishedWork.memoizedProps\n            );\n        else\n          currentResource !== flags\n            ? (null === currentResource\n                ? null !== current.stateNode &&\n                  ((current = current.stateNode),\n                  current.parentNode.removeChild(current))\n                : currentResource.count--,\n              null === flags\n                ? mountHoistable(\n                    hoistableRoot,\n                    finishedWork.type,\n                    finishedWork.stateNode\n                  )\n                : acquireResource(\n                    hoistableRoot,\n                    flags,\n                    finishedWork.memoizedProps\n                  ))\n            : null === flags &&\n              null !== finishedWork.stateNode &&\n              commitHostUpdate(\n                finishedWork,\n                finishedWork.memoizedProps,\n                current.memoizedProps\n              );\n      }\n      break;\n    case 27:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 512 &&\n        (offscreenSubtreeWasHidden ||\n          null === current ||\n          safelyDetachRef(current, current.return));\n      null !== current &&\n        flags & 4 &&\n        commitHostUpdate(\n          finishedWork,\n          finishedWork.memoizedProps,\n          current.memoizedProps\n        );\n      break;\n    case 5:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 512 &&\n        (offscreenSubtreeWasHidden ||\n          null === current ||\n          safelyDetachRef(current, current.return));\n      if (finishedWork.flags & 32) {\n        hoistableRoot = finishedWork.stateNode;\n        try {\n          setTextContent(hoistableRoot, "");\n        } catch (error) {\n          captureCommitPhaseError(finishedWork, finishedWork.return, error);\n        }\n      }\n      flags & 4 &&\n        null != finishedWork.stateNode &&\n        ((hoistableRoot = finishedWork.memoizedProps),\n        commitHostUpdate(\n          finishedWork,\n          hoistableRoot,\n          null !== current ? current.memoizedProps : hoistableRoot\n        ));\n      flags & 1024 && (needsFormReset = !0);\n      break;\n    case 6:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      if (flags & 4) {\n        if (null === finishedWork.stateNode)\n          throw Error(formatProdErrorMessage(162));\n        flags = finishedWork.memoizedProps;\n        current = finishedWork.stateNode;\n        try {\n          current.nodeValue = flags;\n        } catch (error) {\n          captureCommitPhaseError(finishedWork, finishedWork.return, error);\n        }\n      }\n      break;\n    case 3:\n      tagCaches = null;\n      hoistableRoot = currentHoistableRoot;\n      currentHoistableRoot = getHoistableRoot(root.containerInfo);\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      currentHoistableRoot = hoistableRoot;\n      commitReconciliationEffects(finishedWork);\n      if (flags & 4 && null !== current && current.memoizedState.isDehydrated)\n        try {\n          retryIfBlockedOn(root.containerInfo);\n        } catch (error) {\n          captureCommitPhaseError(finishedWork, finishedWork.return, error);\n        }\n      needsFormReset &&\n        ((needsFormReset = !1), recursivelyResetForms(finishedWork));\n      break;\n    case 4:\n      flags = currentHoistableRoot;\n      currentHoistableRoot = getHoistableRoot(\n        finishedWork.stateNode.containerInfo\n      );\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      currentHoistableRoot = flags;\n      break;\n    case 12:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      break;\n    case 13:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      finishedWork.child.flags & 8192 &&\n        (null !== finishedWork.memoizedState) !==\n          (null !== current && null !== current.memoizedState) &&\n        (globalMostRecentFallbackTime = now());\n      flags & 4 &&\n        ((flags = finishedWork.updateQueue),\n        null !== flags &&\n          ((finishedWork.updateQueue = null),\n          attachSuspenseRetryListeners(finishedWork, flags)));\n      break;\n    case 22:\n      hoistableRoot = null !== finishedWork.memoizedState;\n      var wasHidden = null !== current && null !== current.memoizedState,\n        prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden,\n        prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;\n      offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || hoistableRoot;\n      offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || wasHidden;\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;\n      offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;\n      commitReconciliationEffects(finishedWork);\n      if (flags & 8192)\n        a: for (\n          root = finishedWork.stateNode,\n            root._visibility = hoistableRoot\n              ? root._visibility & -2\n              : root._visibility | 1,\n            hoistableRoot &&\n              (null === current ||\n                wasHidden ||\n                offscreenSubtreeIsHidden ||\n                offscreenSubtreeWasHidden ||\n                recursivelyTraverseDisappearLayoutEffects(finishedWork)),\n            current = null,\n            root = finishedWork;\n          ;\n\n        ) {\n          if (5 === root.tag || 26 === root.tag) {\n            if (null === current) {\n              wasHidden = current = root;\n              try {\n                if (((currentResource = wasHidden.stateNode), hoistableRoot))\n                  (maybeNodes = currentResource.style),\n                    "function" === typeof maybeNodes.setProperty\n                      ? maybeNodes.setProperty("display", "none", "important")\n                      : (maybeNodes.display = "none");\n                else {\n                  i = wasHidden.stateNode;\n                  var styleProp = wasHidden.memoizedProps.style,\n                    display =\n                      void 0 !== styleProp &&\n                      null !== styleProp &&\n                      styleProp.hasOwnProperty("display")\n                        ? styleProp.display\n                        : null;\n                  i.style.display =\n                    null == display || "boolean" === typeof display\n                      ? ""\n                      : ("" + display).trim();\n                }\n              } catch (error) {\n                captureCommitPhaseError(wasHidden, wasHidden.return, error);\n              }\n            }\n          }
1 else if (6 === root.tag) {\n            if (null === current) {\n              wasHidden = root;\n              try {\n                wasHidden.stateNode.nodeValue = hoistableRoot\n                  ? ""\n                  : wasHidden.memoizedProps;\n              } catch (error) {\n                captureCommitPhaseError(wasHidden, wasHidden.return, error);\n              }\n            }\n          } else if (\n            ((22 !== root.tag && 23 !== root.tag) ||\n              null === root.memoizedState ||\n              root === finishedWork) &&\n            null !== root.child\n          ) {\n            root.child.return = root;\n            root = root.child;\n            continue;\n          }\n          if (root === finishedWork) break a;\n          for (; null === root.sibling; ) {\n            if (null === root.return || root.return === finishedWork) break a;\n            current === root && (current = null);\n            root = root.return;\n          }\n          current === root && (current = null);\n          root.sibling.return = root.return;\n          root = root.sibling;\n        }\n      flags & 4 &&\n        ((flags = finishedWork.updateQueue),\n        null !== flags &&\n          ((current = flags.retryQueue),\n          null !== current &&\n            ((flags.retryQueue = null),\n            attachSuspenseRetryListeners(finishedWork, current))));\n      break;\n    case 19:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 4 &&\n        ((flags = finishedWork.updateQueue),\n        null !== flags &&\n          ((finishedWork.updateQueue = null),\n          attachSuspenseRetryListeners(finishedWork, flags)));\n      break;\n    case 30:\n      break;\n    case 21:\n      break;\n    default:\n      recursivelyTraverseMutationEffects(root, finishedWork),\n        commitReconciliationEffects(finishedWork);\n  }\n}\nfunction commitReconciliationEffects(finishedWork) {\n  var flags = finishedWork.flags;\n  if (flags & 2) {\n    try {\n      for (\n        var hostParentFiber, parentFiber = finishedWork.return;\n        null !== parentFiber;\n\n      ) {\n        if (isHostParent(parentFiber)) {\n          hostParentFiber = parentFiber;\n          break;\n        }\n        parentFiber = parentFiber.return;\n      }\n      if (null == hostParentFiber) throw Error(formatProdErrorMessage(160));\n      switch (hostParentFiber.tag) {\n        case 27:\n          var parent = hostParentFiber.stateNode,\n            before = getHostSibling(finishedWork);\n          insertOrAppendPlacementNode(finishedWork, before, parent);\n          break;\n        case 5:\n          var parent$144 = hostParentFiber.stateNode;\n          hostParentFiber.flags & 32 &&\n            (setTextContent(parent$144, ""), (hostParentFiber.flags &= -33));\n          var before$145 = getHostSibling(finishedWork);\n          insertOrAppendPlacementNode(finishedWork, before$145, parent$144);\n          break;\n        case 3:\n        case 4:\n          var parent$146 = hostParentFiber.stateNode.containerInfo,\n            before$147 = getHostSibling(finishedWork);\n          insertOrAppendPlacementNodeIntoContainer(\n            finishedWork,\n            before$147,\n            parent$146\n          );\n          break;\n        default:\n          throw Error(formatProdErrorMessage(161));\n      }\n    } catch (error) {\n      captureCommitPhaseError(finishedWork, finishedWork.return, error);\n    }\n    finishedWork.flags &= -3;\n  }\n  flags & 4096 && (finishedWork.flags &= -4097);\n}\nfunction recursivelyResetForms(parentFiber) {\n  if (parentFiber.subtreeFlags & 1024)\n    for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n      var fiber = parentFiber;\n      recursivelyResetForms(fiber);\n      5 === fiber.tag && fiber.flags & 1024 && fiber.stateNode.reset();\n      parentFiber = parentFiber.sibling;\n    }\n}\nfunction recursivelyTraverseLayoutEffects(root, parentFiber) {\n  if (parentFiber.subtreeFlags & 8772)\n    for (parentFiber = parentFiber.child; null !== parentFiber; )\n      commitLayoutEffectOnFiber(root, parentFiber.alternate, parentFiber),\n        (parentFiber = parentFiber.sibling);\n}\nfunction recursivelyTraverseDisappearLayoutEffects(parentFiber) {\n  for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n    var finishedWork = parentFiber;\n    switch (finishedWork.tag) {\n      case 0:\n      case 11:\n      case 14:\n      case 15:\n        commitHookEffectListUnmount(4, finishedWork, finishedWork.return);\n        recursivelyTraverseDisappearLayoutEffects(finishedWork);\n        break;\n      case 1:\n        safelyDetachRef(finishedWork, finishedWork.return);
1\n        var instance = finishedWork.stateNode;\n        "function" === typeof instance.componentWillUnmount &&\n          safelyCallComponentWillUnmount(\n            finishedWork,\n            finishedWork.return,\n            instance\n          );\n        recursivelyTraverseDisappearLayoutEffects(finishedWork);\n        break;\n      case 27:\n        releaseSingletonInstance(finishedWork.stateNode);\n      case 26:\n      case 5:\n        safelyDetachRef(finishedWork, finishedWork.return);\n        recursivelyTraverseDisappearLayoutEffects(finishedWork);\n        break;\n      case 22:\n        null === finishedWork.memoizedState &&\n          recursivelyTraverseDisappearLayoutEffects(finishedWork);\n        break;\n      case 30:\n        recursivelyTraverseDisappearLayoutEffects(finishedWork);\n        break;\n      default:\n        recursivelyTraverseDisappearLayoutEffects(finishedWork);\n    }\n    parentFiber = parentFiber.sibling;\n  }\n}\nfunction recursivelyTraverseReappearLayoutEffects(\n  finishedRoot$jscomp$0,\n  parentFiber,\n  includeWorkInProgressEffects\n) {\n  includeWorkInProgressEffects =\n    includeWorkInProgressEffects && 0 !== (parentFiber.subtreeFlags & 8772);\n  for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n    var current = parentFiber.alternate,\n      finishedRoot = finishedRoot$jscomp$0,\n      finishedWork = parentFiber,\n      flags = finishedWork.flags;\n    switch (finishedWork.tag) {\n      case 0:\n      case 11:\n      case 15:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n        commitHookEffectListMount(4, finishedWork);\n        break;\n      case 1:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n        current = finishedWork;\n        finishedRoot = current.stateNode;\n        if ("function" === typeof finishedRoot.componentDidMount)\n          try {\n            finishedRoot.componentDidMount();\n          } catch (error) {\n            captureCommitPhaseError(current, current.return, error);\n          }\n        current = finishedWork;\n        finishedRoot = current.updateQueue;\n        if (null !== finishedRoot) {\n          var instance = current.stateNode;\n          try {\n            var hiddenCallbacks = finishedRoot.shared.hiddenCallbacks;\n            if (null !== hiddenCallbacks)\n              for (\n                finishedRoot.shared.hiddenCallbacks = null, finishedRoot = 0;\n                finishedRoot < hiddenCallbacks.length;\n                finishedRoot++\n              )\n                callCallback(hiddenCallbacks[finishedRoot], instance);\n          } catch (error) {\n            captureCommitPhaseError(current, current.return, error);\n          }\n        }\n        includeWorkInProgressEffects &&\n          flags & 64 &&\n          commitClassCallbacks(finishedWork);\n        safelyAttachRef(finishedWork, finishedWork.return);\n        break;\n      case 27:\n        commitHostSingletonAcquisition(finishedWork);\n      case 26:\n      case 5:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n        includeWorkInProgressEffects &&\n          null === current &&\n          flags & 4 &&\n          commitHostMount(finishedWork);\n        safelyAttachRef(finishedWork, finishedWork.return);\n        break;\n      case 12:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n        break;\n      case 13:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n        includeWorkInProgressEffects &&\n          flags & 4 &&\n          commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);\n        break;\n      case 22:\n        null === finishedWork.memoizedState &&\n          recursivelyTraverseReappearLayoutEffects(\n            finishedRoot,\n            finishedWork,\n            includeWorkInProgressEffects\n          );\n        safelyAttachRef(finishedWork, finishedWork.return);\n        break;\n      case 30:\n        break;\n      default:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n    }\n    parentFiber = parentFiber.sibling;\n  }\n}\nfunction commitOffscreenPassiveMountEffects(current, finishedWork) {\n  var previousCache = null;\n  null !== current &&\n    null !== current.memoizedState &&\n    null !== current.memoizedState.cachePool &&\n    (previousCache = current.memoizedState.cachePool.pool);\n  current = null;\n  null !== finishedWork.memoizedState &&\n    null !== finishedWork.memoizedState.cachePool &&\n    (current = finishedWork.memoizedState.cachePool.pool);\n  current !== previousCache &&\n    (null != current && current.refCount++,\n    null != previousCache && releaseCache(previousCache));\n}\nfunction commitCachePassiveMountEffect(current, finishedWork) {\n  current = null;\n  null !== finishedWork.alternate &&\n    (current = finishedWork.alternate.memoizedState.cache);\n  finishedWork = finishedWork.memoizedState.cache;\n  finishedWork !== current &&\n    (finishedWork.refCount++, null != current && releaseCache(current));\n}\nfunction recursivelyTraversePassiveMountEffects(\n  root,\n  parentFiber,\n  committedLanes,\n  committedTransitions\n) {\n  if (parentFiber.subtreeFlags & 10256)\n    for (parentFiber = parentFiber.child; null !== parentFiber; )\n      commitPassiveMountOnFiber(\n        root,\n        parentFiber,\n        committedLanes,\n        committedTransitions\n      ),\n        (parentFiber = parentFiber.sibling);\n}\nfunction commitPassiveMountOnFiber(\n  finishedRoot,\n  finishedWork,\n  committedLanes,\n  committedTransitions\n) {\n  var flags = finishedWork.flags;\n  switch (finishedWork.tag) {\n    case 0:\n    case 11:\n    case 15:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n      flags & 2048 && commitHookEffectListMount(9, finishedWork);\n      break;\n    case 1:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n      break;\n    case 3:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n      flags & 2048 &&\n        ((finishedRoot = null),\n        null !== finishedWork.alternate &&\n          (finishedRoot = finishedWork.alternate.memoizedState.cache),\n        (finishedWork = finishedWork.memoizedState.cache),\n        finishedWork !== finishedRoot &&\n          (finishedWork.refCount++,\n          null != finishedRoot && releaseCache(finishedRoot)));\n      break;\n    case 12:\n      if (flags & 2048) {\n        recursivelyTraversePassiveMountEffects(\n          finishedRoot,\n          finishedWork,\n          committedLanes,\n          committedTransitions\n        );\n        finishedRoot = finishedWork.stateNode;\n        try {\n          var _finishedWork$memoize2 = finishedWork.memoizedProps,\n            id = _finishedWork$memoize2.id,\n            onPostCommit = _finishedWork$memoize2.onPostCommit;\n          "function" === typeof onPostCommit &&\n            onPostCommit(\n              id,\n              null === finishedWork.alternate ? "mount" : "update",\n              finishedRoot.passiveEffectDuration,\n              -0\n            );\n        } catch (error) {\n          captureCommitPhaseError(finishedWork, finishedWork.return, error);\n        }\n      } else\n        recursivelyTraversePassiveMountEffects(\n          finishedRoot,\n          finishedWork,\n          committedLanes,\n          committedTransitions\n        );\n      break;\n    case 13:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n      break;\n    case 23:\n      break;\n    case 22:\n      _finishedWork$memoize2 = finishedWork.stateNode;\n      id = finishedWork.alternate;\n      null !== finishedWork.memoizedState\n        ? _finishedWork$memoize2._visibility & 2\n          ? recursivelyTraversePassiveMountEffects(\n              finishedRoot,\n              finishedWork,\n              committedLanes,\n              committedTransitions\n            )\n          : recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork)\n        : _finishedWork$memoize2._visibility & 2\n          ? recursivelyTraversePassiveMountEffects(\n              finishedRoot,\n              finishedWork,\n              committedLanes,\n              committedTransitions\n            )\n          : ((_finishedWork$memoize2._visibility |= 2),\n            recursivelyTraverseReconnectPassiveEffects(\n              finishedRoot,\n              finishedWork,\n              committedLanes,\n              committedTransitions,\n              0 !== (finishedWork.subtreeFlags & 10256)\n            ));\n      flags & 2048 && commitOffscreenPassiveMountEffects(id, finishedWork);\n      break;\n    case 24:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n      flags & 2048 &&\n        commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);\n      break;\n    default:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n  }\n}\nfunction recursivelyTraverseReconnectPassiveEffects(\n  finishedRoot$jscomp$0,\n  parentFiber,\n  committedLanes$jscomp$0,\n  committedTransitions$jscomp$0,\n  includeWorkInProgressEffects\n) {\n  includeWorkInProgressEffects =\n    includeWorkInProgressEffects && 0 !== (parentFiber.subtreeFlags & 10256);\n  for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n    var finishedRoot = finishedRoot$jscomp$0,\n      finishedWork = parentFiber,\n      committedLanes = committedLanes$jscomp$0,\n      committedTransitions = committedTransitions$jscomp$0,\n      flags = finishedWork.flags;\n    switch (finishedWork.tag) {\n      case 0:\n      case 11:\n      case 15:\n        recursivelyTraverseReconnectPassiveEffects(\n          finishedRoot,\n          finishedWork,\n          committedLanes,\n          committedTransitions,\n          includeWorkInProgressEffects\n        );\n        commitHookEffectListMount(8, finishedWork);\n        break;\n      case 23:\n        break;
1\n      case 22:\n        var instance = finishedWork.stateNode;\n        null !== finishedWork.memoizedState\n          ? instance._visibility & 2\n            ? recursivelyTraverseReconnectPassiveEffects(\n                finishedRoot,\n                finishedWork,\n                committedLanes,\n                committedTransitions,\n                includeWorkInProgressEffects\n              )\n            : recursivelyTraverseAtomicPassiveEffects(\n                finishedRoot,\n                finishedWork\n              )\n          : ((instance._visibility |= 2),\n            recursivelyTraverseReconnectPassiveEffects(\n              finishedRoot,\n              finishedWork,\n              committedLanes,\n              committedTransitions,\n              includeWorkInProgressEffects\n            ));\n        includeWorkInProgressEffects &&\n          flags & 2048 &&\n          commitOffscreenPassiveMountEffects(\n            finishedWork.alternate,\n            finishedWork\n          );\n        break;\n      case 24:\n        recursivelyTraverseReconnectPassiveEffects(\n          finishedRoot,\n          finishedWork,\n          committedLanes,\n          committedTransitions,\n          includeWorkInProgressEffects\n        );\n        includeWorkInProgressEffects &&\n          flags & 2048 &&\n          commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);\n        break;\n      default:\n        recursivelyTraverseReconnectPassiveEffects(\n          finishedRoot,\n          finishedWork,\n          committedLanes,\n          committedTransitions,\n          includeWorkInProgressEffects\n        );\n    }\n    parentFiber = parentFiber.sibling;\n  }\n}\nfunction recursivelyTraverseAtomicPassiveEffects(\n  finishedRoot$jscomp$0,\n  parentFiber\n) {\n  if (parentFiber.subtreeFlags & 10256)\n    for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n      var finishedRoot = finishedRoot$jscomp$0,\n        finishedWork = parentFiber,\n        flags = finishedWork.flags;\n      switch (finishedWork.tag) {\n        case 22:\n          recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork);\n          flags & 2048 &&\n            commitOffscreenPassiveMountEffects(\n              finishedWork.alternate,\n              finishedWork\n            );\n          break;\n        case 24:\n          recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork);\n          flags & 2048 &&\n            commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);\n          break;\n        default:\n          recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork);\n      }\n      parentFiber = parentFiber.sibling;\n    }\n}\nvar suspenseyCommitFlag = 8192;\nfunction recursivelyAccumulateSuspenseyCommit(parentFiber) {\n  if (parentFiber.subtreeFlags & suspenseyCommitFlag)\n    for (parentFiber = parentFiber.child; null !== parentFiber; )\n      accumulateSuspenseyCommitOnFiber(parentFiber),\n        (parentFiber = parentFiber.sibling);\n}\nfunction accumulateSuspenseyCommitOnFiber(fiber) {\n  switch (fiber.tag) {\n    case 26:\n      recursivelyAccumulateSuspenseyCommit(fiber);\n      fiber.flags & suspenseyCommitFlag &&\n        null !== fiber.memoizedState &&\n        suspendResource(\n          currentHoistableRoot,\n          fiber.memoizedState,\n          fiber.memoizedProps\n        );\n      break;\n    case 5:\n      recursivelyAccumulateSuspenseyCommit(fiber);\n      break;\n    case 3:\n    case 4:\n      var previousHoistableRoot = currentHoistableRoot;\n      currentHoistableRoot = getHoistableRoot(fiber.stateNode.containerInfo);\n      recursivelyAccumulateSuspenseyCommit(fiber);\n      currentHoistableRoot = previousHoistableRoot;\n      break;\n    case 22:\n      null === fiber.memoizedState &&\n        ((previousHoistableRoot = fiber.alternate),\n        null !== previousHoistableRoot &&\n        null !== previousHoistableRoot.memoizedState\n          ? ((previousHoistableRoot = suspenseyCommitFlag),\n            (suspenseyCommitFlag = 16777216),\n            recursivelyAccumulateSuspenseyCommit(fiber),\n            (suspenseyCommitFlag = previousHoistableRoot))\n          : recursivelyAccumulateSuspenseyCommit(fiber));\n      break;\n    default:\n      recursivelyAccumulateSuspenseyCommit(fiber);\n  }\n}\nfunction detachAlternateSiblings(parentFiber) {\n  var previousFiber = parentFiber.alternate;\n  if (\n    null !== previousFiber &&\n    ((parentFiber = previousFiber.child), null !== parentFiber)\n  ) {\n    previousFiber.child = null;\n    do\n      (previousFiber = parentFiber.sibling),\n        (parentFiber.sibling = null),\n        (parentFiber = previousFiber);\n    while (null !== parentFiber);\n  }\n}\nfunction recursivelyTraversePassiveUnmountEffects(parentFiber) {\n  var deleti
1ons = parentFiber.deletions;\n  if (0 !== (parentFiber.flags & 16)) {\n    if (null !== deletions)\n      for (var i = 0; i < deletions.length; i++) {\n        var childToDelete = deletions[i];\n        nextEffect = childToDelete;\n        commitPassiveUnmountEffectsInsideOfDeletedTree_begin(\n          childToDelete,\n          parentFiber\n        );\n      }\n    detachAlternateSiblings(parentFiber);\n  }\n  if (parentFiber.subtreeFlags & 10256)\n    for (parentFiber = parentFiber.child; null !== parentFiber; )\n      commitPassiveUnmountOnFiber(parentFiber),\n        (parentFiber = parentFiber.sibling);\n}\nfunction commitPassiveUnmountOnFiber(finishedWork) {\n  switch (finishedWork.tag) {\n    case 0:\n    case 11:\n    case 15:\n      recursivelyTraversePassiveUnmountEffects(finishedWork);\n      finishedWork.flags & 2048 &&\n        commitHookEffectListUnmount(9, finishedWork, finishedWork.return);\n      break;\n    case 3:\n      recursivelyTraversePassiveUnmountEffects(finishedWork);\n      break;\n    case 12:\n      recursivelyTraversePassiveUnmountEffects(finishedWork);\n      break;\n    case 22:\n      var instance = finishedWork.stateNode;\n      null !== finishedWork.memoizedState &&\n      instance._visibility & 2 &&\n      (null === finishedWork.return || 13 !== finishedWork.return.tag)\n        ? ((instance._visibility &= -3),\n          recursivelyTraverseDisconnectPassiveEffects(finishedWork))\n        : recursivelyTraversePassiveUnmountEffects(finishedWork);\n      break;\n    default:\n      recursivelyTraversePassiveUnmountEffects(finishedWork);\n  }\n}\nfunction recursivelyTraverseDisconnectPassiveEffects(parentFiber) {\n  var deletions = parentFiber.deletions;\n  if (0 !== (parentFiber.flags & 16)) {\n    if (null !== deletions)\n      for (var i = 0; i < deletions.length; i++) {\n        var childToDelete = deletions[i];\n        nextEffect = childToDelete;\n        commitPassiveUnmountEffectsInsideOfDeletedTree_begin(\n          childToDelete,\n          parentFiber\n        );\n      }\n    detachAlternateSiblings(parentFiber);\n  }\n  for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n    deletions = parentFiber;\n    switch (deletions.tag) {\n      case 0:\n      case 11:\n      case 15:\n        commitHookEffectListUnmount(8, deletions, deletions.return);\n        recursivelyTraverseDisconnectPassiveEffects(deletions);\n        break;\n      case 22:\n        i = deletions.stateNode;\n        i._visibility & 2 &&\n          ((i._visibility &= -3),\n          recursivelyTraverseDisconnectPassiveEffects(deletions));\n        break;\n      default:\n        recursivelyTraverseDisconnectPassiveEffects(deletions);\n    }\n    parentFiber = parentFiber.sibling;\n  }\n}\nfunction commitPassiveUnmountEffectsInsideOfDeletedTree_begin(\n  deletedSubtreeRoot,\n  nearestMountedAncestor\n) {\n  for (; null !== nextEffect; ) {\n    var fiber = nextEffect;\n    switch (fiber.tag) {\n      case 0:\n      case 11:\n      case 15:\n        commitHookEffectListUnmount(8, fiber, nearestMountedAncestor);\n        break;\n      case 23:\n      case 22:\n        if (\n          null !== fiber.memoizedState &&\n          null !== fiber.memoizedState.cachePool\n        ) {\n          var cache = fiber.memoizedState.cachePool.pool;\n          null != cache && cache.refCount++;\n        }\n        break;\n      case 24:\n        releaseCache(fiber.memoizedState.cache);\n    }\n    cache = fiber.child;\n    if (null !== cache) (cache.return = fiber), (nextEffect = cache);\n    else\n      a: for (fiber = deletedSubtreeRoot; null !== nextEffect; ) {\n        cache = nextEffect;\n        var sibling = cache.sibling,\n          returnFiber = cache.return;\n        detachFiberAfterEffects(cache);\n        if (cache === fiber) {\n          nextEffect = null;\n          break a;\n        }\n        if (null !== sibling) {\n          sibling.return = returnFiber;\n          nextEffect = sibling;\n          break a;\n        }\n        nextEffect = returnFiber;\n      }\n  }\n}
1\nvar DefaultAsyncDispatcher = {\n    getCacheForType: function (resourceType) {\n      var cache = readContext(CacheContext),\n        cacheForType = cache.data.get(resourceType);\n      void 0 === cacheForType &&\n        ((cacheForType = resourceType()),\n        cache.data.set(resourceType, cacheForType));\n      return cacheForType;\n    }\n  },\n  PossiblyWeakMap = "function" === typeof WeakMap ? WeakMap : Map,\n  executionContext = 0,\n  workInProgressRoot = null,\n  workInProgress = null,\n  workInProgressRootRenderLanes = 0,\n  workInProgressSuspendedReason = 0,\n  workInProgressThrownValue = null,\n  workInProgressRootDidSkipSuspendedSiblings = !1,\n  workInProgressRootIsPrerendering = !1,\n  workInProgressRootDidAttachPingListener = !1,\n  entangledRenderLanes = 0,\n  workInProgressRootExitStatus = 0,\n  workInProgressRootSkippedLanes = 0,\n  workInProgressRootInterleavedUpdatedLanes = 0,\n  workInProgressRootPingedLanes = 0,\n  workInProgressDeferredLane = 0,\n  workInProgressSuspendedRetryLanes = 0,\n  workInProgressRootConcurrentErrors = null,\n  workInProgressRootRecoverableErrors = null,\n  workInProgressRootDidIncludeRecursiveRenderUpdate = !1,\n  globalMostRecentFallbackTime = 0,\n  workInProgressRootRenderTargetTime = Infinity,\n  workInProgressTransitions = null,\n  legacyErrorBoundariesThatAlreadyFailed = null,\n  pendingEffectsStatus = 0,\n  pendingEffectsRoot = null,\n  pendingFinishedWork = null,\n  pendingEffectsLanes = 0,\n  pendingEffectsRemainingLanes = 0,\n  pendingPassiveTransitions = null,\n  pendingRecoverableErrors = null,\n  nestedUpdateCount = 0,\n  rootWithNestedUpdates = null;\nfunction requestUpdateLane() {\n  if (0 !== (executionContext & 2) && 0 !== workInProgressRootRenderLanes)\n    return workInProgressRootRenderLanes & -workInProgressRootRenderLanes;\n  if (null !== ReactSharedInternals.T) {\n    var actionScopeLane = currentEntangledLane;\n    return 0 !== actionScopeLane ? actionScopeLane : requestTransitionLane();\n  }\n  return resolveUpdatePriority();\n}\nfunction requestDeferredLane() {\n  0 === workInProgressDeferredLane &&\n    (workInProgressDeferredLane =\n      0 === (workInProgressRootRenderLanes & 536870912) || isHydrating\n        ? claimNextTransitionLane()\n        : 536870912);\n  var suspenseHandler = suspenseHandlerStackCursor.current;\n  null !== suspenseHandler && (suspenseHandler.flags |= 32);\n  return workInProgressDeferredLane;\n}\nfunction scheduleUpdateOnFiber(root, fiber, lane) {\n  if (\n    (root === workInProgressRoot &&\n      (2 === workInProgressSuspendedReason ||\n        9 === workInProgressSuspendedReason)) ||\n    null !== root.cancelPendingCommit\n  )\n    prepareFreshStack(root, 0),\n      markRootSuspended(\n        root,\n        workInProgressRootRenderLanes,\n        workInProgressDeferredLane,\n        !1\n      );\n  markRootUpdated$1(root, lane);\n  if (0 === (executionContext & 2) || root !== workInProgressRoot)\n    root === workInProgressRoot &&\n      (0 === (executionContext & 2) &&\n        (workInProgressRootInterleavedUpdatedLanes |= lane),\n      4 === workInProgressRootExitStatus &&\n        markRootSuspended(\n          root,\n          workInProgressRootRenderLanes,\n          workInProgressDeferredLane,\n          !1\n        )),\n      ensureRootIsScheduled(root);\n}\nfunction performWorkOnRoot(root$jscomp$0, lanes, forceSync) {\n  if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(327));\n  var shouldTimeSlice =\n      (!forceSync &&\n        0 === (lanes & 124) &&\n        0 === (lanes & root$jscomp$0.expiredLanes)) ||\n      checkIfRootIsPrerendering(root$jscomp$0, lanes),\n    exitStatus = shouldTimeSlice\n      ? renderRootConcurrent(root$jscomp$0, lanes)\n      : renderRootSync(root$jscomp$0, lanes, !0),\n    renderWasConcurrent = shouldTimeSlice;\n  do {\n    if (0 === exitStatus) {\n      workInProgressRootIsPrerendering &&\n        !shouldTimeSlice &&\n        markRootSuspended(root$jscomp$0, lanes, 0, !1);\n      break;\n    } else {\n      forceSync = root$jscomp$0.current.alternate;\n      if (\n        renderWasConcurrent &&\n        !isRenderConsistentWithExternalStores(forceSync)\n      ) {\n        exitStatus = renderRootSync(root$jscomp$0, lanes, !1);\n        renderWasConcurrent = !1;\n        continue;\n      }\n      if (2 === exitStatus) {\n        renderWasConcurrent = lanes;\n        if (root$jscomp$0.errorRecoveryDisabledLanes & renderWasConcurrent)\n          var JSCompiler_inline_result = 0;\n        else\n          (JSCompiler_inline_result = root$jscomp$0.pendingLanes & -536870913),\n            (JSCompiler_inline_result =\n              0 !== JSCompiler_inline_result\n                ? JSCompiler_inline_result\n                : JSCompiler_inline_result & 536870912\n                  ? 536870912\n                  : 0);\n        if (0 !== JSCompiler_inline_result) {\n          lanes = JSCompiler_inline_result;\n          a: {\n            var root = root$jscomp$0;\n            exitStatus = workInProgressRootConcurrentErrors;\n            var wasRootDehydrated = root.current.memoizedState.isDehydrated;\n            wasRootDehydrated &&\n              (prepareFreshStack(root, JSCompiler_inline_result).flags |= 256);\n            JSCompiler_inline_result = renderRootSync(\n              root,\n              JSCompiler_inline_result,\n              !1\n            );\n            if (2 !== JSCompiler_inline_result) {\n              if (\n                workInProgressRootDidAttachPingListener &&\n                !wasRootDehydrated\n              ) {\n                root.errorRecoveryDisabledLanes |= renderWasConcurrent;
1\n                workInProgressRootInterleavedUpdatedLanes |=\n                  renderWasConcurrent;\n                exitStatus = 4;\n                break a;\n              }\n              renderWasConcurrent = workInProgressRootRecoverableErrors;\n              workInProgressRootRecoverableErrors = exitStatus;\n              null !== renderWasConcurrent &&\n                (null === workInProgressRootRecoverableErrors\n                  ? (workInProgressRootRecoverableErrors = renderWasConcurrent)\n                  : workInProgressRootRecoverableErrors.push.apply(\n                      workInProgressRootRecoverableErrors,\n                      renderWasConcurrent\n                    ));\n            }\n            exitStatus = JSCompiler_inline_result;\n          }\n          renderWasConcurrent = !1;\n          if (2 !== exitStatus) continue;\n        }\n      }\n      if (1 === exitStatus) {\n        prepareFreshStack(root$jscomp$0, 0);\n        markRootSuspended(root$jscomp$0, lanes, 0, !0);\n        break;\n      }\n      a: {\n        shouldTimeSlice = root$jscomp$0;\n        renderWasConcurrent = exitStatus;\n        switch (renderWasConcurrent) {\n          case 0:\n          case 1:\n            throw Error(formatProdErrorMessage(345));\n          case 4:\n            if ((lanes & 4194048) !== lanes) break;\n          case 6:\n            markRootSuspended(\n              shouldTimeSlice,\n              lanes,\n              workInProgressDeferredLane,\n              !workInProgressRootDidSkipSuspendedSiblings\n            );\n            break a;\n          case 2:\n            workInProgressRootRecoverableErrors = null;\n            break;\n          case 3:\n          case 5:\n            break;\n          default:\n            throw Error(formatProdErrorMessage(329));\n        }\n        if (\n          (lanes & 62914560) === lanes &&\n          ((exitStatus = globalMostRecentFallbackTime + 300 - now()),\n          10 < exitStatus)\n        ) {\n          markRootSuspended(\n            shouldTimeSlice,\n            lanes,\n            workInProgressDeferredLane,\n            !workInProgressRootDidSkipSuspendedSiblings\n          );\n          if (0 !== getNextLanes(shouldTimeSlice, 0, !0)) break a;\n          shouldTimeSlice.timeoutHandle = scheduleTimeout(\n            commitRootWhenReady.bind(\n              null,\n              shouldTimeSlice,\n              forceSync,\n              workInProgressRootRecoverableErrors,\n              workInProgressTransitions,\n              workInProgressRootDidIncludeRecursiveRenderUpdate,\n              lanes,\n              workInProgressDeferredLane,\n              workInProgressRootInterleavedUpdatedLanes,\n              workInProgressSuspendedRetryLanes,\n              workInProgressRootDidSkipSuspendedSiblings,\n              renderWasConcurrent,\n              2,\n              -0,\n              0\n            ),\n            exitStatus\n          );\n          break a;\n        }\n        commitRootWhenReady(\n          shouldTimeSlice,\n          forceSync,\n          workInProgressRootRecoverableErrors,\n          workInProgressTransitions,\n          workInProgressRootDidIncludeRecursiveRenderUpdate,\n          lanes,\n          workInProgressDeferredLane,\n          workInProgressRootInterleavedUpdatedLanes,\n          workInProgressSuspendedRetryLanes,\n          workInProgressRootDidSkipSuspendedSiblings,\n          renderWasConcurrent,\n          0,\n          -0,\n          0\n        );\n      }\n    }\n    break;\n  } while (1);\n  ensureRootIsScheduled(root$jscomp$0);\n}\nfunction commitRootWhenReady(\n  root,\n  finishedWork,\n  recoverableErrors,\n  transitions,\n  didIncludeRenderPhaseUpdate,\n  lanes,\n  spawnedLane,\n  updatedLanes,\n  suspendedRetryLanes,\n  didSkipSuspendedSiblings,\n  exitStatus,\n  suspendedCommitReason,\n  completedRenderStartTime,\n  completedRenderEndTime\n) {\n  root.timeoutHandle = -1;\n  suspendedCommitReason = finishedWork.subtreeFlags;\n  if (\n    suspendedCommitReason & 8192 ||\n    16785408 === (suspendedCommitReason & 16785408)\n  )\n    if (\n      ((suspendedState = { stylesheets: null, count: 0, unsuspend: noop }),\n      accumulateSuspenseyCommitOnFiber(finishedWork),\n      (suspendedCommitReason = waitForCommitToBeReady()),\n      null !== suspendedCommitReason)\n    ) {\n      root.cancelPendingCommit = suspendedCommitReason(\n        commitRoot.bind(\n          null,\n          root,\n          finishedWork,\n          lanes,\n          recoverableErrors,\n          transitions,\n          didIncludeRenderPhaseUpdate,\n          spawnedLane,\n          updatedLanes,\n          suspendedRetryLanes,\n          exitStatus,\n          1,\n          completedRenderStartTime,\n          completedRenderEndTime\n        )\n      );
1\n      markRootSuspended(root, lanes, spawnedLane, !didSkipSuspendedSiblings);\n      return;\n    }\n  commitRoot(\n    root,\n    finishedWork,\n    lanes,\n    recoverableErrors,\n    transitions,\n    didIncludeRenderPhaseUpdate,\n    spawnedLane,\n    updatedLanes,\n    suspendedRetryLanes\n  );\n}\nfunction isRenderConsistentWithExternalStores(finishedWork) {\n  for (var node = finishedWork; ; ) {\n    var tag = node.tag;\n    if (\n      (0 === tag || 11 === tag || 15 === tag) &&\n      node.flags & 16384 &&\n      ((tag = node.updateQueue),\n      null !== tag && ((tag = tag.stores), null !== tag))\n    )\n      for (var i = 0; i < tag.length; i++) {\n        var check = tag[i],\n          getSnapshot = check.getSnapshot;\n        check = check.value;\n        try {\n          if (!objectIs(getSnapshot(), check)) return !1;\n        } catch (error) {\n          return !1;\n        }\n      }\n    tag = node.child;\n    if (node.subtreeFlags & 16384 && null !== tag)\n      (tag.return = node), (node = tag);\n    else {\n      if (node === finishedWork) break;\n      for (; null === node.sibling; ) {\n        if (null === node.return || node.return === finishedWork) return !0;\n        node = node.return;\n      }\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n  return !0;\n}\nfunction markRootSuspended(\n  root,\n  suspendedLanes,\n  spawnedLane,\n  didAttemptEntireTree\n) {\n  suspendedLanes &= ~workInProgressRootPingedLanes;\n  suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes;\n  root.suspendedLanes |= suspendedLanes;\n  root.pingedLanes &= ~suspendedLanes;\n  didAttemptEntireTree && (root.warmLanes |= suspendedLanes);\n  didAttemptEntireTree = root.expirationTimes;\n  for (var lanes = suspendedLanes; 0 < lanes; ) {\n    var index$4 = 31 - clz32(lanes),\n      lane = 1 << index$4;\n    didAttemptEntireTree[index$4] = -1;\n    lanes &= ~lane;\n  }\n  0 !== spawnedLane &&\n    markSpawnedDeferredLane(root, spawnedLane, suspendedLanes);\n}\nfunction flushSyncWork$1() {\n  return 0 === (executionContext & 6)\n    ? (flushSyncWorkAcrossRoots_impl(0, !1), !1)\n    : !0;\n}\nfunction resetWorkInProgressStack() {\n  if (null !== workInProgress) {\n    if (0 === workInProgressSuspendedReason)\n      var interruptedWork = workInProgress.return;\n    else\n      (interruptedWork = workInProgress),\n        (lastContextDependency = currentlyRenderingFiber$1 = null),\n        resetHooksOnUnwind(interruptedWork),\n        (thenableState = null),\n        (thenableIndexCounter = 0),\n        (interruptedWork = workInProgress);\n    for (; null !== interruptedWork; )\n      unwindInterruptedWork(interruptedWork.alternate, interruptedWork),\n        (interruptedWork = interruptedWork.return);\n    workInProgress = null;\n  }\n}\nfunction prepareFreshStack(root, lanes) {\n  var timeoutHandle = root.timeoutHandle;\n  -1 !== timeoutHandle &&\n    ((root.timeoutHandle = -1), cancelTimeout(timeoutHandle));\n  timeoutHandle = root.cancelPendingCommit;\n  null !== timeoutHandle &&\n    ((root.cancelPendingCommit = null), timeoutHandle());\n  resetWorkInProgressStack();\n  workInProgressRoot = root;\n  workInProgress = timeoutHandle = createWorkInProgress(root.current, null);\n  workInProgressRootRenderLanes = lanes;\n  workInProgressSuspendedReason = 0;\n  workInProgressThrownValue = null;\n  workInProgressRootDidSkipSuspendedSiblings = !1;\n  workInProgressRootIsPrerendering = checkIfRootIsPrerendering(root, lanes);\n  workInProgressRootDidAttachPingListener = !1;\n  workInProgressSuspendedRetryLanes =\n    workInProgressDeferredLane =\n    workInProgressRootPingedLanes =\n    workInProgressRootInterleavedUpdatedLanes =\n    workInProgressRootSkippedLanes =\n    workInProgressRootExitStatus =\n      0;\n  workInProgressRootRecoverableErrors = workInProgressRootConcurrentErrors =\n    null;\n  workInProgressRootDidIncludeRecursiveRenderUpdate = !1;\n  0 !== (lanes & 8) && (lanes |= lanes & 32);\n  var allEntangledLanes = root.entangledLanes;\n  if (0 !== allEntangledLanes)\n    for (\n      root = root.entanglements, allEntangledLanes &= lanes;\n      0 < allEntangledLanes;\n\n    ) {\n      var index$2 = 31 - clz32(allEntangledLanes),\n        lane = 1 << index$2;\n      lanes |= root[index$2];\n      allEntangledLanes &= ~lane;\n    }\n  entangledRenderLanes = lanes;\n  finishQueueingConcurrentUpdates();\n  return timeoutHandle;\n}\nfunction handleThrow(root, thrownValue) {\n  currentlyRenderingFiber = null;
1\n  ReactSharedInternals.H = ContextOnlyDispatcher;\n  thrownValue === SuspenseException || thrownValue === SuspenseActionException\n    ? ((thrownValue = getSuspendedThenable()),\n      (workInProgressSuspendedReason = 3))\n    : thrownValue === SuspenseyCommitException\n      ? ((thrownValue = getSuspendedThenable()),\n        (workInProgressSuspendedReason = 4))\n      : (workInProgressSuspendedReason =\n          thrownValue === SelectiveHydrationException\n            ? 8\n            : null !== thrownValue &&\n                "object" === typeof thrownValue &&\n                "function" === typeof thrownValue.then\n              ? 6\n              : 1);\n  workInProgressThrownValue = thrownValue;\n  null === workInProgress &&\n    ((workInProgressRootExitStatus = 1),\n    logUncaughtError(\n      root,\n      createCapturedValueAtFiber(thrownValue, root.current)\n    ));\n}\nfunction pushDispatcher() {\n  var prevDispatcher = ReactSharedInternals.H;\n  ReactSharedInternals.H = ContextOnlyDispatcher;\n  return null === prevDispatcher ? ContextOnlyDispatcher : prevDispatcher;\n}\nfunction pushAsyncDispatcher() {\n  var prevAsyncDispatcher = ReactSharedInternals.A;\n  ReactSharedInternals.A = DefaultAsyncDispatcher;\n  return prevAsyncDispatcher;\n}\nfunction renderDidSuspendDelayIfPossible() {\n  workInProgressRootExitStatus = 4;\n  workInProgressRootDidSkipSuspendedSiblings ||\n    ((workInProgressRootRenderLanes & 4194048) !==\n      workInProgressRootRenderLanes &&\n      null !== suspenseHandlerStackCursor.current) ||\n    (workInProgressRootIsPrerendering = !0);\n  (0 === (workInProgressRootSkippedLanes & 134217727) &&\n    0 === (workInProgressRootInterleavedUpdatedLanes & 134217727)) ||\n    null === workInProgressRoot ||\n    markRootSuspended(\n      workInProgressRoot,\n      workInProgressRootRenderLanes,\n      workInProgressDeferredLane,\n      !1\n    );\n}\nfunction renderRootSync(root, lanes, shouldYieldForPrerendering) {\n  var prevExecutionContext = executionContext;\n  executionContext |= 2;\n  var prevDispatcher = pushDispatcher(),\n    prevAsyncDispatcher = pushAsyncDispatcher();\n  if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes)\n    (workInProgressTransitions = null), prepareFreshStack(root, lanes);\n  lanes = !1;\n  var exitStatus = workInProgressRootExitStatus;\n  a: do\n    try {\n      if (0 !== workInProgressSuspendedReason && null !== workInProgress) {\n        var unitOfWork = workInProgress,\n          thrownValue = workInProgressThrownValue;\n        switch (workInProgressSuspendedReason) {\n          case 8:\n            resetWorkInProgressStack();\n            exitStatus = 6;\n            break a;\n          case 3:\n          case 2:\n          case 9:\n          case 6:\n            null === suspenseHandlerStackCursor.current && (lanes = !0);\n            var reason = workInProgressSuspendedReason;\n            workInProgressSuspendedReason = 0;\n            workInProgressThrownValue = null;\n            throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, reason);\n            if (\n              shouldYieldForPrerendering &&\n              workInProgressRootIsPrerendering\n            ) {\n              exitStatus = 0;\n              break a;\n            }\n            break;\n          default:\n            (reason = workInProgressSuspendedReason),\n              (workInProgressSuspendedReason = 0),\n              (workInProgressThrownValue = null),\n              throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, reason);\n        }\n      }\n      workLoopSync();\n      exitStatus = workInProgressRootExitStatus;\n      break;\n    } catch (thrownValue$167) {\n      handleThrow(root, thrownValue$167);\n    }\n  while (1);\n  lanes && root.shellSuspendCounter++;\n  lastContextDependency = currentlyRenderingFiber$1 = null;\n  executionContext = prevExecutionContext;\n  ReactSharedInternals.H = prevDispatcher;\n  ReactSharedInternals.A = prevAsyncDispatcher;\n  null === workInProgress &&\n    ((workInProgressRoot = null),\n    (workInProgressRootRenderLanes = 0),\n    finishQueueingConcurrentUpdates());\n  return exitStatus;\n}\nfunction workLoopSync() {\n  for (; null !== workInProgress; ) performUnitOfWork(workInProgress);\n}\nfunction renderRootConcurrent(root, lanes) {\n  var prevExecutionContext = executionContext;\n  executionContext |= 2;
1\n  var prevDispatcher = pushDispatcher(),\n    prevAsyncDispatcher = pushAsyncDispatcher();\n  workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes\n    ? ((workInProgressTransitions = null),\n      (workInProgressRootRenderTargetTime = now() + 500),\n      prepareFreshStack(root, lanes))\n    : (workInProgressRootIsPrerendering = checkIfRootIsPrerendering(\n        root,\n        lanes\n      ));\n  a: do\n    try {\n      if (0 !== workInProgressSuspendedReason && null !== workInProgress) {\n        lanes = workInProgress;\n        var thrownValue = workInProgressThrownValue;\n        b: switch (workInProgressSuspendedReason) {\n          case 1:\n            workInProgressSuspendedReason = 0;\n            workInProgressThrownValue = null;\n            throwAndUnwindWorkLoop(root, lanes, thrownValue, 1);\n            break;\n          case 2:\n          case 9:\n            if (isThenableResolved(thrownValue)) {\n              workInProgressSuspendedReason = 0;\n              workInProgressThrownValue = null;\n              replaySuspendedUnitOfWork(lanes);\n              break;\n            }\n            lanes = function () {\n              (2 !== workInProgressSuspendedReason &&\n                9 !== workInProgressSuspendedReason) ||\n                workInProgressRoot !== root ||\n                (workInProgressSuspendedReason = 7);\n              ensureRootIsScheduled(root);\n            };\n            thrownValue.then(lanes, lanes);\n            break a;\n          case 3:\n            workInProgressSuspendedReason = 7;\n            break a;\n          case 4:\n            workInProgressSuspendedReason = 5;\n            break a;\n          case 7:\n            isThenableResolved(thrownValue)\n              ? ((workInProgressSuspendedReason = 0),\n                (workInProgressThrownValue = null),\n                replaySuspendedUnitOfWork(lanes))\n              : ((workInProgressSuspendedReason = 0),\n                (workInProgressThrownValue = null),\n                throwAndUnwindWorkLoop(root, lanes, thrownValue, 7));\n            break;\n          case 5:\n            var resource = null;\n            switch (workInProgress.tag) {\n              case 26:\n                resource = workInProgress.memoizedState;\n              case 5:\n              case 27:\n                var hostFiber = workInProgress;\n                if (resource ? preloadResource(resource) : 1) {\n                  workInProgressSuspendedReason = 0;\n                  workInProgressThrownValue = null;\n                  var sibling = hostFiber.sibling;\n                  if (null !== sibling) workInProgress = sibling;\n                  else {\n                    var returnFiber = hostFiber.return;\n                    null !== returnFiber\n                      ? ((workInProgress = returnFiber),\n                        completeUnitOfWork(returnFiber))\n                      : (workInProgress = null);\n                  }\n                  break b;\n                }\n            }\n            workInProgressSuspendedReason = 0;\n            workInProgressThrownValue = null;\n            throwAndUnwindWorkLoop(root, lanes, thrownValue, 5);\n            break;\n          case 6:\n            workInProgressSuspendedReason = 0;\n            workInProgressThrownValue = null;\n            throwAndUnwindWorkLoop(root, lanes, thrownValue, 6);\n            break;\n          case 8:\n            resetWorkInProgressStack();\n            workInProgressRootExitStatus = 6;\n            break a;\n          default:\n            throw Error(formatProdErrorMessage(462));\n        }\n      }\n      workLoopConcurrentByScheduler();\n      break;\n    } catch (thrownValue$169) {\n      handleThrow(root, thrownValue$169);\n    }\n  while (1);\n  lastContextDependency = currentlyRenderingFiber$1 = null;\n  ReactSharedInternals.H = prevDispatcher;\n  ReactSharedInternals.A = prevAsyncDispatcher;\n  executionContext = prevExecutionContext;\n  if (null !== workInProgress) return 0;\n  workInProgressRoot = null;\n  workInProgressRootRenderLanes = 0;\n  finishQueueingConcurrentUpdates();\n  return workInProgressRootExitStatus;\n}\nfunction workLoopConcurrentByScheduler() {\n  for (; null !== workInProgress && !shouldYield(); )\n    performUnitOfWork(workInProgress);\n}\nfunction performUnitOfWork(unitOfWork) {\n  var next = beginWork(unitOfWork.alternate, unitOfWork, entangledRenderLanes);\n  unitOfWork.memoizedProps = unitOfWork.pendingProps;\n  null === next ? completeUnitOfWork(unitOfWork) : (workInProgress = next);\n}\nfunction replaySuspendedUnitOfWork(unitOfWork) {\n  var next = unitOfWork;\n  var current = next.alternate;\n  switch (next.tag) {\n    case 15:\n    case 0:\n      next = replayFunctionComponent(\n        current,\n        next,\n        next.pendingProps,\n        next.type,\n        void 0,\n        workInProgressRootRenderLanes\n      );\n      break;\n    case 11:\n      next = replayFunctionComponent(\n        current,\n        next,\n        next.pendingProps,\n        next.type.render,\n        next.ref,\n        workInProgressRootRenderLanes\n      );\n      break;\n    case 5:\n      resetHooksOnUnwind(next);\n    default:\n      unwindInterruptedWork(current, next),\n        (next = workInProgress =\n          resetWorkInProgress(next, entangledRenderLanes)),\n        (next = beginWork(current, next, entangledRenderLanes));\n  }\n  unitOfWork.memoizedProps = unitOfWork.pendingProps;\n  null === next ? completeUnitOfWork(unitOfWork) : (workInProgress = next);\n}\nfunction throwAndUnwindWorkLoop(\n  root,\n  unitOfWork,\n  thrownValue,\n  suspendedReason\n) {\n  lastContextDependency = currentlyRenderingFiber$1 = null;\n  resetHooksOnUnwind(unitOfWork);\n  thenableState = null;\n  thenableIndexCounter = 0;\n  var returnFiber = unitOfWork.return;\n  try {\n    if (\n      throwException(\n        root,\n        returnFiber,\n        unitOfWork,\n        thrownValue,\n        workInProgressRootRenderLanes\n      )\n    ) {\n      workInProgressRootExitStatus = 1;\n      logUncaughtError(\n        root,\n        createCapturedValueAtFiber(thrownValue, root.current)\n      );\n      workInProgress = null;\n      return;\n    }\n  }
1 catch (error) {\n    if (null !== returnFiber) throw ((workInProgress = returnFiber), error);\n    workInProgressRootExitStatus = 1;\n    logUncaughtError(\n      root,\n      createCapturedValueAtFiber(thrownValue, root.current)\n    );\n    workInProgress = null;\n    return;\n  }\n  if (unitOfWork.flags & 32768) {\n    if (isHydrating || 1 === suspendedReason) root = !0;\n    else if (\n      workInProgressRootIsPrerendering ||\n      0 !== (workInProgressRootRenderLanes & 536870912)\n    )\n      root = !1;\n    else if (\n      ((workInProgressRootDidSkipSuspendedSiblings = root = !0),\n      2 === suspendedReason ||\n        9 === suspendedReason ||\n        3 === suspendedReason ||\n        6 === suspendedReason)\n    )\n      (suspendedReason = suspenseHandlerStackCursor.current),\n        null !== suspendedReason &&\n          13 === suspendedReason.tag &&\n          (suspendedReason.flags |= 16384);\n    unwindUnitOfWork(unitOfWork, root);\n  } else completeUnitOfWork(unitOfWork);\n}\nfunction completeUnitOfWork(unitOfWork) {\n  var completedWork = unitOfWork;\n  do {\n    if (0 !== (completedWork.flags & 32768)) {\n      unwindUnitOfWork(\n        completedWork,\n        workInProgressRootDidSkipSuspendedSiblings\n      );\n      return;\n    }\n    unitOfWork = completedWork.return;\n    var next = completeWork(\n      completedWork.alternate,\n      completedWork,\n      entangledRenderLanes\n    );\n    if (null !== next) {\n      workInProgress = next;\n      return;\n    }\n    completedWork = completedWork.sibling;\n    if (null !== completedWork) {\n      workInProgress = completedWork;\n      return;\n    }\n    workInProgress = completedWork = unitOfWork;\n  } while (null !== completedWork);\n  0 === workInProgressRootExitStatus && (workInProgressRootExitStatus = 5);\n}\nfunction unwindUnitOfWork(unitOfWork, skipSiblings) {\n  do {\n    var next = unwindWork(unitOfWork.alternate, unitOfWork);\n    if (null !== next) {\n      next.flags &= 32767;\n      workInProgress = next;\n      return;\n    }\n    next = unitOfWork.return;\n    null !== next &&\n      ((next.flags |= 32768), (next.subtreeFlags = 0), (next.deletions = null));\n    if (\n      !skipSiblings &&\n      ((unitOfWork = unitOfWork.sibling), null !== unitOfWork)\n    ) {\n      workInProgress = unitOfWork;\n      return;\n    }\n    workInProgress = unitOfWork = next;\n  } while (null !== unitOfWork);\n  workInProgressRootExitStatus = 6;\n  workInProgress = null;\n}\nfunction commitRoot(\n  root,\n  finishedWork,\n  lanes,\n  recoverableErrors,\n  transitions,\n  didIncludeRenderPhaseUpdate,\n  spawnedLane,\n  updatedLanes,\n  suspendedRetryLanes\n) {\n  root.cancelPendingCommit = null;\n  do flushPendingEffects();\n  while (0 !== pendingEffectsStatus);\n  if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(327));\n  if (null !== finishedWork) {\n    if (finishedWork === root.current) throw Error(formatProdErrorMessage(177));\n    didIncludeRenderPhaseUpdate = finishedWork.lanes | finishedWork.childLanes;\n    didIncludeRenderPhaseUpdate |= concurrentlyUpdatedLanes;\n    markRootFinished(\n      root,\n      lanes,\n      didIncludeRenderPhaseUpdate,\n      spawnedLane,\n      updatedLanes,\n      suspendedRetryLanes\n    );\n    root === workInProgressRoot &&\n      ((workInProgress = workInProgressRoot = null),\n      (workInProgressRootRenderLanes = 0));\n    pendingFinishedWork = finishedWork;\n    pendingEffectsRoot = root;\n    pendingEffectsLanes = lanes;\n    pendingEffectsRemainingLanes = didIncludeRenderPhaseUpdate;\n    pendingPassiveTransitions = transitions;\n    pendingRecoverableErrors = recoverableErrors;\n    0 !== (finishedWork.subtreeFlags & 10256) ||\n    0 !== (finishedWork.flags & 10256)\n      ? ((root.callbackNode = null),\n        (root.callbackPriority = 0),\n        scheduleCallback$1(NormalPriority$1, function () {\n          flushPassiveEffects(!0);\n          return null;\n        }))\n      : ((root.callbackNode = null), (root.callbackPriority = 0));\n    recoverableErrors = 0 !== (finishedWork.flags & 13878);\n    if (0 !== (finishedWork.subtreeFlags & 13878) || recoverableErrors) {\n      recoverableErrors = ReactSharedInternals.T;\n      ReactSharedInternals.T = null;\n      transitions = ReactDOMSharedInternals.p;\n      ReactDOMSharedInternals.p = 2;\n      spawnedLane = executionContext;\n      executionContext |= 4;
1\n      try {\n        commitBeforeMutationEffects(root, finishedWork, lanes);\n      } finally {\n        (executionContext = spawnedLane),\n          (ReactDOMSharedInternals.p = transitions),\n          (ReactSharedInternals.T = recoverableErrors);\n      }\n    }\n    pendingEffectsStatus = 1;\n    flushMutationEffects();\n    flushLayoutEffects();\n    flushSpawnedWork();\n  }\n}\nfunction flushMutationEffects() {\n  if (1 === pendingEffectsStatus) {\n    pendingEffectsStatus = 0;\n    var root = pendingEffectsRoot,\n      finishedWork = pendingFinishedWork,\n      rootMutationHasEffect = 0 !== (finishedWork.flags & 13878);\n    if (0 !== (finishedWork.subtreeFlags & 13878) || rootMutationHasEffect) {\n      rootMutationHasEffect = ReactSharedInternals.T;\n      ReactSharedInternals.T = null;\n      var previousPriority = ReactDOMSharedInternals.p;\n      ReactDOMSharedInternals.p = 2;\n      var prevExecutionContext = executionContext;\n      executionContext |= 4;\n      try {\n        commitMutationEffectsOnFiber(finishedWork, root);\n        var priorSelectionInformation = selectionInformation,\n          curFocusedElem = getActiveElementDeep(root.containerInfo),\n          priorFocusedElem = priorSelectionInformation.focusedElem,\n          priorSelectionRange = priorSelectionInformation.selectionRange;\n        if (\n          curFocusedElem !== priorFocusedElem &&\n          priorFocusedElem &&\n          priorFocusedElem.ownerDocument &&\n          containsNode(\n            priorFocusedElem.ownerDocument.documentElement,\n            priorFocusedElem\n          )\n        ) {\n          if (\n            null !== priorSelectionRange &&\n            hasSelectionCapabilities(priorFocusedElem)\n          ) {\n            var start = priorSelectionRange.start,\n              end = priorSelectionRange.end;\n            void 0 === end && (end = start);\n            if ("selectionStart" in priorFocusedElem)\n              (priorFocusedElem.selectionStart = start),\n                (priorFocusedElem.selectionEnd = Math.min(\n                  end,\n                  priorFocusedElem.value.length\n                ));\n            else {\n              var doc = priorFocusedElem.ownerDocument || document,\n                win = (doc && doc.defaultView) || window;\n              if (win.getSelection) {\n                var selection = win.getSelection(),\n                  length = priorFocusedElem.textContent.length,\n                  start$jscomp$0 = Math.min(priorSelectionRange.start, length),\n                  end$jscomp$0 =\n                    void 0 === priorSelectionRange.end\n                      ? start$jscomp$0\n                      : Math.min(priorSelectionRange.end, length);\n                !selection.extend &&\n                  start$jscomp$0 > end$jscomp$0 &&\n                  ((curFocusedElem = end$jscomp$0),\n                  (end$jscomp$0 = start$jscomp$0),\n                  (start$jscomp$0 = curFocusedElem));\n                var startMarker = getNodeForCharacterOffset(\n                    priorFocusedElem,\n                    start$jscomp$0\n                  ),\n                  endMarker = getNodeForCharacterOffset(\n                    priorFocusedElem,\n                    end$jscomp$0\n                  );\n                if (\n                  startMarker &&\n                  endMarker &&\n                  (1 !== selection.rangeCount ||\n                    selection.anchorNode !== startMarker.node ||\n                    selection.anchorOffset !== startMarker.offset ||\n                    selection.focusNode !== endMarker.node ||\n                    selection.focusOffset !== endMarker.offset)\n                ) {\n                  var range = doc.createRange();\n                  range.setStart(startMarker.node, startMarker.offset);\n                  selection.removeAllRanges();\n                  start$jscomp$0 > end$jscomp$0\n                    ? (selection.addRange(range),\n                      selection.extend(endMarker.node, endMarker.offset))\n                    : (range.setEnd(endMarker.node, endMarker.offset),\n                      selection.addRange(range));\n                }\n              }\n            }\n          }\n          doc = [];\n          for (\n            selection = priorFocusedElem;\n            (selection = selection.parentNode);\n\n          )\n            1 === selection.nodeType &&\n              doc.push({\n                element: selection,\n                left: selection.scrollLeft,\n                top: selection.scrollTop\n              });\n          "function" === typeof priorFocusedElem.focus &&\n            priorFocusedElem.focus();\n          for (\n            priorFocusedElem = 0;\n            priorFocusedElem < doc.length;\n            priorFocusedElem++\n          ) {\n            var info = doc[priorFocusedElem];\n            info.element.scrollLeft = info.left;\n            info.element.scrollTop = info.top;\n          }\n        }\n        _enabled = !!eventsEnabled;\n        selectionInformation = eventsEnabled = null;\n      } finally {\n        (executionContext = prevExecutionContext),\n          (ReactDOMSharedInternals.p = previousPriority),\n          (ReactSharedInternals.T = rootMutationHasEffect);\n      }\n    }\n    root.current = finishedWork;\n    pendingEffectsStatus = 2;\n  }\n}
1\nfunction flushLayoutEffects() {\n  if (2 === pendingEffectsStatus) {\n    pendingEffectsStatus = 0;\n    var root = pendingEffectsRoot,\n      finishedWork = pendingFinishedWork,\n      rootHasLayoutEffect = 0 !== (finishedWork.flags & 8772);\n    if (0 !== (finishedWork.subtreeFlags & 8772) || rootHasLayoutEffect) {\n      rootHasLayoutEffect = ReactSharedInternals.T;\n      ReactSharedInternals.T = null;\n      var previousPriority = ReactDOMSharedInternals.p;\n      ReactDOMSharedInternals.p = 2;\n      var prevExecutionContext = executionContext;\n      executionContext |= 4;\n      try {\n        commitLayoutEffectOnFiber(root, finishedWork.alternate, finishedWork);\n      } finally {\n        (executionContext = prevExecutionContext),\n          (ReactDOMSharedInternals.p = previousPriority),\n          (ReactSharedInternals.T = rootHasLayoutEffect);\n      }\n    }\n    pendingEffectsStatus = 3;\n  }\n}\nfunction flushSpawnedWork() {\n  if (4 === pendingEffectsStatus || 3 === pendingEffectsStatus) {\n    pendingEffectsStatus = 0;\n    requestPaint();\n    var root = pendingEffectsRoot,\n      finishedWork = pendingFinishedWork,\n      lanes = pendingEffectsLanes,\n      recoverableErrors = pendingRecoverableErrors;\n    0 !== (finishedWork.subtreeFlags & 10256) ||\n    0 !== (finishedWork.flags & 10256)\n      ? (pendingEffectsStatus = 5)\n      : ((pendingEffectsStatus = 0),\n        (pendingFinishedWork = pendingEffectsRoot = null),\n        releaseRootPooledCache(root, root.pendingLanes));\n    var remainingLanes = root.pendingLanes;\n    0 === remainingLanes && (legacyErrorBoundariesThatAlreadyFailed = null);\n    lanesToEventPriority(lanes);\n    finishedWork = finishedWork.stateNode;\n    if (injectedHook && "function" === typeof injectedHook.onCommitFiberRoot)\n      try {\n        injectedHook.onCommitFiberRoot(\n          rendererID,\n          finishedWork,\n          void 0,\n          128 === (finishedWork.current.flags & 128)\n        );\n      } catch (err) {}\n    if (null !== recoverableErrors) {\n      finishedWork = ReactSharedInternals.T;\n      remainingLanes = ReactDOMSharedInternals.p;\n      ReactDOMSharedInternals.p = 2;\n      ReactSharedInternals.T = null;\n      try {\n        for (\n          var onRecoverableError = root.onRecoverableError, i = 0;\n          i < recoverableErrors.length;\n          i++\n        ) {\n          var recoverableError = recoverableErrors[i];\n          onRecoverableError(recoverableError.value, {\n            componentStack: recoverableError.stack\n          });\n        }\n      } finally {\n        (ReactSharedInternals.T = finishedWork),\n          (ReactDOMSharedInternals.p = remainingLanes);\n      }\n    }\n    0 !== (pendingEffectsLanes & 3) && flushPendingEffects();\n    ensureRootIsScheduled(root);\n    remainingLanes = root.pendingLanes;\n    0 !== (lanes & 4194090) && 0 !== (remainingLanes & 42)\n      ? root === rootWithNestedUpdates\n        ? nestedUpdateCount++\n        : ((nestedUpdateCount = 0), (rootWithNestedUpdates = root))\n      : (nestedUpdateCount = 0);\n    flushSyncWorkAcrossRoots_impl(0, !1);\n  }\n}\nfunction releaseRootPooledCache(root, remainingLanes) {\n  0 === (root.pooledCacheLanes &= remainingLanes) &&\n    ((remainingLanes = root.pooledCache),\n    null != remainingLanes &&\n      ((root.pooledCache = null), releaseCache(remainingLanes)));\n}\nfunction flushPendingEffects(wasDelayedCommit) {\n  flushMutationEffects();\n  flushLayoutEffects();\n  flushSpawnedWork();\n  return flushPassiveEffects(wasDelayedCommit);\n}\nfunction flushPassiveEffects() {\n  if (5 !== pendingEffectsStatus) return !1;\n  var root = pendingEffectsRoot,\n    remainingLanes = pendingEffectsRemainingLanes;\n  pendingEffectsRemainingLanes = 0;\n  var renderPriority = lanesToEventPriority(pendingEffectsLanes),\n    prevTransition = ReactSharedInternals.T,\n    previousPriority = ReactDOMSharedInternals.p;\n  try {\n    ReactDOMSharedInternals.p = 32 > renderPriority ? 32 : renderPriority;\n    ReactSharedInternals.T = null;
1\n    renderPriority = pendingPassiveTransitions;\n    pendingPassiveTransitions = null;\n    var root$jscomp$0 = pendingEffectsRoot,\n      lanes = pendingEffectsLanes;\n    pendingEffectsStatus = 0;\n    pendingFinishedWork = pendingEffectsRoot = null;\n    pendingEffectsLanes = 0;\n    if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(331));\n    var prevExecutionContext = executionContext;\n    executionContext |= 4;\n    commitPassiveUnmountOnFiber(root$jscomp$0.current);\n    commitPassiveMountOnFiber(\n      root$jscomp$0,\n      root$jscomp$0.current,\n      lanes,\n      renderPriority\n    );\n    executionContext = prevExecutionContext;\n    flushSyncWorkAcrossRoots_impl(0, !1);\n    if (\n      injectedHook &&\n      "function" === typeof injectedHook.onPostCommitFiberRoot\n    )\n      try {\n        injectedHook.onPostCommitFiberRoot(rendererID, root$jscomp$0);\n      } catch (err) {}\n    return !0;\n  } finally {\n    (ReactDOMSharedInternals.p = previousPriority),\n      (ReactSharedInternals.T = prevTransition),\n      releaseRootPooledCache(root, remainingLanes);\n  }\n}\nfunction captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {\n  sourceFiber = createCapturedValueAtFiber(error, sourceFiber);\n  sourceFiber = createRootErrorUpdate(rootFiber.stateNode, sourceFiber, 2);\n  rootFiber = enqueueUpdate(rootFiber, sourceFiber, 2);\n  null !== rootFiber &&\n    (markRootUpdated$1(rootFiber, 2), ensureRootIsScheduled(rootFiber));\n}\nfunction captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error) {\n  if (3 === sourceFiber.tag)\n    captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error);\n  else\n    for (; null !== nearestMountedAncestor; ) {\n      if (3 === nearestMountedAncestor.tag) {\n        captureCommitPhaseErrorOnRoot(\n          nearestMountedAncestor,\n          sourceFiber,\n          error\n        );\n        break;\n      } else if (1 === nearestMountedAncestor.tag) {\n        var instance = nearestMountedAncestor.stateNode;\n        if (\n          "function" ===\n            typeof nearestMountedAncestor.type.getDerivedStateFromError ||\n          ("function" === typeof instance.componentDidCatch &&\n            (null === legacyErrorBoundariesThatAlreadyFailed ||\n              !legacyErrorBoundariesThatAlreadyFailed.has(instance)))\n        ) {\n          sourceFiber = createCapturedValueAtFiber(error, sourceFiber);\n          error = createClassErrorUpdate(2);\n          instance = enqueueUpdate(nearestMountedAncestor, error, 2);\n          null !== instance &&\n            (initializeClassErrorUpdate(\n              error,\n              instance,\n              nearestMountedAncestor,\n              sourceFiber\n            ),\n            markRootUpdated$1(instance, 2),\n            ensureRootIsScheduled(instance));\n          break;\n        }\n      }\n      nearestMountedAncestor = nearestMountedAncestor.return;\n    }\n}\nfunction attachPingListener(root, wakeable, lanes) {\n  var pingCache = root.pingCache;\n  if (null === pingCache) {\n    pingCache = root.pingCache = new PossiblyWeakMap();\n    var threadIDs = new Set();\n    pingCache.set(wakeable, threadIDs);\n  } else\n    (threadIDs = pingCache.get(wakeable)),\n      void 0 === threadIDs &&\n        ((threadIDs = new Set()), pingCache.set(wakeable, threadIDs));\n  threadIDs.has(lanes) ||\n    ((workInProgressRootDidAttachPingListener = !0),\n    threadIDs.add(lanes),\n    (root = pingSuspendedRoot.bind(null, root, wakeable, lanes)),\n    wakeable.then(root, root));\n}\nfunction pingSuspendedRoot(root, wakeable, pingedLanes) {\n  var pingCache = root.pingCache;\n  null !== pingCache && pingCache.delete(wakeable);\n  root.pingedLanes |= root.suspendedLanes & pingedLanes;\n  root.warmLanes &= ~pingedLanes;\n  workInProgressRoot === root &&\n    (workInProgressRootRenderLanes & pingedLanes) === pingedLanes &&\n    (4 === workInProgressRootExitStatus ||\n    (3 === workInProgressRootExitStatus &&\n      (workInProgressRootRenderLanes & 62914560) ===\n        workInProgressRootRenderLanes &&\n      300 > now() - globalMostRecentFallbackTime)\n      ? 0 === (executionContext & 2) && prepareFreshStack(root, 0)\n      : (workInProgressRootPingedLanes |= pingedLanes),\n    workInProgressSuspendedRetryLanes === workInProgressRootRenderLanes &&\n      (workInProgressSuspendedRetryLanes = 0));\n  ensureRootIsScheduled(root);\n}\nfunction retryTimedOutBoundary(boundaryFiber, retryLane) {\n  0 === retryLane && (retryLane = claimNextRetryLane());\n  boundaryFiber = enqueueConcurrentRenderForLane(boundaryFiber, retryLane);
1\n  null !== boundaryFiber &&\n    (markRootUpdated$1(boundaryFiber, retryLane),\n    ensureRootIsScheduled(boundaryFiber));\n}\nfunction retryDehydratedSuspenseBoundary(boundaryFiber) {\n  var suspenseState = boundaryFiber.memoizedState,\n    retryLane = 0;\n  null !== suspenseState && (retryLane = suspenseState.retryLane);\n  retryTimedOutBoundary(boundaryFiber, retryLane);\n}\nfunction resolveRetryWakeable(boundaryFiber, wakeable) {\n  var retryLane = 0;\n  switch (boundaryFiber.tag) {\n    case 13:\n      var retryCache = boundaryFiber.stateNode;\n      var suspenseState = boundaryFiber.memoizedState;\n      null !== suspenseState && (retryLane = suspenseState.retryLane);\n      break;\n    case 19:\n      retryCache = boundaryFiber.stateNode;\n      break;\n    case 22:\n      retryCache = boundaryFiber.stateNode._retryCache;\n      break;\n    default:\n      throw Error(formatProdErrorMessage(314));\n  }\n  null !== retryCache && retryCache.delete(wakeable);\n  retryTimedOutBoundary(boundaryFiber, retryLane);\n}\nfunction scheduleCallback$1(priorityLevel, callback) {\n  return scheduleCallback$3(priorityLevel, callback);\n}\nvar firstScheduledRoot = null,\n  lastScheduledRoot = null,\n  didScheduleMicrotask = !1,\n  mightHavePendingSyncWork = !1,\n  isFlushingWork = !1,\n  currentEventTransitionLane = 0;\nfunction ensureRootIsScheduled(root) {\n  root !== lastScheduledRoot &&\n    null === root.next &&\n    (null === lastScheduledRoot\n      ? (firstScheduledRoot = lastScheduledRoot = root)\n      : (lastScheduledRoot = lastScheduledRoot.next = root));\n  mightHavePendingSyncWork = !0;\n  didScheduleMicrotask ||\n    ((didScheduleMicrotask = !0), scheduleImmediateRootScheduleTask());\n}\nfunction flushSyncWorkAcrossRoots_impl(syncTransitionLanes, onlyLegacy) {\n  if (!isFlushingWork && mightHavePendingSyncWork) {\n    isFlushingWork = !0;\n    do {\n      var didPerformSomeWork = !1;\n      for (var root$174 = firstScheduledRoot; null !== root$174; ) {\n        if (!onlyLegacy)\n          if (0 !== syncTransitionLanes) {\n            var pendingLanes = root$174.pendingLanes;\n            if (0 === pendingLanes) var JSCompiler_inline_result = 0;\n            else {\n              var suspendedLanes = root$174.suspendedLanes,\n                pingedLanes = root$174.pingedLanes;\n              JSCompiler_inline_result =\n                (1 << (31 - clz32(42 | syncTransitionLanes) + 1)) - 1;\n              JSCompiler_inline_result &=\n                pendingLanes & ~(suspendedLanes & ~pingedLanes);\n              JSCompiler_inline_result =\n                JSCompiler_inline_result & 201326741\n                  ? (JSCompiler_inline_result & 201326741) | 1\n                  : JSCompiler_inline_result\n                    ? JSCompiler_inline_result | 2\n                    : 0;\n            }\n            0 !== JSCompiler_inline_result &&\n              ((didPerformSomeWork = !0),\n              performSyncWorkOnRoot(root$174, JSCompiler_inline_result));\n          } else\n            (JSCompiler_inline_result = workInProgressRootRenderLanes),\n              (JSCompiler_inline_result = getNextLanes(\n                root$174,\n                root$174 === workInProgressRoot ? JSCompiler_inline_result : 0,\n                null !== root$174.cancelPendingCommit ||\n                  -1 !== root$174.timeoutHandle\n              )),\n              0 === (JSCompiler_inline_result & 3) ||\n                checkIfRootIsPrerendering(root$174, JSCompiler_inline_result) ||\n                ((didPerformSomeWork = !0),\n                performSyncWorkOnRoot(root$174, JSCompiler_inline_result));\n        root$174 = root$174.next;\n      }\n    } while (didPerformSomeWork);\n    isFlushingWork = !1;\n  }\n}\nfunction processRootScheduleInImmediateTask() {\n  processRootScheduleInMicrotask();\n}\nfunction processRootScheduleInMicrotask() {\n  mightHavePendingSyncWork = didScheduleMicrotask = !1;\n  var syncTransitionLanes = 0;\n  0 !== currentEventTransitionLane &&\n    (shouldAttemptEagerTransition() &&\n      (syncTransitionLanes = currentEventTransitionLane),\n    (currentEventTransitionLane = 0));
1\n  for (\n    var currentTime = now(), prev = null, root = firstScheduledRoot;\n    null !== root;\n\n  ) {\n    var next = root.next,\n      nextLanes = scheduleTaskForRootDuringMicrotask(root, currentTime);\n    if (0 === nextLanes)\n      (root.next = null),\n        null === prev ? (firstScheduledRoot = next) : (prev.next = next),\n        null === next && (lastScheduledRoot = prev);\n    else if (\n      ((prev = root), 0 !== syncTransitionLanes || 0 !== (nextLanes & 3))\n    )\n      mightHavePendingSyncWork = !0;\n    root = next;\n  }\n  flushSyncWorkAcrossRoots_impl(syncTransitionLanes, !1);\n}\nfunction scheduleTaskForRootDuringMicrotask(root, currentTime) {\n  for (\n    var suspendedLanes = root.suspendedLanes,\n      pingedLanes = root.pingedLanes,\n      expirationTimes = root.expirationTimes,\n      lanes = root.pendingLanes & -62914561;\n    0 < lanes;\n\n  ) {\n    var index$3 = 31 - clz32(lanes),\n      lane = 1 << index$3,\n      expirationTime = expirationTimes[index$3];\n    if (-1 === expirationTime) {\n      if (0 === (lane & suspendedLanes) || 0 !== (lane & pingedLanes))\n        expirationTimes[index$3] = computeExpirationTime(lane, currentTime);\n    } else expirationTime <= currentTime && (root.expiredLanes |= lane);\n    lanes &= ~lane;\n  }\n  currentTime = workInProgressRoot;\n  suspendedLanes = workInProgressRootRenderLanes;\n  suspendedLanes = getNextLanes(\n    root,\n    root === currentTime ? suspendedLanes : 0,\n    null !== root.cancelPendingCommit || -1 !== root.timeoutHandle\n  );\n  pingedLanes = root.callbackNode;\n  if (\n    0 === suspendedLanes ||\n    (root === currentTime &&\n      (2 === workInProgressSuspendedReason ||\n        9 === workInProgressSuspendedReason)) ||\n    null !== root.cancelPendingCommit\n  )\n    return (\n      null !== pingedLanes &&\n        null !== pingedLanes &&\n        cancelCallback$1(pingedLanes),\n      (root.callbackNode = null),\n      (root.callbackPriority = 0)\n    );\n  if (\n    0 === (suspendedLanes & 3) ||\n    checkIfRootIsPrerendering(root, suspendedLanes)\n  ) {\n    currentTime = suspendedLanes & -suspendedLanes;\n    if (currentTime === root.callbackPriority) return currentTime;\n    null !== pingedLanes && cancelCallback$1(pingedLanes);\n    switch (lanesToEventPriority(suspendedLanes)) {\n      case 2:\n      case 8:\n        suspendedLanes = UserBlockingPriority;\n        break;\n      case 32:\n        suspendedLanes = NormalPriority$1;\n        break;\n      case 268435456:\n        suspendedLanes = IdlePriority;\n        break;\n      default:\n        suspendedLanes = NormalPriority$1;\n    }\n    pingedLanes = performWorkOnRootViaSchedulerTask.bind(null, root);\n    suspendedLanes = scheduleCallback$3(suspendedLanes, pingedLanes);\n    root.callbackPriority = currentTime;\n    root.callbackNode = suspendedLanes;\n    return currentTime;\n  }\n  null !== pingedLanes && null !== pingedLanes && cancelCallback$1(pingedLanes);\n  root.callbackPriority = 2;\n  root.callbackNode = null;\n  return 2;\n}\nfunction performWorkOnRootViaSchedulerTask(root, didTimeout) {\n  if (0 !== pendingEffectsStatus && 5 !== pendingEffectsStatus)\n    return (root.callbackNode = null), (root.callbackPriority = 0), null;\n  var originalCallbackNode = root.callbackNode;\n  if (flushPendingEffects(!0) && root.callbackNode !== originalCallbackNode)\n    return null;\n  var workInProgressRootRenderLanes$jscomp$0 = workInProgressRootRenderLanes;\n  workInProgressRootRenderLanes$jscomp$0 = getNextLanes(\n    root,\n    root === workInProgressRoot ? workInProgressRootRenderLanes$jscomp$0 : 0,\n    null !== root.cancelPendingCommit || -1 !== root.timeoutHandle\n  );\n  if (0 === workInProgressRootRenderLanes$jscomp$0) return null;\n  performWorkOnRoot(root, workInProgressRootRenderLanes$jscomp$0, didTimeout);\n  scheduleTaskForRootDuringMicrotask(root, now());\n  return null != root.callbackNode && root.callbackNode === originalCallbackNode\n    ? performWorkOnRootViaSchedulerTask.bind(null, root)\n    : null;\n}\nfunction performSyncWorkOnRoot(root, lanes) {\n  if (flushPendingEffects()) return null;\n  performWorkOnRoot(root, lanes, !0);\n}
1\nfunction scheduleImmediateRootScheduleTask() {\n  scheduleMicrotask(function () {\n    0 !== (executionContext & 6)\n      ? scheduleCallback$3(\n          ImmediatePriority,\n          processRootScheduleInImmediateTask\n        )\n      : processRootScheduleInMicrotask();\n  });\n}\nfunction requestTransitionLane() {\n  0 === currentEventTransitionLane &&\n    (currentEventTransitionLane = claimNextTransitionLane());\n  return currentEventTransitionLane;\n}\nfunction coerceFormActionProp(actionProp) {\n  return null == actionProp ||\n    "symbol" === typeof actionProp ||\n    "boolean" === typeof actionProp\n    ? null\n    : "function" === typeof actionProp\n      ? actionProp\n      : sanitizeURL("" + actionProp);\n}\nfunction createFormDataWithSubmitter(form, submitter) {\n  var temp = submitter.ownerDocument.createElement("input");\n  temp.name = submitter.name;\n  temp.value = submitter.value;\n  form.id && temp.setAttribute("form", form.id);\n  submitter.parentNode.insertBefore(temp, submitter);\n  form = new FormData(form);\n  temp.parentNode.removeChild(temp);\n  return form;\n}\nfunction extractEvents$1(\n  dispatchQueue,\n  domEventName,\n  maybeTargetInst,\n  nativeEvent,\n  nativeEventTarget\n) {\n  if (\n    "submit" === domEventName &&\n    maybeTargetInst &&\n    maybeTargetInst.stateNode === nativeEventTarget\n  ) {\n    var action = coerceFormActionProp(\n        (nativeEventTarget[internalPropsKey] || null).action\n      ),\n      submitter = nativeEvent.submitter;\n    submitter &&\n      ((domEventName = (domEventName = submitter[internalPropsKey] || null)\n        ? coerceFormActionProp(domEventName.formAction)\n        : submitter.getAttribute("formAction")),\n      null !== domEventName && ((action = domEventName), (submitter = null)));\n    var event = new SyntheticEvent(\n      "action",\n      "action",\n      null,\n      nativeEvent,\n      nativeEventTarget\n    );\n    dispatchQueue.push({\n      event: event,\n      listeners: [\n        {\n          instance: null,\n          listener: function () {\n            if (nativeEvent.defaultPrevented) {\n              if (0 !== currentEventTransitionLane) {\n                var formData = submitter\n                  ? createFormDataWithSubmitter(nativeEventTarget, submitter)\n                  : new FormData(nativeEventTarget);\n                startHostTransition(\n                  maybeTargetInst,\n                  {\n                    pending: !0,\n                    data: formData,\n                    method: nativeEventTarget.method,\n                    action: action\n                  },\n                  null,\n                  formData\n                );\n              }\n            } else\n              "function" === typeof action &&\n                (event.preventDefault(),\n                (formData = submitter\n                  ? createFormDataWithSubmitter(nativeEventTarget, submitter)\n                  : new FormData(nativeEventTarget)),\n                startHostTransition(\n                  maybeTargetInst,\n                  {\n                    pending: !0,\n                    data: formData,\n                    method: nativeEventTarget.method,\n                    action: action\n                  },\n                  action,\n                  formData\n                ));\n          },\n          currentTarget: nativeEventTarget\n        }\n      ]\n    });\n  }\n}\nfor (\n  var i$jscomp$inline_1528 = 0;\n  i$jscomp$inline_1528 < simpleEventPluginEvents.length;\n  i$jscomp$inline_1528++\n) {\n  var eventName$jscomp$inline_1529 =\n      simpleEventPluginEvents[i$jscomp$inline_1528],\n    domEventName$jscomp$inline_1530 =\n      eventName$jscomp$inline_1529.toLowerCase(),\n    capitalizedEvent$jscomp$inline_1531 =\n      eventName$jscomp$inline_1529[0].toUpperCase() +\n      eventName$jscomp$inline_1529.slice(1);\n  registerSimpleEvent(\n    domEventName$jscomp$inline_1530,\n    "on" + capitalizedEvent$jscomp$inline_1531\n  );\n}\nregisterSimpleEvent(ANIMATION_END, "onAnimationEnd");\nregisterSimpleEvent(ANIMATION_ITERATION, "onAnimationIteration");
1\nregisterSimpleEvent(ANIMATION_START, "onAnimationStart");\nregisterSimpleEvent("dblclick", "onDoubleClick");\nregisterSimpleEvent("focusin", "onFocus");\nregisterSimpleEvent("focusout", "onBlur");\nregisterSimpleEvent(TRANSITION_RUN, "onTransitionRun");\nregisterSimpleEvent(TRANSITION_START, "onTransitionStart");\nregisterSimpleEvent(TRANSITION_CANCEL, "onTransitionCancel");\nregisterSimpleEvent(TRANSITION_END, "onTransitionEnd");\nregisterDirectEvent("onMouseEnter", ["mouseout", "mouseover"]);\nregisterDirectEvent("onMouseLeave", ["mouseout", "mouseover"]);\nregisterDirectEvent("onPointerEnter", ["pointerout", "pointerover"]);\nregisterDirectEvent("onPointerLeave", ["pointerout", "pointerover"]);\nregisterTwoPhaseEvent(\n  "onChange",\n  "change click focusin focusout input keydown keyup selectionchange".split(" ")\n);\nregisterTwoPhaseEvent(\n  "onSelect",\n  "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(\n    " "\n  )\n);\nregisterTwoPhaseEvent("onBeforeInput", [\n  "compositionend",\n  "keypress",\n  "textInput",\n  "paste"\n]);\nregisterTwoPhaseEvent(\n  "onCompositionEnd",\n  "compositionend focusout keydown keypress keyup mousedown".split(" ")\n);\nregisterTwoPhaseEvent(\n  "onCompositionStart",\n  "compositionstart focusout keydown keypress keyup mousedown".split(" ")\n);\nregisterTwoPhaseEvent(\n  "onCompositionUpdate",\n  "compositionupdate focusout keydown keypress keyup mousedown".split(" ")\n);\nvar mediaEventTypes =\n    "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(\n      " "\n    ),\n  nonDelegatedEvents = new Set(\n    "beforetoggle cancel close invalid load scroll scrollend toggle"\n      .split(" ")\n      .concat(mediaEventTypes)\n  );
1\nfunction processDispatchQueue(dispatchQueue, eventSystemFlags) {\n  eventSystemFlags = 0 !== (eventSystemFlags & 4);\n  for (var i = 0; i < dispatchQueue.length; i++) {\n    var _dispatchQueue$i = dispatchQueue[i],\n      event = _dispatchQueue$i.event;\n    _dispatchQueue$i = _dispatchQueue$i.listeners;\n    a: {\n      var previousInstance = void 0;\n      if (eventSystemFlags)\n        for (\n          var i$jscomp$0 = _dispatchQueue$i.length - 1;\n          0 <= i$jscomp$0;\n          i$jscomp$0--\n        ) {\n          var _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0],\n            instance = _dispatchListeners$i.instance,\n            currentTarget = _dispatchListeners$i.currentTarget;\n          _dispatchListeners$i = _dispatchListeners$i.listener;\n          if (instance !== previousInstance && event.isPropagationStopped())\n            break a;\n          previousInstance = _dispatchListeners$i;\n          event.currentTarget = currentTarget;\n          try {\n            previousInstance(event);\n          } catch (error) {\n            reportGlobalError(error);\n          }\n          event.currentTarget = null;\n          previousInstance = instance;\n        }\n      else\n        for (\n          i$jscomp$0 = 0;\n          i$jscomp$0 < _dispatchQueue$i.length;\n          i$jscomp$0++\n        ) {\n          _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0];\n          instance = _dispatchListeners$i.instance;\n          currentTarget = _dispatchListeners$i.currentTarget;\n          _dispatchListeners$i = _dispatchListeners$i.listener;\n          if (instance !== previousInstance && event.isPropagationStopped())\n            break a;\n          previousInstance = _dispatchListeners$i;\n          event.currentTarget = currentTarget;\n          try {\n            previousInstance(event);\n          } catch (error) {\n            reportGlobalError(error);\n          }\n          event.currentTarget = null;\n          previousInstance = instance;\n        }\n    }\n  }\n}\nfunction listenToNonDelegatedEvent(domEventName, targetElement) {\n  var JSCompiler_inline_result = targetElement[internalEventHandlersKey];\n  void 0 === JSCompiler_inline_result &&\n    (JSCompiler_inline_result = targetElement[internalEventHandlersKey] =\n      new Set());\n  var listenerSetKey = domEventName + "__bubble";\n  JSCompiler_inline_result.has(listenerSetKey) ||\n    (addTrappedEventListener(targetElement, domEventName, 2, !1),\n    JSCompiler_inline_result.add(listenerSetKey));\n}\nfunction listenToNativeEvent(domEventName, isCapturePhaseListener, target) {\n  var eventSystemFlags = 0;\n  isCapturePhaseListener && (eventSystemFlags |= 4);\n  addTrappedEventListener(\n    target,\n    domEventName,\n    eventSystemFlags,\n    isCapturePhaseListener\n  );\n}\nvar listeningMarker = "_reactListening" + Math.random().toString(36).slice(2);\nfunction listenToAllSupportedEvents(rootContainerElement) {\n  if (!rootContainerElement[listeningMarker]) {\n    rootContainerElement[listeningMarker] = !0;\n    allNativeEvents.forEach(function (domEventName) {\n      "selectionchange" !== domEventName &&\n        (nonDelegatedEvents.has(domEventName) ||\n          listenToNativeEvent(domEventName, !1, rootContainerElement),\n        listenToNativeEvent(domEventName, !0, rootContainerElement));\n    });\n    var ownerDocument =\n      9 === rootContainerElement.nodeType\n        ? rootContainerElement\n        : rootContainerElement.ownerDocument;\n    null === ownerDocument ||\n      ownerDocument[listeningMarker] ||\n      ((ownerDocument[listeningMarker] = !0),\n      listenToNativeEvent("selectionchange", !1, ownerDocument));\n  }\n}\nfunction addTrappedEventListener(\n  targetContainer,\n  domEventName,\n  eventSystemFlags,\n  isCapturePhaseListener\n) {\n  switch (getEventPriority(domEventName)) {\n    case 2:\n      var listenerWrapper = dispatchDiscreteEvent;\n      break;\n    case 8:\n      listenerWrapper = dispatchContinuousEvent;\n      break;\n    default:\n      listenerWrapper = dispatchEvent;\n  }\n  eventSystemFlags = listenerWrapper.bind(\n    null,\n    domEventName,\n    eventSystemFlags,\n    targetContainer\n  );\n  listenerWrapper = void 0;\n  !passiveBrowserEventsSupported ||\n    ("touchstart" !== domEventName &&\n      "touchmove" !== domEventName &&\n      "wheel" !== domEventName) ||\n    (listenerWrapper = !0);\n  isCapturePhaseListener\n    ? void 0 !== listenerWrapper\n      ? targetContainer.addEventListener(domEventName, eventSystemFlags, {\n          capture: !0,\n          passive: listenerWrapper\n        })\n      : targetContainer.addEventListener(domEventName, eventSystemFlags, !0)\n    : void 0 !== listenerWrapper\n      ? targetContainer.addEventListener(domEventName, eventSystemFlags, {\n          passive: listenerWrapper\n        })\n      : targetContainer.addEventListener(domEventName, eventSystemFlags, !1);\n}\nfunction dispatchEventForPluginEventSystem(\n  domEventName,\n  eventSystemFlags,\n  nativeEvent,\n  targetInst$jscomp$0,\n  targetContainer\n) {\n  var ancestorInst = targetInst$jscomp$0;\n  if (\n    0 === (eventSystemFlags & 1) &&\n    0 === (eventSystemFlags & 2) &&\n    null !== targetInst$jscomp$0\n  )\n    a: for (;;) {\n      if (null === targetInst$jscomp$0) return;\n      var nodeTag = targetInst$jscomp$0.tag;\n      if (3 === nodeTag || 4 === nodeTag) {\n        var container = targetInst$jscomp$0.stateNode.containerInfo;\n        if (container === targetContainer) break;\n        if (4 === nodeTag)\n          for (nodeTag = targetInst$jscomp$0.return; null !== nodeTag; ) {\n            var grandTag = nodeTag.tag;\n            if (\n              (3 === grandTag || 4 === grandTag) &&\n              nodeTag.stateNode.containerInfo === targetContainer\n            )\n              return;\n            nodeTag = nodeTag.return;\n          }\n        for (; null !== container; ) {\n          nodeTag = getClosestInstanceFromNode(container);\n          if (null === nodeTag) return;\n          grandTag = nodeTag.tag;\n          if (\n            5 === grandTag ||\n            6 === grandTag ||\n            26 === grandTag ||\n            27 === grandTag\n          ) {\n            targetInst$jscomp$0 = ancestorInst = nodeTag;\n            continue a;\n          }\n          container = container.parentNode;\n        }\n      }\n      targetInst$jscomp$0 = targetInst$jscomp$0.return;\n    }\n  batchedUpdates$1(function () {\n    var targetInst = ancestorInst,\n      nativeEventTarget = getEventTarget(nativeEvent),\n      dispatchQueue = [];\n    a: {\n      var reactName = topLevelEventsToReactNames.get(domEventName);\n      if (void 0 !== reactName) {\n        var SyntheticEventCtor = SyntheticEvent,\n          reactEventType = domEventName;\n        switch (domEventName) {\n          case "keypress":\n            if (0 === getEventCharCo
1de(nativeEvent)) break a;\n          case "keydown":\n          case "keyup":\n            SyntheticEventCtor = SyntheticKeyboardEvent;\n            break;\n          case "focusin":\n            reactEventType = "focus";\n            SyntheticEventCtor = SyntheticFocusEvent;\n            break;\n          case "focusout":\n            reactEventType = "blur";\n            SyntheticEventCtor = SyntheticFocusEvent;\n            break;\n          case "beforeblur":\n          case "afterblur":\n            SyntheticEventCtor = SyntheticFocusEvent;\n            break;\n          case "click":\n            if (2 === nativeEvent.button) break a;\n          case "auxclick":\n          case "dblclick":\n          case "mousedown":\n          case "mousemove":\n          case "mouseup":\n          case "mouseout":\n          case "mouseover":\n          case "contextmenu":\n            SyntheticEventCtor = SyntheticMouseEvent;\n            break;\n          case "drag":\n          case "dragend":\n          case "dragenter":\n          case "dragexit":\n          case "dragleave":\n          case "dragover":\n          case "dragstart":\n          case "drop":\n            SyntheticEventCtor = SyntheticDragEvent;\n            break;\n          case "touchcancel":\n          case "touchend":\n          case "touchmove":\n          case "touchstart":\n            SyntheticEventCtor = SyntheticTouchEvent;\n            break;\n          case ANIMATION_END:\n          case ANIMATION_ITERATION:\n          case ANIMATION_START:\n            SyntheticEventCtor = SyntheticAnimationEvent;\n            break;\n          case TRANSITION_END:\n            SyntheticEventCtor = SyntheticTransitionEvent;\n            break;\n          case "scroll":\n          case "scrollend":\n            SyntheticEventCtor = SyntheticUIEvent;\n            break;\n          case "wheel":\n            SyntheticEventCtor = SyntheticWheelEvent;\n            break;\n          case "copy":\n          case "cut":\n          case "paste":\n            SyntheticEventCtor = SyntheticClipboardEvent;\n            break;\n          case "gotpointercapture":\n          case "lostpointercapture":\n          case "pointercancel":\n          case "pointerdown":\n          case "pointermove":\n          case "pointerout":\n          case "pointerover":\n          case "pointerup":\n            SyntheticEventCtor = SyntheticPointerEvent;\n            break;\n          case "toggle":\n          case "beforetoggle":\n            SyntheticEventCtor = SyntheticToggleEvent;\n        }\n        var inCapturePhase = 0 !== (eventSystemFlags & 4),\n          accumulateTargetOnly =\n            !inCapturePhase &&\n            ("scroll" === domEventName || "scrollend" === domEventName),\n          reactEventName = inCapturePhase\n            ? null !== reactName\n              ? reactName + "Capture"\n              : null\n            : reactName;\n        inCapturePhase = [];\n        for (\n          var instance = targetInst, lastHostComponent;\n          null !== instance;\n\n        ) {\n          var _instance = instance;\n          lastHostComponent = _instance.stateNode;\n          _instance = _instance.tag;\n          (5 !== _instance && 26 !== _instance && 27 !== _instance) ||\n            null === lastHostComponent ||\n            null === reactEventName ||\n            ((_instance = getListener(instance, reactEventName)),\n            null != _instance &&\n              inCapturePhase.push(\n                createDispatchListener(instance, _instance, lastHostComponent)\n              ));\n          if (accumulateTargetOnly) break;\n          instance = instance.return;\n        }\n        0 < inCapturePhase.length &&\n          ((reactName = new SyntheticEventCtor(\n            reactName,\n            reactEventType,\n            null,\n            nativeEvent,\n            nativeEventTarget\n          )),\n          dispatchQueue.push({ event: reactName, listeners: inCapturePhase }));\n      }\n    }\n    if (0 === (eventSystemFlags & 7)) {\n      a: {\n        reactName =\n          "mouseover" === domEventName || "pointerover" === domEventName;\n        SyntheticEventCtor =\n          "mouseout" === domEventName || "pointerout" === domEventName;\n        if (\n          reactName &&\n          nativeEvent !== currentReplayingEvent &&\n          (reactEventType =\n            nativeEvent.relatedTarget || nativeEvent.fromElement) &&\n          (getClosestInstanceFromNode(reactEventType) ||\n            reactEventType[internalContainerInstanceKey])\n        )\n          break a;\n        if (SyntheticEventCtor || reactName) {\n          reactName =\n            nativeEventTarget.window === nativeEventTarget\n              ? nativeEventTarget\n              : (reactName = nativeEventTarget.ownerDocument)\n                ? reactName.defaultView || reactName.parentWindow\n                : window;\n          if (SyntheticEventCtor) {\n            if (\n              ((reactEventType =\n                nativeEvent.relatedTarget || nativeEvent.toElement),\n              (SyntheticEventCtor = targetInst),\n              (reactEventType = reactEventType\n                ? getClosestInstanceFromNode(reactEventType)\n                : null),\n              null !== reactEventType &&\n                ((accumulateTargetOnly =\n                  getNearestMountedFiber(reactEventType)),\n                (inCapturePhase = reactEventType.tag),\n                reactEventType !== accumulateTargetOnly ||\n                  (5 !== inCapturePhase &&\n                    27 !== inCapturePhase &&\n                    6 !== inCapturePhase)))\n            )\n              reactEventType = null;\n          } else (SyntheticEventCtor = null), (reactEventType = targetInst);\n          if (SyntheticEventCtor !== reactEventType) {\n            inCapturePhase = SyntheticMouseEvent;\n            _instance = "onMouseLeave";\n            reactEventName = "onMouseEnter";\n            instance = "mouse";\n            if ("pointerout" === domEventName || "pointerover" === domEventName)\n              (inCapturePhase = SyntheticPointerEvent),\n                (_instance = "onPointerLeave"),\n                (reactEventName = "onPointerEnter"),\n                (instance = "pointer");\n            accumulateTargetOnly =\n              null == SyntheticEventCtor\n                ? reactName\n                : getNodeFromInstance(SyntheticEventCtor);\n            lastHostComponent =\n              null == reactEventType\n                ? reactName\n                : getNodeFromInstance(reactEventType);\n            reactName = new inCapturePhase(\n              _instance,\n              instance + "leave",\n              SyntheticEventCtor,\n              nativeEvent,\n              nativeEventTarget\n            );\n            reactName.target = accumulateTargetOnly;\n            reactName.relatedTarget = lastHostComponent;\n            _instance = null;\n            getClosestInstanceFromNode(nativeEventTarget) === targetInst &&\n              ((inCapturePhase = new inCapturePhase(\n                reactEventName,\n                instance + "enter",\n                reactEventType,\n                nativeEvent,\n                nativeEventTarget\n              )),\n              (inCapturePhase.target = lastHostComponent),\n              (inCapturePhase.relatedTarget = accumulateTargetOnly),\n              (_instance = inCapturePhase));\n            accumulateTargetOnly = _instance;\n            if (SyntheticEventCtor && reactEventType)\n              b: {\n                inCapturePhase = SyntheticEventCtor;\n                reactEventName = reactEventType;\n                instance = 0;\n                for (\n                  lastHostComponent = inCapturePhase;\n                  lastHostComponent;\n                  lastHostComponent = getParent(lastHostComponent)\n                )\n                  instance++;\n                lastHostComponent = 0;\n                for (\n                  _instance = reactEventName;\n                  _instance;\n                  _instance = getParent(_instance)\n                )\n                  lastHostComponent++;\n                for (; 0 < instance - lastHostComponent; )\n                  (inCapturePhase = getParent(inCapturePhase)), instance--;\n                for (; 0 < lastHostComponent - instance; )\n                  (reactEventName = getParent(reactEventName)),\n                    lastHostComponent--;\n                for (; instance--; ) {\n                  if (\n                    inCapturePhase === reactEventName ||\n                    (null !== reactEventName &&\n                      inCapturePhase === reactEventName.alternate)\n                  )\n                    break b;\n                  inCapturePhase = getParent(inCapturePhase);\n                  reactEventName = getParent(reactEventName);\n                }\n                inCapturePhase = null;\n              }\n            else inCapturePhase = null;\n            null !== SyntheticEventCtor &&\n              accumulateEnterLeaveListenersForEvent(\n                dispatchQueue,\n                reactName,\n                SyntheticEventCtor,\n                inCapturePhase,\n                !1\n              );\n            null !== reactEventType &&\n              null !== accumulateTargetOnly &&\n              accumulateEnterLeaveListenersForEvent(\n                dispatchQueue,\n                accumulateTargetOnly,\n                reactEventType,\n                inCapturePhase,\n                !0\n              );\n          }\n        }\n      }\n      a: {\n        reactName = targetInst ? getNodeFromInstance(targetInst) : window;\n        SyntheticEventCtor =\n          reactName.nodeName && reactName.nodeName.toLowerCase();\n        if (\n          "select" === SyntheticEventCtor ||\n          ("input" === SyntheticEventCtor && "file" === reactName.type)\n        )\n          var getTargetInstFunc = getTargetInstForChangeEvent;\n        else if (isTextInputElement(reactName))\n          if (isInputEventSupported)\n            getTargetInstFunc = getTargetInstForInputOrChangeEvent;\n          else {\n            getTargetInstFunc = getTargetInstForInputEventPolyfill;\n            var handleEventFunc = handleEventsForInputEventPolyfill;\n          }\n        else\n          (SyntheticEventCtor = reactName.nodeName),\n            !SyntheticEventCtor ||\n            "input" !== SyntheticEventCtor.toLowerCase() ||\n            ("checkbox" !== reactName.type && "radio" !== reactName.type)\n              ? targetInst &&\n                isCustomElement(targetInst.elementType) &&\n                (getTargetInstFunc = getTargetInstForChangeEvent)\n              : (getTargetInstFunc = getTargetInstForClickEvent);\n        if (\n          getTargetInstFunc &&\n          (getTargetInstFunc = getTargetInstFunc(domEventName, targetInst))\n        ) {\n          createAndAccumulateChangeEvent(\n            dispatchQueue,\n            getTargetInstFunc,\n            nativeEvent,\n            nativeEventTarget\n          );\n          break a;\n        }\n        handleEventFunc && handleEventFunc(domEventName, reactName, targetInst);\n        "focusout" === domEventName &&\n          targetInst &&\n          "number" === reactName.type &&\n          null != targetInst.memoizedProps.value &&\n          setDefaultValue(reactName, "number", reactName.value);\n      }\n      handleEventFunc = targetInst ? getNodeFromInstance(targetInst) : window;\n      switch (domEventName) {\n        case "focusin":\n          if (\n            isTextInputElement(handleEventFunc) ||\n            "true" === handleEventFunc.contentEditable\n          )\n            (activeElement = handleEventFunc),\n              (activeElementInst = targetInst),\n              (lastSelection = null);\n          break;\n        case "focusout":\n          lastSelection = activeElementInst = activeElement = null;\n          break;\n        case "mousedown":\n          mouseDown = !0;\n          break;\n        case "contextmenu":\n        case "mouseup":\n        case "dragend":\n          mouseDown = !1;
1\n          constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);\n          break;\n        case "selectionchange":\n          if (skipSelectionChangeEvent) break;\n        case "keydown":\n        case "keyup":\n          constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);\n      }\n      var fallbackData;\n      if (canUseCompositionEvent)\n        b: {\n          switch (domEventName) {\n            case "compositionstart":\n              var eventType = "onCompositionStart";\n              break b;\n            case "compositionend":\n              eventType = "onCompositionEnd";\n              break b;\n            case "compositionupdate":\n              eventType = "onCompositionUpdate";\n              break b;\n          }\n          eventType = void 0;\n        }\n      else\n        isComposing\n          ? isFallbackCompositionEnd(domEventName, nativeEvent) &&\n            (eventType = "onCompositionEnd")\n          : "keydown" === domEventName &&\n            229 === nativeEvent.keyCode &&\n            (eventType = "onCompositionStart");\n      eventType &&\n        (useFallbackCompositionData &&\n          "ko" !== nativeEvent.locale &&\n          (isComposing || "onCompositionStart" !== eventType\n            ? "onCompositionEnd" === eventType &&\n              isComposing &&\n              (fallbackData = getData())\n            : ((root = nativeEventTarget),\n              (startText = "value" in root ? root.value : root.textContent),\n              (isComposing = !0))),\n        (handleEventFunc = accumulateTwoPhaseListeners(targetInst, eventType)),\n        0 < handleEventFunc.length &&\n          ((eventType = new SyntheticCompositionEvent(\n            eventType,\n            domEventName,\n            null,\n            nativeEvent,\n            nativeEventTarget\n          )),\n          dispatchQueue.push({ event: eventType, listeners: handleEventFunc }),\n          fallbackData\n            ? (eventType.data = fallbackData)\n            : ((fallbackData = getDataFromCustomEvent(nativeEvent)),\n              null !== fallbackData && (eventType.data = fallbackData))));\n      if (\n        (fallbackData = canUseTextInputEvent\n          ? getNativeBeforeInputChars(domEventName, nativeEvent)\n          : getFallbackBeforeInputChars(domEventName, nativeEvent))\n      )\n        (eventType = accumulateTwoPhaseListeners(targetInst, "onBeforeInput")),\n          0 < eventType.length &&\n            ((handleEventFunc = new SyntheticCompositionEvent(\n              "onBeforeInput",\n              "beforeinput",\n              null,\n              nativeEvent,\n              nativeEventTarget\n            )),\n            dispatchQueue.push({\n              event: handleEventFunc,\n              listeners: eventType\n            }),\n            (handleEventFunc.data = fallbackData));\n      extractEvents$1(\n        dispatchQueue,\n        domEventName,\n        targetInst,\n        nativeEvent,\n        nativeEventTarget\n      );\n    }
1\n    processDispatchQueue(dispatchQueue, eventSystemFlags);\n  });\n}\nfunction createDispatchListener(instance, listener, currentTarget) {\n  return {\n    instance: instance,\n    listener: listener,\n    currentTarget: currentTarget\n  };\n}\nfunction accumulateTwoPhaseListeners(targetFiber, reactName) {\n  for (\n    var captureName = reactName + "Capture", listeners = [];\n    null !== targetFiber;\n\n  ) {\n    var _instance2 = targetFiber,\n      stateNode = _instance2.stateNode;\n    _instance2 = _instance2.tag;\n    (5 !== _instance2 && 26 !== _instance2 && 27 !== _instance2) ||\n      null === stateNode ||\n      ((_instance2 = getListener(targetFiber, captureName)),\n      null != _instance2 &&\n        listeners.unshift(\n          createDispatchListener(targetFiber, _instance2, stateNode)\n        ),\n      (_instance2 = getListener(targetFiber, reactName)),\n      null != _instance2 &&\n        listeners.push(\n          createDispatchListener(targetFiber, _instance2, stateNode)\n        ));\n    if (3 === targetFiber.tag) return listeners;\n    targetFiber = targetFiber.return;\n  }\n  return [];\n}\nfunction getParent(inst) {\n  if (null === inst) return null;\n  do inst = inst.return;\n  while (inst && 5 !== inst.tag && 27 !== inst.tag);\n  return inst ? inst : null;\n}\nfunction accumulateEnterLeaveListenersForEvent(\n  dispatchQueue,\n  event,\n  target,\n  common,\n  inCapturePhase\n) {\n  for (\n    var registrationName = event._reactName, listeners = [];\n    null !== target && target !== common;\n\n  ) {\n    var _instance3 = target,\n      alternate = _instance3.alternate,\n      stateNode = _instance3.stateNode;\n    _instance3 = _instance3.tag;\n    if (null !== alternate && alternate === common) break;\n    (5 !== _instance3 && 26 !== _instance3 && 27 !== _instance3) ||\n      null === stateNode ||\n      ((alternate = stateNode),\n      inCapturePhase\n        ? ((stateNode = getListener(target, registrationName)),\n          null != stateNode &&\n            listeners.unshift(\n              createDispatchListener(target, stateNode, alternate)\n            ))\n        : inCapturePhase ||\n          ((stateNode = getListener(target, registrationName)),\n          null != stateNode &&\n            listeners.push(\n              createDispatchListener(target, stateNode, alternate)\n            )));\n    target = target.return;\n  }\n  0 !== listeners.length &&\n    dispatchQueue.push({ event: event, listeners: listeners });\n}\nvar NORMALIZE_NEWLINES_REGEX = /\\r\\n?/g,\n  NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\\u0000|\\uFFFD/g;\nfunction normalizeMarkupForTextOrAttribute(markup) {\n  return ("string" === typeof markup ? markup : "" + markup)\n    .replace(NORMALIZE_NEWLINES_REGEX, "\\n")\n    .replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, "");\n}\nfunction checkForUnmatchedText(serverText, clientText) {\n  clientText = normalizeMarkupForTextOrAttribute(clientText);\n  return normalizeMarkupForTextOrAttribute(serverText) === clientText ? !0 : !1;\n}\nfunction noop$1() {}\nfunction setProp(domElement, tag, key, value, props, prevValue) {\n  switch (key) {\n    case "children":\n      "string" === typeof value\n        ? "body" === tag ||\n          ("textarea" === tag && "" === value) ||\n          setTextContent(domElement, value)\n        : ("number" === typeof value || "bigint" === typeof value) &&\n          "body" !== tag &&\n          setTextContent(domElement, "" + value);\n      break;\n    case "className":\n      setValueForKnownAttribute(domElement, "class", value);\n      break;\n    case "tabIndex":\n      setValueForKnownAttribute(domElement, "tabindex", value);\n      break;\n    case "dir":\n    case "role":\n    case "viewBox":\n    case "width":\n    case "height":\n      setValueForKnownAttribute(domElement, key, value);\n      break;\n    case "style":\n      setValueForStyles(domElement, value, prevValue);\n      break;\n    case "data":\n      if ("object" !== tag) {\n        setValueForKnownAttribute(domElement, "data", value);\n        break;\n      }\n    case "src":\n    case "href":\n      if ("" === value && ("a" !== tag || "href" !== key)) {\n        domElement.removeAttribute(key);\n        break;\n      }\n      if (\n        null == value ||\n        "function" === typeof value ||\n        "symbol" === typeof value ||\n        "boolean" === typeof value\n      ) {\n        domElement.removeAttribute(key);\n        break;\n      }\n      value = sanitizeURL("" + value);\n      domElement.setAttribute(key, value);\n      break;\n    case "action":\n    case "formAction":\n      if ("function" === typeof value) {\n        domElement.setAttribute(\n          key,\n          "javascript:throw new Error(\'A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\\\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().\')"\n        );\n        break;\n      } else\n        "function" === typeof prevValue &&\n          ("formAction" === key\n            ? ("input" !== tag &&\n                setProp(domElement, tag, "name", props.name, props, null),\n              setProp(\n                domElement,\n                tag,\n                "formEncType",\n                props.formEncType,\n                props,\n                null\n              ),\n              setProp(\n                domElement,\n                tag,\n                "formMethod",\n                props.formMethod,\n                props,\n                null\n              ),\n              setProp(\n                domElement,\n                tag,\n                "formTarget",\n                props.formTarget,\n                props,\n                null\n              ))\n            : (setProp(domElement, tag, "encType", props.encType, props, null),\n              setProp(domElement, tag, "method", props.method, props, null),\n              setProp(domElement, tag, "target", props.target, props, null)));\n      if (\n        null == value ||\n        "symbol" === typeof value ||\n        "boolean" === typeof value\n      ) {\n        domElement.removeAttribute(key);\n        break;\n      }\n      value = sanitizeURL("" + value);\n      domElement.setAttribute(key, value);\n      break;\n    case "onClick":\n      null != value && (domElement.onclick = noop$1);\n      break;\n    case "onScroll":\n      null != value && listenToNonDelegatedEvent("scroll", domElement);\n      break;\n    case "onScrollEnd":\n      null != value && listenToNonDelegatedEvent("scrollend", domElement);\n      break;\n    case "dangerouslySetInnerHTML":\n      if (null != value) {\n        if ("object" !== typeof value || !("__html" in value))\n          throw Error(formatProdErrorMessage(61));\n        key = value.__html;\n        if (null != key) {\n          if (null != props.children) throw Error(formatProdErrorMessage(60));\n          domElement.innerHTML = key;\n        }\n      }\n      break;\n    case "multiple":\n      domElement.multiple =\n        value && "function" !== typeof value && "symbol" !== typeof value;\n      break;\n    case "muted":\n      domElement.muted =\n        value && "function" !== typeof value && "symbol" !== typeof value;\n      break;\n    case "suppressContentEditableWarning":\n    case "suppressHydrationWarning":\n    case "defaultValue":\n    case "defaultChecked":\n    case "innerHTML":\n    case "ref":\n      break;\n    case "autoFocus":\n      break;\n    case "xlinkHref":\n      if (\n        null == value ||\n        "function" === typeof value ||\n        "boolean" === typeof value ||\n        "symbol" === typeof value\n      ) {\n        domElement.removeAttribute("xlink:href");\n        break;\n      }\n      key = sanitizeURL("" + value);\n      domElement.setAttributeNS(\n        "http://www.w3.org/1999/xlink",\n        "xlink:href",\n        key\n      );\n      break;\n    case "contentEditable":\n    case "spellCheck":\n    case "draggable":\n    case "value":\n    case "autoReverse":\n    case "externalResourcesRequired":\n    case "focusable":\n    case "preserveAlpha":\n      null != value && "function" !== typeof value && "symbol" !== typeof value\n        ? domElement.setAttribute(key, "" + value)\n        : domElement.removeAttribute(key);\n      break;\n    case "inert":\n    case "allowFullScreen":\n    case "async":\n    case "autoPlay":\n    case "controls":\n    case "default":\n    case "defer":\n    case "disabled":\n    case "disablePictureInPicture":\n    case "disableRemotePlayback":\n    case "formNoValidate":\n    case "hidden":\n    case "loop":\n    case "noModule":\n    case "noValidate":\n    case "open":\n    case "playsInl
1ine":\n    case "readOnly":\n    case "required":\n    case "reversed":\n    case "scoped":\n    case "seamless":\n    case "itemScope":\n      value && "function" !== typeof value && "symbol" !== typeof value\n        ? domElement.setAttribute(key, "")\n        : domElement.removeAttribute(key);\n      break;\n    case "capture":\n    case "download":\n      !0 === value\n        ? domElement.setAttribute(key, "")\n        : !1 !== value &&\n            null != value &&\n            "function" !== typeof value &&\n            "symbol" !== typeof value\n          ? domElement.setAttribute(key, value)\n          : domElement.removeAttribute(key);\n      break;\n    case "cols":\n    case "rows":\n    case "size":\n    case "span":\n      null != value &&\n      "function" !== typeof value &&\n      "symbol" !== typeof value &&\n      !isNaN(value) &&\n      1 <= value\n        ? domElement.setAttribute(key, value)\n        : domElement.removeAttribute(key);\n      break;\n    case "rowSpan":\n    case "start":\n      null == value ||\n      "function" === typeof value ||\n      "symbol" === typeof value ||\n      isNaN(value)\n        ? domElement.removeAttribute(key)\n        : domElement.setAttribute(key, value);\n      break;\n    case "popover":\n      listenToNonDelegatedEvent("beforetoggle", domElement);\n      listenToNonDelegatedEvent("toggle", domElement);\n      setValueForAttribute(domElement, "popover", value);\n      break;\n    case "xlinkActuate":\n      setValueForNamespacedAttribute(\n        domElement,\n        "http://www.w3.org/1999/xlink",\n        "xlink:actuate",\n        value\n      );\n      break;\n    case "xlinkArcrole":\n      setValueForNamespacedAttribute(\n        domElement,\n        "http://www.w3.org/1999/xlink",\n        "xlink:arcrole",\n        value\n      );\n      break;\n    case "xlinkRole":\n      setValueForNamespacedAttribute(\n        domElement,\n        "http://www.w3.org/1999/xlink",\n        "xlink:role",\n        value\n      );\n      break;\n    case "xlinkShow":\n      setValueForNamespacedAttribute(\n        domElement,\n        "http://www.w3.org/1999/xlink",\n        "xlink:show",\n        value\n      );\n      break;\n    case "xlinkTitle":\n      setValueForNamespacedAttribute(\n        domElement,\n        "http://www.w3.org/1999/xlink",\n        "xlink:title",\n        value\n      );\n      break;\n    case "xlinkType":\n      setValueForNamespacedAttribute(\n        domElement,\n        "http://www.w3.org/1999/xlink",\n        "xlink:type",\n        value\n      );\n      break;\n    case "xmlBase":\n      setValueForNamespacedAttribute(\n        domElement,\n        "http://www.w3.org/XML/1998/namespace",\n        "xml:base",\n        value\n      );\n      break;\n    case "xmlLang":\n      setValueForNamespacedAttribute(\n        domElement,\n        "http://www.w3.org/XML/1998/namespace",\n        "xml:lang",\n        value\n      );\n      break;\n    case "xmlSpace":\n      setValueForNamespacedAttribute(\n        domElement,\n        "http://www.w3.org/XML/1998/namespace",\n        "xml:space",\n        value\n      );\n      break;\n    case "is":\n      setValueForAttribute(domElement, "is", value);\n      break;\n    case "innerText":\n    case "textContent":\n      break;\n    default:\n      if (\n        !(2 < key.length) ||\n        ("o" !== key[0] && "O" !== key[0]) ||\n        ("n" !== key[1] && "N" !== key[1])\n      )\n        (key = aliases.get(key) || key),\n          setValueForAttribute(domElement, key, value);\n  }\n}\nfunction setPropOnCustomElement(domElement, tag, key, value, props, prevValue) {\n  switch (key) {\n    case "style":\n      setValueForStyles(domElement, value, prevValue);\n      break;\n    case "dangerouslySetInnerHTML":\n      if (null != value) {\n        if ("object" !== typeof value || !("__html" in value))\n          throw Error(formatProdErrorMessage(61));\n        key = value.__html;\n        if (null != key) {\n          if (null != props.children) throw Error(formatProdErrorMessage(60));\n          domElement.innerHTML = key;\n        }\n      }\n      break;\n    case "children":\n      "string" === typeof value\n        ? setTextContent(domElement, value)\n        : ("number" === typeof value || "bigint" === typeof value) &&\n          setTextContent(domElement, "" + value);\n      break;\n    case "onScroll":\n      null != value && listenToNonDelegatedEvent("scroll", domElement);\n      break;\n    case "onScrollEnd":\n      null != value && listenToNonDelegatedEvent("scrollend", domElement);\n      break;\n    case "onClick":\n      null != value && (domElement.onclick = noop$1);\n      break;\n    case "suppressContentEditableWarning":\n    case "suppressHydrationWarning":\n    case "innerHTML":\n    case "ref":\n      break;\n    case "innerText":\n    case "textContent":\n      break;\n    default:\n      if (!registrationNameDependencies.hasOwnProperty(key))\n        a: {\n          if (\n            "o" === key[0] &&\n            "n" === key[1] &&\n            ((props = key.endsWith("Capture")),\n            (tag = key.slice(2, props ? key.length - 7 : void 0)),\n            (prevValue = domElement[internalPropsKey] || null),\n            (prevValue = null != prevValue ? prevValue[key] : null),\n            "function" === typeof prevValue &&\n              domElement.removeEventListener(tag, prevValue, props),\n            "function" === typeof value)\n          ) {\n            "function" !== typeof prevValue &&\n              null !== prevValue &&\n              (key in domElement\n                ? (domElement[key] = null)\n                : domElement.hasAttribute(key) &&\n                  domElement.removeAttribute(key));\n            domElement.addEventListener(tag, value, props);\n            break a;\n          }\n          key in domElement\n            ? (domElement[key] = value)\n            : !0 === value\
1n              ? domElement.setAttribute(key, "")\n              : setValueForAttribute(domElement, key, value);\n        }\n  }\n}\nfunction setInitialProperties(domElement, tag, props) {\n  switch (tag) {\n    case "div":\n    case "span":\n    case "svg":\n    case "path":\n    case "a":\n    case "g":\n    case "p":\n    case "li":\n      break;\n    case "img":\n      listenToNonDelegatedEvent("error", domElement);\n      listenToNonDelegatedEvent("load", domElement);\n      var hasSrc = !1,\n        hasSrcSet = !1,\n        propKey;\n      for (propKey in props)\n        if (props.hasOwnProperty(propKey)) {\n          var propValue = props[propKey];\n          if (null != propValue)\n            switch (propKey) {\n              case "src":\n                hasSrc = !0;\n                break;\n              case "srcSet":\n                hasSrcSet = !0;\n                break;\n              case "children":\n              case "dangerouslySetInnerHTML":\n                throw Error(formatProdErrorMessage(137, tag));\n              default:\n                setProp(domElement, tag, propKey, propValue, props, null);\n            }\n        }\n      hasSrcSet &&\n        setProp(domElement, tag, "srcSet", props.srcSet, props, null);\n      hasSrc && setProp(domElement, tag, "src", props.src, props, null);\n      return;\n    case "input":\n      listenToNonDelegatedEvent("invalid", domElement);\n      var defaultValue = (propKey = propValue = hasSrcSet = null),\n        checked = null,\n        defaultChecked = null;\n      for (hasSrc in props)\n        if (props.hasOwnProperty(hasSrc)) {\n          var propValue$188 = props[hasSrc];\n          if (null != propValue$188)\n            switch (hasSrc) {\n              case "name":\n                hasSrcSet = propValue$188;\n                break;\n              case "type":\n                propValue = propValue$188;\n                break;\n              case "checked":\n                checked = propValue$188;\n                break;\n              case "defaultChecked":\n                defaultChecked = propValue$188;\n                break;\n              case "value":\n                propKey = propValue$188;\n                break;\n              case "defaultValue":\n                defaultValue = propValue$188;\n                break;\n              case "children":\n              case "dangerouslySetInnerHTML":\n                if (null != propValue$188)\n                  throw Error(formatProdErrorMessage(137, tag));\n                break;\n              default:\n                setProp(domElement, tag, hasSrc, propValue$188, props, null);\n            }\n        }\n      initInput(\n        domElement,\n        propKey,\n        defaultValue,\n        checked,\n        defaultChecked,\n        propValue,\n        hasSrcSet,\n        !1\n      );\n      track(domElement);\n      return;\n    case "select":\n      listenToNonDelegatedEvent("invalid", domElement);\n      hasSrc = propValue = propKey = null;\n      for (hasSrcSet in props)\n        if (\n          props.hasOwnProperty(hasSrcSet) &&\n          ((defaultValue = props[hasSrcSet]), null != defaultValue)\n        )\n          switch (hasSrcSet) {\n            case "value":\n              propKey = defaultValue;\n              break;\n            case "defaultValue":\n              propValue = defaultValue;\n              break;\n            case "multiple":\n              hasSrc = defaultValue;\n            default:\n              setProp(domElement, tag, hasSrcSet, defaultValue, props, null);\n          }\n      tag = propKey;\n      props = propValue;\n      domElement.multiple = !!hasSrc;\n      null != tag\n        ? updateOptions(domElement, !!hasSrc, tag, !1)\n        : null != props && updateOptions(domElement, !!hasSrc, props, !0);\n      return;\n    case "textarea":\n      listenToNonDelegatedEvent("invalid", domElement);\n      propKey = hasSrcSet = hasSrc = null;\n      for (propValue in props)\n        if (\n          props.hasOwnProperty(propValue) &&\n          ((defaultValue = props[propValue]), null != defaultValue)\n        )\n          switch (propValue) {\n            case "value":\n              hasSrc = defaultValue;\n              break;\n            case "defaultValue":\n              hasSrcSet = defaultValue;\n              break;\n            case "children":\n              propKey = defaultValue;\n              break;\n            case "dangerouslySetInnerHTML":\n              if (null != defaultValue) throw Error(formatProdErrorMessage(91));\n              break;\n            default:\n              setProp(domElement, tag, propValue, defaultValue, props, null);\n          }\n      initTextarea(domElement, hasSrc, hasSrcSet, propKey);\n      track(domElement);\n      return;\n    case "option":\n      for (checked in props)\n        if (\n          props.hasOwnProperty(checked) &&\n          ((hasSrc = props[checked]), null != hasSrc)\n        )\n          switch (checked) {\n            case "selected":\n              domElement.selected =\n                hasSrc &&\n                "function" !== typeof hasSrc &&\n                "symbol" !== typeof hasSrc;\n              break;\n            default:\n              setProp(domElement, tag, checked, hasSrc, props, null);\n          }\n      return;\n    case "dialog":\n      listenToNonDelegatedEvent("beforetoggle", domElement);\n      listenToNonDelegatedEvent("toggle", domElement);\n      listenToNonDelegatedEvent("cancel", domElement);\n      listenToNonDelegatedEvent("close", domElement);\n      break;\n    case "iframe":\n    case "object":\n      listenToNonDelegatedEvent("load", domElement);\n      break;\n    case "video":\n    case "audio":\n      for (hasSrc = 0; hasSrc < mediaEventTypes.length; hasSrc++)\n        listenToNonDelegatedEvent(mediaEventTypes[hasSrc], domElement);\n      break;\n    case "image":\n      listenToNonDelegatedEvent("error", domElement);\n      listenToNonDelegatedEvent("load", domElement);\n      break;\n    case "details":\n      listenToNonDelegatedEvent("toggle", domElement);\n      break;\n    case "embed":\n    case "source":\n    case "link":\n      listenToNonDelegatedEvent("error", domElement),\n        listenToNonDelegatedEvent("load", domElement);\n    case "area":\n    case "base":\n    case "br":\n    case "col":\n    case "hr":\n    case "keygen":\n    case "meta":\n    case "param":\n    case "track":\n    case "wbr":\n    case "menuitem":\n      for (defaultChecked in props)\n        if (\n          props.hasOwnProperty(defaultChecked) &&\n          ((hasSrc = props[defaultChecked]), null != hasSrc)\n        )\n          switch (defaultChecked) {\n            case "children":\n            case "dangerouslySetInnerHTML":\n              throw Error(formatProdErrorMessage(137, tag));\n            default:\n              setProp(domElement, tag, defaultChecked, hasSrc, props, null);\n          }\n      return;\n    default:\n      if (isCustomElement(tag)) {\n        for (propValue$188 in props)\n          props.hasOwnProperty(propValue$188) &&\n            ((hasSrc = props[propValue$188]),\n            void 0 !== hasSrc &&\n              setPropOnCustomElement(\n                domElement,\n                tag,\n                propValue$188,\n                hasSrc,\n                props,\n                void 0\n              ));\n        return;\n      }\n  }\n  for (defaultValue in props)\n    props.hasOwnProperty(defaultValue) &&\n      ((hasSrc = props[defaultValue]),\n      null != hasSrc &&\n        setProp(domElement, tag, defaultValue, hasSrc, props, null));\n}\nfunction updateProperties(domElement, tag, lastProps, nextProps) {\
1n  switch (tag) {\n    case "div":\n    case "span":\n    case "svg":\n    case "path":\n    case "a":\n    case "g":\n    case "p":\n    case "li":\n      break;\n    case "input":\n      var name = null,\n        type = null,\n        value = null,\n        defaultValue = null,\n        lastDefaultValue = null,\n        checked = null,\n        defaultChecked = null;\n      for (propKey in lastProps) {\n        var lastProp = lastProps[propKey];\n        if (lastProps.hasOwnProperty(propKey) && null != lastProp)\n          switch (propKey) {\n            case "checked":\n              break;\n            case "value":\n              break;\n            case "defaultValue":\n              lastDefaultValue = lastProp;\n            default:\n              nextProps.hasOwnProperty(propKey) ||\n                setProp(domElement, tag, propKey, null, nextProps, lastProp);\n          }\n      }\n      for (var propKey$205 in nextProps) {\n        var propKey = nextProps[propKey$205];\n        lastProp = lastProps[propKey$205];\n        if (\n          nextProps.hasOwnProperty(propKey$205) &&\n          (null != propKey || null != lastProp)\n        )\n          switch (propKey$205) {\n            case "type":\n              type = propKey;\n              break;\n            case "name":\n              name = propKey;\n              break;\n            case "checked":\n              checked = propKey;\n              break;\n            case "defaultChecked":\n              defaultChecked = propKey;\n              break;\n            case "value":\n              value = propKey;\n              break;\n            case "defaultValue":\n              defaultValue = propKey;\n              break;\n            case "children":\n            case "dangerouslySetInnerHTML":\n              if (null != propKey)\n                throw Error(formatProdErrorMessage(137, tag));\n              break;\n            default:\n              propKey !== lastProp &&\n                setProp(\n                  domElement,\n                  tag,\n                  propKey$205,\n                  propKey,\n                  nextProps,\n                  lastProp\n                );\n          }\n      }\n      updateInput(\n        domElement,\n        value,\n        defaultValue,\n        lastDefaultValue,\n        checked,\n        defaultChecked,\n        type,\n        name\n      );\n      return;\n    case "select":\n      propKey = value = defaultValue = propKey$205 = null;\n      for (type in lastProps)\n        if (\n          ((lastDefaultValue = lastProps[type]),\n          lastProps.hasOwnProperty(type) && null != lastDefaultValue)\n        )\n          switch (type) {\n            case "value":\n              break;\n            case "multiple":\n              propKey = lastDefaultValue;\n            default:\n              nextProps.hasOwnProperty(type) ||\n                setProp(\n                  domElement,\n                  tag,\n                  type,\n                  null,\n                  nextProps,\n                  lastDefaultValue\n                );\n          }\n      for (name in nextProps)\n        if (\n          ((type = nextProps[name]),\n          (lastDefaultValue = lastProps[name]),\n          nextProps.hasOwnProperty(name) &&\n            (null != type || null != lastDefaultValue))\n        )\n          switch (name) {\n            case "value":\n              propKey$205 = type;\n              break;\n            case "defaultValue":\n              defaultValue = type;\n              break;\n            case "multiple":\n              value = type;\n            default:\n              type !== lastDefaultValue &&\n                setProp(\n                  domElement,\n                  tag,\n                  name,\n                  type,\n                  nextProps,\n                  lastDefaultValue\n                );\n          }\n      tag = defaultValue;\n      lastProps = value;\n      nextProps = propKey;\n      null != propKey$205\n        ? updateOptions(domElement, !!lastProps, propKey$205, !1)\n        : !!nextProps !== !!lastProps &&\n          (null != tag\n            ? updateOptions(domElement, !!lastProps, tag, !0)\n            : updateOptions(domElement, !!lastProps, lastProps ? [] : "", !1));\n      return;\n    case "textarea":\n      propKey = propKey$205 = null;\n      for (defaultValue in lastProps)\n        if (\n          ((name = lastProps[defaultValue]),\n          lastProps.hasOwnProperty(defaultValue) &&\n            null != name &&\n            !nextProps.hasOwnProperty(defaultValue))\n        )\n          switch (defaultValue) {\n            case "value":\n              break;\n            case "children":\n              break;\n            default:\n              setProp(domElement, tag, defaultValue, null, nextProps, name);\n          }\n      for (value in nextProps)\n        if (\n          ((name = nextProps[value]),\n          (type = lastProps[value]),\n          nextProps.hasOwnProperty(value) && (null != name || null != type))\n        )\n          switch (value) {\n            case "value":\n              propKey$205 = name;\n              break;
1\n            case "defaultValue":\n              propKey = name;\n              break;\n            case "children":\n              break;\n            case "dangerouslySetInnerHTML":\n              if (null != name) throw Error(formatProdErrorMessage(91));\n              break;\n            default:\n              name !== type &&\n                setProp(domElement, tag, value, name, nextProps, type);\n          }\n      updateTextarea(domElement, propKey$205, propKey);\n      return;\n    case "option":\n      for (var propKey$221 in lastProps)\n        if (\n          ((propKey$205 = lastProps[propKey$221]),\n          lastProps.hasOwnProperty(propKey$221) &&\n            null != propKey$205 &&\n            !nextProps.hasOwnProperty(propKey$221))\n        )\n          switch (propKey$221) {\n            case "selected":\n              domElement.selected = !1;\n              break;\n            default:\n              setProp(\n                domElement,\n                tag,\n                propKey$221,\n                null,\n                nextProps,\n                propKey$205\n              );\n          }\n      for (lastDefaultValue in nextProps)\n        if (\n          ((propKey$205 = nextProps[lastDefaultValue]),\n          (propKey = lastProps[lastDefaultValue]),\n          nextProps.hasOwnProperty(lastDefaultValue) &&\n            propKey$205 !== propKey &&\n            (null != propKey$205 || null != propKey))\n        )\n          switch (lastDefaultValue) {\n            case "selected":\n              domElement.selected =\n                propKey$205 &&\n                "function" !== typeof propKey$205 &&\n                "symbol" !== typeof propKey$205;\n              break;\n            default:\n              setProp(\n                domElement,\n                tag,\n                lastDefaultValue,\n                propKey$205,\n                nextProps,\n                propKey\n              );\n          }\n      return;\n    case "img":\n    case "link":\n    case "area":\n    case "base":\n    case "br":\n    case "col":\n    case "embed":\n    case "hr":\n    case "keygen":\n    case "meta":\n    case "param":\n    case "source":\n    case "track":\n    case "wbr":\n    case "menuitem":\n      for (var propKey$226 in lastProps)\n        (propKey$205 = lastProps[propKey$226]),\n          lastProps.hasOwnProperty(propKey$226) &&\n            null != propKey$205 &&\n            !nextProps.hasOwnProperty(propKey$226) &&\n            setProp(domElement, tag, propKey$226, null, nextProps, propKey$205);\n      for (checked in nextProps)\n        if (\n          ((propKey$205 = nextProps[checked]),\n          (propKey = lastProps[checked]),\n          nextProps.hasOwnProperty(checked) &&\n            propKey$205 !== propKey &&\n            (null != propKey$205 || null != propKey))\n        )\n          switch (checked) {\n            case "children":\n            case "dangerouslySetInnerHTML":\n              if (null != propKey$205)\n                throw Error(formatProdErrorMessage(137, tag));\n              break;\n            default:\n              setProp(\n                domElement,\n                tag,\n                checked,\n                propKey$205,\n                nextProps,\n                propKey\n              );\n          }\n      return;\n    default:\n      if (isCustomElement(tag)) {\n        for (var propKey$231 in lastProps)\n          (propKey$205 = lastProps[propKey$231]),\n            lastProps.hasOwnProperty(propKey$231) &&\n              void 0 !== propKey$205 &&\n              !nextProps.hasOwnProperty(propKey$231) &&\n              setPropOnCustomElement(\n                domElement,\n                tag,\n                propKey$231,\n                void 0,\n                nextProps,\n                propKey$205\n              );\n        for (defaultChecked in nextProps)\n          (propKey$205 = nextProps[defaultChecked]),\n            (propKey = lastProps[defaultChecked]),\n            !nextProps.hasOwnProperty(defaultChecked) ||\n              propKey$205 === propKey ||\n              (void 0 === propKey$205 && void 0 === propKey) ||\n              setPropOnCustomElement(\n                domElement,\n                tag,\n                defaultChecked,\n                propKey$205,\n                nextProps,\n                propKey\n              );\n        return;\n      }\n  }\n  for (var propKey$236 in lastProps)\n    (propKey$205 = lastProps[propKey$236]),\n      lastProps.hasOwnProperty(propKey$236) &&\n        null != propKey$205 &&\n        !nextProps.hasOwnProperty(propKey$236) &&\n        setProp(domElement, tag, propKey$236, null, nextProps, propKey$205);\n  for (lastProp in nextProps)\n    (propKey$205 = nextProps[lastProp]),\n      (propKey = lastProps[lastProp]),\n      !nextProps.hasOwnProperty(lastProp) ||\n        propKey$205 === propKey ||\n        (null == propKey$205 && null == propKey) ||\n        setProp(domElement, tag, lastProp, propKey$205, nextProps, propKey);\n}\nvar eventsEnabled = null,\n  selectionInformation = null;\nfunction getOwnerDocumentFromRootContainer(rootContainerElement) {\n  return 9 === rootContainerElement.nodeType\n    ? rootContainerElement\n    : rootContainerElement.ownerDocument;\n}\nfunction getOwnHostContext(namespaceURI) {\n  switch (namespaceURI) {\n    case "http://www.w3.org/2000/svg":\n      return 1;\n    case "http://www.w3.org/1998/Math/MathML":\n      return 2;\n    default:\n      return 0;\n  }\n}\nfunction getChildHostContextProd(parentNamespace, type) {\n  if (0 === parentNamespace)\n    switch (type) {\n      case "svg":\n        return 1;\n      case "math":\n        return 2;\n      default:\n        return 0;\n    }\n  return 1 === parentNamespace && "foreignObject" === type\n    ? 0\n    : parentNamespace;\n}\nfunction shouldSetTextContent(type, props) {\n  return (\n    "textarea" === type ||\n    "noscript" === type ||\n    "string" === typeof props.children ||\n    "number" === typeof props.children ||\n    "bigint" === typeof props.children ||\n    ("object" === typeof props.dangerouslySetInnerHTML &&\n      null !== props.dangerouslySetInnerHTML &&\n      null != props.dangerouslySetInnerHTML.__html)\n  );\n}\nvar currentPopstateTransitionEvent = null;
1\nfunction shouldAttemptEagerTransition() {\n  var event = window.event;\n  if (event && "popstate" === event.type) {\n    if (event === currentPopstateTransitionEvent) return !1;\n    currentPopstateTransitionEvent = event;\n    return !0;\n  }\n  currentPopstateTransitionEvent = null;\n  return !1;\n}\nvar scheduleTimeout = "function" === typeof setTimeout ? setTimeout : void 0,\n  cancelTimeout = "function" === typeof clearTimeout ? clearTimeout : void 0,\n  localPromise = "function" === typeof Promise ? Promise : void 0,\n  scheduleMicrotask =\n    "function" === typeof queueMicrotask\n      ? queueMicrotask\n      : "undefined" !== typeof localPromise\n        ? function (callback) {\n            return localPromise\n              .resolve(null)\n              .then(callback)\n              .catch(handleErrorInNextTick);\n          }\n        : scheduleTimeout;\nfunction handleErrorInNextTick(error) {\n  setTimeout(function () {\n    throw error;\n  });\n}\nfunction isSingletonScope(type) {\n  return "head" === type;\n}\nfunction clearSuspenseBoundary(parentInstance, suspenseInstance) {\n  var node = suspenseInstance,\n    possiblePreambleContribution = 0,\n    depth = 0;\n  do {\n    var nextNode = node.nextSibling;\n    parentInstance.removeChild(node);\n    if (nextNode && 8 === nextNode.nodeType)\n      if (((node = nextNode.data), "/$" === node)) {\n        if (\n          0 < possiblePreambleContribution &&\n          8 > possiblePreambleContribution\n        ) {\n          node = possiblePreambleContribution;\n          var ownerDocument = parentInstance.ownerDocument;\n          node & 1 && releaseSingletonInstance(ownerDocument.documentElement);\n          node & 2 && releaseSingletonInstance(ownerDocument.body);\n          if (node & 4)\n            for (\n              node = ownerDocument.head,\n                releaseSingletonInstance(node),\n                ownerDocument = node.firstChild;\n              ownerDocument;\n\n            ) {\n              var nextNode$jscomp$0 = ownerDocument.nextSibling,\n                nodeName = ownerDocument.nodeName;\n              ownerDocument[internalHoistableMarker] ||\n                "SCRIPT" === nodeName ||\n                "STYLE" === nodeName ||\n                ("LINK" === nodeName &&\n                  "stylesheet" === ownerDocument.rel.toLowerCase()) ||\n                node.removeChild(ownerDocument);\n              ownerDocument = nextNode$jscomp$0;\n            }\n        }\n        if (0 === depth) {\n          parentInstance.removeChild(nextNode);\n          retryIfBlockedOn(suspenseInstance);\n          return;\n        }\n        depth--;\n      } else\n        "$" === node || "$?" === node || "$!" === node\n          ? depth++\n          : (possiblePreambleContribution = node.charCodeAt(0) - 48);\n    else possiblePreambleContribution = 0;\n    node = nextNode;\n  } while (node);\n  retryIfBlockedOn(suspenseInstance);\n}\nfunction clearContainerSparingly(container) {\n  var nextNode = container.firstChild;\n  nextNode && 10 === nextNode.nodeType && (nextNode = nextNode.nextSibling);\n  for (; nextNode; ) {\n    var node = nextNode;\n    nextNode = nextNode.nextSibling;\n    switch (node.nodeName) {\n      case "HTML":\n      case "HEAD":\n      case "BODY":\n        clearContainerSparingly(node);\n        detachDeletedInstance(node);\n        continue;\n      case "SCRIPT":\n      case "STYLE":\n        continue;\n      case "LINK":\n        if ("stylesheet" === node.rel.toLowerCase()) continue;\n    }\n    container.removeChild(node);\n  }\n}\nfunction canHydrateInstance(instance, type, props, inRootOrSingleton) {\n  for (; 1 === instance.nodeType; ) {\n    var anyProps = props;\n    if (instance.nodeName.toLowerCase() !== type.toLowerCase()) {\n      if (\n        !inRootOrSingleton &&\n        ("INPUT" !== instance.nodeName || "hidden" !== instance.type)\n      )\n        break;\n    } else if (!inRootOrSingleton)\n      if ("input" === type && "hidden" === instance.type) {\n        var name = null == anyProps.name ? null : "" + anyProps.name;\n        if (\n          "hidden" === anyProps.type &&\n          instance.getAttribute("name") === name\n        )\n          return instance;\n      } else return instance;\n    else if (!instance[internalHoistableMarker])\n      switch (type) {\n        case "meta":\n          if (!instance.hasAttribute("itemprop")) break;\n          return instance;\n        case "link":\n          name = instance.getAttribute("rel");\n          if ("stylesheet" === name && instance.hasAttribute("data-precedence"))\n            break;\n          else if (\n            name !== anyProps.rel ||\n            instance.getAttribute("href") !==\n              (null == anyProps.href || "" === anyProps.href\n                ? null\n                : anyProps.href) ||\n            instance.getAttribute("crossorigin") !==\n              (null == anyProps.crossOrigin ? null : anyProps.crossOrigin) ||\n            instance.getAttribute("title") !==\n              (null == anyProps.title ? null : anyProps.title)\n          )\n            break;\n          return instance;\n        case "style":\n          if (instance.hasAttribute("data-precedence")) break;\n          return instance;\n        case "script":\n          name = instance.getAttribute("src");\n          if (\n            (name !== (null == anyProps.src ? null : anyProps.src) ||\n              instance.getAttribute("type") !==\n                (null == anyProps.type ? null : anyProps.type) ||\n              instance.getAttribute("crossorigin") !==\n                (null == anyProps.crossOrigin ? null : anyProps.crossOrigin)) &&\n            name &&\n            instance.hasAttribute("async") &&\n            !instance.hasAttribute("itemprop")\n          )\n            break;\n          return instance;\n        default:\n          return instance;\n      }\n    instance = getNextHydratable(instance.nextSibling);\n    if (null === instance) break;\n  }\n  return null;\n}\nfunction canHydrateTextInstance(instance, text, inRootOrSingleton) {\n  if ("" === text) return null;\n  for (; 3 !== instance.nodeType; ) {\n    if (\n      (1 !== instance.nodeType ||\n        "INPUT" !== instance.nodeName ||\n        "hidden" !== instance.type) &&\n      !inRootOrSingleton\n    )\n      return null;\n    instance = getNextHydratable(instance.nextSibling);\n    if (null === instance) return null;\n  }\n  return instance;\n}\nfunction isSuspenseInstanceFallback(instance) {\n  return (\n    "$!" === instance.data ||\n    ("$?" === instance.data && "complete" === instance.ownerDocument.readyState)\n  );\n}\nfunction registerSuspenseInstanceRetry(instance, callback) {\n  var ownerDocument = instance.ownerDocument;\n  if ("$?" !== instance.data || "complete" === ownerDocument.readyState)\n    callback();\n  else {\n    var listener = function () {\n      callback();\n      ownerDocument.removeEventListener("DOMContentLoaded", listener);\n    };\n    ownerDocument.addEventListener("DOMContentLoaded", listener);\n    instance._reactRetry = listener;\n  }\n}\nfunction getNextHydratable(node) {\n  for (; null != node; node = node.nextSibling) {\n    var nodeType = node.nodeType;
1\n    if (1 === nodeType || 3 === nodeType) break;\n    if (8 === nodeType) {\n      nodeType = node.data;\n      if (\n        "$" === nodeType ||\n        "$!" === nodeType ||\n        "$?" === nodeType ||\n        "F!" === nodeType ||\n        "F" === nodeType\n      )\n        break;\n      if ("/$" === nodeType) return null;\n    }\n  }\n  return node;\n}\nvar previousHydratableOnEnteringScopedSingleton = null;\nfunction getParentSuspenseInstance(targetInstance) {\n  targetInstance = targetInstance.previousSibling;\n  for (var depth = 0; targetInstance; ) {\n    if (8 === targetInstance.nodeType) {\n      var data = targetInstance.data;\n      if ("$" === data || "$!" === data || "$?" === data) {\n        if (0 === depth) return targetInstance;\n        depth--;\n      } else "/$" === data && depth++;\n    }\n    targetInstance = targetInstance.previousSibling;\n  }\n  return null;\n}\nfunction resolveSingletonInstance(type, props, rootContainerInstance) {\n  props = getOwnerDocumentFromRootContainer(rootContainerInstance);\n  switch (type) {\n    case "html":\n      type = props.documentElement;\n      if (!type) throw Error(formatProdErrorMessage(452));\n      return type;\n    case "head":\n      type = props.head;\n      if (!type) throw Error(formatProdErrorMessage(453));\n      return type;\n    case "body":\n      type = props.body;\n      if (!type) throw Error(formatProdErrorMessage(454));\n      return type;\n    default:\n      throw Error(formatProdErrorMessage(451));\n  }\n}\nfunction releaseSingletonInstance(instance) {\n  for (var attributes = instance.attributes; attributes.length; )\n    instance.removeAttributeNode(attributes[0]);\n  detachDeletedInstance(instance);\n}\nvar preloadPropsMap = new Map(),\n  preconnectsSet = new Set();\nfunction getHoistableRoot(container) {\n  return "function" === typeof container.getRootNode\n    ? container.getRootNode()\n    : 9 === container.nodeType\n      ? container\n      : container.ownerDocument;\n}\nvar previousDispatcher = ReactDOMSharedInternals.d;\nReactDOMSharedInternals.d = {\n  f: flushSyncWork,\n  r: requestFormReset,\n  D: prefetchDNS,\n  C: preconnect,\n  L: preload,\n  m: preloadModule,\n  X: preinitScript,\n  S: preinitStyle,\n  M: preinitModuleScript\n};\nfunction flushSyncWork() {\n  var previousWasRendering = previousDispatcher.f(),\n    wasRendering = flushSyncWork$1();\n  return previousWasRendering || wasRendering;\n}\nfunction requestFormReset(form) {\n  var formInst = getInstanceFromNode(form);\n  null !== formInst && 5 === formInst.tag && "form" === formInst.type\n    ? requestFormReset$1(formInst)\n    : previousDispatcher.r(form);\n}\nvar globalDocument = "undefined" === typeof document ? null : document;\nfunction preconnectAs(rel, href, crossOrigin) {\n  var ownerDocument = globalDocument;\n  if (ownerDocument && "string" === typeof href && href) {\n    var limitedEscapedHref =\n      escapeSelectorAttributeValueInsideDoubleQuotes(href);\n    limitedEscapedHref =\n      \'link[rel="\' + rel + \'"][href="\' + limitedEscapedHref + \'"]\';\n    "string" === typeof crossOrigin &&\n      (limitedEscapedHref += \'[crossorigin="\' + crossOrigin + \'"]\');\n    preconnectsSet.has(limitedEscapedHref) ||\n      (preconnectsSet.add(limitedEscapedHref),\n      (rel = { rel: rel, crossOrigin: crossOrigin, href: href }),\n      null === ownerDocument.querySelector(limitedEscapedHref) &&\n        ((href = ownerDocument.createElement("link")),\n        setInitialProperties(href, "link", rel),\n        markNodeAsHoistable(href),\n        ownerDocument.head.appendChild(href)));\n  }\n}\nfunction prefetchDNS(href) {\n  previousDispatcher.D(href);\n  preconnectAs("dns-prefetch", href, null);\n}\nfunction preconnect(href, crossOrigin) {\n  previousDispatcher.C(href, crossOrigin);\n  preconnectAs("preconnect", href, crossOrigin);\n}\nfunction preload(href, as, options) {\n  previousDispatcher.L(href, as, options);\n  var ownerDocument = globalDocument;\n  if (ownerDocument && href && as) {\n    var preloadSelector =\n      \'link[rel="preload"][as="\' +\n      escapeSelectorAttributeValueInsideDoubleQuotes(as) +\n      \'"]\';\n    "image" === as\n      ? options && options.imageSrcSet\n        ? ((preloadSelector +=\n            \'[imagesrcset="\' +\n            escapeSelectorAttributeValueInsideDoubleQuotes(\n              options.imageSrcSet\n            ) +\n            \'"]\'),\n          "string" === typeof options.imageSizes &&\n            (preloadSelector +=\n              \'[imagesizes="\' +\n              escapeSelectorAttributeValueInsideDoubleQuotes(\n                options.imageSizes\n              ) +\n              \'"]\'))\n        : (preloadSelector +=\n            \'[href="\' +\n            escapeSelectorAttributeValueInsideDoubleQuotes(href) +\n            \'"]\')\n      : (preloadSelector +=\n          \'[href="\' +\n          escapeSelectorAttributeValueInsideDoubleQuotes(href) +\n          \'"]\');\n    var key = preloadSelector;\n    switch (as) {\n      case "style":\n        key = getStyleKey(href);\n        break;\n      case "script":\n        key = getScriptKey(href);\n    }\n    preloadPropsMap.has(key) ||\n      ((href = assign(\n        {\n          rel: "preload",\n          href:\n            "image" === as && options && options.imageSrcSet ? void 0 : href,\n          as: as\n        },\n        options\n      )),\n      preloadPropsMap.set(key, href),\n      null !== ownerDocument.querySelector(preloadSelector) ||\n        ("style" === as &&\n          ownerDocument.querySelector(getStylesheetSelectorFromKey(key))) ||\n        ("script" === as &&\n          ownerDocument.querySelector(getScriptSelectorFromKey(key))) ||\n        ((as = ownerDocument.createElement("link")),\n        setInitialProperties(as, "link", href),\n        markNodeAsHoistable(as),\n        ownerDocument.head.appendChild(as)));\n  }\n}\nfunction preloadModule(href, options) {\n  previousDispatcher.m(href, options);\n  var ownerDocument = globalDocument;\n  if (ownerDocument && href) {\n    var as = options && "string" === typeof options.as ? options.as : "script",\n      preloadSelector =\n        \'link[rel="modulepreload"][as="\' +\n        escapeSelectorAttributeValueInsideDoubleQuotes(as) +\n        \'"][href="\' +\n        escapeSelectorAttributeValueInsideDoubleQuotes(href) +\n        \'"]\',\n      key = preloadSelector;\n    switch (as) {\n      case "audioworklet":\n      case "paintworklet":\n      case "serviceworker":\n      case "sharedworker":\n      case "worker":\n      case "script":\n        key = getScriptKey(href);\n    }\n    if (\n      !preloadPropsMap.has(key) &&\n      ((href = assign({ rel: "modulepreload", href: href }, options)),\n      preloadPropsMap.set(key, href),\n      null === ownerDocument.querySelector(preloadSelector))\n    ) {\n      switch (as) {\n        case "audioworklet":\n        case "paintworklet":\n        case "serviceworker":\n        case "sharedworker":\n        case "worker":\n        case "script":\n          if (ownerDocument.querySelector(getScriptSelectorFromKey(key)))\n            return;\n      }\n      as = ownerDocument.createElement("link");\n      setInitialProperties(as, "link", href);\n      markNodeAsHoistable(as);\n      ownerDocument.head.appendChild(as);\n    }\n  }\n}\nfunction preinitStyle(href, precedence, options) {\n  previousDispatcher.S(href, precedence, options);\n  var ownerDocument = globalDocument;\n  if (ownerDocument && href) {\n    var styles = getResourcesFromRoot(ownerDocument).hoistableStyles,\n      key = getStyleKey(href);\n    precedence = precedence || "default";\n    var resource = styles.get(key);\n    if (!resource) {\n      var state = { loading: 0, preload: null };\n      if (\n        (resource = ownerDocument.querySelector(\n          getStylesheetSelectorFromKey(key)\n        ))\n      )\n        state.loading = 5;\n      else {\n        href = assign(\n          { rel: "stylesheet", href: href, "data-precedence": precedence },\n          options\n        );\n        (options = preloadPropsMap.get(key)) &&\n          adoptPreloadPropsForStylesheet(href, options);\n        var link = (resource = ownerDocument.createElement("link"));\n        markNodeAsHoistable(link);\n        setInitialProperties(link, "link", href);\n        link._p = new Promise(function (resolve, reject) {\n          link.onload = resolve;\n          link.onerror = reject;\n        });\n        link.addEventListener("load", function () {\n          state.loading |= 1;\n        });\n        link.addEventListener("error", function () {\n          state.loading |= 2;\n        });\n        state.loading |= 4;\n        insertStylesheet(resource, precedence, ownerDocument);\n      }
1\n      resource = {\n        type: "stylesheet",\n        instance: resource,\n        count: 1,\n        state: state\n      };\n      styles.set(key, resource);\n    }\n  }\n}\nfunction preinitScript(src, options) {\n  previousDispatcher.X(src, options);\n  var ownerDocument = globalDocument;\n  if (ownerDocument && src) {\n    var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts,\n      key = getScriptKey(src),\n      resource = scripts.get(key);\n    resource ||\n      ((resource = ownerDocument.querySelector(getScriptSelectorFromKey(key))),\n      resource ||\n        ((src = assign({ src: src, async: !0 }, options)),\n        (options = preloadPropsMap.get(key)) &&\n          adoptPreloadPropsForScript(src, options),\n        (resource = ownerDocument.createElement("script")),\n        markNodeAsHoistable(resource),\n        setInitialProperties(resource, "link", src),\n        ownerDocument.head.appendChild(resource)),\n      (resource = {\n        type: "script",\n        instance: resource,\n        count: 1,\n        state: null\n      }),\n      scripts.set(key, resource));\n  }\n}\nfunction preinitModuleScript(src, options) {\n  previousDispatcher.M(src, options);\n  var ownerDocument = globalDocument;\n  if (ownerDocument && src) {\n    var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts,\n      key = getScriptKey(src),\n      resource = scripts.get(key);\n    resource ||\n      ((resource = ownerDocument.querySelector(getScriptSelectorFromKey(key))),\n      resource ||\n        ((src = assign({ src: src, async: !0, type: "module" }, options)),\n        (options = preloadPropsMap.get(key)) &&\n          adoptPreloadPropsForScript(src, options),\n        (resource = ownerDocument.createElement("script")),\n        markNodeAsHoistable(resource),\n        setInitialProperties(resource, "link", src),\n        ownerDocument.head.appendChild(resource)),\n      (resource = {\n        type: "script",\n        instance: resource,\n        count: 1,\n        state: null\n      }),\n      scripts.set(key, resource));\n  }\n}\nfunction getResource(type, currentProps, pendingProps, currentResource) {\n  var JSCompiler_inline_result = (JSCompiler_inline_result =\n    rootInstanceStackCursor.current)\n    ? getHoistableRoot(JSCompiler_inline_result)\n    : null;\n  if (!JSCompiler_inline_result) throw Error(formatProdErrorMessage(446));\n  switch (type) {\n    case "meta":\n    case "title":\n      return null;\n    case "style":\n      return "string" === typeof pendingProps.precedence &&\n        "string" === typeof pendingProps.href\n        ? ((currentProps = getStyleKey(pendingProps.href)),\n          (pendingProps = getResourcesFromRoot(\n            JSCompiler_inline_result\n          ).hoistableStyles),\n          (currentResource = pendingProps.get(currentProps)),\n          currentResource ||\n            ((currentResource = {\n              type: "style",\n              instance: null,\n              count: 0,\n              state: null\n            }),\n            pendingProps.set(currentProps, currentResource)),\n          currentResource)\n        : { type: "void", instance: null, count: 0, state: null };\n    case "link":\n      if (\n        "stylesheet" === pendingProps.rel &&\n        "string" === typeof pendingProps.href &&\n        "string" === typeof pendingProps.precedence\n      ) {\n        type = getStyleKey(pendingProps.href);\n        var styles$244 = getResourcesFromRoot(\n            JSCompiler_inline_result\n          ).hoistableStyles,\n          resource$245 = styles$244.get(type);\n        resource$245 ||\n          ((JSCompiler_inline_result =\n            JSCompiler_inline_result.ownerDocument || JSCompiler_inline_result),\n          (resource$245 = {\n            type: "stylesheet",\n            instance: null,\n            count: 0,\n            state: { loading: 0, preload: null }\n          }),\n          styles$244.set(type, resource$245),\n          (styles$244 = JSCompiler_inline_result.querySelector(\n            getStylesheetSelectorFromKey(type)\n          )) &&\n            !styles$244._p &&\n            ((resource$245.instance = styles$244),\n            (resource$245.state.loading = 5)),\n          preloadPropsMap.has(type) ||\n            ((pendingProps = {\n              rel: "preload",\n              as: "
1style",\n              href: pendingProps.href,\n              crossOrigin: pendingProps.crossOrigin,\n              integrity: pendingProps.integrity,\n              media: pendingProps.media,\n              hrefLang: pendingProps.hrefLang,\n              referrerPolicy: pendingProps.referrerPolicy\n            }),\n            preloadPropsMap.set(type, pendingProps),\n            styles$244 ||\n              preloadStylesheet(\n                JSCompiler_inline_result,\n                type,\n                pendingProps,\n                resource$245.state\n              )));\n        if (currentProps && null === currentResource)\n          throw Error(formatProdErrorMessage(528, ""));\n        return resource$245;\n      }\n      if (currentProps && null !== currentResource)\n        throw Error(formatProdErrorMessage(529, ""));\n      return null;\n    case "script":\n      return (\n        (currentProps = pendingProps.async),\n        (pendingProps = pendingProps.src),\n        "string" === typeof pendingProps &&\n        currentProps &&\n        "function" !== typeof currentProps &&\n        "symbol" !== typeof currentProps\n          ? ((currentProps = getScriptKey(pendingProps)),\n            (pendingProps = getResourcesFromRoot(\n              JSCompiler_inline_result\n            ).hoistableScripts),\n            (currentResource = pendingProps.get(currentProps)),\n            currentResource ||\n              ((currentResource = {\n                type: "script",\n                instance: null,\n                count: 0,\n                state: null\n              }),\n              pendingProps.set(currentProps, currentResource)),\n            currentResource)\n          : { type: "void", instance: null, count: 0, state: null }\n      );\n    default:\n      throw Error(formatProdErrorMessage(444, type));\n  }\n}\nfunction getStyleKey(href) {\n  return \'href="\' + escapeSelectorAttributeValueInsideDoubleQuotes(href) + \'"\';\n}\nfunction getStylesheetSelectorFromKey(key) {\n  return \'link[rel="stylesheet"][\' + key + "]";\n}\nfunction stylesheetPropsFromRawProps(rawProps) {\n  return assign({}, rawProps, {\n    "data-precedence": rawProps.precedence,\n    precedence: null\n  });\n}\nfunction preloadStylesheet(ownerDocument, key, preloadProps, state) {\n  ownerDocument.querySelector(\'link[rel="preload"][as="style"][\' + key + "]")\n    ? (state.loading = 1)\n    : ((key = ownerDocument.createElement("link")),\n      (state.preload = key),\n      key.addEventListener("load", function () {\n        return (state.loading |= 1);\n      }),\n      key.addEventListener("error", function () {\n        return (state.loading |= 2);\n      }),\n      setInitialProperties(key, "link", preloadProps),\n      markNodeAsHoistable(key),\n      ownerDocument.head.appendChild(key));\n}\nfunction getScriptKey(src) {\n  return \'[src="\' + escapeSelectorAttributeValueInsideDoubleQuotes(src) + \'"]\';\n}\nfunction getScriptSelectorFromKey(key) {\n  return "script[async]" + key;\n}\nfunction acquireResource(hoistableRoot, resource, props) {\n  resource.count++;\n  if (null === resource.instance)\n    switch (resource.type) {\n      case "style":\n        var instance = hoistableRoot.querySelector(\n          \'style[data-href~="\' +\n            escapeSelectorAttributeValueInsideDoubleQuotes(props.href) +\n            \'"]\'\n        );\n        if (instance)\n          return (\n            (resource.instance = instance),\n            markNodeAsHoistable(instance),\n            instance\n          );\n        var styleProps = assign({}, props, {\n          "data-href": props.href,\n          "data-precedence": props.precedence,\n          href: null,\n          precedence: null\n        });\n        instance = (hoistableRoot.ownerDocument || hoistableRoot).createElement(\n          "style"\n        );\n        markNodeAsHoistable(instance);\n        setInitialProperties(instance, "style", styleProps);\n        insertStylesheet(instance, props.precedence, hoistableRoot);\n        return (resource.instance = instance);\n      case "stylesheet":\n        styleProps = getStyleKey(props.href);\n        var instance$250 = hoistableRoot.querySelector(\n          getStylesheetSelectorFromKey(styleProps)\n        );\n        if (instance$250)\n          return (\n            (resource.state.loading |= 4),\n            (resource.instance = instance$250),\n            markNodeAsHoistable(instance$250),\n            instance$250\n          );\n        instance = stylesheetPropsFromRawProps(props);\n        (styleProps = preloadPropsMap.get(styleProps)) &&\n          adoptPreloadPropsForStylesheet(instance, styleProps);\n        instance$250 = (\n          hoistableRoot.ownerDocument || hoistableRoot\n        ).createElement("link");\n        markNodeAsHoistable(instance$250);\n        var linkInstance = instance$250;\n        linkInstance._p = new Promise(function (resolve, reject) {\n          linkInstance.onload = resolve;\n          linkInstance.onerror = reject;\n        });\n        setInitialProperties(instance$250, "link", instance);\n        resource.state.loading |= 4;\n        insertStylesheet(instance$250, props.precedence, hoistableRoot);\n        return (resource.instance = instance$250);\n      case "script":\n        instance$250 = getScriptKey(props.src);\n        if (\n          (styleProps = hoistableRoot.querySelector(\n            getScriptSelectorFromKey(instance$250)\n          ))\n        )\n          return (\n            (resource.instance = styleProps),\n            markNodeAsHoistable(styleProps),\n            styleProps\n          );\n        instance = props;\n        if ((styleProps = preloadPropsMap.get(instance$250)))\n          (instance = assign({}, props)),\n            adoptPreloadPropsForScript(instance, styleProps);\n        hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;\n        styleProps = hoistableRoot.createElement("script");\n        markNodeAsHoistable(styleProps);\n        setInitialProperties(styleProps, "link", instance);\n        hoistableRoot.head.appendChild(styleProps);\n        return (resource.instance = styleProps);\n      case "void":\n        return null;\n      default:\n        throw Error(formatProdErrorMessage(443, resource.type));\n    }\n  else\n    "stylesheet" === resource.type &&\n      0 === (resource.state.loading & 4) &&\n      ((instance = resource.instance),\n      (resource.state.loading |= 4),\n      insertStylesheet(instance, props.precedence, hoistableRoot));\n  return resource.instance;\n}\nfunction insertStylesheet(instance, precedence, root) {\n  for (\n    var nodes = root.querySelectorAll(\n        \'link[rel="stylesheet"][data-precedence],style[data-precedence]\'\n      ),\n      last = nodes.length ? nodes[nodes.length - 1] : null,\n      prior = last,\n      i = 0;\n    i < nodes.length;\n    i++\n  ) {\n    var node = nodes[i];\n    if (node.dataset.precedence === precedence) prior = node;\n    else if (prior !== last) break;\n  }\n  prior\n    ? prior.parentNode.insertBefore(instance, prior.nextSibling)\n    : ((precedence = 9 === root.nodeType ? root.head : root),\n      precedence.insertBefore(instance, precedence.firstChild));\n}\nfunction adoptPreloadPropsForStylesheet(stylesheetProps, preloadProps) {\
1n  null == stylesheetProps.crossOrigin &&\n    (stylesheetProps.crossOrigin = preloadProps.crossOrigin);\n  null == stylesheetProps.referrerPolicy &&\n    (stylesheetProps.referrerPolicy = preloadProps.referrerPolicy);\n  null == stylesheetProps.title && (stylesheetProps.title = preloadProps.title);\n}\nfunction adoptPreloadPropsForScript(scriptProps, preloadProps) {\n  null == scriptProps.crossOrigin &&\n    (scriptProps.crossOrigin = preloadProps.crossOrigin);\n  null == scriptProps.referrerPolicy &&\n    (scriptProps.referrerPolicy = preloadProps.referrerPolicy);\n  null == scriptProps.integrity &&\n    (scriptProps.integrity = preloadProps.integrity);\n}\nvar tagCaches = null;\nfunction getHydratableHoistableCache(type, keyAttribute, ownerDocument) {\n  if (null === tagCaches) {\n    var cache = new Map();\n    var caches = (tagCaches = new Map());\n    caches.set(ownerDocument, cache);\n  } else\n    (caches = tagCaches),\n      (cache = caches.get(ownerDocument)),\n      cache || ((cache = new Map()), caches.set(ownerDocument, cache));\n  if (cache.has(type)) return cache;\n  cache.set(type, null);\n  ownerDocument = ownerDocument.getElementsByTagName(type);\n  for (caches = 0; caches < ownerDocument.length; caches++) {\n    var node = ownerDocument[caches];\n    if (\n      !(\n        node[internalHoistableMarker] ||\n        node[internalInstanceKey] ||\n        ("link" === type && "stylesheet" === node.getAttribute("rel"))\n      ) &&\n      "http://www.w3.org/2000/svg" !== no
1de.namespaceURI\n    ) {\n      var nodeKey = node.getAttribute(keyAttribute) || "";\n      nodeKey = type + nodeKey;\n      var existing = cache.get(nodeKey);\n      existing ? existing.push(node) : cache.set(nodeKey, [node]);\n    }\n  }\n  return cache;\n}\nfunction mountHoistable(hoistableRoot, type, instance) {\n  hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;\n  hoistableRoot.head.insertBefore(\n    instance,\n    "title" === type ? hoistableRoot.querySelector("head > title") : null\n  );\n}\nfunction isHostHoistableType(type, props, hostContext) {\n  if (1 === hostContext || null != props.itemProp) return !1;\n  switch (type) {\n    case "meta":\n    case "title":\n      return !0;\n    case "style":\n      if (\n        "string" !== typeof props.precedence ||\n        "string" !== typeof props.href ||\n        "" === props.href\n      )\n        break;\n      return !0;\n    case "link":\n      if (\n        "string" !== typeof props.rel ||\n        "string" !== typeof props.href ||\n        "" === props.href ||\n        props.onLoad ||\n        props.onError\n      )\n        break;\n      switch (props.rel) {\n        case "stylesheet":\n          return (\n            (type = props.disabled),\n            "string" === typeof props.precedence && null == type\n          );\n        default:\n          return !0;\n      }\n    case "script":\n      if (\n        props.async &&\n        "function" !== typeof props.async &&\n        "symbol" !== typeof props.async &&\n        !props.onLoad &&\n        !props.onError &&\n        props.src &&\n        "string" === typeof props.src\n      )\n        return !0;\n  }\n  return !1;\n}\nfunction preloadResource(resource) {\n  return "stylesheet" === resource.type && 0 === (resource.state.loading & 3)\n    ? !1\n    : !0;\n}\nvar suspendedState = null;\nfunction noop() {}\nfunction suspendResource(hoistableRoot, resource, props) {\n  if (null === suspendedState) throw Error(formatProdErrorMessage(475));\n  var state = suspendedState;\n  if (\n    "stylesheet" === resource.type &&\n    ("string" !== typeof props.media ||\n      !1 !== matchMedia(props.media).matches) &&\n    0 === (resource.state.loading & 4)\n  ) {\n    if (null === resource.instance) {\n      var key = getStyleKey(props.href),\n        instance = hoistableRoot.querySelector(\n          getStylesheetSelectorFromKey(key)\n        );\n      if (instance) {\n        hoistableRoot = instance._p;\n        null !== hoistableRoot &&\n          "object" === typeof hoistableRoot &&\n          "function" === typeof hoistableRoot.then &&\n          (state.count++,\n          (state = onUnsuspend.bind(state)),\n          hoistableRoot.then(state, state));\n        resource.state.loading |= 4;\n        resource.instance = instance;\n        markNodeAsHoistable(instance);\n        return;\n      }\n      instance = hoistableRoot.ownerDocument || hoistableRoot;\n      props = stylesheetPropsFromRawProps(props);\n      (key = preloadPropsMap.get(key)) &&\n        adoptPreloadPropsForStylesheet(props, key);\n      instance = instance.createElement("link");\n      markNodeAsHoistable(instance);\n      var linkInstance = instance;\n      linkInstance._p = new Promise(function (resolve, reject) {\n        linkInstance.onload = resolve;\n        linkInstance.onerror = reject;\n      });\n      setInitialProperties(instance, "link", props);\n      resource.instance = instance;\n    }\n    null === state.stylesheets && (state.stylesheets = new Map());\n    state.stylesheets.set(resource, hoistableRoot);\n    (hoistableRoot = resource.state.preload) &&\n      0 === (resource.state.loading & 3) &&\n      (state.count++,\n      (resource = onUnsuspend.bind(state)),\n      hoistableRoot.addEventListener("load", resource),\n      hoistableRoot.addEventListener("error", resource));\n  }\n}\nfunction waitForCommitToBeReady() {\n  if (null === suspendedState) throw Error(formatProdErrorMessage(475));\n  var state = suspendedState;\n  state.stylesheets &&\n    0 === state.count &&\n    insertSuspendedStylesheets(state, state.stylesheets);\n  return 0 < state.count\n    ? function (commit) {\n        var stylesheetTimer = setTimeout(function () {\n          state.stylesheets &&\n            insertSuspendedStylesheets(state, state.stylesheets);
1\n          if (state.unsuspend) {\n            var unsuspend = state.unsuspend;\n            state.unsuspend = null;\n            unsuspend();\n          }\n        }, 6e4);\n        state.unsuspend = commit;\n        return function () {\n          state.unsuspend = null;\n          clearTimeout(stylesheetTimer);\n        };\n      }\n    : null;\n}\nfunction onUnsuspend() {\n  this.count--;\n  if (0 === this.count)\n    if (this.stylesheets) insertSuspendedStylesheets(this, this.stylesheets);\n    else if (this.unsuspend) {\n      var unsuspend = this.unsuspend;\n      this.unsuspend = null;\n      unsuspend();\n    }\n}\nvar precedencesByRoot = null;\nfunction insertSuspendedStylesheets(state, resources) {\n  state.stylesheets = null;\n  null !== state.unsuspend &&\n    (state.count++,\n    (precedencesByRoot = new Map()),\n    resources.forEach(insertStylesheetIntoRoot, state),\n    (precedencesByRoot = null),\n    onUnsuspend.call(state));\n}\nfunction insertStylesheetIntoRoot(root, resource) {\n  if (!(resource.state.loading & 4)) {\n    var precedences = precedencesByRoot.get(root);\n    if (precedences) var last = precedences.get(null);\n    else {\n      precedences = new Map();\n      precedencesByRoot.set(root, precedences);\n      for (\n        var nodes = root.querySelectorAll(\n            "link[data-precedence],style[data-precedence]"\n          ),\n          i = 0;\n        i < nodes.length;\n        i++\n      ) {\n        var node = nodes[i];\n        if (\n          "LINK" === node.nodeName ||\n          "not all" !== node.getAttribute("media")\n        )\n          precedences.set(node.dataset.precedence, node), (last = node);\n      }\n      last && precedences.set(null, last);\n    }\n    nodes = resource.instance;\n    node = nodes.getAttribute("data-precedence");\n    i = precedences.get(node) || last;\n    i === last && precedences.set(null, nodes);\n    precedences.set(node, nodes);\n    this.count++;\n    last = onUnsuspend.bind(this);\n    nodes.addEventListener("load", last);\n    nodes.addEventListener("error", last);\n    i\n      ? i.parentNode.insertBefore(nodes, i.nextSibling)\n      : ((root = 9 === root.nodeType ? root.head : root),\n        root.insertBefore(nodes, root.firstChild));\n    resource.state.loading |= 4;\n  }\n}\nvar HostTransitionContext = {\n  $$typeof: REACT_CONTEXT_TYPE,\n  Provider: null,\n  Consumer: null,\n  _currentValue: sharedNotPendingObject,\n  _currentValue2: sharedNotPendingObject,\n  _threadCount: 0\n};\nfunction FiberRootNode(\n  containerInfo,\n  tag,\n  hydrate,\n  identifierPrefix,\n  onUncaughtError,\n  onCaughtError,\n  onRecoverableError,\n  formState\n) {\n  this.tag = 1;\n  this.containerInfo = containerInfo;\n  this.pingCache = this.current = this.pendingChildren = null;\n  this.timeoutHandle = -1;\n  this.callbackNode =\n    this.next =\n    this.pendingContext =\n    this.context =\n    this.cancelPendingCommit =\n      null;\n  this.callbackPriority = 0;\n  this.expirationTimes = createLaneMap(-1);\n  this.entangledLanes =\n    this.shellSuspendCounter =\n    this.errorRecoveryDisabledLanes =\n    this.expiredLanes =\n    this.warmLanes =\n    this.pingedLanes =\n    this.suspendedLanes =\n    this.pendingLanes =\n      0;\n  this.entanglements = createLaneMap(0);\n  this.hiddenUpdates = createLaneMap(null);\n  this.identifierPrefix = identifierPrefix;\n  this.onUncaughtError = onUncaughtError;\n  this.onCaughtError = onCaughtError;\n  this.onRecoverableError = onRecoverableError;\n  this.pooledCache = null;\n  this.pooledCacheLanes = 0;\n  this.formState = formState;\n  this.incompleteTransitions = new Map();\n}\nfunction createFiberRoot(\n  containerInfo,\n  tag,\n  hydrate,\n  initialChildren,\n  hydrationCallbacks,\n  isStrictMode,\n  identifierPrefix,\n  onUncaughtError,\n  onCaughtError,\n  onRecoverableError,\n  transitionCallbacks,\n  formState\n) {\n  containerInfo = new FiberRootNode(\n    containerInfo,\n    tag,\n    hydrate,\n    identifierPrefix,\n    onUncaughtError,\n    onCaughtError,\n    onRecoverableError,\n    formState\n  );\n  tag = 1;
1\n  !0 === isStrictMode && (tag |= 24);\n  isStrictMode = createFiberImplClass(3, null, null, tag);\n  containerInfo.current = isStrictMode;\n  isStrictMode.stateNode = containerInfo;\n  tag = createCache();\n  tag.refCount++;\n  containerInfo.pooledCache = tag;\n  tag.refCount++;\n  isStrictMode.memoizedState = {\n    element: initialChildren,\n    isDehydrated: hydrate,\n    cache: tag\n  };\n  initializeUpdateQueue(isStrictMode);\n  return containerInfo;\n}\nfunction getContextForSubtree(parentComponent) {\n  if (!parentComponent) return emptyContextObject;\n  parentComponent = emptyContextObject;\n  return parentComponent;\n}\nfunction updateContainerImpl(\n  rootFiber,\n  lane,\n  element,\n  container,\n  parentComponent,\n  callback\n) {\n  parentComponent = getContextForSubtree(parentComponent);\n  null === container.context\n    ? (container.context = parentComponent)\n    : (container.pendingContext = parentComponent);\n  container = createUpdate(lane);\n  container.payload = { element: element };\n  callback = void 0 === callback ? null : callback;\n  null !== callback && (container.callback = callback);\n  element = enqueueUpdate(rootFiber, container, lane);\n  null !== element &&\n    (scheduleUpdateOnFiber(element, rootFiber, lane),\n    entangleTransitions(element, rootFiber, lane));\n}\nfunction markRetryLaneImpl(fiber, retryLane) {\n  fiber = fiber.memoizedState;\n  if (null !== fiber && null !== fiber.dehydrated) {\n    var a = fiber.retryLane;\n    fiber.retryLane = 0 !== a && a < retryLane ? a : retryLane;\n  }\n}\nfunction markRetryLaneIfNotHydrated(fiber, retryLane) {\n  markRetryLaneImpl(fiber, retryLane);\n  (fiber = fiber.alternate) && markRetryLaneImpl(fiber, retryLane);\n}\nfunction attemptContinuousHydration(fiber) {\n  if (13 === fiber.tag) {\n    var root = enqueueConcurrentRenderForLane(fiber, 67108864);\n    null !== root && scheduleUpdateOnFiber(root, fiber, 67108864);\n    markRetryLaneIfNotHydrated(fiber, 67108864);\n  }\n}\nvar _enabled = !0;\nfunction dispatchDiscreteEvent(\n  domEventName,\n  eventSystemFlags,\n  container,\n  nativeEvent\n) {\n  var prevTransition = ReactSharedInternals.T;\n  ReactSharedInternals.T = null;\n  var previousPriority = ReactDOMSharedInternals.p;\n  try {\n    (ReactDOMSharedInternals.p = 2),\n      dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);\n  } finally {\n    (ReactDOMSharedInternals.p = previousPriority),\n      (ReactSharedInternals.T = prevTransition);\n  }\n}\nfunction dispatchContinuousEvent(\n  domEventName,\n  eventSystemFlags,\n  container,\n  nativeEvent\n) {\n  var prevTransition = ReactSharedInternals.T;\n  ReactSharedInternals.T = null;\n  var previousPriority = ReactDOMSharedInternals.p;\n  try {\n    (ReactDOMSharedInternals.p = 8),\n      dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);\n  } finally {\n    (ReactDOMSharedInternals.p = previousPriority),\n      (ReactSharedInternals.T = prevTransition);\n  }\n}\nfunction dispatchEvent(\n  domEventName,\n  eventSystemFlags,\n  targetContainer,\n  nativeEvent\n) {\n  if (_enabled) {\n    var blockedOn = findInstanceBlockingEvent(nativeEvent);\n    if (null === blockedOn)\n      dispatchEventForPluginEventSystem(\n        domEventName,\n        eventSystemFlags,\n        nativeEvent,\n        return_targetInst,\n        targetContainer\n      ),\n        clearIfContinuousEvent(domEventName, nativeEvent);\n    else if (\n      queueIfContinuousEvent(\n        blockedOn,\n        domEventName,\n        eventSystemFlags,\n        targetContainer,\n        nativeEvent\n      )\n    )\n      nativeEvent.stopPropagation();\n    else if (\n      (clearIfContinuousEvent(domEventName, nativeEvent),\n      eventSystemFlags & 4 &&\n        -1 < discreteReplayableEvents.indexOf(domEventName))\n    ) {\n      for (; null !== blockedOn; ) {\n        var fiber = getInstanceFromNode(blockedOn);\n        if (null !== fiber)\n          switch (fiber.tag) {\n            case 3:\n              fiber = fiber.stateNode;\n              if (fiber.current.memoizedState.isDehydrated) {\n                var lanes = getHighestPriorityLanes(fiber.pendingLanes);\n                if (0 !== lanes) {\n                  var root = fiber;\n                  root.pendingLanes |= 2;\n                  for (root.entangledLanes |= 2; lanes; ) {\n                    var lane = 1 << (31 - clz32(lanes));\n                    root.entanglements[1] |= lane;\n                    lanes &= ~lane;\n                  }\n                  ensureRootIsScheduled(fiber);\n                  0 === (executionContext & 6) &&\n                    ((workInProgressRootRenderTargetTime = n
1ow() + 500),\n                    flushSyncWorkAcrossRoots_impl(0, !1));\n                }\n              }\n              break;\n            case 13:\n              (root = enqueueConcurrentRenderForLane(fiber, 2)),\n                null !== root && scheduleUpdateOnFiber(root, fiber, 2),\n                flushSyncWork$1(),\n                markRetryLaneIfNotHydrated(fiber, 2);\n          }\n        fiber = findInstanceBlockingEvent(nativeEvent);\n        null === fiber &&\n          dispatchEventForPluginEventSystem(\n            domEventName,\n            eventSystemFlags,\n            nativeEvent,\n            return_targetInst,\n            targetContainer\n          );\n        if (fiber === blockedOn) break;\n        blockedOn = fiber;\n      }\n      null !== blockedOn && nativeEvent.stopPropagation();\n    } else\n      dispatchEventForPluginEventSystem(\n        domEventName,\n        eventSystemFlags,\n        nativeEvent,\n        null,\n        targetContainer\n      );\n  }\n}\nfunction findInstanceBlockingEvent(nativeEvent) {\n  nativeEvent = getEventTarget(nativeEvent);\n  return findInstanceBlockingTarget(nativeEvent);\n}\nvar return_targetInst = null;\nfunction findInstanceBlockingTarget(targetNode) {\n  return_targetInst = null;\n  targetNode = getClosestInstanceFromNode(targetNode);\n  if (null !== targetNode) {\n    var nearestMounted = getNearestMountedFiber(targetNode);\n    if (null === nearestMounted) targetNode = null;\n    else {\n      var tag = nearestMounted.tag;\n      if (13 === tag) {\n        targetNode = getSuspenseInstanceFromFiber(nearestMounted);\n        if (null !== targetNode) return targetNode;\n        targetNode = null;\n      } else if (3 === tag) {\n        if (nearestMounted.stateNode.current.memoizedState.isDehydrated)\n          return 3 === nearestMounted.tag\n            ? nearestMounted.stateNode.containerInfo\n            : null;\n        targetNode = null;\n      } else nearestMounted !== targetNode && (targetNode = null);\n    }\n  }\n  return_targetInst = targetNode;\n  return null;\n}\nfunction getEventPriority(domEventName) {\n  switch (domEventName) {\n    case "beforetoggle":\n    case "cancel":\n    case "click":\n    case "close":\n    case "contextmenu":\n    case "copy":\n    case "cut":\n    case "auxclick":\n    case "dblclick":\n    case "dragend":\n    case "dragstart":\n    case "drop":\n    case "focusin":\n    case "focusout":\n    case "input":\n    case "invalid":\n    case "keydown":\n    case "keypress":\n    case "keyup":\n    case "mousedown":\n    case "mouseup":\n    case "paste":\n    case "pause":\n    case "play":\n    case "pointercancel":\n    case "pointerdown":\n    case "pointerup":\n    case "ratechange":\n    case "reset":\n    case "resize":\n    case "seeked":\n    case "submit":\n    case "toggle":\n    case "touchcancel":\n    case "touchend":\n    case "touchstart":\n    case "volumechange":\n    case "change":\n    case "selectionchange":\n    case "textInput":\n    case "compositionstart":\n    case "compositionend":\n    case "compositionupdate":\n    case "beforeblur":\n    case "afterblur":\n    case "beforeinput":\n    case "blur":\n    case "fullscreenchange":\n    case "focus":\n    case "hashchange":\n    case "popstate":\n    case "select":\n    case "selectstart":\n      return 2;\n    case "drag":\n    case "dragenter":\n    case "dragexit":\n    case "dragleave":\n    case "dragover":\n    case "mousemove":\n    case "mouseout":\n    case "mouseover":\n    case "pointermove":\n    case "pointerout":\n    case "pointerover":\n    case "scroll":\n    case "touchmove":\n    case "wheel":\n    case "mouseenter":\n    case "mouseleave":\n    case "pointerenter":\n    case "pointerleave":\n      return 8;\n    case "message":\n      switch (getCurrentPriorityLevel()) {\n        case ImmediatePriority:\n          return 2;\n        case UserBlockingPriority:\n          return 8;\n        case NormalPriority$1:\n        case LowPriority:\n          return 32;\n        case IdlePriority:\n          return 268435456;\n        default:\n          return 32;\n      }\n    default:\n      return 32;\n  }\n}\nvar hasScheduledReplayAttempt = !1,\n  queuedFocus = null,\n  queuedDrag = null,\n  queuedMouse = null,\n  queuedPointers = new Map(),\n  queuedPointerCaptures = new Map(),\n  queuedExplicitHydrationTargets = [],\n  discreteReplayableEvents =\n    "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(\n      " "\n    );\nfunction clearIfContinuousEvent(domEventName, nativeEvent) {\n  switch (domEventName) {\n    case "focusin":\n    case "focusout":\n      queuedFocus = null;\n      break;\n    case "dragenter":\n    case "dragleave":\n      queuedDrag = null;\n      break;\n    case "mouseover":\n    case "mouseout":\n      queuedMouse = null;\n      break;\n    case "pointerover":\n    case "pointerout":\n      queuedPointers.delete(nativeEvent.pointerId);\n      break;\n    case "gotpointercapture":\n    case "lostpointercapture":\n      queuedPointerCaptures.delete(nativeEvent.pointerId);\n  }\n}\nfunction accumulateOrCreateContinuousQueuedReplayableEvent(\n  existingQueuedEvent,\n  blockedOn,\n  domEventName,\n  eventSystemFlags,\n  targetContainer,\n  nativeEvent\n) {\n  if (\n    null === existingQueuedEvent ||\n    existingQueuedEvent.nativeEvent !== nativeEvent\n  )\n    return (\n      (existingQueuedEvent = {\n        blockedOn: blockedOn,\n        domEventName: domEventName,\n        eventSystemFlags: eventSystemFlags,\n        nativeEvent: nativeEvent,\n        targetContainers: [targetContainer]\n      }),\n      null !== blockedOn &&\n        ((blockedOn = getInstanceFromNode(blockedOn)),\n        null !== blockedOn && attemptContinuousHydration(blockedOn)),\n      existingQueuedEvent\n    );\n  existingQueuedEvent.eventSystemFlags |= eventSystemFlags;\n  blockedOn = existingQueuedEvent.targetContainers;\n  null !== targetContainer &&\n    -1 === blockedOn.indexOf(targetContainer) &&\n    blockedOn.push(targetContainer);\n  return existingQueuedEvent;\n}\nfunction queueIfContinuousEvent(\n  blockedOn,\n  domEventName,\n  eventSystemFlags,\n  targetContainer,\n  nativeEvent\n) {\n  switch (domEventName) {\n    case "focusin":\n      return (\n        (queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(\n          queuedFocus,\n          blockedOn,\n          domEventName,\n          eventSystemFlags,\n          targetContainer,\n          nativeEvent\n        )),\n        !0\n      );\n    case "dragenter":\n      return (\n        (queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(\n          queuedDrag,\n          blockedOn,\n          domEventName,\n          eventSystemFlags,\n          targetContainer,\n          nativeEvent\n        )),\n        !0\n      );\n    case "mouseover":\n      return (\n        (queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(\n          queuedMouse,\n          blockedOn,\n          domEventName,\n          eventSystemFlags,\n          targetContainer,\n          nativeEvent\n        )),\n        !0\n      );\n    case "pointerover":\n      var pointerId = nativeEvent.pointerId;\n      queuedPointers.set(\n        pointerId,\n        accumulateOrCreateContinuousQueuedReplayableEvent(\n          queuedPointers.get(pointerId) || null,\n          blockedOn,\n          domEventName,\n          eventSystemFlags,\n          targetContainer,\n          nativeEvent\n        )\n      );\n      return !0;\n    case "gotpointercapture":\n      return (\n        (pointerId = nativeEvent.pointerId),\n        queuedPointerCaptures.set(\n          pointerId,\n          accumulateOrCreateContinuousQueuedReplayableEvent(\n            queuedPointerCaptures.get(pointerId) || null,\n            blockedOn,\n            domEventName,\n            eventSystemFlags,\n            targetContainer,\n            nativeEvent\n          )\n        ),\n        !0\n      );\n  }\n  return !1;\n}\nfunction attemptExplicitHydrationTarget(queuedTarget) {\n  var targetInst = getClosestInstanceFromNode(queuedTarget.target);\n  if (null !== targetInst) {\n    var nearestMounted = getNearestMountedFiber(targetInst);\n    if (null !== nearestMounted)\n      if (((targetInst = nearestMounted.tag), 13 === targetInst)) {\n        if (\n          ((targetInst = getSuspenseInstanceFromFiber(nearestMounted)),\n          null !== targetInst)\n        ) {\n          queuedTarget.blockedOn = targetInst;\n          runWithPriority(queuedTarget.priority, function () {\n            if (13 === nearestMounted.tag) {\n              var lane = requestUpdateLane();\n              lane = getBumpedLaneForHydrationByLane(lane);\n              var root = enqueueConcurrentRenderForLane(nearestMounted, lane);\n              null !== root &&\n                scheduleUpdateOnFiber(root, nearestMounted, lane);\n              markRetryLaneIfNotHydrated(nearestMounted, lane);\n            }\n          });\n          return;\n        }\n      } else if (\n        3 === targetInst &&\n        nearestMounted.stateNode.current.memoizedState.isDehydrated\n      ) {\n        queuedTarget.blockedOn =\n          3 === nearestMounted.tag\n            ? nearestMounted.stateNode.containerInfo\n            : null;\n        return;\n      }\n  }\n  queuedTarget.blockedOn = null;\n}\nfunction attemptReplayContinuousQueuedEvent(queuedEvent) {\n  if (null !== queuedEvent.blockedOn) return !1;\n  for (\n    var targetContainers = queuedEvent.targetContainers;\n    0 < targetContainers.length;\n\n  ) {\n    var nextBlockedOn = findInstanceBlockingEvent(queuedEvent.nativeEvent);\n    if (null === nextBlockedOn) {\n      nextBlockedOn = queuedEvent.nativeEvent;\n      var nativeEventClone = new nextBlockedOn.constructor(\n        nextBlockedOn.type,\n        nextBlockedOn\n      );\n      currentReplayingEvent = nativeEventClone;\n      nextBlockedOn.target.dispatchEvent(nativeEventClone);\n      currentReplayingEvent = null;\n    } else\n      return (\n        (targetContainers = getInstanceFromNode(nextBlockedOn)),\n        null !== targetContainers &&\n          attemptContinuousHydration(targetContainers
1),\n        (queuedEvent.blockedOn = nextBlockedOn),\n        !1\n      );\n    targetContainers.shift();\n  }\n  return !0;\n}\nfunction attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {\n  attemptReplayContinuousQueuedEvent(queuedEvent) && map.delete(key);\n}\nfunction replayUnblockedEvents() {\n  hasScheduledReplayAttempt = !1;\n  null !== queuedFocus &&\n    attemptReplayContinuousQueuedEvent(queuedFocus) &&\n    (queuedFocus = null);\n  null !== queuedDrag &&\n    attemptReplayContinuousQueuedEvent(queuedDrag) &&\n    (queuedDrag = null);\n  null !== queuedMouse &&\n    attemptReplayContinuousQueuedEvent(queuedMouse) &&\n    (queuedMouse = null);\n  queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);\n  queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);\n}\nfunction scheduleCallbackIfUnblocked(queuedEvent, unblocked) {\n  queuedEvent.blockedOn === unblocked &&\n    ((queuedEvent.blockedOn = null),\n    hasScheduledReplayAttempt ||\n      ((hasScheduledReplayAttempt = !0),\n      Scheduler.unstable_scheduleCallback(\n        Scheduler.unstable_NormalPriority,\n        replayUnblockedEvents\n      )));\n}\nvar lastScheduledReplayQueue = null;\nfunction scheduleReplayQueueIfNeeded(formReplayingQueue) {\n  lastScheduledReplayQueue !== formReplayingQueue &&\n    ((lastScheduledReplayQueue = formReplayingQueue),\n    Scheduler.unstable_scheduleCallback(\n      Scheduler.unstable_NormalPriority,\n      function () {\n        lastScheduledReplayQueue === formReplayingQueue &&\n          (lastScheduledReplayQueue = null);\n        for (var i = 0; i < formReplayingQueue.length; i += 3) {\n          var form = formReplayingQueue[i],\n            submitterOrAction = formReplayingQueue[i + 1],\n            formData = formReplayingQueue[i + 2];\n          if ("function" !== typeof submitterOrAction)\n            if (null === findInstanceBlockingTarget(submitterOrAction || form))\n              continue;\n            else break;\n          var formInst = getInstanceFromNode(form);\n          null !== formInst &&\n            (formReplayingQueue.splice(i, 3),\n            (i -= 3),\n            startHostTransition(\n              formInst,\n              {\n                pending: !0,\n                data: formData,\n                method: form.method,\n                action: submitterOrAction\n              },\n              submitterOrAction,\n              formData\n            ));\n        }\n      }\n    ));\n}\nfunction retryIfBlockedOn(unblocked) {\n  function unblock(queuedEvent) {\n    return scheduleCallbackIfUnblocked(queuedEvent, unblocked);\n  }\n  null !== queuedFocus && scheduleCallbackIfUnblocked(queuedFocus, unblocked);\n  null !== queuedDrag && scheduleCallbackIfUnblocked(queuedDrag, unblocked);\n  null !== queuedMouse && scheduleCallbackIfUnblocked(queuedMouse, unblocked);\n  queuedPointers.forEach(unblock);\n  queuedPointerCaptures.forEach(unblock);\n  for (var i = 0; i < queuedExplicitHydrationTargets.length; i++) {\n    var queuedTarget = queuedExplicitHydrationTargets[i];\n    queuedTarget.blockedOn === unblocked && (queuedTarget.blockedOn = null);\n  }\n  for (\n    ;\n    0 < queuedExplicitHydrationTargets.length &&\n    ((i = queuedExplicitHydrationTargets[0]), null === i.blockedOn);\n\n  )\n    attemptExplicitHydrationTarget(i),\n      null === i.blockedOn && queuedExplicitHydrationTargets.shift();\n  i = (unblocked.ownerDocument || unblocked).$$reactFormReplay;\n  if (null != i)\n    for (queuedTarget = 0; queuedTarget < i.length; queuedTarget += 3) {\n      var form = i[queuedTarget],\n        submitterOrAction = i[queuedTarget + 1],\n        formProps = form[internalPropsKey] || null;\n      if ("function" === typeof submitterOrAction)\n        formProps || scheduleReplayQueueIfNeeded(i);\n      else if (formProps) {\n        var action = null;\n        if (submitterOrAction && submitterOrAction.hasAttribute("formAction"))\n          if (\n            ((form = submitterOrAction),\n            (formProps = submitterOrAction[internalPropsKey] || null))\n          )\n            action = formProps.formAction;\n          else {\n            if (null !== findInstanceBlockingTarget(form)) continue;\n          }\n        else action = formProps.action;\n        "function" === typeof action\n          ? (i[queuedTarget + 1] = action)\n          : (i.splice(queuedTarget, 3), (queuedTarget -= 3));\n        scheduleReplayQueueIfNeeded(i);\n      }\n    }\n}\nfunction ReactDOMRoot(internalRoot) {\n  this._internalRoot = internalRoot;\n}\nReactDOMHydrationRoot.prototype.render = ReactDOMRoot.prototype.render =\n  function (children) {\n    var root = this._internalRoot;\n    if (null === root) throw Error(formatProdErrorMessage(409));\n    var current = root.current,\n      lane = requestUpdateLane();\n    updateContainerImpl(current, lane, children, root, null, null);\n  };\nReactDOMHydrationRoot.prototype.unmount = ReactDOMRoot.prototype.unmount =\n  function () {\n    var root = this._internalRoot;\n    if (null !== root) {\n      this._internalRoot = null;\n      var container = root.containerInfo;\n      updateContainerImpl(root.current, 2, null, root, null, null);\n      flushSyncWork$1();\n      container[internalContainerInstanceKey] = null;\n    }\n  };\nfunction ReactDOMHydrationRoot(internalRoot) {\n  this._internalRoot = internalRoot;\n}\nReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {\n  if (target) {\n    var updatePriority = resolveUpdatePriority();\n    target = { blockedOn: null, target: target, priority: updatePriority };\n    for (\n      var i = 0;\n      i < queuedExplicitHydrationTargets.length &&\n      0 !== updatePriority &&\n      updatePriority < queuedExplicitHydrationTargets[i].priority;\n      i++\n    );\n    queuedExplicitHydrationTargets.splice(i, 0, target);\n    0 === i && attemptExplicitHydrationTarget(target);\n  }\n};\nvar isomorphicReactPackageVersion$jscomp$inline_1785 = React.ver
1sion;\nif (\n  "19.1.0" !==\n  isomorphicReactPackageVersion$jscomp$inline_1785\n)\n  throw Error(\n    formatProdErrorMessage(\n      527,\n      isomorphicReactPackageVersion$jscomp$inline_1785,\n      "19.1.0"\n    )\n  );\nReactDOMSharedInternals.findDOMNode = function (componentOrElement) {\n  var fiber = componentOrElement._reactInternals;\n  if (void 0 === fiber) {\n    if ("function" === typeof componentOrElement.render)\n      throw Error(formatProdErrorMessage(188));\n    componentOrElement = Object.keys(componentOrElement).join(",");\n    throw Error(formatProdErrorMessage(268, componentOrElement));\n  }\n  componentOrElement = findCurrentFiberUsingSlowPath(fiber);\n  componentOrElement =\n    null !== componentOrElement\n      ? findCurrentHostFiberImpl(componentOrElement)\n      : null;\n  componentOrElement =\n    null === componentOrElement ? null : componentOrElement.stateNode;\n  return componentOrElement;\n};\nvar internals$jscomp$inline_2256 = {\n  bundleType: 0,\n  version: "19.1.0",\n  rendererPackageName: "react-dom",\n  currentDispatcherRef: ReactSharedInternals,\n  reconcilerVersion: "19.1.0"\n};\nif ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {\n  var hook$jscomp$inline_2257 = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n  if (\n    !hook$jscomp$inline_2257.isDisabled &&\n    hook$jscomp$inline_2257.supportsFiber\n  )\n    try {\n      (rendererID = hook$jscomp$inline_2257.inject(\n        internals$jscomp$inline_2256\n      )),\n        (injectedHook = hook$jscomp$inline_2257);\n    } catch (err) {}\n}\nexports.createRoot = function (container, options) {\n  if (!isValidContainer(container)) throw Error(formatProdErrorMessage(299));\n  var isStrictMode = !1,\n    identifierPrefix = "",\n    onUncaughtError = defaultOnUncaughtError,\n    onCaughtError = defaultOnCaughtError,\n    onRecoverableError = defaultOnRecoverableError,\n    transitionCallbacks = null;\n  null !== options &&\n    void 0 !== options &&\n    (!0 === options.unstable_strictMode && (isStrictMode = !0),\n    void 0 !== options.identifierPrefix &&\n      (identifierPrefix = options.identifierPrefix),\n    void 0 !== options.onUncaughtError &&\n      (onUncaughtError = options.onUncaughtError),\n    void 0 !== options.onCaughtError && (onCaughtError = options.onCaughtError),\n    void 0 !== options.onRecoverableError &&\n      (onRecoverableError = options.onRecoverableError),\n    void 0 !== options.unstable_transitionCallbacks &&\n      (transitionCallbacks = options.unstable_transitionCallbacks));\n  options = createFiberRoot(\n    container,\n    1,\n    !1,\n    null,\n    null,\n    isStrictMode,\n    identifierPrefix,\n    onUncaughtError,\n    onCaughtError,\n    onRecoverableError,\n    transitionCallbacks,\n    null\n  );\n  container[internalContainerInstanceKey] = options.current;\n  listenToAllSupportedEvents(container);\n  return new ReactDOMRoot(options);\n};\nexports.hydrateRoot = function (container, initialChildren, options) {\n  if (!isValidContainer(container)) throw Error(formatProdErrorMessage(299));\n  var isStrictMode = !1,\n    identifierPrefix = "",\n    onUncaughtError = defaultOnUncaughtError,\n    onCaughtError = defaultOnCaughtError,\n    onRecoverableError = defaultOnRecoverableError,\n    transitionCallbacks = null,\n    formState = null;\n  null !== options &&\n    void 0 !== options &&\n    (!0 === options.unstable_strictMode && (isStrictMode = !0),\n    void 0 !== options.identifierPrefix &&\n      (identifierPrefix = options.identifierPrefix),\n    void 0 !== options.onUncaughtError &&\n      (onUncaughtError = options.onUncaughtError),\n    void 0 !== options.onCaughtError && (onCaughtError = options.onCaughtError),\n    void 0 !== options.onRecoverableError &&\n      (onRecoverableError = options.onRecoverableError),\n    void 0 !== options.unstable_transitionCallbacks &&\n      (transitionCallbacks = options.unstable_transitionCallbacks),\n    void 0 !== options.formState && (formState = options.formState));\n  initialChildren = createFiberRoot(\n    container,\n    1,\n    !0,\n    initialChildren,\n    null != options ? options : null,\n    isStrictMode,\n    identifierPrefix,\n    onUncaughtError,\n    onCaughtError,\n    onRecoverableError,\n    transitionCallbacks,\n    formState\n  );\n  initialChildren.context = getContextForSubtree(null);\n  options = initialChildren.current;\n  isStrictMode = requestUpdateLane();\n  isStrictMode = getBumpedLaneForHydrationByLane(isStrictMode);\n  identifierPrefix = createUpdate(isStrictMode);\n  identifierPrefix.callback = null;\n  enqueueUpdate(options, identifierPrefix, isStrictMode);\n  options = isStrictMode;\n  initialChildren.current.lanes = options;\n  markRootUpdated$1(initialChildren, options);\n  ensureRootIsScheduled(initialChildren);\n  container[internalContainerInstanceKey] = initialChildren.current;\n  listenToAllSupportedEvents(container);\n  return new ReactDOMHydrationRoot(initialChildren);\n};\nexports.version = "19.1.0";\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI3OS5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNhO0FBQ2IsZ0JBQWdCLG1CQUFPLENBQUMsSUFBVztBQUNuQyxVQUFVLG1CQUFPLENBQUMsSUFBTztBQUN6QixhQUFhLG1CQUFPLENBQUMsSUFBVztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixhQUFhO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxTQUFTO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsU0FBUztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsU0FBUztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLD
1BCQUEwQixlQUFlO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVE7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxvQkFBb0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFlBQVk7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHlEQUF5RDtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtB
1QUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0Esd0JBQXdCLHlCQUF5QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0Isa0JBQWtCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixlQUFlO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtB
1QUs7QUFDTCwyQkFBMkI7QUFDM0I7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsOEJBQThCLG9CQUFvQixvQkFBb0I7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGdDQUFnQyx5QkFBeUIsaUJBQWlCO0FBQzFFO0FBQ0EsaUNBQWlDLHNCQUFzQixrQkFBa0I7QUFDekU7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx1Q0FBdUMsb0JBQW9CLFNBQVM7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixxQ0FBcUM7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyx5QkFBeUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixNQUFNO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtEQUFrRDtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixvQ0FBb0M7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEd
1BQUc7QUFDSCx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsaUJBQWlCO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsaUJBQWlCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxxQ0FBcUM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHdDQUF3QztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsK0JBQStCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLHNCQUFzQjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxpQkFBaUI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGdCQUFnQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixlQUFlO0FBQy9CO0FBQ0E7QUFDQSx3QkFBd0IscUJBQXFCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLDhCQUE4QixvQkFBb0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
1BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHNCQUFzQjtBQUM1QyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBCQUEwQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGdEQUFnRDtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNENBQTRDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBLHNDQUFzQyxvQkFBb0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QU
1FDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxRQUFRLG9CQUFvQixxQ0FBcUM7QUFDakU7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtB
1QUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxtQkFBbUI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIseUNBQXlDO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyw0QkFBNEI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyw0QkFBNEI7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLDZCQUE2QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyw0QkFBNEI7QU
1FDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsNEJBQTRCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixlQUFlO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDViw4QkFBOEIsT0FBTztBQUNyQyxnQ0FBZ0MsT0FBTztBQUN2QztBQUNBLFVBQVUsT0FBTztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxpQ0FBaUM7QUFDeEUsSUFBSTtBQUNKO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxjQUFjO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxjQUFjO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHVC
1QUF1QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLCtCQUErQjtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksd0NBQXdDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLCtDQUErQztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qiw2Q0FBNkM7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLF
1dBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLDRDQUE0QztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGtCQUFrQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwQkFBMEI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0Isc0JBQXNCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msc0JBQXNCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLDBCQUEwQjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxhQUFhO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw2Q0FBNkM7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLG1DQUFtQztBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsdUJBQXVCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLG9CQUFvQjtB
1QUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsb0JBQW9CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGlCQUFpQjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBELGlCQUFpQjtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLGVBQWU7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix1QkFBdUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxrQkFBa0I7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELHNCQUFzQjtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
1FDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osV0FBVyx3QkFBd0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQsVUFBVTtBQUNWO0FBQ0EsMkNBQTJDO0FBQzNDLElBQUk7QUFDSiwyQkFBMkI7QUFDM0I7QUFDQSxnQ0FBZ0MscUJBQXFCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQkFBcUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixpQkFBaUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QU
1FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxzQkFBc0I7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyx1QkFBdUI7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHVCQUF1QjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsdUJBQXVCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxzQkFBc0I7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxzQkFBc0I7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msc0JBQXNCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msc0JBQXNCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLD
1BDQUEwQyxzQkFBc0I7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msc0JBQXNCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLHNCQUFzQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLHNCQUFzQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsc0JBQXNCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isc0JBQXNCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxzQkFBc0I7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxxQkFBcUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxxQkFBcUI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw4Q0FBOEM7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixnQkFBZ0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx1QkFBdUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFdBQVc7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVywwQkFBMEI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
1BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMseUJBQXlCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUywyQ0FBMkM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLF
1dBQVcsaUNBQWlDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLG1CQUFtQjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsa0JBQWtCO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9CQUFvQjtB
1QUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw2Q0FBNkM7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtDQUFrQztBQUN6RDtBQUNBLHVCQUF1QixrQ0FBa0M7QUFDekQ7QUFDQTtBQUNBLHVCQUF1QixZQUFZO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw4Q0FBOEM7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsb0NBQW9DO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGlDQUFpQztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
1FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxVQUFVO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyx5QkFBeUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHlCQUF5QjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxjQUFjO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsZ0JBQWdCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsbUJBQW1CO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdEQUFnRDtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQ0FBa0M7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw4REFBOEQ7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIscUJBQXFCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIscUNBQXFDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQk
1FBbUIsK0JBQStCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtB
1QUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0JBQW9CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELE9BQU87QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLCtCQUErQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsMkNBQTJDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIseUJBQXlCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS1jbGllbnQucHJvZHVjdGlvbi5qcz80NDdlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWRvbS1jbGllbnQucHJvZHVjdGlvbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLypcbiBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiovXG5cInVzZSBzdHJpY3RcIjtcbnZhciBTY2hlZHVsZXIgPSByZXF1aXJlKFwic2NoZWR1bGVyXCIpLFxuICBSZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKSxcbiAgUmVhY3RET00gPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuZnVuY3Rpb24gZm9ybWF0UHJvZEVycm9yTWVzc2FnZShjb2RlKSB7XG4gIHZhciB1cmwgPSBcImh0dHBzOi8vcmVhY3QuZGV2L2Vycm9ycy9cIiArIGNvZGU7XG4gIGlmICgxIDwgYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHVybCArPSBcIj9hcmdzW109XCIgKyBlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzWzFdKTtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIHVybCArPSBcIiZhcmdzW109XCIgKyBlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2ldKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIFwiTWluaWZpZWQgUmVhY3QgZXJyb3IgI1wiICtcbiAgICBjb2RlICtcbiAgICBcIjsgdmlzaXQgXCIgK1xuICAgIHVybCArXG4gICAgXCIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLlwiXG4gICk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpIHtcbiAgcmV0dXJuICEoXG4gICAgIW5vZGUgfHxcbiAgICAoMSAhPT0gbm9kZS5ub2RlVHlwZSAmJiA5ICE9PSBub2RlLm5vZGVUeXBlICYmIDExICE9PSBub2RlLm5vZGVUeXBlKVxuICApO1xufVxuZnVuY3Rpb24gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikge1xuICB2YXIgbm9kZSA9IGZpYmVyLFxuICAgIG5lYXJlc3RNb3VudGVkID0gZmliZXI7XG4gIGlmIChmaWJlci5hbHRlcm5hdGUpIGZvciAoOyBub2RlLnJldHVybjsgKSBub2RlID0gbm9kZS5yZXR1cm47XG4gIGVsc2Uge1xuICAgIGZpYmVyID0gbm9kZTtcbiAgICBkb1xuICAgICAgKG5vZGUgPSBmaWJlciksXG4gICAgICAgIDAgIT09IChub2RlLmZsYWdzICYgNDA5OCkgJiYgKG5lYXJlc3RNb3VudGVkID0gbm9kZS5yZXR1cm4pLFxuICAgICAgICAoZmliZXIgPSBub2RlLnJldHVybik7XG4gICAgd2hpbGUgKGZpYmVyKTtcbiAgfVxuICByZXR1cm4gMyA9PT0gbm9kZS50YWcgPyBuZWFyZXN0TW91bnRlZCA6IG51bGw7XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKGZpYmVyKSB7XG4gIGlmICgxMyA9PT0gZmliZXIudGFnKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICAgIG51bGwgPT09IHN1c3BlbnNlU3RhdGUgJiZcbiAgICAgICgoZmliZXIgPSBmaWJlci5hbHRlcm5hdGUpLFxuICAgICAgbnVsbCAhPT0gZmliZXIgJiYgKHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlKSk7XG4gICAgaWYgKG51bGwgIT09IHN1c3BlbnNlU3RhdGUpIHJldHVybi
1BzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBhc3NlcnRJc01vdW50ZWQoZmliZXIpIHtcbiAgaWYgKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpICE9PSBmaWJlcilcbiAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE4OCkpO1xufVxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgaWYgKCFhbHRlcm5hdGUpIHtcbiAgICBhbHRlcm5hdGUgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcbiAgICBpZiAobnVsbCA9PT0gYWx0ZXJuYXRlKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE4OCkpO1xuICAgIHJldHVybiBhbHRlcm5hdGUgIT09IGZpYmVyID8gbnVsbCA6IGZpYmVyO1xuICB9XG4gIGZvciAodmFyIGEgPSBmaWJlciwgYiA9IGFsdGVybmF0ZTsgOyApIHtcbiAgICB2YXIgcGFyZW50QSA9IGEucmV0dXJuO1xuICAgIGlmIChudWxsID09PSBwYXJlbnRBKSBicmVhaztcbiAgICB2YXIgcGFyZW50QiA9IHBhcmVudEEuYWx0ZXJuYXRlO1xuICAgIGlmIChudWxsID09PSBwYXJlbnRCKSB7XG4gICAgICBiID0gcGFyZW50QS5yZXR1cm47XG4gICAgICBpZiAobnVsbCAhPT0gYikge1xuICAgICAgICBhID0gYjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIGZvciAocGFyZW50QiA9IHBhcmVudEEuY2hpbGQ7IHBhcmVudEI7ICkge1xuICAgICAgICBpZiAocGFyZW50QiA9PT0gYSkgcmV0dXJuIGFzc2VydElzTW91bnRlZChwYXJlbnRBKSwgZmliZXI7XG4gICAgICAgIGlmIChwYXJlbnRCID09PSBiKSByZXR1cm4gYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpLCBhbHRlcm5hdGU7XG4gICAgICAgIHBhcmVudEIgPSBwYXJlbnRCLnNpYmxpbmc7XG4gICAgICB9XG4gICAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE4OCkpO1xuICAgIH1cbiAgICBpZiAoYS5yZXR1cm4gIT09IGIucmV0dXJuKSAoYSA9IHBhcmVudEEpLCAoYiA9IHBhcmVudEIpO1xuICAgIGVsc2Uge1xuICAgICAgZm9yICh2YXIgZGlkRmluZENoaWxkID0gITEsIGNoaWxkJDAgPSBwYXJlbnRBLmNoaWxkOyBjaGlsZCQwOyApIHtcbiAgICAgICAgaWYgKGNoaWxkJDAgPT09IGEpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSAhMDtcbiAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGQkMCA9PT0gYikge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9ICEwO1xuICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkJDAgPSBjaGlsZCQwLnNpYmxpbmc7XG4gICAgICB9XG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICBmb3IgKGNoaWxkJDAgPSBwYXJlbnRCLmNoaWxkOyBjaGlsZCQwOyApIHtcbiAgICAgICAgICBpZiAoY2hpbGQkMCA9PT0gYSkge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gITA7XG4gICAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGlsZCQwID09PSBiKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSAhMDtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2hpbGQkMCA9IGNoaWxkJDAuc2libGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRpZEZpbmRDaGlsZCkgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxODkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGEuYWx0ZXJuYXRlICE9PSBiKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE5MCkpO1xuICB9XG4gIGlmICgzICE9PSBhLnRhZykgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxODgpKTtcbiAgcmV0dXJuIGEuc3RhdGVOb2RlLmN1cnJlbnQgPT09IGEgPyBmaWJlciA6IGFsdGVybmF0ZTtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgaWYgKDUgPT09IHRhZyB8fCAyNiA9PT0gdGFnIHx8IDI3ID09PSB0YWcgfHwgNiA9PT0gdGFnKSByZXR1cm4gbm9kZTtcbiAgZm9yIChub2RlID0gbm9kZS5jaGlsZDsgbnVsbCAhPT0gbm9kZTsgKSB7XG4gICAgdGFnID0gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKG5vZGUpO1xuICAgIGlmIChudWxsICE9PSB0YWcpIHJldHVybiB0YWc7XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduLFxuICBSRUFDVF9MRUdBQ1lfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIiksXG4gIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC50cmFuc2l0aW9uYWwuZWxlbWVudFwiKSxcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLFxuICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLFxuICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpLFxuICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLFxuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpLFxuICBSRUFDVF9DT05TVU1FUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnN1bWVyXCIpLFxuICBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYW
1N0LnN1c3BlbnNlX2xpc3RcIiksXG4gIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpLFxuICBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKTtcblN5bWJvbC5mb3IoXCJyZWFjdC5zY29wZVwiKTtcbnZhciBSRUFDVF9BQ1RJVklUWV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmFjdGl2aXR5XCIpO1xuU3ltYm9sLmZvcihcInJlYWN0LmxlZ2FjeV9oaWRkZW5cIik7XG5TeW1ib2wuZm9yKFwicmVhY3QudHJhY2luZ19tYXJrZXJcIik7XG52YXIgUkVBQ1RfTUVNT19DQUNIRV9TRU5USU5FTCA9IFN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vX2NhY2hlX3NlbnRpbmVsXCIpO1xuU3ltYm9sLmZvcihcInJlYWN0LnZpZXdfdHJhbnNpdGlvblwiKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG51bGwgPT09IG1heWJlSXRlcmFibGUgfHwgXCJvYmplY3RcIiAhPT0gdHlwZW9mIG1heWJlSXRlcmFibGUpIHJldHVybiBudWxsO1xuICBtYXliZUl0ZXJhYmxlID1cbiAgICAoTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSkgfHxcbiAgICBtYXliZUl0ZXJhYmxlW1wiQEBpdGVyYXRvclwiXTtcbiAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG1heWJlSXRlcmFibGUgPyBtYXliZUl0ZXJhYmxlIDogbnVsbDtcbn1cbnZhciBSRUFDVF9DTElFTlRfUkVGRVJFTkNFID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIik7XG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAobnVsbCA9PSB0eXBlKSByZXR1cm4gbnVsbDtcbiAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGUpXG4gICAgcmV0dXJuIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0VcbiAgICAgID8gbnVsbFxuICAgICAgOiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHR5cGUpIHJldHVybiB0eXBlO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gXCJGcmFnbWVudFwiO1xuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiBcIlByb2ZpbGVyXCI7XG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuIFwiU3RyaWN0TW9kZVwiO1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiBcIlN1c3BlbnNlXCI7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gXCJTdXNwZW5zZUxpc3RcIjtcbiAgICBjYXNlIFJFQUNUX0FDVElWSVRZX1RZUEU6XG4gICAgICByZXR1cm4gXCJBY3Rpdml0eVwiO1xuICB9XG4gIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSlcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiBcIlBvcnRhbFwiO1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHJldHVybiAodHlwZS5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Qcm92aWRlclwiO1xuICAgICAgY2FzZSBSRUFDVF9DT05TVU1FUl9UWVBFOlxuICAgICAgICByZXR1cm4gKHR5cGUuX2NvbnRleHQuZGlzcGxheU5hbWUgfHwgXCJDb250ZXh0XCIpICsgXCIuQ29uc3VtZXJcIjtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgdmFyIGlubmVyVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICB0eXBlID0gdHlwZS5kaXNwbGF5TmFtZTtcbiAgICAgICAgdHlwZSB8fFxuICAgICAgICAgICgodHlwZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCBcIlwiKSxcbiAgICAgICAgICAodHlwZSA9IFwiXCIgIT09IHR5cGUgPyBcIkZvcndhcmRSZWYoXCIgKyB0eXBlICsgXCIpXCIgOiBcIkZvcndhcmRSZWZcIikpO1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChpbm5lclR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGwpLFxuICAgICAgICAgIG51bGwgIT09IGlubmVyVHlwZVxuICAgICAgICAgICAgPyBpbm5lclR5cGVcbiAgICAgICAgICAgIDogZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgXCJNZW1vXCJcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICBpbm5lclR5cGUgPSB0eXBlLl9wYXlsb2FkO1xuICAgICAgICB0eXBlID0gdHlwZS5faW5pdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUoaW5uZXJUeXBlKSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgfVxuICByZXR1cm4gbnVsbDtcbn1cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXksXG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzID1cbiAgICBSZWFjdC5fX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUsXG4gIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzID1cbiAgICBSZWFjdERPTS5fX0RPTV9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUsXG4gIHNoYXJlZE5vdFBlbmRpbmdPYmplY3QgPSB7XG4gICAgcGVuZGluZzogITEsXG4gICAgZGF0YTogbnVsbCxcbiAgICBtZXRob2Q6IG51bGwsXG4gICAgYWN0aW9uOiBudWxsXG4gIH0sXG4gIHZhbHVlU3RhY2sgPSBbXSxcbiAgaW5kZXggPSAtMTtcbmZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZh
1dWx0VmFsdWUpIHtcbiAgcmV0dXJuIHsgY3VycmVudDogZGVmYXVsdFZhbHVlIH07XG59XG5mdW5jdGlvbiBwb3AoY3Vyc29yKSB7XG4gIDAgPiBpbmRleCB8fFxuICAgICgoY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZVN0YWNrW2luZGV4XSksICh2YWx1ZVN0YWNrW2luZGV4XSA9IG51bGwpLCBpbmRleC0tKTtcbn1cbmZ1bmN0aW9uIHB1c2goY3Vyc29yLCB2YWx1ZSkge1xuICBpbmRleCsrO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IGN1cnNvci5jdXJyZW50O1xuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlO1xufVxudmFyIGNvbnRleHRTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKSxcbiAgY29udGV4dEZpYmVyU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCksXG4gIHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpLFxuICBob3N0VHJhbnNpdGlvblByb3ZpZGVyQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpO1xuZnVuY3Rpb24gcHVzaEhvc3RDb250YWluZXIoZmliZXIsIG5leHRSb290SW5zdGFuY2UpIHtcbiAgcHVzaChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgbmV4dFJvb3RJbnN0YW5jZSk7XG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG51bGwpO1xuICBzd2l0Y2ggKG5leHRSb290SW5zdGFuY2Uubm9kZVR5cGUpIHtcbiAgICBjYXNlIDk6XG4gICAgY2FzZSAxMTpcbiAgICAgIGZpYmVyID0gKGZpYmVyID0gbmV4dFJvb3RJbnN0YW5jZS5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgID8gKGZpYmVyID0gZmliZXIubmFtZXNwYWNlVVJJKVxuICAgICAgICAgID8gZ2V0T3duSG9zdENvbnRleHQoZmliZXIpXG4gICAgICAgICAgOiAwXG4gICAgICAgIDogMDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoXG4gICAgICAgICgoZmliZXIgPSBuZXh0Um9vdEluc3RhbmNlLnRhZ05hbWUpLFxuICAgICAgICAobmV4dFJvb3RJbnN0YW5jZSA9IG5leHRSb290SW5zdGFuY2UubmFtZXNwYWNlVVJJKSlcbiAgICAgIClcbiAgICAgICAgKG5leHRSb290SW5zdGFuY2UgPSBnZXRPd25Ib3N0Q29udGV4dChuZXh0Um9vdEluc3RhbmNlKSksXG4gICAgICAgICAgKGZpYmVyID0gZ2V0Q2hpbGRIb3N0Q29udGV4dFByb2QobmV4dFJvb3RJbnN0YW5jZSwgZmliZXIpKTtcbiAgICAgIGVsc2VcbiAgICAgICAgc3dpdGNoIChmaWJlcikge1xuICAgICAgICAgIGNhc2UgXCJzdmdcIjpcbiAgICAgICAgICAgIGZpYmVyID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJtYXRoXCI6XG4gICAgICAgICAgICBmaWJlciA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZmliZXIgPSAwO1xuICAgICAgICB9XG4gIH1cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5mdW5jdGlvbiBwb3BIb3N0Q29udGFpbmVyKCkge1xuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yKTtcbiAgcG9wKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yKTtcbn1cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGV4dChmaWJlcikge1xuICBudWxsICE9PSBmaWJlci5tZW1vaXplZFN0YXRlICYmIHB1c2goaG9zdFRyYW5zaXRpb25Qcm92aWRlckN1cnNvciwgZmliZXIpO1xuICB2YXIgY29udGV4dCA9IGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gZ2V0Q2hpbGRIb3N0Q29udGV4dFByb2QoY29udGV4dCwgZmliZXIudHlwZSk7XG4gIGNvbnRleHQgIT09IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCAmJlxuICAgIChwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciksXG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCkpO1xufVxuZnVuY3Rpb24gcG9wSG9zdENvbnRleHQoZmliZXIpIHtcbiAgY29udGV4dEZpYmVyU3RhY2tDdXJzb3IuY3VycmVudCA9PT0gZmliZXIgJiZcbiAgICAocG9wKGNvbnRleHRTdGFja0N1cnNvciksIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvcikpO1xuICBob3N0VHJhbnNpdGlvblByb3ZpZGVyQ3Vyc29yLmN1cnJlbnQgPT09IGZpYmVyICYmXG4gICAgKHBvcChob3N0VHJhbnNpdGlvblByb3ZpZGVyQ3Vyc29yKSxcbiAgICAoSG9zdFRyYW5zaXRpb25Db250ZXh0Ll9jdXJyZW50VmFsdWUgPSBzaGFyZWROb3RQZW5kaW5nT2JqZWN0KSk7XG59XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuICBzY2hlZHVsZUNhbGxiYWNrJDMgPSBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayxcbiAgY2FuY2VsQ2FsbGJhY2skMSA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxcbiAgc2hvdWxkWWllbGQgPSBTY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQsXG4gIHJlcXVlc3RQYWludCA9IFNjaGVkdWxlci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsXG4gIG5vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3csXG4gIGdldEN1cnJlbnRQcmlvcml0eUxldmVsID0gU2NoZWR1bGVyLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLFxuICBJbW1lZGlhdGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxcbiAgVXNlckJsb2NraW5nUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksXG4gIE5vcm1hbFByaW9yaXR5JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksXG4gIExvd1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5LFxuICBJZGxlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5LFxuICBsb2ckMSA9IFNjaGVkdWxlci5sb2csXG4gIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlLFxuICByZW5kZXJlcklEID0gbnVsbCxcbiAgaW5qZWN0ZWRIb29rID0gbnVsbDtcbmZ1bmN0aW9uIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKG5ld0lzU3RyaWN0TW9kZSkge1xuICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBsb2ckMSAmJiB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZShuZXdJc1N0cmljdE1vZGUpO1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlKVxuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZShyZW5kZXJlcklELCBuZXdJc1N0cmljdE1vZGUpO1xuICAgIH0gY2F0Y2ggKGVycikge31cbn1cbnZhciBjbHozMiA9IE1hdGguY2x6MzIgPyBNYXRoLmNsejMyIDogY2x6MzJGYWxsYmFjayxcbiAgbG9nID0gTWF0aC5sb2csXG4gIExOMiA9IE1hdGguTE4yO1xuZnVuY3Rpb24gY2x6MzJGYWxsYmFjayh4KSB7XG4gIHggPj4+PSAwO1xuICByZXR1cm4gMCA9PT0geCA/IDMyIDogKDMxIC0gKChsb2coeCkgLyBMTjIpIHwgMCkpIHwgMDtcbn1cbnZhciBuZXh0VHJhbnNpdGlvbkxhbmUgPSAyNTYsXG4gIG5leHRSZXRyeUxhbmUgPSA0MTk0MzA0O1xuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobGFuZXMpIHtcbiAgdmFyIHBlbmRpbmdTeW5jTGFuZXMgPSBsYW5lcyAmIDQyO1xuICBpZiAoMCAhPT0gcGVuZGluZ1N5bmNMYW5lcykgcmV0dXJuIHBlbmRpbmdTeW5jTGFuZXM7XG4gIHN3aXRjaCAobGFuZXMgJiAtbGFuZXMpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gMTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gMjtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gNDtcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gODtcbiAgICBjYXNlIDE2OlxuICAgICAgcmV0dXJuIDE2O1xuICAgIGNhc2UgMzI6XG4gICAgICByZXR1cm4gMzI7XG4gICAgY2FzZSA2NDpcbiAgICAgIHJldHVybiA2NDtcbiAgICBjYXNlIDEyODpcbiAgICAgIHJldHVybiAxMjg7XG4gICAgY2FzZSAyNTY6XG4gICAgY2FzZSA1MTI6XG4gICAgY2FzZSAxMDI0OlxuICAgIGNhc2UgMjA0ODpcbiAgICBjYXNlIDQwOTY6XG4gICAgY2FzZSA4MTkyOlxuICAgIGNhc2UgMTYzODQ6XG4gICAgY2FzZSAzMjc2ODpcbiAgICBjYXNlIDY1NTM2OlxuICAgIGNhc2UgMTMxMDcyOlxuICAgIGNhc2UgMjYyMTQ0OlxuICAgIGNhc2UgNTI0Mjg4OlxuICAgIGNhc2UgMTA0ODU3NjpcbiAgICBjYXNlIDIwOTcxNTI6XG4gICAgICByZXR1cm4gbGFuZXMgJiA0MTk0MDQ4O1xuICAgIGNhc2UgNDE5NDMwNDpcbiAgICBjYXNlIDgzODg2MDg6XG4gICAgY2FzZSAxNjc3NzIxNjpcbiAgICBjYXNlIDMzNT
1U0NDMyOlxuICAgICAgcmV0dXJuIGxhbmVzICYgNjI5MTQ1NjA7XG4gICAgY2FzZSA2NzEwODg2NDpcbiAgICAgIHJldHVybiA2NzEwODg2NDtcbiAgICBjYXNlIDEzNDIxNzcyODpcbiAgICAgIHJldHVybiAxMzQyMTc3Mjg7XG4gICAgY2FzZSAyNjg0MzU0NTY6XG4gICAgICByZXR1cm4gMjY4NDM1NDU2O1xuICAgIGNhc2UgNTM2ODcwOTEyOlxuICAgICAgcmV0dXJuIDUzNjg3MDkxMjtcbiAgICBjYXNlIDEwNzM3NDE4MjQ6XG4gICAgICByZXR1cm4gMDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGxhbmVzO1xuICB9XG59XG5mdW5jdGlvbiBnZXROZXh0TGFuZXMocm9vdCwgd2lwTGFuZXMsIHJvb3RIYXNQZW5kaW5nQ29tbWl0KSB7XG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgaWYgKDAgPT09IHBlbmRpbmdMYW5lcykgcmV0dXJuIDA7XG4gIHZhciBuZXh0TGFuZXMgPSAwLFxuICAgIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcyxcbiAgICBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7XG4gIHJvb3QgPSByb290Lndhcm1MYW5lcztcbiAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiAxMzQyMTc3Mjc7XG4gIDAgIT09IG5vbklkbGVQZW5kaW5nTGFuZXNcbiAgICA/ICgocGVuZGluZ0xhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcyksXG4gICAgICAwICE9PSBwZW5kaW5nTGFuZXNcbiAgICAgICAgPyAobmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGVuZGluZ0xhbmVzKSlcbiAgICAgICAgOiAoKHBpbmdlZExhbmVzICY9IG5vbklkbGVQZW5kaW5nTGFuZXMpLFxuICAgICAgICAgIDAgIT09IHBpbmdlZExhbmVzXG4gICAgICAgICAgICA/IChuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhwaW5nZWRMYW5lcykpXG4gICAgICAgICAgICA6IHJvb3RIYXNQZW5kaW5nQ29tbWl0IHx8XG4gICAgICAgICAgICAgICgocm9vdEhhc1BlbmRpbmdDb21taXQgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgfnJvb3QpLFxuICAgICAgICAgICAgICAwICE9PSByb290SGFzUGVuZGluZ0NvbW1pdCAmJlxuICAgICAgICAgICAgICAgIChuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhyb290SGFzUGVuZGluZ0NvbW1pdCkpKSkpXG4gICAgOiAoKG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXMpLFxuICAgICAgMCAhPT0gbm9uSWRsZVBlbmRpbmdMYW5lc1xuICAgICAgICA/IChuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlUGVuZGluZ0xhbmVzKSlcbiAgICAgICAgOiAwICE9PSBwaW5nZWRMYW5lc1xuICAgICAgICAgID8gKG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHBpbmdlZExhbmVzKSlcbiAgICAgICAgICA6IHJvb3RIYXNQZW5kaW5nQ29tbWl0IHx8XG4gICAgICAgICAgICAoKHJvb3RIYXNQZW5kaW5nQ29tbWl0ID0gcGVuZGluZ0xhbmVzICYgfnJvb3QpLFxuICAgICAgICAgICAgMCAhPT0gcm9vdEhhc1BlbmRpbmdDb21taXQgJiZcbiAgICAgICAgICAgICAgKG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHJvb3RIYXNQZW5kaW5nQ29tbWl0KSkpKTtcbiAgcmV0dXJuIDAgPT09IG5leHRMYW5lc1xuICAgID8gMFxuICAgIDogMCAhPT0gd2lwTGFuZXMgJiZcbiAgICAgICAgd2lwTGFuZXMgIT09IG5leHRMYW5lcyAmJlxuICAgICAgICAwID09PSAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgJiZcbiAgICAgICAgKChzdXNwZW5kZWRMYW5lcyA9IG5leHRMYW5lcyAmIC1uZXh0TGFuZXMpLFxuICAgICAgICAocm9vdEhhc1BlbmRpbmdDb21taXQgPSB3aXBMYW5lcyAmIC13aXBMYW5lcyksXG4gICAgICAgIHN1c3BlbmRlZExhbmVzID49IHJvb3RIYXNQZW5kaW5nQ29tbWl0IHx8XG4gICAgICAgICAgKDMyID09PSBzdXNwZW5kZWRMYW5lcyAmJiAwICE9PSAocm9vdEhhc1BlbmRpbmdDb21taXQgJiA0MTk0MDQ4KSkpXG4gICAgICA/IHdpcExhbmVzXG4gICAgICA6IG5leHRMYW5lcztcbn1cbmZ1bmN0aW9uIGNoZWNrSWZSb290SXNQcmVyZW5kZXJpbmcocm9vdCwgcmVuZGVyTGFuZXMpIHtcbiAgcmV0dXJuIChcbiAgICAwID09PVxuICAgIChyb290LnBlbmRpbmdMYW5lcyAmXG4gICAgICB+KHJvb3Quc3VzcGVuZGVkTGFuZXMgJiB+cm9vdC5waW5nZWRMYW5lcykgJlxuICAgICAgcmVuZGVyTGFuZXMpXG4gICk7XG59XG5mdW5jdGlvbiBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpIHtcbiAgc3dpdGNoIChsYW5lKSB7XG4gICAgY2FzZSAxOlxuICAgIGNhc2UgMjpcbiAgICBjYXNlIDQ6XG4gICAgY2FzZSA4OlxuICAgIGNhc2UgNjQ6XG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyAyNTA7XG4gICAgY2FzZSAxNjpcbiAgICBjYXNlIDMyOlxuICAgIGNhc2UgMTI4OlxuICAgIGNhc2UgMjU2OlxuICAgIGNhc2UgNTEyOlxuICAgIGNhc2UgMTAyNDpcbiAgICBjYXNlIDIwNDg6XG4gICAgY2FzZSA0MDk2OlxuICAgIGNhc2UgODE5MjpcbiAgICBjYXNlIDE2Mzg0OlxuICAgIGNhc2UgMzI3Njg6XG4gICAgY2FzZSA2NTUzNjpcbiAgICBjYXNlIDEzMTA3MjpcbiAgICBjYXNlIDI2MjE0NDpcbiAgICBjYXNlIDUyNDI4ODpcbiAgICBjYXNlIDEwNDg1NzY6XG4gICAgY2FzZSAyMDk3MTUyOlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgNWUzO1xuICAgIGNhc2UgNDE5NDMwNDpcbiAgICBjYXNlIDgzODg2MDg6XG4gICAgY2FzZSAxNjc3NzIxNjpcbiAgICBjYXNlIDMzNTU0NDMyOlxuICAgICAgcmV0dXJuIC0xO1xuICAgIGNhc2UgNjcxMDg4NjQ6XG4gICAgY2FzZSAxMzQyMTc3Mjg6XG4gICAgY2FzZSAyNjg0MzU0NTY6XG4gICAgY2FzZSA1MzY4NzA5MTI6XG4gICAgY2FzZSAxMDczNzQxODI0OlxuICAgICAgcmV0dXJuIC0xO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gLTE7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCkge1xuICB2YXIgbGFuZSA9IG5leHRUcmFuc2l0aW9uTGFuZTtcbiAgbmV4dFRyYW5zaXRpb25MYW5lIDw8PSAxO1xuICAwID09PSAobmV4dFRyYW5zaXRpb25MYW5lICYgNDE5NDA0OCkgJiYgKG5leHRUcmFuc2l0aW9uTGFuZSA9IDI1Nik7XG4gIHJldHVybi
1BsYW5lO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0UmV0cnlMYW5lKCkge1xuICB2YXIgbGFuZSA9IG5leHRSZXRyeUxhbmU7XG4gIG5leHRSZXRyeUxhbmUgPDw9IDE7XG4gIDAgPT09IChuZXh0UmV0cnlMYW5lICYgNjI5MTQ1NjApICYmIChuZXh0UmV0cnlMYW5lID0gNDE5NDMwNCk7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gY3JlYXRlTGFuZU1hcChpbml0aWFsKSB7XG4gIGZvciAodmFyIGxhbmVNYXAgPSBbXSwgaSA9IDA7IDMxID4gaTsgaSsrKSBsYW5lTWFwLnB1c2goaW5pdGlhbCk7XG4gIHJldHVybiBsYW5lTWFwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkJDEocm9vdCwgdXBkYXRlTGFuZSkge1xuICByb290LnBlbmRpbmdMYW5lcyB8PSB1cGRhdGVMYW5lO1xuICAyNjg0MzU0NTYgIT09IHVwZGF0ZUxhbmUgJiZcbiAgICAoKHJvb3Quc3VzcGVuZGVkTGFuZXMgPSAwKSwgKHJvb3QucGluZ2VkTGFuZXMgPSAwKSwgKHJvb3Qud2FybUxhbmVzID0gMCkpO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RGaW5pc2hlZChcbiAgcm9vdCxcbiAgZmluaXNoZWRMYW5lcyxcbiAgcmVtYWluaW5nTGFuZXMsXG4gIHNwYXduZWRMYW5lLFxuICB1cGRhdGVkTGFuZXMsXG4gIHN1c3BlbmRlZFJldHJ5TGFuZXNcbikge1xuICB2YXIgcHJldmlvdXNseVBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICByb290LnBlbmRpbmdMYW5lcyA9IHJlbWFpbmluZ0xhbmVzO1xuICByb290LnN1c3BlbmRlZExhbmVzID0gMDtcbiAgcm9vdC5waW5nZWRMYW5lcyA9IDA7XG4gIHJvb3Qud2FybUxhbmVzID0gMDtcbiAgcm9vdC5leHBpcmVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QuZW50YW5nbGVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QuZXJyb3JSZWNvdmVyeURpc2FibGVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3Quc2hlbGxTdXNwZW5kQ291bnRlciA9IDA7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzLFxuICAgIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzLFxuICAgIGhpZGRlblVwZGF0ZXMgPSByb290LmhpZGRlblVwZGF0ZXM7XG4gIGZvciAoXG4gICAgcmVtYWluaW5nTGFuZXMgPSBwcmV2aW91c2x5UGVuZGluZ0xhbmVzICYgfnJlbWFpbmluZ0xhbmVzO1xuICAgIDAgPCByZW1haW5pbmdMYW5lcztcblxuICApIHtcbiAgICB2YXIgaW5kZXgkNSA9IDMxIC0gY2x6MzIocmVtYWluaW5nTGFuZXMpLFxuICAgICAgbGFuZSA9IDEgPDwgaW5kZXgkNTtcbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4JDVdID0gMDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXgkNV0gPSAtMTtcbiAgICB2YXIgaGlkZGVuVXBkYXRlc0ZvckxhbmUgPSBoaWRkZW5VcGRhdGVzW2luZGV4JDVdO1xuICAgIGlmIChudWxsICE9PSBoaWRkZW5VcGRhdGVzRm9yTGFuZSlcbiAgICAgIGZvciAoXG4gICAgICAgIGhpZGRlblVwZGF0ZXNbaW5kZXgkNV0gPSBudWxsLCBpbmRleCQ1ID0gMDtcbiAgICAgICAgaW5kZXgkNSA8IGhpZGRlblVwZGF0ZXNGb3JMYW5lLmxlbmd0aDtcbiAgICAgICAgaW5kZXgkNSsrXG4gICAgICApIHtcbiAgICAgICAgdmFyIHVwZGF0ZSA9IGhpZGRlblVwZGF0ZXNGb3JMYW5lW2luZGV4JDVdO1xuICAgICAgICBudWxsICE9PSB1cGRhdGUgJiYgKHVwZGF0ZS5sYW5lICY9IC01MzY4NzA5MTMpO1xuICAgICAgfVxuICAgIHJlbWFpbmluZ0xhbmVzICY9IH5sYW5lO1xuICB9XG4gIDAgIT09IHNwYXduZWRMYW5lICYmIG1hcmtTcGF3bmVkRGVmZXJyZWRMYW5lKHJvb3QsIHNwYXduZWRMYW5lLCAwKTtcbiAgMCAhPT0gc3VzcGVuZGVkUmV0cnlMYW5lcyAmJlxuICAgIDAgPT09IHVwZGF0ZWRMYW5lcyAmJlxuICAgIDAgIT09IHJvb3QudGFnICYmXG4gICAgKHJvb3Quc3VzcGVuZGVkTGFuZXMgfD1cbiAgICAgIHN1c3BlbmRlZFJldHJ5TGFuZXMgJiB+KHByZXZpb3VzbHlQZW5kaW5nTGFuZXMgJiB+ZmluaXNoZWRMYW5lcykpO1xufVxuZnVuY3Rpb24gbWFya1NwYXduZWREZWZlcnJlZExhbmUocm9vdCwgc3Bhd25lZExhbmUsIGVudGFuZ2xlZExhbmVzKSB7XG4gIHJvb3QucGVuZGluZ0xhbmVzIHw9IHNwYXduZWRMYW5lO1xuICByb290LnN1c3BlbmRlZExhbmVzICY9IH5zcGF3bmVkTGFuZTtcbiAgdmFyIHNwYXduZWRMYW5lSW5kZXggPSAzMSAtIGNsejMyKHNwYXduZWRMYW5lKTtcbiAgcm9vdC5lbnRhbmdsZWRMYW5lcyB8PSBzcGF3bmVkTGFuZTtcbiAgcm9vdC5lbnRhbmdsZW1lbnRzW3NwYXduZWRMYW5lSW5kZXhdID1cbiAgICByb290LmVudGFuZ2xlbWVudHNbc3Bhd25lZExhbmVJbmRleF0gfFxuICAgIDEwNzM3NDE4MjQgfFxuICAgIChlbnRhbmdsZWRMYW5lcyAmIDQxOTQwOTApO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgZW50YW5nbGVkTGFuZXMpIHtcbiAgdmFyIHJvb3RFbnRhbmdsZWRMYW5lcyA9IChyb290LmVudGFuZ2xlZExhbmVzIHw9IGVudGFuZ2xlZExhbmVzKTtcbiAgZm9yIChyb290ID0gcm9vdC5lbnRhbmdsZW1lbnRzOyByb290RW50YW5nbGVkTGFuZXM7ICkge1xuICAgIHZhciBpbmRleCQ2ID0gMzEgLSBjbHozMihyb290RW50YW5nbGVkTGFuZXMpLFxuICAgICAgbGFuZSA9IDEgPDwgaW5kZXgkNjtcbiAgICAobGFuZSAmIGVudGFuZ2xlZExhbmVzKSB8IChyb290W2luZGV4JDZdICYgZW50YW5nbGVkTGFuZXMpICYmXG4gICAgICAocm9vdFtpbmRleCQ2XSB8PSBlbnRhbmdsZWRMYW5lcyk7XG4gICAgcm9vdEVudGFuZ2xlZExhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uQnlMYW5lKGxhbmUpIHtcbiAgc3dpdGNoIChsYW5lKSB7XG4gICAgY2FzZSAyOlxuICAgICAgbGFuZSA9IDE7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICBsYW5lID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzI6XG4gICAgICBsYW5lID0gMTY7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI1NjpcbiAgICBjYXNlIDUxMjpcbiAgICBjYXNlIDEwMjQ6XG4gICAgY2FzZSAyMDQ4OlxuICAgIGNhc2UgNDA5NjpcbiAgICBjYXNlIDgxOTI6XG4gICAgY2FzZSAxNjM4NDpcbiAgICBjYXNlIDMyNzY4OlxuICAgIGNhc2UgNjU1MzY6XG4gICAgY2FzZSAxMzEwNzI6XG4gICAgY2FzZSAyNjIxNDQ6XG4gICAgY2FzZSA1MjQyODg6XG4gICAgY2FzZSAxMDQ4NTc2OlxuICAgIGNhc2UgMjA5NzE1MjpcbiAgICBjYXNlIDQxOTQzMDQ6XG4gICAgY2FzZSA4Mzg4NjA4OlxuICAgIGNhc2UgMTY3NzcyMTY6XG4gICAgY2FzZSAzMzU1NDQzMjpcbiAgICAgIGxhbmUgPSAxMjg7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI2ODQzNTQ1Nj
1pcbiAgICAgIGxhbmUgPSAxMzQyMTc3Mjg7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbGFuZSA9IDA7XG4gIH1cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBsYW5lc1RvRXZlbnRQcmlvcml0eShsYW5lcykge1xuICBsYW5lcyAmPSAtbGFuZXM7XG4gIHJldHVybiAyIDwgbGFuZXNcbiAgICA/IDggPCBsYW5lc1xuICAgICAgPyAwICE9PSAobGFuZXMgJiAxMzQyMTc3MjcpXG4gICAgICAgID8gMzJcbiAgICAgICAgOiAyNjg0MzU0NTZcbiAgICAgIDogOFxuICAgIDogMjtcbn1cbmZ1bmN0aW9uIHJlc29sdmVVcGRhdGVQcmlvcml0eSgpIHtcbiAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucDtcbiAgaWYgKDAgIT09IHVwZGF0ZVByaW9yaXR5KSByZXR1cm4gdXBkYXRlUHJpb3JpdHk7XG4gIHVwZGF0ZVByaW9yaXR5ID0gd2luZG93LmV2ZW50O1xuICByZXR1cm4gdm9pZCAwID09PSB1cGRhdGVQcmlvcml0eSA/IDMyIDogZ2V0RXZlbnRQcmlvcml0eSh1cGRhdGVQcmlvcml0eS50eXBlKTtcbn1cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eShwcmlvcml0eSwgZm4pIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICB0cnkge1xuICAgIHJldHVybiAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByaW9yaXR5KSwgZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gcHJldmlvdXNQcmlvcml0eTtcbiAgfVxufVxudmFyIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLFxuICBpbnRlcm5hbEluc3RhbmNlS2V5ID0gXCJfX3JlYWN0RmliZXIkXCIgKyByYW5kb21LZXksXG4gIGludGVybmFsUHJvcHNLZXkgPSBcIl9fcmVhY3RQcm9wcyRcIiArIHJhbmRvbUtleSxcbiAgaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleSA9IFwiX19yZWFjdENvbnRhaW5lciRcIiArIHJhbmRvbUtleSxcbiAgaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5ID0gXCJfX3JlYWN0RXZlbnRzJFwiICsgcmFuZG9tS2V5LFxuICBpbnRlcm5hbEV2ZW50SGFuZGxlckxpc3RlbmVyc0tleSA9IFwiX19yZWFjdExpc3RlbmVycyRcIiArIHJhbmRvbUtleSxcbiAgaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXkgPSBcIl9fcmVhY3RIYW5kbGVzJFwiICsgcmFuZG9tS2V5LFxuICBpbnRlcm5hbFJvb3ROb2RlUmVzb3VyY2VzS2V5ID0gXCJfX3JlYWN0UmVzb3VyY2VzJFwiICsgcmFuZG9tS2V5LFxuICBpbnRlcm5hbEhvaXN0YWJsZU1hcmtlciA9IFwiX19yZWFjdE1hcmtlciRcIiArIHJhbmRvbUtleTtcbmZ1bmN0aW9uIGRldGFjaERlbGV0ZWRJbnN0YW5jZShub2RlKSB7XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbFByb3BzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleV07XG59XG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgaWYgKHRhcmdldEluc3QpIHJldHVybiB0YXJnZXRJbnN0O1xuICBmb3IgKHZhciBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlOyBwYXJlbnROb2RlOyApIHtcbiAgICBpZiAoXG4gICAgICAodGFyZ2V0SW5zdCA9XG4gICAgICAgIHBhcmVudE5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gfHxcbiAgICAgICAgcGFyZW50Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSlcbiAgICApIHtcbiAgICAgIHBhcmVudE5vZGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcbiAgICAgIGlmIChcbiAgICAgICAgbnVsbCAhPT0gdGFyZ2V0SW5zdC5jaGlsZCB8fFxuICAgICAgICAobnVsbCAhPT0gcGFyZW50Tm9kZSAmJiBudWxsICE9PSBwYXJlbnROb2RlLmNoaWxkKVxuICAgICAgKVxuICAgICAgICBmb3IgKFxuICAgICAgICAgIHRhcmdldE5vZGUgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuICAgICAgICAgIG51bGwgIT09IHRhcmdldE5vZGU7XG5cbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKChwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSkpIHJldHVybiBwYXJlbnROb2RlO1xuICAgICAgICAgIHRhcmdldE5vZGUgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuICAgICAgICB9XG4gICAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICB9XG4gICAgdGFyZ2V0Tm9kZSA9IHBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkge1xuICBpZiAoXG4gICAgKG5vZGUgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0pXG4gICkge1xuICAgIHZhciB0YWcgPSBub2RlLnRhZztcbiAgICBpZiAoXG4gICAgICA1ID09PSB0YWcgfHxcbiAgICAgIDYgPT09IHRhZyB8fFxuICAgICAgMTMgPT09IHRhZyB8fFxuICAgICAgMjYgPT09IHRhZyB8fFxuICAgICAgMjcgPT09IHRhZyB8fFxuICAgICAgMyA9PT0gdGFnXG4gICAgKVxuICAgICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXROb2RlRnJvbUluc3RhbmNlKGluc3QpIHtcbiAgdmFyIHRhZyA9IGluc3QudGFnO1xuICBpZiAoNSA9PT0gdGFnIHx8IDI2ID09PSB0YWcgfHwgMjcgPT09IHRhZyB8fCA2ID09PSB0YWcpIHJldHVybiBpbnN0LnN0YXRlTm9kZTtcbiAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMykpO1xufVxuZnVuY3Rpb24gZ2V0UmVzb3VyY2VzRnJvbVJvb3Qocm9vdCkge1xuICB2YXIgcmVzb3VyY2VzID0gcm9vdFtpbnRlcm5hbFJvb3ROb2RlUmVzb3VyY2VzS2V5XTtcbiAgcmVzb3VyY2VzIHx8XG4gICAgKHJlc291cmNlcyA9IHJvb3RbaW50ZXJuYWxSb290Tm9kZVJlc291cmNlc0tleV0gPVxuICAgICAgeyBob2lzdGFibGVTdHlsZXM6IG5ldyBNYXAoKSwgaG9pc3RhYmxlU2NyaXB0czogbmV3IE1hcCgpIH0pO1xuICByZXR1cm4gcmVzb3VyY2VzO1xufVxuZnVuY3Rpb24gbWFya05vZGVBc0hvaXN0YWJsZShub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxIb2lzdGFibGVNYXJrZXJdID0gITA7XG59XG52YXIgYWxsTmF0aXZlRXZlbnRzID0gbmV3IFNldCgpLFxuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0ge307XG5mdW5jdGlvbiByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgXCJDYXB0dXJlXCIsIGRlcGVuZGVuY2llcyk7XG59XG5mdW5jdGlvbiByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuICBmb3IgKFxuICAgIHJlZ2lzdHJhdGlvbk5hbWUgPSAwO1xuICAgIHJlZ2lzdHJhdGlvbk5hbWUgPCBkZXBlbmRlbmNpZXMubGVuZ3RoO1xuICAgIHJlZ2lzdHJhdGlvbk5hbWUrK1xuICApXG4gICAgYWxsTmF0aXZlRXZlbnRzLmFkZChkZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0pO1xufVxudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gUmVnRXhwKFxuICAgIFwiXls6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXVs6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXFxcXC0uMC05XFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDBdKiRcIlxuICApLFxuICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge30sXG4gIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xuZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpXG4gICAgcmV0dXJuICEwO1xuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkgcmV0dXJuICExO1xuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSlcbiAgICByZXR1cm4gKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9ICEwKTtcbiAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9ICEwO1xuICByZXR1cm4gITE7XG59XG5mdW5jdGlvbiBzZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCB2YWx1ZSkge1xuICBpZiAoaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSlcbiAgICBpZiAobnVsbCA9PT0gdmFsdWUpIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGVsc2Uge1xuICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgI
1HJldHVybjtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICB2YXIgcHJlZml4JDggPSBuYW1lLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCwgNSk7XG4gICAgICAgICAgaWYgKFwiZGF0YS1cIiAhPT0gcHJlZml4JDggJiYgXCJhcmlhLVwiICE9PSBwcmVmaXgkOCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgXCJcIiArIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRWYWx1ZUZvcktub3duQXR0cmlidXRlKG5vZGUsIG5hbWUsIHZhbHVlKSB7XG4gIGlmIChudWxsID09PSB2YWx1ZSkgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIGVsc2Uge1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIFwiXCIgKyB2YWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFZhbHVlRm9yTmFtZXNwYWNlZEF0dHJpYnV0ZShub2RlLCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gIGlmIChudWxsID09PSB2YWx1ZSkgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIGVsc2Uge1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIG5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlLCBuYW1lLCBcIlwiICsgdmFsdWUpO1xuICB9XG59XG52YXIgcHJlZml4LCBzdWZmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSB7XG4gIGlmICh2b2lkIDAgPT09IHByZWZpeClcbiAgICB0cnkge1xuICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICB9IGNhdGNoICh4KSB7XG4gICAgICB2Y
1XIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgcHJlZml4ID0gKG1hdGNoICYmIG1hdGNoWzFdKSB8fCBcIlwiO1xuICAgICAgc3VmZml4ID1cbiAgICAgICAgLTEgPCB4LnN0YWNrLmluZGV4T2YoXCJcXG4gICAgYXRcIilcbiAgICAgICAgICA/IFwiICg8YW5vbnltb3VzPilcIlxuICAgICAgICAgIDogLTEgPCB4LnN0YWNrLmluZGV4T2YoXCJAXCIpXG4gICAgICAgICAgICA/IFwiQHVua25vd246MDowXCJcbiAgICAgICAgICAgIDogXCJcIjtcbiAgICB9XG4gIHJldHVybiBcIlxcblwiICsgcHJlZml4ICsgbmFtZSArIHN1ZmZpeDtcbn1cbnZhciByZWVudHJ5ID0gITE7XG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgaWYgKCFmbiB8fCByZWVudHJ5KSByZXR1cm4gXCJcIjtcbiAgcmVlbnRyeSA9ICEwO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlO1xuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHZvaWQgMDtcbiAgdHJ5IHtcbiAgICB2YXIgUnVuSW5Sb290RnJhbWUgPSB7XG4gICAgICBEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAgICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsIFwicHJvcHNcIiwge1xuICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgUmVmbGVjdCAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0geDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoeCQ5KSB7XG4gICAgICAgICAgICAgICAgY29udHJvbCA9IHgkOTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHgkMTApIHtcbiAgICAgICAgICAgICAgY29udHJvbCA9IHgkMTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoRmFrZSA9IGZuKCkpICYmXG4gICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIEZha2UuY2F0Y2ggJiZcbiAgICAgICAgICAgICAgRmFrZS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAgICAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHNhbXBsZS5zdGFjaylcbiAgICAgICAgICAgIHJldHVybiBbc2FtcGxlLnN0YWNrLCBjb250cm9sLnN0YWNrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW251bGwsIG51bGxdO1xuICAgICAgfVxuICAgIH07XG4gICAgUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LmRpc3BsYXlOYW1lID1cbiAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCI7XG4gICAgdmFyIG5hbWVQcm9wRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QsXG4gICAgICBcIm5hbWVcIlxuICAgICk7XG4gICAgbmFtZVByb3BEZXNjcmlwdG9yICYmXG4gICAgICBuYW1lUHJvcERlc2NyaXB0b3IuY29uZmlndXJhYmxlICYmXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCxcbiAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgIHsgdmFsdWU6IFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCIgfVxuICAgICAgKTtcbiAgICB2YXIgX1J1bkluUm9vdEZyYW1lJERldGVyID0gUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290KCksXG4gICAgICBzYW1wbGVTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclswXSxcbiAgICAgIGNvbnRyb2xTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclsxXTtcbiAgICBpZiAoc2FtcGxlU3RhY2sgJiYgY29udHJvbFN0YWNrKSB7XG4gICAgICB2Y
1XIgc2FtcGxlTGluZXMgPSBzYW1wbGVTdGFjay5zcGxpdChcIlxcblwiKSxcbiAgICAgICAgY29udHJvbExpbmVzID0gY29udHJvbFN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgZm9yIChcbiAgICAgICAgbmFtZVByb3BEZXNjcmlwdG9yID0gUnVuSW5Sb290RnJhbWUgPSAwO1xuICAgICAgICBSdW5JblJvb3RGcmFtZSA8IHNhbXBsZUxpbmVzLmxlbmd0aCAmJlxuICAgICAgICAhc2FtcGxlTGluZXNbUnVuSW5Sb290RnJhbWVdLmluY2x1ZGVzKFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCIpO1xuXG4gICAgICApXG4gICAgICAgIFJ1bkluUm9vdEZyYW1lKys7XG4gICAgICBmb3IgKFxuICAgICAgICA7XG4gICAgICAgIG5hbWVQcm9wRGVzY3JpcHRvciA8IGNvbnRyb2xMaW5lcy5sZW5ndGggJiZcbiAgICAgICAgIWNvbnRyb2xMaW5lc1tuYW1lUHJvcERlc2NyaXB0b3JdLmluY2x1ZGVzKFxuICAgICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCJcbiAgICAgICAgKTtcblxuICAgICAgKVxuICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IrKztcbiAgICAgIGlmIChcbiAgICAgICAgUnVuSW5Sb290RnJhbWUgPT09IHNhbXBsZUxpbmVzLmxlbmd0aCB8fFxuICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IgPT09IGNvbnRyb2xMaW5lcy5sZW5ndGhcbiAgICAgIClcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBSdW5JblJvb3RGcmFtZSA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAxIDw9IFJ1bkluUm9vdEZyYW1lICYmXG4gICAgICAgICAgMCA8PSBuYW1lUHJvcERlc2NyaXB0b3IgJiZcbiAgICAgICAgICBzYW1wbGVMaW5lc1tSdW5JblJvb3RGcmFtZV0gIT09IGNvbnRyb2xMaW5lc1tuYW1lUHJvcERlc2NyaXB0b3JdO1xuXG4gICAgICAgIClcbiAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3ItLTtcbiAgICAgIGZvciAoXG4gICAgICAgIDtcbiAgICAgICAgMSA8PSBSdW5JblJvb3RGcmFtZSAmJiAwIDw9IG5hbWVQcm9wRGVzY3JpcHRvcjtcbiAgICAgICAgUnVuSW5Sb290RnJhbWUtLSwgbmFtZVByb3BEZXNjcmlwdG9yLS1cbiAgICAgIClcbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW1J1bkluUm9vdEZyYW1lXSAhPT0gY29udHJvbExpbmVzW25hbWVQcm9wRGVzY3JpcHRvcl0pIHtcbiAgICAgICAgICBpZiAoMSAhPT0gUnVuSW5Sb290RnJhbWUgfHwgMSAhPT0gbmFtZVByb3BEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBkb1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKFJ1bkluUm9vdEZyYW1lLS0sXG4gICAgICAgICAgICAgICAgbmFtZVByb3BEZXNjcmlwdG9yLS0sXG4gICAgICAgICAgICAgICAgMCA+IG5hbWVQcm9wRGVzY3JpcHRvciB8fFxuICAgICAgICAgICAgICAgICAgc2FtcGxlTGluZXNbUnVuSW5Sb290RnJhbWVdICE9PVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyYW1lID1cbiAgICAgICAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgc2FtcGxlTGluZXNbUnVuSW5Sb290RnJhbWVdLnJlcGxhY2UoXCIgYXQgbmV3IFwiLCBcIiBhdCBcIik7XG4gICAgICAgICAgICAgICAgZm4uZGlzcGxheU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgIGZyYW1lLmluY2x1ZGVzKFwiPGFub255bW91cz5cIikgJiZcbiAgICAgICAgICAgICAgICAgIChmcmFtZSA9IGZyYW1lLnJlcGxhY2UoXCI8YW5vbnltb3VzPlwiLCBmbi5kaXNwbGF5TmFtZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKDEgPD0gUnVuSW5Sb290RnJhbWUgJiYgMCA8PSBuYW1lUHJvcERlc2NyaXB0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAocmVlbnRyeSA9ICExKSwgKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSk7XG4gIH1cbiAgcmV0dXJuIChwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogXCJcIilcbiAgICA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UpXG4gICAgOiBcIlwiO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlcikge1xuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgMjY6XG4gICAgY2FzZSAyNzpcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG4gICAgY2FzZSAxNjpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShcIkxhenlcIik7XG4gICAgY2FzZSAxMzpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShcIlN1c3BlbnNlXCIpO1xuICAgIGNhc2UgMTk6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZUxpc3RcIik7XG4gICAgY2FzZSAwOlxuICAgIGNhc2UgMTU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmaWJlci50eXBlLCAhMSk7XG4gICAgY2FzZSAxMTpcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUucmVuZGVyLCAhMSk7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSwgITApO1xuICAgIGNhc2UgMzE6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJBY3Rpdml0eVwiKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwiXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZCh3b3JrSW5Qcm9ncmVzcykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gXCJcIjtcbiAgICBkb1xuICAgICAgKGluZm8gKz0gZGVzY3JpYmVGaWJlcih3b3JrSW5Qcm9ncmVzcykpLFxuICAgICAgICAod29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm4pO1xuICAgIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmV0dXJuIGluZm87XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gXCJcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiBcIiArIHgubWVzc2FnZSArIFwiXFxuXCIgKyB4LnN0YWNrO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSB7XG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJcIjtcbiAgfVxufVxuZnVuY3Rpb24gaXNDaGVja2FibGUoZWxlbSkge1xuICB2YXIgdHlwZSA9IGVsZW0udHlwZTtcbiAgcmV0dXJuIChcbiAgICAoZWxlbSA9IGVsZW0ubm9kZU5hbWUpICYmXG4gICAgXCJpbnB1dFwiID09PSBlbGVtLnRvTG93ZXJDYXNlKCkgJiZcbiAgICAoXCJjaGVja2JveFwiID09PSB0eXBlIHx8IFwicmFkaW9cIiA9PT0gdHlwZSlcbiAgKTtcbn1cbmZ1bmN0aW9uIHRyYWNrVmFsdWVPbk5vZGUobm9kZSkge1xuICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gXCJjaGVja2VkXCIgOiBcInZhbHVlXCIsXG4gICAgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBub2Rl
1LmNvbnN0cnVjdG9yLnByb3RvdHlwZSxcbiAgICAgIHZhbHVlRmllbGRcbiAgICApLFxuICAgIGN1cnJlbnRWYWx1ZSA9IFwiXCIgKyBub2RlW3ZhbHVlRmllbGRdO1xuICBpZiAoXG4gICAgIW5vZGUuaGFzT3duUHJvcGVydHkodmFsdWVGaWVsZCkgJiZcbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgZGVzY3JpcHRvciAmJlxuICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICYmXG4gICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZGVzY3JpcHRvci5zZXRcbiAgKSB7XG4gICAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0LFxuICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IFwiXCIgKyB2YWx1ZTtcbiAgICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGVcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IFwiXCIgKyB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIG5vZGVbdmFsdWVGaWVsZF07XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gdHJhY2sobm9kZSkge1xuICBub2RlLl92YWx1ZVRyYWNrZXIgfHwgKG5vZGUuX3ZhbHVlVHJhY2tlciA9IHRyYWNrVmFsdWVPbk5vZGUobm9kZSkpO1xufVxuZnVuY3Rpb24gdXBkYXRlVmFsdWVJZkNoYW5nZWQobm9kZSkge1xuICBpZiAoIW5vZGUpIHJldHVybiAhMTtcbiAgdmFyIHRyYWNrZXIgPSBub2RlLl92YWx1ZVRyYWNrZXI7XG4gIGlmICghdHJhY2tlcikgcmV0dXJuICEwO1xuICB2YXIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpO1xuICB2YXIgdmFsdWUgPSBcIlwiO1xuICBub2RlICYmXG4gICAgKHZhbHVlID0gaXNDaGVja2FibGUobm9kZSlcbiAgICAgID8gbm9kZS5jaGVja2VkXG4gICAgICAgID8gXCJ0cnVlXCJcbiAgICAgICAgOiBcImZhbHNlXCJcbiAgICAgIDogbm9kZS52YWx1ZSk7XG4gIG5vZGUgPSB2YWx1ZTtcbiAgcmV0dXJuIG5vZGUgIT09IGxhc3RWYWx1ZSA/ICh0cmFja2VyLnNldFZhbHVlKG5vZGUpLCAhMCkgOiAhMTtcbn1cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnQoZG9jKSB7XG4gIGRvYyA9IGRvYyB8fCAoXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIGRvY3VtZW50ID8gZG9jdW1lbnQgOiB2b2lkIDApO1xuICBpZiAoXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIGRvYykgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRvYy5hY3RpdmVFbGVtZW50IHx8IGRvYy5ib2R5O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGRvYy5ib2R5O1xuICB9XG59XG52YXIgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3Rlc1JlZ2V4ID0gL1tcXG5cIlxcXFxdL2c7XG5mdW5jdGlvbiBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKFxuICAgIGVzY2FwZVNlbGVjdG9yQXR0cmlidXRlVmFsdWVJbnNpZGVEb3VibGVRdW90ZXNSZWdleCxcbiAgICBmdW5jdGlvbiAoY2gpIHtcbiAgICAgIHJldHVybiBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpICsgXCIgXCI7XG4gICAgfVxuICApO1xufVxuZnVuY3Rpb24gdXBkYXRlSW5wdXQoXG4gIGVsZW1lbnQsXG4gIHZhbHVlLFxuICBkZWZhdWx0VmFsdWUsXG4gIGxhc3REZWZhdWx0VmFsdWUsXG4gIGNoZWNrZWQsXG4gIGRlZmF1bHRDaGVja2VkLFxuICB0eXBlLFxuICBuYW1lXG4pIHtcbiAgZWxlbWVudC5uYW1lID0gXCJcIjtcbiAgbnVsbCAhPSB0eXBlICYmXG4gIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHR5cGUgJiZcbiAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHR5cGUgJiZcbiAgXCJib29sZWFuXCIgIT09IHR5cGVvZiB0eXBlXG4gICAgPyAoZWxlbWVudC50eXBlID0gdHlwZSlcbiAgICA6IGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwidHlwZVwiKTtcbiAgaWYgKG51bGwgIT0gdmFsdWUpXG4gICAgaWYgKFwibnVtYmVyXCIgPT09IHR5cGUpIHtcbiAgICAgIGlmICgoMCA9PT0gdmFsdWUgJiYgXCJcIiA9PT0gZWxlbWVudC52YWx1ZSkgfHwgZWxlbWVudC52YWx1ZSAhPSB2YWx1ZSlcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IFwiXCIgKyBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKTtcbiAgICB9IGVsc2VcbiAgICAgIGVsZW1lbnQudmFsdWUgIT09IFwiXCIgKyBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSAmJlxuICAgICAgICAoZWxlbWVudC52YWx1ZSA9IFwiXCIgKyBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSk7XG4gIGVsc2VcbiAgICAoXCJzdWJtaXRcIiAhPT0gdHlwZSAmJiBcInJlc2V0XCIgIT09IHR5cGUpIHx8IGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwidmFsdWVcIik7XG4gIG51bGwgIT0gdmFsdWVcbiAgICA/IHNldERlZmF1bHRWYWx1ZShlbGVtZW50LCB0eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSlcbiAgICA6IG51bGwgIT0gZGVmYXVsdFZhbHVlXG4gICAgICA/IHNldERlZmF1bHRWYWx1ZShlbGVtZW50LCB0eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKGRlZmF1bHRWYWx1ZSkpXG4gICAgICA6IG51bGwgIT0gbGFzdERlZmF1bHRWYWx1ZSAmJiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICBudWxsID09IGNoZWNrZWQgJiZcbiAgICBudWxsICE9IGRlZmF1bHRDaGVja2VkICYmXG4gICAgKGVsZW1lbnQuZGVmYXVsdENoZWNrZWQgPSAhIWRlZmF1bHRDaGVja2VkKTtcbiAgbnVsbCAhPSBjaGVja2VkICYmXG4gICAgKGVsZW1lbnQuY2hlY2tlZCA9XG4gICAgICBjaGVja2VkICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIGNoZWNrZWQgJiYgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIGNoZWNrZWQpO1xuICBudWxsICE9IG5hbWUgJiZcbiAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgbmFtZSAmJlxuICBcInN5bWJvbFwiICE9PSB0eXBlb2YgbmFtZSAmJlxuICBcImJvb2xlYW5cIiAhPT0gdHlwZW9mIG5hbWVcbiAgICA/IChlbGVtZW50Lm5hbWUgPSBcIlwiICsgZ2V0VG9TdHJpbmdWYWx1ZShuYW1lKSlcbiAgICA6IGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwibmFtZVwiKTtcbn1cbmZ1bmN0aW9uIGluaXRJbnB1dChcbiAgZWxlbWVudCxcbiAgdmFsdWUsXG4gIGRlZmF1bHRWYWx1ZSxcbiAgY2hlY2tlZCxcbiAgZGVmYXVsdENoZWNrZWQsXG4gIHR5cGUsXG4gIG5hbWUsXG4gIGlzSHlkcmF0aW5nXG4pIHtcbiAgbnVsbCAhPSB0eXBlICYmXG4gICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgdHlwZSAmJlxuICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiB0eXBlICYmXG4gICAgXCJib29sZWFuXCIgIT09IHR5cGVvZiB0eXBlICYmXG4gICAgKGVsZW1lbnQudHlwZSA9IHR5cGUpO1xuICBpZiAobnVsbCAhPSB2YWx1ZSB8fCBudWxsICE9IGRlZmF1bHRWYWx1ZSkge1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIChcInN1Ym1pdFwiICE9PSB0eXBlICYmIFwicmVzZXRcIiAhPT0gdHlwZSkgfHxcbiAgICAgICAgKHZvaWQgMCAhPT0gdmFsdWUgJiYgbnVsbCAhPT0gdmFsdWUpXG4gICAgICApXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGRlZmF1bHRWYWx1ZSA9XG4gICAgICBudWxsICE9IGRlZmF1bHRWYWx1ZSA/IFwiXCIgKyBnZXRUb1N0cmluZ1ZhbHVlKGRlZmF1bHRWYWx1ZSkgOiBcIlwiO
11xuICAgIHZhbHVlID0gbnVsbCAhPSB2YWx1ZSA/IFwiXCIgKyBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICBpc0h5ZHJhdGluZyB8fCB2YWx1ZSA9PT0gZWxlbWVudC52YWx1ZSB8fCAoZWxlbWVudC52YWx1ZSA9IHZhbHVlKTtcbiAgICBlbGVtZW50LmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIGNoZWNrZWQgPSBudWxsICE9IGNoZWNrZWQgPyBjaGVja2VkIDogZGVmYXVsdENoZWNrZWQ7XG4gIGNoZWNrZWQgPVxuICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIGNoZWNrZWQgJiYgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIGNoZWNrZWQgJiYgISFjaGVja2VkO1xuICBlbGVtZW50LmNoZWNrZWQgPSBpc0h5ZHJhdGluZyA/IGVsZW1lbnQuY2hlY2tlZCA6ICEhY2hlY2tlZDtcbiAgZWxlbWVudC5kZWZhdWx0Q2hlY2tlZCA9ICEhY2hlY2tlZDtcbiAgbnVsbCAhPSBuYW1lICYmXG4gICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgbmFtZSAmJlxuICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBuYW1lICYmXG4gICAgXCJib29sZWFuXCIgIT09IHR5cGVvZiBuYW1lICYmXG4gICAgKGVsZW1lbnQubmFtZSA9IG5hbWUpO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHR5cGUsIHZhbHVlKSB7XG4gIChcIm51bWJlclwiID09PSB0eXBlICYmIGdldEFjdGl2ZUVsZW1lbnQobm9kZS5vd25lckRvY3VtZW50KSA9PT0gbm9kZSkgfHxcbiAgICBub2RlLmRlZmF1bHRWYWx1ZSA9PT0gXCJcIiArIHZhbHVlIHx8XG4gICAgKG5vZGUuZGVmYXVsdFZhbHVlID0gXCJcIiArIHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMobm9kZSwgbXVsdGlwbGUsIHByb3BWYWx1ZSwgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gIG5vZGUgPSBub2RlLm9wdGlvbnM7XG4gIGlmIChtdWx0aXBsZSkge1xuICAgIG11bHRpcGxlID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICBtdWx0aXBsZVtcIiRcIiArIHByb3BWYWx1ZVtpXV0gPSAhMDtcbiAgICBmb3IgKHByb3BWYWx1ZSA9IDA7IHByb3BWYWx1ZSA8IG5vZGUubGVuZ3RoOyBwcm9wVmFsdWUrKylcbiAgICAgIChpID0gbXVsdGlwbGUuaGFzT3duUHJvcGVydHkoXCIkXCIgKyBub2RlW3Byb3BWYWx1ZV0udmFsdWUpKSxcbiAgICAgICAgbm9kZVtwcm9wVmFsdWVdLnNlbGVjdGVkICE9PSBpICYmIChub2RlW3Byb3BWYWx1ZV0uc2VsZWN0ZWQgPSBpKSxcbiAgICAgICAgaSAmJiBzZXREZWZhdWx0U2VsZWN0ZWQgJiYgKG5vZGVbcHJvcFZhbHVlXS5kZWZhdWx0U2VsZWN0ZWQgPSAhMCk7XG4gIH0gZWxzZSB7XG4gICAgcHJvcFZhbHVlID0gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUocHJvcFZhbHVlKTtcbiAgICBtdWx0aXBsZSA9IG51bGw7XG4gICAgZm9yIChpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChub2RlW2ldLnZhbHVlID09PSBwcm9wVmFsdWUpIHtcbiAgICAgICAgbm9kZVtpXS5zZWxlY3RlZCA9ICEwO1xuICAgICAgICBzZXREZWZhdWx0U2VsZWN0ZWQgJiYgKG5vZGVbaV0uZGVmYXVsdFNlbGVjdGVkID0gITApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBudWxsICE9PSBtdWx0aXBsZSB8fCBub2RlW2ldLmRpc2FibGVkIHx8IChtdWx0aXBsZSA9IG5vZGVbaV0pO1xuICAgIH1cbiAgICBudWxsICE9PSBtdWx0aXBsZSAmJiAobXVsdGlwbGUuc2VsZWN0ZWQgPSAhMCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVRleHRhcmVhKGVsZW1lbnQsIHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKFxuICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAoKHZhbHVlID0gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpKSxcbiAgICB2YWx1ZSAhPT0gZWxlbWVudC52YWx1ZSAmJiAoZWxlbWVudC52YWx1ZSA9IHZhbHVlKSxcbiAgICBudWxsID09IGRlZmF1bHRWYWx1ZSlcbiAgKSB7XG4gICAgZWxlbWVudC5kZWZhdWx0VmFsdWUgIT09IHZhbHVlICYmIChlbGVtZW50LmRlZmF1bHRWYWx1ZSA9IHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZWxlbWVudC5kZWZhdWx0VmFsdWUgPVxuICAgIG51bGwgIT0gZGVmYXVsdFZhbHVlID8gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUoZGVmYXVsdFZhbHVlKSA6IFwiXCI7XG59XG5mdW5jdGlvbiBpbml0VGV4dGFyZWEoZWxlbWVudCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSwgY2hpbGRyZW4pIHtcbiAgaWYgKG51bGwgPT0gdmFsdWUpIHtcbiAgICBpZiAobnVsbCAhPSBjaGlsZHJlbikge1xuICAgICAgaWYgKG51bGwgIT0gZGVmYXVsdFZhbHVlKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkyKSk7XG4gICAgICBpZiAoaXNBcnJheUltcGwoY2hpbGRyZW4pKSB7XG4gICAgICAgIGlmICgxIDwgY2hpbGRyZW4ubGVuZ3RoKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkzKSk7XG4gICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICB9XG4gICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgbnVsbCA9PSBkZWZhdWx0VmFsdWUgJiYgKGRlZmF1bHRWYWx1ZSA9IFwiXCIpO1xuICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB9XG4gIGRlZmF1bHRWYWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUodmFsdWUpO1xuICBlbGVtZW50LmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgY2hpbGRyZW4gPSBlbGVtZW50LnRleHRDb250ZW50O1xuICBjaGlsZHJlbiA9PT0gZGVmYXVsdFZhbHVlICYmXG4gICAgXCJcIiAhPT0gY2hpbGRyZW4gJiZcbiAgICBudWxsICE9PSBjaGlsZHJlbiAmJlxuICAgIChlbGVtZW50LnZhbHVlID0gY2hpbGRyZW4pO1xufVxuZnVuY3Rpb24gc2V0VGV4dENvbnRlbnQobm9kZSwgdGV4dCkge1xuICBpZiAodGV4dCkge1xuICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgIGlmIChcbiAgICAgIGZpcnN0Q2hpbGQgJiZcbiAgICAgIGZpcnN0Q2hpbGQgPT09IG5vZGUubGFzdENoaWxkICYmXG4gICAgICAzID09PSBmaXJzdENoaWxkLm5vZGVUeXBlXG4gICAgKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xufVxudmFyIHVuaXRsZXNzTnVtYmVycyA9IG5ldyBTZXQoXG4gIFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgYXNwZWN0UmF0aW8gYm9yZGVySW1hZ2VPdXRzZXQgYm9yZGVySW1hZ2VTbGljZSBib3JkZXJJbWFnZVdpZHR
1oIGJveEZsZXggYm94RmxleEdyb3VwIGJveE9yZGluYWxHcm91cCBjb2x1bW5Db3VudCBjb2x1bW5zIGZsZXggZmxleEdyb3cgZmxleFBvc2l0aXZlIGZsZXhTaHJpbmsgZmxleE5lZ2F0aXZlIGZsZXhPcmRlciBncmlkQXJlYSBncmlkUm93IGdyaWRSb3dFbmQgZ3JpZFJvd1NwYW4gZ3JpZFJvd1N0YXJ0IGdyaWRDb2x1bW4gZ3JpZENvbHVtbkVuZCBncmlkQ29sdW1uU3BhbiBncmlkQ29sdW1uU3RhcnQgZm9udFdlaWdodCBsaW5lQ2xhbXAgbGluZUhlaWdodCBvcGFjaXR5IG9yZGVyIG9ycGhhbnMgc2NhbGUgdGFiU2l6ZSB3aWRvd3MgekluZGV4IHpvb20gZmlsbE9wYWNpdHkgZmxvb2RPcGFjaXR5IHN0b3BPcGFjaXR5IHN0cm9rZURhc2hhcnJheSBzdHJva2VEYXNob2Zmc2V0IHN0cm9rZU1pdGVybGltaXQgc3Ryb2tlT3BhY2l0eSBzdHJva2VXaWR0aCBNb3pBbmltYXRpb25JdGVyYXRpb25Db3VudCBNb3pCb3hGbGV4IE1vekJveEZsZXhHcm91cCBNb3pMaW5lQ2xhbXAgbXNBbmltYXRpb25JdGVyYXRpb25Db3VudCBtc0ZsZXggbXNab29tIG1zRmxleEdyb3cgbXNGbGV4TmVnYXRpdmUgbXNGbGV4T3JkZXIgbXNGbGV4UG9zaXRpdmUgbXNGbGV4U2hyaW5rIG1zR3JpZENvbHVtbiBtc0dyaWRDb2x1bW5TcGFuIG1zR3JpZFJvdyBtc0dyaWRSb3dTcGFuIFdlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50IFdlYmtpdEJveEZsZXggV2ViS2l0Qm94RmxleEdyb3VwIFdlYmtpdEJveE9yZGluYWxHcm91cCBXZWJraXRDb2x1bW5Db3VudCBXZWJraXRDb2x1bW5zIFdlYmtpdEZsZXggV2Via2l0RmxleEdyb3cgV2Via2l0RmxleFBvc2l0aXZlIFdlYmtpdEZsZXhTaHJpbmsgV2Via2l0TGluZUNsYW1wXCIuc3BsaXQoXG4gICAgXCIgXCJcbiAgKVxuKTtcbmZ1bmN0aW9uIHNldFZhbHVlRm9yU3R5bGUoc3R5bGUsIHN0eWxlTmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSAwID09PSBzdHlsZU5hbWUuaW5kZXhPZihcIi0tXCIpO1xuICBudWxsID09IHZhbHVlIHx8IFwiYm9vbGVhblwiID09PSB0eXBlb2YgdmFsdWUgfHwgXCJcIiA9PT0gdmFsdWVcbiAgICA/IGlzQ3VzdG9tUHJvcGVydHlcbiAgICAgID8gc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBcIlwiKVxuICAgICAgOiBcImZsb2F0XCIgPT09IHN0eWxlTmFtZVxuICAgICAgICA/IChzdHlsZS5jc3NGbG9hdCA9IFwiXCIpXG4gICAgICAgIDogKHN0eWxlW3N0eWxlTmFtZV0gPSBcIlwiKVxuICAgIDogaXNDdXN0b21Qcm9wZXJ0eVxuICAgICAgPyBzdHlsZS5zZXRQcm9wZXJ0eShzdHlsZU5hbWUsIHZhbHVlKVxuICAgICAgOiBcIm51bWJlclwiICE9PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICAwID09PSB2YWx1ZSB8fFxuICAgICAgICAgIHVuaXRsZXNzTnVtYmVycy5oYXMoc3R5bGVOYW1lKVxuICAgICAgICA/IFwiZmxvYXRcIiA9PT0gc3R5bGVOYW1lXG4gICAgICAgICAgPyAoc3R5bGUuY3NzRmxvYXQgPSB2YWx1ZSlcbiAgICAgICAgICA6IChzdHlsZVtzdHlsZU5hbWVdID0gKFwiXCIgKyB2YWx1ZSkudHJpbSgpKVxuICAgICAgICA6IChzdHlsZVtzdHlsZU5hbWVdID0gdmFsdWUgKyBcInB4XCIpO1xufVxuZnVuY3Rpb24gc2V0VmFsdWVGb3JTdHlsZXMobm9kZSwgc3R5bGVzLCBwcmV2U3R5bGVzKSB7XG4gIGlmIChudWxsICE9IHN0eWxlcyAmJiBcIm9iamVjdFwiICE9PSB0eXBlb2Ygc3R5bGVzKVxuICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNjIpKTtcbiAgbm9kZSA9IG5vZGUuc3R5bGU7XG4gIGlmIChudWxsICE9IHByZXZTdHlsZXMpIHtcbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gcHJldlN0eWxlcylcbiAgICAgICFwcmV2U3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgfHxcbiAgICAgICAgKG51bGwgIT0gc3R5bGVzICYmIHN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB8fFxuICAgICAgICAoMCA9PT0gc3R5bGVOYW1lLmluZGV4T2YoXCItLVwiKVxuICAgICAgICAgID8gbm9kZS5zZXRQcm9wZXJ0eShzdHlsZU5hbWUsIFwiXCIpXG4gICAgICAgICAgOiBcImZsb2F0XCIgPT09IHN0eWxlTmFtZVxuICAgICAgICAgICAgPyAobm9kZS5jc3NGbG9hdCA9IFwiXCIpXG4gICAgICAgICAgICA6IChub2RlW3N0eWxlTmFtZV0gPSBcIlwiKSk7XG4gICAgZm9yICh2YXIgc3R5bGVOYW1lJDE2IGluIHN0eWxlcylcbiAgICAgIChzdHlsZU5hbWUgPSBzdHlsZXNbc3R5bGVOYW1lJDE2XSksXG4gICAgICAgIHN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUkMTYpICYmXG4gICAgICAgICAgcHJldlN0eWxlc1tzdHlsZU5hbWUkMTZdICE9PSBzdHlsZU5hbWUgJiZcbiAgICAgICAgICBzZXRWYWx1ZUZvclN0eWxlKG5vZGUsIHN0eWxlTmFtZSQxNiwgc3R5bGVOYW1lKTtcbiAgfSBlbHNlXG4gICAgZm9yICh2YXIgc3R5bGVOYW1lJDE3IGluIHN0eWxlcylcbiAgICAgIHN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUkMTcpICYmXG4gICAgICAgIHNldFZhbHVlRm9yU3R5bGUobm9kZSwgc3R5bGVOYW1lJDE3LCBzdHlsZXNbc3R5bGVOYW1lJDE3XSk7XG59XG5mdW5jdGlvbiBpc0N1c3RvbUVsZW1lbnQodGFnTmFtZSkge1xuICBpZiAoLTEgPT09IHRhZ05hbWUuaW5kZXhPZihcIi1cIikpIHJldHVybiAhMTtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcImFubm90YXRpb24teG1sXCI6XG4gICAgY2FzZSBcImNvbG9yLXByb2ZpbGVcIjpcbiAgICBjYXNlIFwiZm9udC1mYWNlXCI6XG4gICAgY2FzZSBcImZvbnQtZmFjZS1zcmNcIjpcbiAgICBjYXNlIFwiZm9udC1mYWNlLXVyaVwiOlxuICAgIGNhc2UgXCJmb250LWZhY2UtZm9ybWF0XCI6XG4gICAgY2FzZSBcImZvbnQtZmFjZS1uYW1lXCI6XG4gICAgY2FzZSBcIm1pc3NpbmctZ2x5cGhcIjpcbiAgICAgIHJldHVybiAhMTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICEwO1xuICB9XG59XG52YXIgYWxpYXNlcyA9IG5ldyBNYXAoW1xuICAgIFtcImFjY2VwdENoYXJzZXRcIiwgXCJhY2NlcHQtY2hhcnNldFwiXSxcbiAgICBbXCJodG1sRm9yXCIsIFwiZm9yXCJdLFxuICAgIFtcImh0dHBFcXVpdlwiLCBcImh0dHAtZXF1aXZcIl0sXG4gICAgW1wiY3Jvc3NPcmlnaW5cIiwgXCJjcm9zc29yaWdpblwiXSxcbiAgICBbXCJhY2NlbnRIZWlnaHRcIiwgXCJhY2NlbnQtaGVpZ2h0XCJdLFxuICAgIFtcImFsaWdubWVudEJhc2VsaW5lXCIsIFwiYWxpZ25tZW50LWJhc2VsaW5lXCJdLFxuICAgIFtcImFyYWJpY0Zvcm1cIiwgXCJhcmFiaWMtZm9ybVwiXSxcbiAgICBbXCJiYXNlbGluZVNoaWZ0XCIsIFwiYmFzZWxpbmUtc2hpZnRcIl0sXG4gICAgW1wiY2FwSGVpZ2h0XCIsIFwiY2FwLWhlaWdodFwiXSxcbiAgICBbXCJjbGlwUGF0aFwiLCBcImNsaXAtcGF0aFwiXSxcbiAgICBbXCJjbGlwUnVsZVwiLCBcImNsaXAtcnVsZVwiXSxcbiAgICBbXCJjb2xvckludGVycG9sYXRpb25cIiwgXCJjb2xvci1pbnRlcnBvbGF0aW9uXCJdLFxuICAgIFtcImNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnNcIiwgXCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnNcIl0sXG4gICAgW1wiY29sb3JQcm9maWxlXCIsIFwiY29sb3ItcHJvZmlsZVwiXSxcbiAgICBbXCJjb2xvclJlbmRlcmluZ1wiLCBcImNvbG9yLXJlbmRlcmluZ1wiXSxcbiAgICBbXCJkb21pbmFudEJhc2VsaW5lXCIsIFwiZG9taW5hbnQtYmFzZWxpbmVcIl0sXG4gICAgW1wiZW5hYmxlQmFja2dyb3VuZFwiLCBcImVuYWJsZS1iYWNrZ3JvdW5kXCJdLFxuICAgIFtcImZpbGxPcGFjaXR5XCIsIFwiZmlsbC1vcGFjaXR5XCJdLFxuICAgIFtcImZpbGxSdWxlXCIsIFwiZmlsbC1ydWxlXCJdLFxuICAgIFtcImZsb29kQ29sb3JcIiwgXCJmbG9vZC1jb2xvclwiXSxcbiAgICBbXCJmbG9vZE9wYWNpdHlcIiwgXCJmbG9vZC1vcGFjaXR5XCJdLFxuICAgIFtcImZvbnRGYW1pbHlcIiwgXCJmb250LWZhbWlseVwiXSxcbiAgICBbXCJmb250U2l6ZVwiLCBcImZvbnQtc2l6ZVwiXSxcbiAgICBbXCJmb250U2l6ZU
1FkanVzdFwiLCBcImZvbnQtc2l6ZS1hZGp1c3RcIl0sXG4gICAgW1wiZm9udFN0cmV0Y2hcIiwgXCJmb250LXN0cmV0Y2hcIl0sXG4gICAgW1wiZm9udFN0eWxlXCIsIFwiZm9udC1zdHlsZVwiXSxcbiAgICBbXCJmb250VmFyaWFudFwiLCBcImZvbnQtdmFyaWFudFwiXSxcbiAgICBbXCJmb250V2VpZ2h0XCIsIFwiZm9udC13ZWlnaHRcIl0sXG4gICAgW1wiZ2x5cGhOYW1lXCIsIFwiZ2x5cGgtbmFtZVwiXSxcbiAgICBbXCJnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbFwiLCBcImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWxcIl0sXG4gICAgW1wiZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsXCIsIFwiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWxcIl0sXG4gICAgW1wiaG9yaXpBZHZYXCIsIFwiaG9yaXotYWR2LXhcIl0sXG4gICAgW1wiaG9yaXpPcmlnaW5YXCIsIFwiaG9yaXotb3JpZ2luLXhcIl0sXG4gICAgW1wiaW1hZ2VSZW5kZXJpbmdcIiwgXCJpbWFnZS1yZW5kZXJpbmdcIl0sXG4gICAgW1wibGV0dGVyU3BhY2luZ1wiLCBcImxldHRlci1zcGFjaW5nXCJdLFxuICAgIFtcImxpZ2h0aW5nQ29sb3JcIiwgXCJsaWdodGluZy1jb2xvclwiXSxcbiAgICBbXCJtYXJrZXJFbmRcIiwgXCJtYXJrZXItZW5kXCJdLFxuICAgIFtcIm1hcmtlck1pZFwiLCBcIm1hcmtlci1taWRcIl0sXG4gICAgW1wibWFya2VyU3RhcnRcIiwgXCJtYXJrZXItc3RhcnRcIl0sXG4gICAgW1wib3ZlcmxpbmVQb3NpdGlvblwiLCBcIm92ZXJsaW5lLXBvc2l0aW9uXCJdLFxuICAgIFtcIm92ZXJsaW5lVGhpY2tuZXNzXCIsIFwib3ZlcmxpbmUtdGhpY2tuZXNzXCJdLFxuICAgIFtcInBhaW50T3JkZXJcIiwgXCJwYWludC1vcmRlclwiXSxcbiAgICBbXCJwYW5vc2UtMVwiLCBcInBhbm9zZS0xXCJdLFxuICAgIFtcInBvaW50ZXJFdmVudHNcIiwgXCJwb2ludGVyLWV2ZW50c1wiXSxcbiAgICBbXCJyZW5kZXJpbmdJbnRlbnRcIiwgXCJyZW5kZXJpbmctaW50ZW50XCJdLFxuICAgIFtcInNoYXBlUmVuZGVyaW5nXCIsIFwic2hhcGUtcmVuZGVyaW5nXCJdLFxuICAgIFtcInN0b3BDb2xvclwiLCBcInN0b3AtY29sb3JcIl0sXG4gICAgW1wic3RvcE9wYWNpdHlcIiwgXCJzdG9wLW9wYWNpdHlcIl0sXG4gICAgW1wic3RyaWtldGhyb3VnaFBvc2l0aW9uXCIsIFwic3RyaWtldGhyb3VnaC1wb3NpdGlvblwiXSxcbiAgICBbXCJzdHJpa2V0aHJvdWdoVGhpY2tuZXNzXCIsIFwic3RyaWtldGhyb3VnaC10aGlja25lc3NcIl0sXG4gICAgW1wic3Ryb2tlRGFzaGFycmF5XCIsIFwic3Ryb2tlLWRhc2hhcnJheVwiXSxcbiAgICBbXCJzdHJva2VEYXNob2Zmc2V0XCIsIFwic3Ryb2tlLWRhc2hvZmZzZXRcIl0sXG4gICAgW1wic3Ryb2tlTGluZWNhcFwiLCBcInN0cm9rZS1saW5lY2FwXCJdLFxuICAgIFtcInN0cm9rZUxpbmVqb2luXCIsIFwic3Ryb2tlLWxpbmVqb2luXCJdLFxuICAgIFtcInN0cm9rZU1pdGVybGltaXRcIiwgXCJzdHJva2UtbWl0ZXJsaW1pdFwiXSxcbiAgICBbXCJzdHJva2VPcGFjaXR5XCIsIFwic3Ryb2tlLW9wYWNpdHlcIl0sXG4gICAgW1wic3Ryb2tlV2lkdGhcIiwgXCJzdHJva2Utd2lkdGhcIl0sXG4gICAgW1widGV4dEFuY2hvclwiLCBcInRleHQtYW5jaG9yXCJdLFxuICAgIFtcInRleHREZWNvcmF0aW9uXCIsIFwidGV4dC1kZWNvcmF0aW9uXCJdLFxuICAgIFtcInRleHRSZW5kZXJpbmdcIiwgXCJ0ZXh0LXJlbmRlcmluZ1wiXSxcbiAgICBbXCJ0cmFuc2Zvcm1PcmlnaW5cIiwgXCJ0cmFuc2Zvcm0tb3JpZ2luXCJdLFxuICAgIFtcInVuZGVybGluZVBvc2l0aW9uXCIsIFwidW5kZXJsaW5lLXBvc2l0aW9uXCJdLFxuICAgIFtcInVuZGVybGluZVRoaWNrbmVzc1wiLCBcInVuZGVybGluZS10aGlja25lc3NcIl0sXG4gICAgW1widW5pY29kZUJpZGlcIiwgXCJ1bmljb2RlLWJpZGlcIl0sXG4gICAgW1widW5pY29kZVJhbmdlXCIsIFwidW5pY29kZS1yYW5nZVwiXSxcbiAgICBbXCJ1bml0c1BlckVtXCIsIFwidW5pdHMtcGVyLWVtXCJdLFxuICAgIFtcInZBbHBoYWJldGljXCIsIFwidi1hbHBoYWJldGljXCJdLFxuICAgIFtcInZIYW5naW5nXCIsIFwidi1oYW5naW5nXCJdLFxuICAgIFtcInZJZGVvZ3JhcGhpY1wiLCBcInYtaWRlb2dyYXBoaWNcIl0sXG4gICAgW1widk1hdGhlbWF0aWNhbFwiLCBcInYtbWF0aGVtYXRpY2FsXCJdLFxuICAgIFtcInZlY3RvckVmZmVjdFwiLCBcInZlY3Rvci1lZmZlY3RcIl0sXG4gICAgW1widmVydEFkdllcIiwgXCJ2ZXJ0LWFkdi15XCJdLFxuICAgIFtcInZlcnRPcmlnaW5YXCIsIFwidmVydC1vcmlnaW4teFwiXSxcbiAgICBbXCJ2ZXJ0T3JpZ2luWVwiLCBcInZlcnQtb3Jp
1Z2luLXlcIl0sXG4gICAgW1wid29yZFNwYWNpbmdcIiwgXCJ3b3JkLXNwYWNpbmdcIl0sXG4gICAgW1wid3JpdGluZ01vZGVcIiwgXCJ3cml0aW5nLW1vZGVcIl0sXG4gICAgW1wieG1sbnNYbGlua1wiLCBcInhtbG5zOnhsaW5rXCJdLFxuICAgIFtcInhIZWlnaHRcIiwgXCJ4LWhlaWdodFwiXVxuICBdKSxcbiAgaXNKYXZhU2NyaXB0UHJvdG9jb2wgPVxuICAgIC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyXFxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSo6L2k7XG5mdW5jdGlvbiBzYW5pdGl6ZVVSTCh1cmwpIHtcbiAgcmV0dXJuIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QoXCJcIiArIHVybClcbiAgICA/IFwiamF2YXNjcmlwdDp0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IGhhcyBibG9ja2VkIGEgamF2YXNjcmlwdDogVVJMIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4nKVwiXG4gICAgOiB1cmw7XG59XG52YXIgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSB7XG4gIG5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93O1xuICBuYXRpdmVFdmVudC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCAmJlxuICAgIChuYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtcbiAgcmV0dXJuIDMgPT09IG5hdGl2ZUV2ZW50Lm5vZGVUeXBlID8gbmF0aXZlRXZlbnQucGFyZW50Tm9kZSA6IG5hdGl2ZUV2ZW50O1xufVxudmFyIHJlc3RvcmVUYXJnZXQgPSBudWxsLFxuICByZXN0b3JlUXVldWUgPSBudWxsO1xuZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXQpO1xuICBpZiAoaW50ZXJuYWxJbnN0YW5jZSAmJiAodGFyZ2V0ID0gaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUpKSB7XG4gICAgdmFyIHByb3BzID0gdGFyZ2V0W2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG4gICAgYTogc3dpdGNoICgoKHRhcmdldCA9IGludGVybmFsSW5zdGFuY2Uuc3RhdGVOb2RlKSwgaW50ZXJuYWxJbnN0YW5jZS50eXBlKSkge1xuICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgIHVwZGF0ZUlucHV0KFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wcy52YWx1ZSxcbiAgICAgICAgICBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgIHByb3BzLmNoZWNrZWQsXG4gICAgICAgICAgcHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgICAgICAgcHJvcHMudHlwZSxcbiAgICAgICAgICBwcm9wcy5uYW1lXG4gICAgICAgICk7XG4gICAgICAgIGludGVybmFsSW5zdGFuY2UgPSBwcm9wcy5uYW1lO1xuICAgICAgICBpZiAoXCJyYWRpb1wiID09PSBwcm9wcy50eXBlICYmIG51bGwgIT0gaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgICAgIGZvciAocHJvcHMgPSB0YXJnZXQ7IHByb3BzLnBhcmVudE5vZGU7ICkgcHJvcHMgPSBwcm9wcy5wYXJlbnROb2RlO1xuICAgICAgICAgIHByb3BzID0gcHJvcHMucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICdpbnB1dFtuYW1lPVwiJyArXG4gICAgICAgICAgICAgIGVzY2FwZVNlbGVjdG9yQXR0cmlidXRlVmFsdWVJbnNpZGVEb3VibGVRdW90ZXMoXG4gICAgICAgICAgICAgICAgXCJcIiArIGludGVybmFsSW5zdGFuY2VcbiAgICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAgICdcIl1bdHlwZT1cInJhZGlvXCJdJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIGludGVybmFsSW5zdGFuY2UgPSAwO1xuICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZSA8IHByb3BzLmxlbmd0aDtcbiAgICAgICAgICAgIGludGVybmFsSW5zdGFuY2UrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdmFyIG90aGVyTm9kZSA9IHByb3BzW2ludGVybmFsSW5zdGFuY2VdO1xuICAgICAgICAgICAgaWYgKG90aGVyTm9kZSAhPT0gdGFyZ2V0ICYmIG90aGVyTm9kZS5mb3JtID09PSB0YXJnZXQuZm9ybSkge1xuICAgICAgICAgICAgICB2Y
1XIgb3RoZXJQcm9wcyA9IG90aGVyTm9kZVtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xuICAgICAgICAgICAgICBpZiAoIW90aGVyUHJvcHMpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOTApKTtcbiAgICAgICAgICAgICAgdXBkYXRlSW5wdXQoXG4gICAgICAgICAgICAgICAgb3RoZXJOb2RlLFxuICAgICAgICAgICAgICAgIG90aGVyUHJvcHMudmFsdWUsXG4gICAgICAgICAgICAgICAgb3RoZXJQcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgICAgb3RoZXJQcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgICAgb3RoZXJQcm9wcy5jaGVja2VkLFxuICAgICAgICAgICAgICAgIG90aGVyUHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgICAgICAgICAgICAgb3RoZXJQcm9wcy50eXBlLFxuICAgICAgICAgICAgICAgIG90aGVyUHJvcHMubmFtZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZSA9IDA7XG4gICAgICAgICAgICBpbnRlcm5hbEluc3RhbmNlIDwgcHJvcHMubGVuZ3RoO1xuICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZSsrXG4gICAgICAgICAgKVxuICAgICAgICAgICAgKG90aGVyTm9kZSA9IHByb3BzW2ludGVybmFsSW5zdGFuY2VdKSxcbiAgICAgICAgICAgICAgb3RoZXJOb2RlLmZvcm0gPT09IHRhcmdldC5mb3JtICYmIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG90aGVyTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWsgYTtcbiAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICB1cGRhdGVUZXh0YXJlYSh0YXJnZXQsIHByb3BzLnZhbHVlLCBwcm9wcy5kZWZhdWx0VmFsdWUpO1xuICAgICAgICBicmVhayBhO1xuICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICAoaW50ZXJuYWxJbnN0YW5jZSA9IHByb3BzLnZhbHVlKSxcbiAgICAgICAgICBudWxsICE9IGludGVybmFsSW5zdGFuY2UgJiZcbiAgICAgICAgICAgIHVwZGF0ZU9wdGlvbnModGFyZ2V0LCAhIXByb3BzLm11bHRpcGxlLCBpbnRlcm5hbEluc3RhbmNlLCAhMSk7XG4gICAgfVxuICB9XG59XG52YXIgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSAhMTtcbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEsIGIpIHtcbiAgaWYgKGlzSW5zaWRlRXZlbnRIYW5kbGVyKSByZXR1cm4gZm4oYSwgYik7XG4gIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gITA7XG4gIHRyeSB7XG4gICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9IGZuKGEpO1xuICAgIHJldHVybiBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQ7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKFxuICAgICAgKChpc0luc2lkZUV2ZW50SGFuZGxlciA9ICExKSxcbiAgICAgIG51bGwgIT09IHJlc3RvcmVUYXJnZXQgfHwgbnVsbCAhPT0gcmVzdG9yZVF1ZXVlKVxuICAgIClcbiAgICAgIGlmIChcbiAgICAgICAgKGZsdXNoU3luY1dvcmskMSgpLFxuICAgICAgICByZXN0b3JlVGFyZ2V0ICYmXG4gICAgICAgICAgKChhID0gcmVzdG9yZVRhcmdldCksXG4gICAgICAgICAgKGZuID0gcmVzdG9yZVF1ZXVlKSxcbiAgICAgICAgICAocmVzdG9yZVF1ZXVlID0gcmVzdG9yZVRhcmdldCA9IG51bGwpLFxuICAgICAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KGEpLFxuICAgICAgICAgIGZuKSlcbiAgICAgIClcbiAgICAgICAgZm9yIChhID0gMDsgYSA8IGZuLmxlbmd0aDsgYSsrKSByZXN0b3JlU3RhdGVPZlRhcmdldChmblthXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgdmFyIHN0YXRlTm9kZSA9IGluc3Quc3RhdGVOb2RlO1xuICBpZiAobnVsbCA9PT0gc3RhdGVOb2RlKSByZXR1cm4gbnVsbDtcbiAgdmFyIHByb3BzID0gc3RhdGVOb2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG4gIGlmIChudWxsID09PSBwcm9wcykgcmV0dXJuIG51bGw7XG4gIHN0YXRlTm9kZSA9IHByb3BzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICBhOiBzd2l0Y2ggKHJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICBjYXNlIFwib25DbGlja1wiOlxuICAgIGNhc2UgXCJvbkNsaWNrQ2FwdHVyZVwiOlxuICAgIGNhc2UgXCJvbkRvdWJsZUNsaWNrXCI6XG4gICAgY2FzZSBcIm9uRG91YmxlQ2xpY2tDYXB0dXJlXCI6XG4gICAgY2FzZSBcIm9uTW91c2VEb3duXCI6XG4gICAgY2FzZSBcIm9uTW91c2VEb3duQ2FwdHVyZVwiOlxuICAgIGNhc2UgXCJvbk1vdXNlTW92ZVwiOlxuICAgIGNhc2UgXCJvbk1vdXNlTW92ZUNhcHR1cmVcIjpcbiAgICBjYXNlIFwib25Nb3VzZVVwXCI6XG4gICAgY2FzZSBcIm9uTW91c2VVcENhcHR1cmVcIjpcbiAgICBjYXNlIFwib25Nb3VzZUVudGVyXCI6XG4gICAgICAocHJvcHMgPSAhcHJvcHMuZGlzYWJsZWQpIHx8XG4gICAgICAgICgoaW5zdCA9IGluc3QudHlwZSksXG4gICAgICAgIChwcm9wcyA9ICEoXG4gICAgICAgICAgXCJidXR0b25cIiA9PT0gaW5zdCB8fFxuICAgICAgICAgIFwiaW5wdXRcIiA9PT0gaW5zdCB8fFxuICAgICAgICAgIFwic2VsZWN0XCIgPT09IGluc3QgfHxcbiAgICAgICAgICBcInRleHRhcmVhXCIgPT09IGluc3RcbiAgICAgICAgKSkpO1xuICAgICAgaW5zdCA9ICFwcm9wcztcbiAgICAgIGJyZWFrIGE7XG4gICAgZGVmYXVsdDpcbiAgICAgIGluc3QgPSAhMTtcbiAgfVxuICBpZiAoaW5zdCkgcmV0dXJuIG51bGw7XG4gIGlmIChzdGF0ZU5vZGUgJiYgXCJmdW5jdGlvblwiICE9PSB0eXBlb2Ygc3RhdGVOb2RlKVxuICAgIHRocm93IEVycm9yKFxuICAgICAgZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMzEsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBzdGF0ZU5vZGUpXG4gICAgKTtcbiAgcmV0dXJuIHN0YXRlTm9kZTtcbn1cbnZhciBjYW5Vc2VET00gPSAhKFxuICAgIFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB3aW5kb3cgfHxcbiAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2Ygd2luZG93LmRvY3VtZW50IHx8XG4gICAgXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50XG4gICksXG4gIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gITE7XG5pZiAoY2FuVXNlRE9NKVxuICB0cnkge1xuICAgIHZhciBvcHRpb25zID0ge307XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdGlvbnMsIFwicGFzc2l2ZVwiLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSAhMDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIiwgb3B0aW9ucywgb3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSAhMTtcbiAgfVxudmFyIHJvb3QgPSBudWxsLFxuICBzdGFydFRleHQgPSBudWxsLFxuICBmYWxsYmFja1RleHQgPSBudWxsO1xuZnVuY3Rpb24gZ2V0RGF0YSgpIHtcbiAgaWYgKGZhbGxiYWNrVGV4dCkgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgdmFyIHN0YXJ0LFxuICAgIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQsXG4gICAgc3RhcnRMZW5ndGggPSBzdGFydFZhbHVlLmxlbmd0aCxcbiAgICBlbmQsXG4gICAgZW5kVmFsdWUgPSBcInZhbHVlXCIgaW4gcm9vdCA/IHJvb3QudmFsdWUgOiByb290LnRleHRDb250ZW50LFxuICAgIGVuZExlbmd0aCA9IGVuZFZhbHVlLmxlbmd0aDtcbiAgZm9yIChcbiAgICBzdGFydCA9IDA7XG4gICAgc3RhcnQgPCBzdGFydExlbmd0aCAmJi
1BzdGFydFZhbHVlW3N0YXJ0XSA9PT0gZW5kVmFsdWVbc3RhcnRdO1xuICAgIHN0YXJ0KytcbiAgKTtcbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG4gIGZvciAoXG4gICAgZW5kID0gMTtcbiAgICBlbmQgPD0gbWluRW5kICYmXG4gICAgc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gPT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF07XG4gICAgZW5kKytcbiAgKTtcbiAgcmV0dXJuIChmYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgMSA8IGVuZCA/IDEgLSBlbmQgOiB2b2lkIDApKTtcbn1cbmZ1bmN0aW9uIGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGtleUNvZGUgPSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuICBcImNoYXJDb2RlXCIgaW4gbmF0aXZlRXZlbnRcbiAgICA/ICgobmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudC5jaGFyQ29kZSksXG4gICAgICAwID09PSBuYXRpdmVFdmVudCAmJiAxMyA9PT0ga2V5Q29kZSAmJiAobmF0aXZlRXZlbnQgPSAxMykpXG4gICAgOiAobmF0aXZlRXZlbnQgPSBrZXlDb2RlKTtcbiAgMTAgPT09IG5hdGl2ZUV2ZW50ICYmIChuYXRpdmVFdmVudCA9IDEzKTtcbiAgcmV0dXJuIDMyIDw9IG5hdGl2ZUV2ZW50IHx8IDEzID09PSBuYXRpdmVFdmVudCA/IG5hdGl2ZUV2ZW50IDogMDtcbn1cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlKCkge1xuICByZXR1cm4gITA7XG59XG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UoKSB7XG4gIHJldHVybiAhMTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEludGVyZmFjZSkge1xuICBmdW5jdGlvbiBTeW50aGV0aWNCYXNlRXZlbnQoXG4gICAgcmVhY3ROYW1lLFxuICAgIHJlYWN0RXZlbnRUeXBlLFxuICAgIHRhcmdldEluc3QsXG4gICAgbmF0aXZlRXZlbnQsXG4gICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgKSB7XG4gICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICAgIHRoaXMudHlwZSA9IHJlYWN0RXZlbnRUeXBlO1xuICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gSW50ZXJmYWNlKVxuICAgICAgSW50ZXJmYWNlLmhhc093blByb3BlcnR5KHByb3BOYW1lKSAmJlxuICAgICAgICAoKHJlYWN0TmFtZSA9IEludGVyZmFjZVtwcm9wTmFtZV0pLFxuICAgICAgICAodGhpc1twcm9wTmFtZV0gPSByZWFjdE5hbWVcbiAgICAgICAgICA/IHJlYWN0TmFtZShuYXRpdmVFdmVudClcbiAgICAgICAgICA6IG5hdGl2ZUV2ZW50W3Byb3BOYW1lXSkpO1xuICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gKFxuICAgICAgbnVsbCAhPSBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkXG4gICAgICAgID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZFxuICAgICAgICA6ICExID09PSBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZVxuICAgIClcbiAgICAgID8gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWVcbiAgICAgIDogZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gITA7XG4gICAgICB2Y
1XIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuICAgICAgZXZlbnQgJiZcbiAgICAgICAgKGV2ZW50LnByZXZlbnREZWZhdWx0XG4gICAgICAgICAgPyBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgOiBcInVua25vd25cIiAhPT0gdHlwZW9mIGV2ZW50LnJldHVyblZhbHVlICYmIChldmVudC5yZXR1cm5WYWx1ZSA9ICExKSxcbiAgICAgICAgKHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWUpKTtcbiAgICB9LFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcbiAgICAgIGV2ZW50ICYmXG4gICAgICAgIChldmVudC5zdG9wUHJvcGFnYXRpb25cbiAgICAgICAgICA/IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgOiBcInVua25vd25cIiAhPT0gdHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAmJlxuICAgICAgICAgICAgKGV2ZW50LmNhbmNlbEJ1YmJsZSA9ICEwKSxcbiAgICAgICAgKHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSkpO1xuICAgIH0sXG4gICAgcGVyc2lzdDogZnVuY3Rpb24gKCkge30sXG4gICAgaXNQZXJzaXN0ZW50OiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICB9KTtcbiAgcmV0dXJuIFN5bnRoZXRpY0Jhc2VFdmVudDtcbn1cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgICBldmVudFBoYXNlOiAwLFxuICAgIGJ1YmJsZXM6IDAsXG4gICAgY2FuY2VsYWJsZTogMCxcbiAgICB0aW1lU3RhbXA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuICAgIH0sXG4gICAgZGVmYXVsdFByZXZlbnRlZDogMCxcbiAgICBpc1RydXN0ZWQ6IDBcbiAgfSxcbiAgU3ludGhldGljRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChFdmVudEludGVyZmFjZSksXG4gIFVJRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7IHZpZXc6IDAsIGRldGFpbDogMCB9KSxcbiAgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpLFxuICBsYXN0TW92ZW1lbnRYLFxuICBsYXN0TW92ZW1lbnRZLFxuICBsYXN0TW91c2VFdmVudCxcbiAgTW91c2VFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICAgIHNjcmVlblg6IDAsXG4gICAgc2NyZWVuWTogMCxcbiAgICBjbGllbnRYOiAwLFxuICAgIGNsaWVudFk6IDAsXG4gICAgcGFnZVg6IDAsXG4gICAgcGFnZVk6IDAsXG4gICAgY3RybEtleTogMCxcbiAgICBzaGlmdEtleTogMCxcbiAgICBhbHRLZXk6IDAsXG4gICAgbWV0YUtleTogMCxcbiAgICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gICAgYnV0dG9uOiAwLFxuICAgIGJ1dHRvbnM6IDAsXG4gICAgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gdm9pZCAwID09PSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgID8gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnRcbiAgICAgICAgICA/IGV2ZW50LnRvRWxlbWVudFxuICAgICAgICAgIDogZXZlbnQuZnJvbUVsZW1lbnRcbiAgICAgICAgOiBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAgIH0sXG4gICAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChcIm1vdmVtZW50WFwiIGluIGV2ZW50KSByZXR1cm4gZXZlbnQubW92ZW1lbnRYO1xuICAgICAgZXZlbnQgIT09IGxhc3RNb3VzZUV2ZW50ICYmXG4gICAgICAgIChsYXN0TW91c2VFdmVudCAmJiBcIm1vdXNlbW92ZVwiID09PSBldmVudC50eXBlXG4gICAgICAgICAgPyAoKGxhc3RNb3ZlbWVudFggPSBldmVudC5zY3JlZW5YIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWCksXG4gICAgICAgICAgICAobGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZKSlcbiAgICAgICAgICA6IChsYXN0TW92ZW1lbnRZID0gbGFzdE1vdmVtZW50WCA9IDApLFxuICAgICAgICAobGFzdE1vdXNlRXZlbnQgPSBldmVudCkpO1xuICAgICAgcmV0dXJuIGxhc3RNb3ZlbWVudFg7XG4gICAgfSxcbiAgICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgcmV0dXJuIFwibW92ZW1lbnRZXCIgaW4gZXZlbnQgPyBldmVudC5tb3ZlbWVudFkgOiBsYXN0TW92ZW1lbnRZO1xuICAgIH1cbiAgfSksXG4gIFN5bnRoZXRpY01vdXNlRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChNb3VzZUV2ZW50SW50ZXJmYWNlKSxcbiAgRHJhZ0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7IGRhdGFUcmFuc2ZlcjogMCB9KSxcbiAgU3ludGhldGljRHJhZ0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRHJhZ0V2ZW50SW50ZXJmYWNlKSxcbiAgRm9jdXNFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwgeyByZWxhdGVkVGFyZ2V0OiAwIH0pLFxuICBTeW50aGV0aWNGb2N1c0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRm9jdXNFdmVudEludGVyZmFjZSksXG4gIEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICAgIGFuaW1hdGlvbk5hbWU6IDAsXG4gICAgZWxhcHNlZFRpbWU6IDAsXG4gICAgcHNldWRvRWxlbWVudDogMFxuICB9KSxcbiAgU3ludGhldGljQW5pbWF0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChBbmltYXRpb25FdmVudEludGVyZmFjZSksXG4gIENsaXBib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICAgIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgcmV0dXJuIFwiY2xpcGJvYXJkRGF0YVwiIGluIGV2ZW50XG4gICAgICAgID8gZXZlbnQuY2xpcGJvYXJkRGF0YVxuICAgICAgICA6IHdpbmRvdy5jbGlwYm9hcmREYXRhO1xuICAgIH1cbiAgfSksXG4gIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ2xpcGJvYXJkRXZlbn
1RJbnRlcmZhY2UpLFxuICBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwgeyBkYXRhOiAwIH0pLFxuICBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSksXG4gIG5vcm1hbGl6ZUtleSA9IHtcbiAgICBFc2M6IFwiRXNjYXBlXCIsXG4gICAgU3BhY2ViYXI6IFwiIFwiLFxuICAgIExlZnQ6IFwiQXJyb3dMZWZ0XCIsXG4gICAgVXA6IFwiQXJyb3dVcFwiLFxuICAgIFJpZ2h0OiBcIkFycm93UmlnaHRcIixcbiAgICBEb3duOiBcIkFycm93RG93blwiLFxuICAgIERlbDogXCJEZWxldGVcIixcbiAgICBXaW46IFwiT1NcIixcbiAgICBNZW51OiBcIkNvbnRleHRNZW51XCIsXG4gICAgQXBwczogXCJDb250ZXh0TWVudVwiLFxuICAgIFNjcm9sbDogXCJTY3JvbGxMb2NrXCIsXG4gICAgTW96UHJpbnRhYmxlS2V5OiBcIlVuaWRlbnRpZmllZFwiXG4gIH0sXG4gIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAgIDg6IFwiQmFja3NwYWNlXCIsXG4gICAgOTogXCJUYWJcIixcbiAgICAxMjogXCJDbGVhclwiLFxuICAgIDEzOiBcIkVudGVyXCIsXG4gICAgMTY6IFwiU2hpZnRcIixcbiAgICAxNzogXCJDb250cm9sXCIsXG4gICAgMTg6IFwiQWx0XCIsXG4gICAgMTk6IFwiUGF1c2VcIixcbiAgICAyMDogXCJDYXBzTG9ja1wiLFxuICAgIDI3OiBcIkVzY2FwZVwiLFxuICAgIDMyOiBcIiBcIixcbiAgICAzMzogXCJQYWdlVXBcIixcbiAgICAzNDogXCJQYWdlRG93blwiLFxuICAgIDM1OiBcIkVuZFwiLFxuICAgIDM2OiBcIkhvbWVcIixcbiAgICAzNzogXCJBcnJvd0xlZnRcIixcbiAgICAzODogXCJBcnJvd1VwXCIsXG4gICAgMzk6IFwiQXJyb3dSaWdodFwiLFxuICAgIDQwOiBcIkFycm93RG93blwiLFxuICAgIDQ1OiBcIkluc2VydFwiLFxuICAgIDQ2OiBcIkRlbGV0ZVwiLFxuICAgIDExMjogXCJGMVwiLFxuICAgIDExMzogXCJGMlwiLFxuICAgIDExNDogXCJGM1wiLFxuICAgIDExNTogXCJGNFwiLFxuICAgIDExNjogXCJGNVwiLFxuICAgIDExNzogXCJGNlwiLFxuICAgIDExODogXCJGN1wiLFxuICAgIDExOTogXCJGOFwiLFxuICAgIDEyMDogXCJGOVwiLFxuICAgIDEyMTogXCJGMTBcIixcbiAgICAxMjI6IFwiRjExXCIsXG4gICAgMTIzOiBcIkYxMlwiLFxuICAgIDE0NDogXCJOdW1Mb2NrXCIsXG4gICAgMTQ1OiBcIlNjcm9sbExvY2tcIixcbiAgICAyMjQ6IFwiTWV0YVwiXG4gIH0sXG4gIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICAgIEFsdDogXCJhbHRLZXlcIixcbiAgICBDb250cm9sOiBcImN0cmxLZXlcIixcbiAgICBNZXRhOiBcIm1ldGFLZXlcIixcbiAgICBTaGlmdDogXCJzaGlmdEtleVwiXG4gIH07XG5mdW5jdGlvbiBtb2RpZmllclN0YXRlR2V0dGVyKGtleUFyZykge1xuICB2YXIgbmF0aXZlRXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuICByZXR1cm4gbmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZVxuICAgID8gbmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShrZXlBcmcpXG4gICAgOiAoa2V5QXJnID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXSlcbiAgICAgID8gISFuYXRpdmVFdmVudFtrZXlBcmddXG4gICAgICA6ICExO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRNb2RpZmllclN0YXRlKCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gICAga2V5OiBmdW5jdGlvbiAobmF0aXZlRXZlbnQpIHtcbiAgICAgIGlmIChuYXRpdmVFdmVudC5rZXkpIHtcbiAgICAgICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleVtuYXRpdmVFdmVudC5rZXldIHx8IG5hdGl2ZUV2ZW50LmtleTtcbiAgICAgICAgaWYgKFwiVW5pZGVudGlmaWVkXCIgIT09IGtleSkgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBcImtleXByZXNzXCIgPT09IG5hdGl2ZUV2ZW50LnR5cGVcbiAgICAgICAgPyAoKG5hdGl2ZUV2ZW50ID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkpLFxuICAgICAgICAgIDEzID09PSBuYXRpdmVFdmVudCA/IFwiRW50ZXJcIiA6IFN0cmluZy5mcm9tQ2hhckNvZGUobmF0aXZlRXZlbnQpKVxuICAgICAgICA6IFwia2V5ZG93blwiID09PSBuYXRpdmVFdmVudC50eXBlIHx8IFwia2V5dXBcIiA9PT0gbmF0aXZlRXZlbnQudHlwZVxuICAgICAgICAgID8gdHJhbnNsYXRlVG9LZXlbbmF0aXZlRXZlbnQua2V5Q29kZV0gfHwgXCJVbmlkZW50aWZpZWRcIlxuICAgICAgICAgIDogXCJcIjtcbiAgICB9LFxuICAgIGNvZGU6IDAsXG4gICAgbG9jYXRpb246IDAsXG4gICAgY3RybEtleTogMCxcbiAgICBzaGlmdEtleTogMCxcbiAgICBhbHRLZXk6IDAsXG4gICAgbWV0YUtleTogMCxcbiAgICByZXBlYXQ6IDAsXG4gICAgbG9jYWxlOiAwLFxuICAgIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gXCJrZXlwcmVzc1wiID09PSBldmVudC50eXBlID8gZ2V0RXZlbnRDaGFyQ29kZShldmVudCkgOiAwO1xuICAgIH0sXG4gICAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gXCJrZXlkb3duXCIgPT09IGV2ZW50LnR5cGUgfHwgXCJrZXl1cFwiID09PSBldmVudC50eXBlXG4gICAgICAgID8gZXZlbnQua2V5Q29kZVxuICAgICAgICA6IDA7XG4gICAgfSxcbiAgICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gXCJrZXlwcmVzc1wiID09PSBldmVudC50eXBlXG4gICAgICAgID8gZ2V0RXZlbnRDaGFyQ29kZShldmVudClcbiAgICAgICAgOiBcImtleWRvd25cIiA9PT0gZXZlbnQudHlwZSB8fCBcImtleXVwXCIgPT09IGV2ZW50LnR5cGVcbiAgICAgICAgICA/IGV2ZW50LmtleUNvZGVcbiAgICAgICAgICA6IDA7XG4gICAgfVxuICB9KSxcbiAgU3ludGhldGljS2V5Ym9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEtleWJvYXJkRXZlbnRJbnRlcmZhY2UpLFxuICBQb2ludGVyRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgICBwb2ludGVySWQ6IDAsXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHByZXNzdXJlOiAwLFxuICAgIHRhbmdlbnRpYWxQcmVzc3VyZTogMCxcbiAgICB0aWx0WDogMCxcbiAgICB0aWx0WTogMCxcbiAgICB0d2lzdDogMCxcbiAgICBwb2ludGVyVHlwZTogMCxcbiAgICBpc1ByaW1hcnk6IDBcbiAgfSksXG4gIFN5bnRoZXRpY1BvaW50ZXJFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFBvaW50ZXJFdmVudEludGVyZmFjZSksXG4gIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgICB0b3VjaGVzOiAwLFxuICAgIHRhcmdldFRvdWNoZXM6IDAsXG4gICAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gICAgYWx0S2V5OiAwLFxuICAgIG1ldGFLZXk6IDAsXG4gICAgY3RybEtleTogMCxcbiAgICBzaGlmdEtleTogMCxcbiAgICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGVcbiAgfSksXG4gIFN5bnRoZXRpY1RvdWNoRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUb3VjaEV2ZW50SW50ZXJmYWNlKSxcbiAgVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICAgIHByb3BlcnR5TmFtZTogMCxcbiAgICBlbGFwc2VkVGltZTogMCxcbiAgICBwc2V1ZG9FbGVtZW50OiAwXG4gIH0pLFxuICBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UpLFxuICBXaGVlbEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gICAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHJldHVybi
1BcImRlbHRhWFwiIGluIGV2ZW50XG4gICAgICAgID8gZXZlbnQuZGVsdGFYXG4gICAgICAgIDogXCJ3aGVlbERlbHRhWFwiIGluIGV2ZW50XG4gICAgICAgICAgPyAtZXZlbnQud2hlZWxEZWx0YVhcbiAgICAgICAgICA6IDA7XG4gICAgfSxcbiAgICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgcmV0dXJuIFwiZGVsdGFZXCIgaW4gZXZlbnRcbiAgICAgICAgPyBldmVudC5kZWx0YVlcbiAgICAgICAgOiBcIndoZWVsRGVsdGFZXCIgaW4gZXZlbnRcbiAgICAgICAgICA/IC1ldmVudC53aGVlbERlbHRhWVxuICAgICAgICAgIDogXCJ3aGVlbERlbHRhXCIgaW4gZXZlbnRcbiAgICAgICAgICAgID8gLWV2ZW50LndoZWVsRGVsdGFcbiAgICAgICAgICAgIDogMDtcbiAgICB9LFxuICAgIGRlbHRhWjogMCxcbiAgICBkZWx0YU1vZGU6IDBcbiAgfSksXG4gIFN5bnRoZXRpY1doZWVsRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChXaGVlbEV2ZW50SW50ZXJmYWNlKSxcbiAgVG9nZ2xlRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gICAgbmV3U3RhdGU6IDAsXG4gICAgb2xkU3RhdGU6IDBcbiAgfSksXG4gIFN5bnRoZXRpY1RvZ2dsZUV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG9nZ2xlRXZlbnRJbnRlcmZhY2UpLFxuICBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl0sXG4gIGNhblVzZUNvbXBvc2l0aW9uRXZlbnQgPSBjYW5Vc2VET00gJiYgXCJDb21wb3NpdGlvbkV2ZW50XCIgaW4gd2luZG93LFxuICBkb2N1bWVudE1vZGUgPSBudWxsO1xuY2FuVXNlRE9NICYmXG4gIFwiZG9jdW1lbnRNb2RlXCIgaW4gZG9jdW1lbnQgJiZcbiAgKGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZSk7XG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBjYW5Vc2VET00gJiYgXCJUZXh0RXZlbnRcIiBpbiB3aW5kb3cgJiYgIWRvY3VtZW50TW9kZSxcbiAgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPVxuICAgIGNhblVzZURPTSAmJlxuICAgICghY2FuVXNlQ29tcG9zaXRpb25FdmVudCB8fFxuICAgICAgKGRvY3VtZW50TW9kZSAmJiA4IDwgZG9jdW1lbnRNb2RlICYmIDExID49IGRvY3VtZW50TW9kZSkpLFxuICBTUEFDRUJBUl9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZSgzMiksXG4gIGhhc1NwYWNlS2V5cHJlc3MgPSAhMTtcbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSBcImtleXVwXCI6XG4gICAgICByZXR1cm4gLTEgIT09IEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpO1xuICAgIGNhc2UgXCJrZXlkb3duXCI6XG4gICAgICByZXR1cm4gMjI5ICE9PSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuICAgIGNhc2UgXCJrZXlwcmVzc1wiOlxuICAgIGNhc2UgXCJtb3VzZWRvd25cIjpcbiAgICBjYXNlIFwiZm9jdXNvdXRcIjpcbiAgICAgIHJldHVybiAhMDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICExO1xuICB9XG59XG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIG5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQuZGV0YWlsO1xuICByZXR1cm4gXCJvYmplY3RcIiA9PT0gdHlwZW9mIG5hdGl2ZUV2ZW50ICYmIFwiZGF0YVwiIGluIG5hdGl2ZUV2ZW50XG4gICAgPyBuYXRpdmVFdmVudC5kYXRhXG4gICAgOiBudWxsO1xufVxudmFyIGlzQ29tcG9zaW5nID0gITE7XG5mdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICBjYXNlIFwia2V5cHJlc3NcIjpcbiAgICAgIGlmICgzMiAhPT0gbmF0aXZlRXZlbnQud2hpY2gpIHJldHVybiBudWxsO1xuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9ICEwO1xuICAgICAgcmV0dXJuIFNQQUNFQkFSX0NIQVI7XG4gICAgY2FzZSBcInRleHRJbnB1dFwiOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGRvbUV2ZW50TmFtZSA9IG5hdGl2ZUV2ZW50LmRhdGEpLFxuICAgICAgICBkb21FdmVudE5hbWUgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzcyA/IG51bGwgOiBkb21FdmVudE5hbWVcbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBpZiAoaXNDb21wb3NpbmcpXG4gICAgcmV0dXJuIFwiY29tcG9zaXRpb25lbmRcIiA9PT0gZG9tRXZlbnROYW1lIHx8XG4gICAgICAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiZcbiAgICAgICAgaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKVxuICAgICAgPyAoKGRvbUV2ZW50TmFtZSA9IGdldERhdGEoKSksXG4gICAgICAgIChmYWxsYmFja1RleHQgPSBzdGFydFRleHQgPSByb290ID0gbnVsbCksXG4gICAgICAgIChpc0NvbXBvc2luZyA9ICExKSxcbiAgICAgICAgZG9tRXZlbnROYW1lKVxuICAgICAgOiBudWxsO1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgXCJwYXN0ZVwiOlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSBcImtleXByZXNzXCI6XG4gICAgICBpZiAoXG4gICAgICAgICEobmF0aXZlRXZlbnQuY3RybEtleSB8fCBuYXRpdmVFdmVudC5hbHRLZXkgfHwgbmF0aXZlRXZlbnQubWV0YUtleSkgfHxcbiAgICAgICAgKG5hdGl2ZUV2ZW50LmN0cmxLZXkgJiYgbmF0aXZlRXZlbnQuYWx0S2V5KVxuICAgICAgKSB7XG4gICAgICAgIGlmIChuYXRpdmVFdmVudC5jaGFyICYmIDEgPCBuYXRpdmVFdmVudC5jaGFyLmxlbmd0aClcbiAgICAgICAgICByZXR1cm4gbmF0aXZlRXZlbnQuY2hhcjtcbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LndoaWNoKSByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpcbiAgICAgIHJldHVybi
1B1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiBcImtvXCIgIT09IG5hdGl2ZUV2ZW50LmxvY2FsZVxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiBuYXRpdmVFdmVudC5kYXRhO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxudmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7XG4gIGNvbG9yOiAhMCxcbiAgZGF0ZTogITAsXG4gIGRhdGV0aW1lOiAhMCxcbiAgXCJkYXRldGltZS1sb2NhbFwiOiAhMCxcbiAgZW1haWw6ICEwLFxuICBtb250aDogITAsXG4gIG51bWJlcjogITAsXG4gIHBhc3N3b3JkOiAhMCxcbiAgcmFuZ2U6ICEwLFxuICBzZWFyY2g6ICEwLFxuICB0ZWw6ICEwLFxuICB0ZXh0OiAhMCxcbiAgdGltZTogITAsXG4gIHVybDogITAsXG4gIHdlZWs6ICEwXG59O1xuZnVuY3Rpb24gaXNUZXh0SW5wdXRFbGVtZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIFwiaW5wdXRcIiA9PT0gbm9kZU5hbWVcbiAgICA/ICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdXG4gICAgOiBcInRleHRhcmVhXCIgPT09IG5vZGVOYW1lXG4gICAgICA/ICEwXG4gICAgICA6ICExO1xufVxuZnVuY3Rpb24gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KFxuICBkaXNwYXRjaFF1ZXVlLFxuICBpbnN0LFxuICBuYXRpdmVFdmVudCxcbiAgdGFyZ2V0XG4pIHtcbiAgcmVzdG9yZVRhcmdldFxuICAgID8gcmVzdG9yZVF1ZXVlXG4gICAgICA/IHJlc3RvcmVRdWV1ZS5wdXNoKHRhcmdldClcbiAgICAgIDogKHJlc3RvcmVRdWV1ZSA9IFt0YXJnZXRdKVxuICAgIDogKHJlc3RvcmVUYXJnZXQgPSB0YXJnZXQpO1xuICBpbnN0ID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGluc3QsIFwib25DaGFuZ2VcIik7XG4gIDAgPCBpbnN0Lmxlbmd0aCAmJlxuICAgICgobmF0aXZlRXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoXG4gICAgICBcIm9uQ2hhbmdlXCIsXG4gICAgICBcImNoYW5nZVwiLFxuICAgICAgbnVsbCxcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgdGFyZ2V0XG4gICAgKSksXG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHsgZXZlbnQ6IG5hdGl2ZUV2ZW50LCBsaXN0ZW5lcnM6IGluc3QgfSkpO1xufVxudmFyIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGwsXG4gIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xuZnVuY3Rpb24gcnVuRXZlbnRJbkJhdGNoKGRpc3BhdGNoUXVldWUp
1IHtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgMCk7XG59XG5mdW5jdGlvbiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCkge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCk7XG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkgcmV0dXJuIHRhcmdldEluc3Q7XG59XG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChcImNoYW5nZVwiID09PSBkb21FdmVudE5hbWUpIHJldHVybiB0YXJnZXRJbnN0O1xufVxudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9ICExO1xuaWYgKGNhblVzZURPTSkge1xuICB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0JGpzY29tcCQyODI7XG4gIGlmIChjYW5Vc2VET00pIHtcbiAgICB2YXIgaXNTdXBwb3J0ZWQkanNjb21wJGlubGluZV80MTcgPSBcIm9uaW5wdXRcIiBpbiBkb2N1bWVudDtcbiAgICBpZiAoIWlzU3VwcG9ydGVkJGpzY29tcCRpbmxpbmVfNDE3KSB7XG4gICAgICB2YXIgZWxlbWVudCRqc2NvbXAkaW5saW5lXzQxOCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtZW50JGpzY29tcCRpbmxpbmVfNDE4LnNldEF0dHJpYnV0ZShcIm9uaW5wdXRcIiwgXCJyZXR1cm47XCIpO1xuICAgICAgaXNTdXBwb3J0ZWQkanNjb21wJGlubGluZV80MTcgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBlbGVtZW50JGpzY29tcCRpbmxpbmVfNDE4Lm9uaW5wdXQ7XG4gICAgfVxuICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMjgyID0gaXNTdXBwb3J0ZWQkanNjb21wJGlubGluZV80MTc7XG4gIH0gZWxzZSBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQkanNjb21wJDI4MiA9ICExO1xuICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPVxuICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMjgyICYmXG4gICAgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgOSA8IGRvY3VtZW50LmRvY3VtZW50TW9kZSk7XG59XG5mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHtcbiAgYWN0aXZlRWxlbWVudCQxICYmXG4gICAgKGFjdGl2ZUVsZW1lbnQkMS5kZXRhY2hFdmVudChcIm9ucHJvcGVydHljaGFuZ2VcIiwgaGFuZGxlUHJvcGVydHlDaGFuZ2UpLFxuICAgIChhY3RpdmVFbGVtZW50SW5zdCQxID0gYWN0aXZlRWxlbWVudCQxID0gbnVsbCkpO1xufVxuZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlDaGFuZ2UobmF0aXZlRXZlbnQpIHtcbiAgaWYgKFxuICAgIFwidmFsdWVcIiA9PT0gbmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICYmXG4gICAgZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0JDEpXG4gICkge1xuICAgIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KFxuICAgICAgZGlzcGF0Y2hRdWV1ZSxcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEsXG4gICAgICBuYXRpdmVFdmVudCxcbiAgICAgIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KVxuICAgICk7XG4gICAgYmF0Y2hlZFVwZGF0ZXMkMShydW5FdmVudEluQmF0Y2gsIGRpc3BhdGNoUXVldWUpO1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgXCJmb2N1c2luXCIgPT09IGRvbUV2ZW50TmFtZVxuICAgID8gKHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCksXG4gICAgICAoYWN0aXZlRWxlbWVudCQxID0gdGFyZ2V0KSxcbiAgICAgIChhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdCksXG4gICAgICBhY3RpdmVFbGVtZW50JDEuYXR0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKSlcbiAgICA6IFwiZm9jdXNvdXRcIiA9PT0gZG9tRXZlbnROYW1lICYmIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG59XG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSkge1xuICBpZiAoXG4gICAgXCJzZWxlY3Rpb25jaGFuZ2VcIiA9PT0gZG9tRXZlbnROYW1lIHx8XG4gICAgXCJrZXl1cFwiID09PSBkb21FdmVudE5hbWUgfHxcbiAgICBcImtleWRvd25cIiA9PT0gZG9tRXZlbnROYW1lXG4gIClcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0JDEpO1xufVxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChcImNsaWNrXCIgPT09IGRvbUV2ZW50TmFtZSkgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbn1cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChcImlucHV0XCIgPT09IGRvbUV2ZW50TmFtZSB8fCBcImNoYW5nZVwiID09PSBkb21FdmVudE5hbWUpXG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbn1cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgcmV0dXJuICh4ID09PSB5ICYmICgwICE9PSB4IHx8IDEgLyB4ID09PSAxIC8geSkpIHx8ICh4ICE9PSB4ICYmIHkgIT09IHkpO1xufVxudmFyIG9iamVjdElzID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgT2JqZWN0LmlzID8gT2JqZWN0LmlzIDogaXM7XG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAob2JqZWN0SXMob2JqQSwgb2JqQikpIHJldHVybiAhMDtcbiAgaWYgKFxuICAgIFwib2JqZWN0XCIgIT09IHR5cGVvZiBvYmpBIHx8XG4gICAgbnVsbCA9PT0gb2JqQSB8fFxuICAgIFwib2JqZWN0XCIgIT09IHR5cGVvZiBvYmpCIHx8XG4gICAgbnVsbCA9PT0gb2JqQlxuICApXG4gICAgcmV0dXJuICExO1xuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKSxcbiAgICBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiAhMTtcbiAgZm9yIChrZXlzQiA9IDA7IGtleXNCIDwga2V5c0EubGVuZ3RoOyBrZXlzQisrKSB7XG4gICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzQVtrZXlzQl07XG4gICAgaWYgKFxuICAgICAgIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwgY3VycmVudEtleSkgfHxcbiAgICAgIC
1FvYmplY3RJcyhvYmpBW2N1cnJlbnRLZXldLCBvYmpCW2N1cnJlbnRLZXldKVxuICAgIClcbiAgICAgIHJldHVybiAhMTtcbiAgfVxuICByZXR1cm4gITA7XG59XG5mdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gIGZvciAoOyBub2RlICYmIG5vZGUuZmlyc3RDaGlsZDsgKSBub2RlID0gbm9kZS5maXJzdENoaWxkO1xuICByZXR1cm4gbm9kZTtcbn1cbmZ1bmN0aW9uIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQocm9vdCwgb2Zmc2V0KSB7XG4gIHZhciBub2RlID0gZ2V0TGVhZk5vZGUocm9vdCk7XG4gIHJvb3QgPSAwO1xuICBmb3IgKHZhciBub2RlRW5kOyBub2RlOyApIHtcbiAgICBpZiAoMyA9PT0gbm9kZS5ub2RlVHlwZSkge1xuICAgICAgbm9kZUVuZCA9IHJvb3QgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgIGlmIChyb290IDw9IG9mZnNldCAmJiBub2RlRW5kID49IG9mZnNldClcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogbm9kZSwgb2Zmc2V0OiBvZmZzZXQgLSByb290IH07XG4gICAgICByb290ID0gbm9kZUVuZDtcbiAgICB9XG4gICAgYToge1xuICAgICAgZm9yICg7IG5vZGU7ICkge1xuICAgICAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSB2b2lkIDA7XG4gICAgfVxuICAgIG5vZGUgPSBnZXRMZWFmTm9kZShub2RlKTtcbiAgfVxufVxuZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gIHJldHVybiBvdXRlck5vZGUgJiYgaW5uZXJOb2RlXG4gICAgPyBvdXRlck5vZGUgPT09IGlubmVyTm9kZVxuICAgICAgPyAhMFxuICAgICAgOiBvdXRlck5vZGUgJiYgMyA9PT0gb3V0ZXJOb2RlLm5vZGVUeXBlXG4gICAgICAgID8gITFcbiAgICAgICAgOiBpbm5lck5vZGUgJiYgMyA9PT0gaW5uZXJOb2RlLm5vZGVUeXBlXG4gICAgICAgICAgPyBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgICA6IFwiY29udGFpbnNcIiBpbiBvdXRlck5vZGVcbiAgICAgICAgICAgID8gb3V0ZXJOb2RlLmNvbnRhaW5zKGlubmVyTm9kZSlcbiAgICAgICAgICAgIDogb3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG4gICAgICAgICAgICAgID8gISEob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGlubmVyTm9kZSkgJiAxNilcbiAgICAgICAgICAgICAgOiAhMVxuICAgIDogITE7XG59XG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50RGVlcChjb250YWluZXJJbmZvKSB7XG4gIGNvbnRhaW5lckluZm8gPVxuICAgIG51bGwgIT0gY29udGFpbmVySW5mbyAmJlxuICAgIG51bGwgIT0gY29udGFpbmVySW5mby5vd25lckRvY3VtZW50ICYmXG4gICAgbnVsbCAhPSBjb250YWluZXJJbmZvLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXdcbiAgICAgID8gY29udGFpbmVySW5mby5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3XG4gICAgICA6IHdpbmRvdztcbiAgZm9yIChcbiAgICB2YXIgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoY29udGFpbmVySW5mby5kb2N1bWVudCk7XG4gICAgZWxlbWVudCBpbnN0YW5jZW9mIGNvbnRhaW5lckluZm8uSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPVxuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgZWxlbWVudC5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSAhMTtcbiAgICB9XG4gICAgaWYgKEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCkgY29udGFpbmVySW5mbyA9IGVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICBlbHNlIGJyZWFrO1xuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KGNvbnRhaW5lckluZm8uZG9jdW1lbnQpO1xuICB9XG4gIHJldHVybiBlbGVtZW50O1xufVxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChcbiAgICBub2RlTmFtZSAmJlxuICAgICgoXCJpbnB1dFwiID09PSBub2RlTmFtZSAmJlxuICAgICAgKFwidGV4dFwiID09PSBlbGVtLnR5cGUgfHxcbiAgICAgICAgXCJzZWFyY2hcIiA9PT0gZWxlbS50eXBlIHx8XG4gICAgICAgIFwidGVsXCIgPT09IGVsZW0udHlwZSB8fFxuICAgICAgICBcInVybFwiID09PSBlbGVtLnR5cGUgfHxcbiAgICAgICAgXCJwYXNzd29yZFwiID09PSBlbGVtLnR5cGUpKSB8fFxuICAgICAgXCJ0ZXh0YXJlYVwiID09PSBub2RlTmFtZSB8fFxuICAgICAgXCJ0cnVlXCIgPT09IGVsZW0uY29udGVudEVkaXRhYmxlKVxuICApO1xufVxudmFyIHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCA9XG4gICAgY2FuVXNlRE9NICYmIFwiZG9jdW1lbnRNb2RlXCIgaW4gZG9jdW1lbnQgJiYgMTEgPj0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlLFxuICBhY3RpdmVFbGVtZW50ID0gbnVsbCxcbiAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsLFxuICBsYXN0U2VsZWN0aW9uID0gbnVsbCxcbiAgbW91c2VEb3duID0gITE7XG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGRvYyA9XG4gICAgbmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgPyBuYXRpdmVFdmVudFRhcmdldC5kb2N1bWVudFxuICAgICAgOiA5ID09PSBuYXRpdmVFdmVudFRhcmdldC5ub2RlVHlwZVxuICAgICAgICA/IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgIDogbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbiAgbW91c2VEb3duIHx8XG4gICAgbnVsbCA9PSBhY3RpdmVFbGVtZW50IHx8XG4gICAgYWN0aXZlRWxlbWVudCAhPT0gZ2V0QWN0aXZlRWxlbWVudChkb2MpIHx8XG4gICAgKChkb2MgPSBhY3RpdmVFbGVtZW50KSxcbiAgICBcInNlbGVjdGlvblN0YXJ0XCIgaW4gZG9jICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhkb2MpXG4gICAgICA/IChkb2MgPSB7IHN0YXJ0Oi
1Bkb2Muc2VsZWN0aW9uU3RhcnQsIGVuZDogZG9jLnNlbGVjdGlvbkVuZCB9KVxuICAgICAgOiAoKGRvYyA9IChcbiAgICAgICAgICAoZG9jLm93bmVyRG9jdW1lbnQgJiYgZG9jLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIHx8XG4gICAgICAgICAgd2luZG93XG4gICAgICAgICkuZ2V0U2VsZWN0aW9uKCkpLFxuICAgICAgICAoZG9jID0ge1xuICAgICAgICAgIGFuY2hvck5vZGU6IGRvYy5hbmNob3JOb2RlLFxuICAgICAgICAgIGFuY2hvck9mZnNldDogZG9jLmFuY2hvck9mZnNldCxcbiAgICAgICAgICBmb2N1c05vZGU6IGRvYy5mb2N1c05vZGUsXG4gICAgICAgICAgZm9jdXNPZmZzZXQ6IGRvYy5mb2N1c09mZnNldFxuICAgICAgICB9KSksXG4gICAgKGxhc3RTZWxlY3Rpb24gJiYgc2hhbGxvd0VxdWFsKGxhc3RTZWxlY3Rpb24sIGRvYykpIHx8XG4gICAgICAoKGxhc3RTZWxlY3Rpb24gPSBkb2MpLFxuICAgICAgKGRvYyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhhY3RpdmVFbGVtZW50SW5zdCwgXCJvblNlbGVjdFwiKSksXG4gICAgICAwIDwgZG9jLmxlbmd0aCAmJlxuICAgICAgICAoKG5hdGl2ZUV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KFxuICAgICAgICAgIFwib25TZWxlY3RcIixcbiAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgKSksXG4gICAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7IGV2ZW50OiBuYXRpdmVFdmVudCwgbGlzdGVuZXJzOiBkb2MgfSksXG4gICAgICAgIChuYXRpdmVFdmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50KSkpKTtcbn1cbmZ1bmN0aW9uIG1ha2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUpIHtcbiAgdmFyIHByZWZpeGVzID0ge307XG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1tcIldlYmtpdFwiICsgc3R5bGVQcm9wXSA9IFwid2Via2l0XCIgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzW1wiTW96XCIgKyBzdHlsZVByb3BdID0gXCJtb3pcIiArIGV2ZW50TmFtZTtcbiAgcmV0dXJuIHByZWZpeGVzO1xufVxudmFyIHZlbmRvclByZWZpeGVzID0ge1xuICAgIGFuaW1hdGlvbmVuZDogbWFrZVByZWZpeE1hcChcIkFuaW1hdGlvblwiLCBcIkFuaW1hdGlvbkVuZFwiKSxcbiAgICBhbmltYXRpb25pdGVyYXRpb246IG1ha2VQcmVmaXhNYXAoXCJBbmltYXRpb25cIiwgXCJBbmltYXRpb25JdGVyYXRpb25cIiksXG4gICAgYW5pbWF0aW9uc3RhcnQ6IG1ha2VQcmVmaXhNYXAoXCJBbmltYXRpb25cIiwgXCJBbmltYXRpb25TdGFydFwiKSxcbiAgICB0cmFuc2l0aW9ucnVuOiBtYWtlUHJlZml4TWFwKFwiVHJhbnNpdGlvblwiLCBcIlRyYW5zaXRpb25SdW5cIiksXG4gICAgdHJhbnNpdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKFwiVHJhbnNpdGlvblwiLCBcIlRyYW5zaXRpb25TdGFydFwiKSxcbiAgICB0cmFuc2l0aW9uY2FuY2VsOiBtYWtlUHJlZml4TWFwKFwiVHJhbnNpdGlvblwiLCBcIlRyYW5zaXRpb25DYW5jZWxcIiksXG4gICAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcChcIlRyYW5zaXRpb25cIiwgXCJUcmFuc2l0aW9uRW5kXCIpXG4gIH0sXG4gIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9LFxuICBzdHlsZSA9IHt9O1xuY2FuVXNlRE9NICYmXG4gICgoc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLnN0eWxlKSxcbiAgXCJBbmltYXRpb25FdmVudFwiIGluIHdpbmRvdyB8fFxuICAgIChkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSxcbiAgXCJUcmFuc2l0aW9uRXZlbnRcIiBpbiB3aW5kb3cgfHxcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTtcbmZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICBpZiAocHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0pIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSByZXR1cm4gZXZlbnROYW1lO1xuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSxcbiAgICBzdHlsZVByb3A7XG4gIGZvciAoc3R5bGVQcm9wIGluIHByZWZpeE1hcClcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKVxuICAgICAgcmV0dXJuIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHByZWZpeE1hcFtzdHlsZVByb3BdKTtcbiAgcmV0dXJuIGV2ZW50TmFtZTtcbn1cbnZhciBBTklNQVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoXCJhbmltYXRpb25lbmRcIiksXG4gIEFOSU1BVElPTl9JVEVSQVRJT04gPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcImFuaW1hdGlvbml0ZXJhdGlvblwiKSxcbiAgQU5JTUFUSU9OX1NUQVJUID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoXCJhbmltYXRpb25zdGFydFwiKSxcbiAgVFJBTlNJVElPTl9SVU4gPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcInRyYW5zaXRpb25ydW5cIiksXG4gIFRSQU5TSVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcInRyYW5zaXRpb25zdGFydFwiKSxcbiAgVFJBTlNJVElPTl9DQU5DRUwgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcInRyYW5zaXRpb25jYW5jZWxcIiksXG4gIFRSQU5TSVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoXCJ0cmFuc2l0aW9uZW5kXCIpLFxuICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKSxcbiAgc2ltcGxlRXZlbnRQbHVnaW5FdmVudHMgPVxuICAgIFwiYWJvcnQgYXV4Q2xpY2sgYmVmb3JlVG9nZ2xlIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlI
1HBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsXCIuc3BsaXQoXG4gICAgICBcIiBcIlxuICAgICk7XG5zaW1wbGVFdmVudFBsdWdpbkV2ZW50cy5wdXNoKFwic2Nyb2xsRW5kXCIpO1xuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSkge1xuICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVhY3ROYW1lLCBbZG9tRXZlbnROYW1lXSk7XG59XG52YXIgQ2FwdHVyZWRTdGFja3MgPSBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZSkge1xuICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHZhbHVlICYmIG51bGwgIT09IHZhbHVlKSB7XG4gICAgdmFyIGV4aXN0aW5nID0gQ2FwdHVyZWRTdGFja3MuZ2V0KHZhbHVlKTtcbiAgICBpZiAodm9pZCAwICE9PSBleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIHNvdXJjZSA9IHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpXG4gICAgfTtcbiAgICBDYXB0dXJlZFN0YWNrcy5zZXQodmFsdWUsIHNvdXJjZSk7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdGFjazogZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHNvdXJjZSlcbiAgfTtcbn1cbnZhciBjb25jdXJyZW50UXVldWVzID0gW10sXG4gIGNvbmN1cnJlbnRRdWV1ZXNJbmRleCA9IDAsXG4gIGNvbmN1cnJlbnRseVVwZGF0ZWRMYW5lcyA9IDA7XG5mdW5jdGlvbiBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCkge1xuICBmb3IgKFxuICAgIHZhciBlbmRJbmRleCA9IGNvbmN1cnJlbnRRdWV1ZXNJbmRleCxcbiAgICAgIGkgPSAoY29uY3VycmVudGx5VXBkYXRlZExhbmVzID0gY29uY3VycmVudFF1ZXVlc0luZGV4ID0gMCk7XG4gICAgaSA8IGVuZEluZGV4O1xuXG4gICkge1xuICAgIHZhciBmaWJlciA9IGNvbmN1cnJlbnRRdWV1ZXNbaV07XG4gICAgY29uY3VycmVudFF1ZXVlc1tpKytdID0gbnVsbDtcbiAgICB2YXIgcXVldWUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgIGNvbmN1cnJlbnRRdWV1ZXNbaSsrXSA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGNvbmN1cnJlbnRRdWV1ZXNbaV07XG4gICAgY29uY3VycmVudFF1ZXVlc1tpKytdID0gbnVsbDtcbiAgICB2YXIgbGFuZSA9IGNvbmN1cnJlbnRRdWV1ZXNbaV07XG4gICAgY29uY3VycmVudFF1ZXVlc1tpKytdID0gbnVsbDtcbiAgICBpZiAobnVsbCAhPT0gcXVldWUgJiYgbnVsbCAhPT0gdXBkYXRlKSB7XG4gICAgICB2Y
1XIgcGVuZGluZyA9IHF1ZXVlLnBlbmRpbmc7XG4gICAgICBudWxsID09PSBwZW5kaW5nXG4gICAgICAgID8gKHVwZGF0ZS5uZXh0ID0gdXBkYXRlKVxuICAgICAgICA6ICgodXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQpLCAocGVuZGluZy5uZXh0ID0gdXBkYXRlKSk7XG4gICAgICBxdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuICAgIH1cbiAgICAwICE9PSBsYW5lICYmIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlJDEoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgY29uY3VycmVudFF1ZXVlc1tjb25jdXJyZW50UXVldWVzSW5kZXgrK10gPSBmaWJlcjtcbiAgY29uY3VycmVudFF1ZXVlc1tjb25jdXJyZW50UXVldWVzSW5kZXgrK10gPSBxdWV1ZTtcbiAgY29uY3VycmVudFF1ZXVlc1tjb25jdXJyZW50UXVldWVzSW5kZXgrK10gPSB1cGRhdGU7XG4gIGNvbmN1cnJlbnRRdWV1ZXNbY29uY3VycmVudFF1ZXVlc0luZGV4KytdID0gbGFuZTtcbiAgY29uY3VycmVudGx5VXBkYXRlZExhbmVzIHw9IGxhbmU7XG4gIGZpYmVyLmxhbmVzIHw9IGxhbmU7XG4gIGZpYmVyID0gZmliZXIuYWx0ZXJuYXRlO1xuICBudWxsICE9PSBmaWJlciAmJiAoZmliZXIubGFuZXMgfD0gbGFuZSk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgZW5xdWV1ZVVwZGF0ZSQxKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgcmV0dXJuIGdldFJvb3RGb3JVcGRhdGVkRmliZXIoZmliZXIpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKSB7XG4gIGVucXVldWVVcGRhdGUkMShmaWJlciwgbnVsbCwgbnVsbCwgbGFuZSk7XG4gIHJldHVybiBnZXRSb290Rm9yVXBkYXRlZEZpYmVyKGZpYmVyKTtcbn1cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCB1cGRhdGUsIGxhbmUpIHtcbiAgc291cmNlRmliZXIubGFuZXMgfD0gbGFuZTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcbiAgbnVsbCAhPT0gYWx0ZXJuYXRlICYmIChhbHRlcm5hdGUubGFuZXMgfD0gbGFuZSk7XG4gIGZvciAodmFyIGlzSGlkZGVuID0gITEsIHBhcmVudCA9IHNvdXJjZUZpYmVyLnJldHVybjsgbnVsbCAhPT0gcGFyZW50OyApXG4gICAgKHBhcmVudC5jaGlsZExhbmVzIHw9IGxhbmUpLFxuICAgICAgKGFsdGVybmF0ZSA9IHBhcmVudC5hbHRlcm5hdGUpLFxuICAgICAgbnVsbCAhPT0gYWx0ZXJuYXRlICYmIChhbHRlcm5hdGUuY2hpbGRMYW5lcyB8PSBsYW5lKSxcbiAgICAgIDIyID09PSBwYXJlbnQudGFnICYmXG4gICAgICAgICgoc291cmNlRmliZXIgPSBwYXJlbnQuc3RhdGVOb2RlKSxcbiAgICAgICAgbnVsbCA9PT0gc291cmNlRmliZXIgfHwgc291cmNlRmliZXIuX3Zpc2liaWxpdHkgJiAxIHx8IChpc0hpZGRlbiA9ICEwKSksXG4gICAgICAoc291cmNlRmliZXIgPSBwYXJlbnQpLFxuICAgICAgKHBhcmVudCA9IHBhcmVudC5yZXR1cm4pO1xuICByZXR1cm4gMyA9PT0gc291cmNlRmliZXIudGFnXG4gICAgPyAoKHBhcmVudCA9IHNvdXJjZUZpYmVyLnN0YXRlTm9kZSksXG4gICAgICBpc0hpZGRlbiAmJlxuICAgICAgICBudWxsICE9PSB1cGRhdGUgJiZcbiAgICAgICAgKChpc0hpZGRlbiA9IDMxIC0gY2x6MzIobGFuZSkpLFxuICAgICAgICAoc291cmNlRmliZXIgPSBwYXJlbnQuaGlkZGVuVXBkYXRlcyksXG4gICAgICAgIChhbHRlcm5hdGUgPSBzb3VyY2VGaWJlcltpc0hpZGRlbl0pLFxuICAgICAgICBudWxsID09PSBhbHRlcm5hdGVcbiAgICAgICAgICA/IChzb3VyY2VGaWJlcltpc0hpZGRlbl0gPSBbdXBkYXRlXSlcbiAgICAgICAgICA6IGFsdGVybmF0ZS5wdXNoKHVwZGF0ZSksXG4gICAgICAgICh1cGRhdGUubGFuZSA9IGxhbmUgfCA1MzY4NzA5MTIpKSxcbiAgICAgIHBhcmVudClcbiAgICA6IG51bGw7XG59XG5mdW5jdGlvbiBnZXRSb290Rm9yVXBkYXRlZEZpYmVyKHNvdXJjZUZpYmVyKSB7XG4gIGlmICg1MCA8IG5lc3RlZFVwZGF0ZUNvdW50KVxuICAgIHRocm93IChcbiAgICAgICgobmVzdGVkVXBkYXRlQ291bnQgPSAwKSxcbiAgICAgIChyb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsKSxcbiAgICAgIEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTg1KSkpXG4gICAgKTtcbiAgZm9yICh2YXIgcGFyZW50ID0gc291cmNlRmliZXIucmV0dXJuOyBudWxsICE9PSBwYXJlbnQ7IClcbiAgICAoc291cmNlRmliZXIgPSBwYXJlbnQpLCAocGFyZW50ID0gc291cmNlRmliZXIucmV0dXJuKTtcbiAgcmV0dXJuIDMgPT09IHNvdXJjZUZpYmVyLnRhZyA/IHNvdXJjZUZpYmVyLnN0YXRlTm9kZSA6IG51bGw7XG59XG52YXIgZW1wdHlDb250ZXh0T2JqZWN0ID0ge307XG5mdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMuc2libGluZyA9XG4gICAgdGhpcy5jaGlsZCA9XG4gICAgdGhpcy5yZXR1cm4gPVxuICAgIHRoaXMuc3RhdGVOb2RlID1cbiAgICB0aGlzLnR5cGUgPVxuICAgIHRoaXMuZWxlbWVudFR5cGUgPVxuICAgICAgbnVsbDtcbiAgdGhpcy5pbmRleCA9IDA7XG4gIHRoaXMucmVmQ2xlYW51cCA9IHRoaXMucmVmID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7XG4gIHRoaXMuZGVwZW5kZW5jaWVzID1cbiAgICB0aGlzLm1lbW9pemVkU3RhdGUgPVxuICAgIHRoaXMudXBkYXRlUXVldWUgPVxuICAgIHRoaXMubWVtb2l6ZWRQcm9wcyA9XG4gICAgICBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlO1xuICB0aGlzLnN1YnRyZWVGbGFncyA9IHRoaXMuZmxhZ3MgPSAwO1xuICB0aGlzLmRlbGV0aW9ucyA9IG51bGw7XG4gIHRoaXMuY2hpbGRMYW5lcyA9IHRoaXMubGFuZXMgPSAwO1xuICB0aGlzLmFsdGVybmF0ZSA9IG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckltcGxDbGFzcyh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gIHJldHVybi
1BuZXcgRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xufVxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICBDb21wb25lbnQgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISghQ29tcG9uZW50IHx8ICFDb21wb25lbnQuaXNSZWFjdENvbXBvbmVudCk7XG59XG5mdW5jdGlvbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBwZW5kaW5nUHJvcHMpIHtcbiAgdmFyIHdvcmtJblByb2dyZXNzID0gY3VycmVudC5hbHRlcm5hdGU7XG4gIG51bGwgPT09IHdvcmtJblByb2dyZXNzXG4gICAgPyAoKHdvcmtJblByb2dyZXNzID0gY3JlYXRlRmliZXJJbXBsQ2xhc3MoXG4gICAgICAgIGN1cnJlbnQudGFnLFxuICAgICAgICBwZW5kaW5nUHJvcHMsXG4gICAgICAgIGN1cnJlbnQua2V5LFxuICAgICAgICBjdXJyZW50Lm1vZGVcbiAgICAgICkpLFxuICAgICAgKHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID0gY3VycmVudC5lbGVtZW50VHlwZSksXG4gICAgICAod29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZSksXG4gICAgICAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudC5zdGF0ZU5vZGUpLFxuICAgICAgKHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IGN1cnJlbnQpLFxuICAgICAgKGN1cnJlbnQuYWx0ZXJuYXRlID0gd29ya0luUHJvZ3Jlc3MpKVxuICAgIDogKCh3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHMpLFxuICAgICAgKHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGUpLFxuICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzID0gMCksXG4gICAgICAod29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gMCksXG4gICAgICAod29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbCkpO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGN1cnJlbnQuZmxhZ3MgJiA2NTAxMTcxMjtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcbiAgcGVuZGluZ1Byb3BzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9XG4gICAgbnVsbCA9PT0gcGVuZGluZ1Byb3BzXG4gICAgICA/IG51bGxcbiAgICAgIDogeyBsYW5lczogcGVuZGluZ1Byb3BzLmxhbmVzLCBmaXJzdENvbnRleHQ6IHBlbmRpbmdQcm9wcy5maXJzdENvbnRleHQgfTtcbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcbiAgd29ya0luUHJvZ3Jlc3MucmVmQ2xlYW51cCA9IGN1cnJlbnQucmVmQ2xlYW51cDtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufVxuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzcyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gNjUwMTE3MTQ7XG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuICBudWxsID09PSBjdXJyZW50XG4gICAgPyAoKHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSAwKSxcbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzKSxcbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGwpLFxuICAgICAgKHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IDApLFxuICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBudWxsKSxcbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbCksXG4gICAgICAod29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsKSxcbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBudWxsKSxcbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBudWxsKSlcbiAgICA6ICgod29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcyksXG4gICAgICAod29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzKSxcbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQpLFxuICAgICAgKHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IDApLFxuICAgICAgKHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGwpLFxuICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHMpLFxuICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpLFxuICAgICAgKHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZSksXG4gICAgICAod29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZSksXG4gICAgICAocmVuZGVyTGFuZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcyksXG4gICAgICAod29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID1cbiAgICAgICAgbnVsbCA9PT0gcmVuZGVyTGFuZXNcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbGFuZXM6IHJlbmRlckxhbmVzLmxhbmVzLFxuICAgICAgICAgICAgICBmaXJzdENvbnRleHQ6IHJlbmRlckxhbmVzLmZpcnN0Q29udGV4dFxuICAgICAgICAgICAgfSkpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoXG4gIHR5cGUsXG4gIGtleSxcbiAgcGVuZGluZ1Byb3BzLFxuICBvd25lcixcbiAgbW9kZSxcbiAgbGFuZXNcbikge1xuICB2YXIgZmliZXJUYWcgPSAwO1xuICBvd25lciA9IHR5cGU7XG4gIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlKSBzaG91bGRDb25zdHJ1Y3QodHlwZSkgJiYgKGZpYmVyVGFnID0gMSk7XG4gIGVsc2UgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiB0eXBlKVxuICAgIGZpYmVyVGFnID0gaXNIb3N0SG9pc3RhYmxlVHlwZShcbiAgICAgIHR5cGUsXG4gICAgICBwZW5kaW5nUHJvcHMsXG4gICAgICBjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudFxuICAgIClcbiAgICAgID8gMjZcbiAgICAgIDogXCJodG1sXCIgPT09IHR5cGUgfHwgXCJo
1ZWFkXCIgPT09IHR5cGUgfHwgXCJib2R5XCIgPT09IHR5cGVcbiAgICAgICAgPyAyN1xuICAgICAgICA6IDU7XG4gIGVsc2VcbiAgICBhOiBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQUNUSVZJVFlfVFlQRTpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAodHlwZSA9IGNyZWF0ZUZpYmVySW1wbENsYXNzKDMxLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkpLFxuICAgICAgICAgICh0eXBlLmVsZW1lbnRUeXBlID0gUkVBQ1RfQUNUSVZJVFlfVFlQRSksXG4gICAgICAgICAgKHR5cGUubGFuZXMgPSBsYW5lcyksXG4gICAgICAgICAgdHlwZVxuICAgICAgICApO1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcbiAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSA4O1xuICAgICAgICBtb2RlIHw9IDI0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAodHlwZSA9IGNyZWF0ZUZpYmVySW1wbENsYXNzKDEyLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSB8IDIpKSxcbiAgICAgICAgICAodHlwZS5lbGVtZW50VHlwZSA9IFJFQUNUX1BST0ZJTEVSX1RZUEUpLFxuICAgICAgICAgICh0eXBlLmxhbmVzID0gbGFuZXMpLFxuICAgICAgICAgIHR5cGVcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAodHlwZSA9IGNyZWF0ZUZpYmVySW1wbENsYXNzKDEzLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkpLFxuICAgICAgICAgICh0eXBlLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRSksXG4gICAgICAgICAgKHR5cGUubGFuZXMgPSBsYW5lcyksXG4gICAgICAgICAgdHlwZVxuICAgICAgICApO1xuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKHR5cGUgPSBjcmVhdGVGaWJlckltcGxDbGFzcygxOSwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpKSxcbiAgICAgICAgICAodHlwZS5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSksXG4gICAgICAgICAgKHR5cGUubGFuZXMgPSBsYW5lcyksXG4gICAgICAgICAgdHlwZVxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlICYmIG51bGwgIT09IHR5cGUpXG4gICAgICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgZmliZXJUYWcgPSAxMDtcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OU1VNRVJfVFlQRTpcbiAgICAgICAgICAgICAgZmliZXJUYWcgPSA5O1xuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBmaWJlclRhZyA9IDExO1xuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGZpYmVyVGFnID0gMTQ7XG4gICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgZmliZXJUYWcgPSAxNjtcbiAgICAgICAgICAgICAgb3duZXIgPSBudWxsO1xuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgIH1cbiAgICAgICAgZmliZXJUYWcgPSAyOTtcbiAgICAgICAgcGVuZGluZ1Byb3BzID0gRXJyb3IoXG4gICAgICAgICAgZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMzAsIG51bGwgPT09IHR5cGUgPyBcIm51bGxcIiA6IHR5cGVvZiB0eXBlLCBcIlwiKVxuICAgICAgICApO1xuICAgICAgICBvd25lciA9IG51bGw7XG4gICAgfVxuICBrZXkgPSBjcmVhdGVGaWJlckltcGxDbGFzcyhmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBrZXkuZWxlbWVudFR5cGUgPSB0eXBlO1xuICBrZXkudHlwZSA9IG93bmVyO1xuICBrZXkubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIGVsZW1lbnRzID0gY3JlYXRlRmliZXJJbXBsQ2xhc3MoNywgZWxlbWVudHMsIGtleSwgbW9kZSk7XG4gIGVsZW1lbnRzLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBlbGVtZW50cztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVRleHQoY29udGVudCwgbW9kZSwgbGFuZXMpIHtcbiAgY29udGVudCA9IGNyZWF0ZUZpYmVySW1wbENsYXNzKDYsIGNvbnRlbnQsIG51bGwsIG1vZGUpO1xuICBjb250ZW50LmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBjb250ZW50O1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgbGFuZXMpIHtcbiAgbW9kZSA9IGNyZWF0ZUZpYmVySW1wbENsYXNzKFxuICAgIDQsXG4gICAgbnVsbCAhPT0gcG9ydGFsLmNoaWxkcmVuID8gcG9ydGFsLmNoaWxkcmVuIDogW10sXG4gICAgcG9ydGFsLmtleSxcbiAgICBtb2RlXG4gICk7XG4gIG1vZGUubGFuZXMgPSBsYW5lcztcbiAgbW9kZS5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIG1vZGU7XG59XG52YXIgZm9ya1N0YWNrID0gW10sXG4gIGZvcmtTdGFja0luZGV4ID0gMCxcbiAgdHJlZUZvcmtQcm92aWRlciA9IG51bGwsXG4gIHRyZWVGb3JrQ291bnQgPSAwLFxuICBpZFN0YWNrID0gW10sXG4gIGlkU3RhY2tJbmRleCA9IDAsXG4gIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBudWxsLFxuICB0cmVlQ29udGV4dElkID0gMSxcbiAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IFwiXCI7XG5mdW5jdGlvbiBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4pIHtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtDb3VudDtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtQcm92aWRlcjtcbiAgdHJlZUZvcmtQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB0cmVlRm9ya0NvdW50ID0gdG90YWxDaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIHB1c2hUcmVl
1SWQod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4sIGluZGV4KSB7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0UHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIGJhc2VJZFdpdGhMZWFkaW5nQml0ID0gdHJlZUNvbnRleHRJZDtcbiAgd29ya0luUHJvZ3Jlc3MgPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICB2YXIgYmFzZUxlbmd0aCA9IDMyIC0gY2x6MzIoYmFzZUlkV2l0aExlYWRpbmdCaXQpIC0gMTtcbiAgYmFzZUlkV2l0aExlYWRpbmdCaXQgJj0gfigxIDw8IGJhc2VMZW5ndGgpO1xuICBpbmRleCArPSAxO1xuICB2YXIgbGVuZ3RoID0gMzIgLSBjbHozMih0b3RhbENoaWxkcmVuKSArIGJhc2VMZW5ndGg7XG4gIGlmICgzMCA8IGxlbmd0aCkge1xuICAgIHZhciBudW1iZXJPZk92ZXJmbG93Qml0cyA9IGJhc2VMZW5ndGggLSAoYmFzZUxlbmd0aCAlIDUpO1xuICAgIGxlbmd0aCA9IChcbiAgICAgIGJhc2VJZFdpdGhMZWFkaW5nQml0ICZcbiAgICAgICgoMSA8PCBudW1iZXJPZk92ZXJmbG93Qml0cykgLSAxKVxuICAgICkudG9TdHJpbmcoMzIpO1xuICAgIGJhc2VJZFdpdGhMZWFkaW5nQml0ID4+PSBudW1iZXJPZk92ZXJmbG93Qml0cztcbiAgICBiYXNlTGVuZ3RoIC09IG51bWJlck9mT3ZlcmZsb3dCaXRzO1xuICAgIHRyZWVDb250ZXh0SWQgPVxuICAgICAgKDEgPDwgKDMyIC0gY2x6MzIodG90YWxDaGlsZHJlbikgKyBiYXNlTGVuZ3RoKSkgfFxuICAgICAgKGluZGV4IDw8IGJhc2VMZW5ndGgpIHxcbiAgICAgIGJhc2VJZFdpdGhMZWFkaW5nQml0O1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBsZW5ndGggKyB3b3JrSW5Qcm9ncmVzcztcbiAgfSBlbHNlXG4gICAgKHRyZWVDb250ZXh0SWQgPVxuICAgICAgKDEgPDwgbGVuZ3RoKSB8IChpbmRleCA8PCBiYXNlTGVuZ3RoKSB8IGJhc2VJZFdpdGhMZWFkaW5nQml0KSxcbiAgICAgICh0cmVlQ29udGV4dE92ZXJmbG93ID0gd29ya0luUHJvZ3Jlc3MpO1xufVxuZnVuY3Rpb24gcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcykge1xuICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm4gJiZcbiAgICAocHVzaFRyZWVGb3JrKHdvcmtJblByb2dyZXNzLCAxKSwgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgMSwgMCkpO1xufVxuZnVuY3Rpb24gcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgZm9yICg7IHdvcmtJblByb2dyZXNzID09PSB0cmVlRm9ya1Byb3ZpZGVyOyApXG4gICAgKHRyZWVGb3JrUHJvdmlkZXIgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF0pLFxuICAgICAgKGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsKSxcbiAgICAgICh0cmVlRm9ya0NvdW50ID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdKSxcbiAgICAgIChmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXhdID0gbnVsbCk7XG4gIGZvciAoOyB3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUNvbnRleHRQcm92aWRlcjsgKVxuICAgICh0cmVlQ29udGV4dFByb3ZpZGVyID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF0pLFxuICAgICAgKGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGwpLFxuICAgICAgKHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XSksXG4gICAgICAoaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbCksXG4gICAgICAodHJlZUNvbnRleHRJZCA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdKSxcbiAgICAgIChpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsKTtcbn1cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGwsXG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsLFxuICBpc0h5ZHJhdGluZyA9ICExLFxuICBoeWRyYXRpb25FcnJvcnMgPSBudWxsLFxuICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITEsXG4gIEh5ZHJhdGlvbk1pc21hdGNoRXhjZXB0aW9uID0gRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1MTkpKTtcbmZ1bmN0aW9uIHRocm93T25IeWRyYXRpb25NaXNtYXRjaChmaWJlcikge1xuICB2YXIgZXJyb3IgPSBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQxOCwgXCJcIikpO1xuICBxdWV1ZUh5ZHJhdGlvbkVycm9yKGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBmaWJlcikpO1xuICB0aHJvdyBIeWRyYXRpb25NaXNtYXRjaEV4Y2VwdGlvbjtcbn1cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2UoZmliZXIpIHtcbiAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLFxuICAgIHR5cGUgPSBmaWJlci50eXBlLFxuICAgIHByb3BzID0gZmliZXIubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSBmaWJlcjtcbiAgaW5zdGFuY2VbaW50ZXJuYWxQcm9wc0tleV0gPSBwcm9wcztcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcImRpYWxvZ1wiOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImNhbmNlbFwiLCBpbnN0YW5jZSk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwiY2xvc2VcIiwgaW5zdGFuY2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImlmcmFtZVwiOlxuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICBjYXNlIFwiZW1iZWRcIjpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJsb2FkXCIsIGluc3RhbmNlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ2aWRlb1wiOlxuICAgIGNhc2UgXCJhdWRpb1wiOlxuICAgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IHR5cGUrKylcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbdHlwZV0sIGluc3RhbmNlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJzb3VyY2VcIjpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJlcnJvclwiLCBpbnN0YW5jZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiaW1nXCI6XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgY2FzZSBcImxpbmtcIjpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJlcnJvclwiLCBpbnN0YW5jZSk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwibG9hZFwiLCBpbnN0YW5jZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiZGV0YWlsc1wiOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcInRvZ2dsZVwiLCBpbnN0YW5jZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJpbnZhbGlkXCIsIGluc3RhbmNlKTtcbiAgICAgIGluaXRJbnB1dChcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgI
1HByb3BzLnZhbHVlLFxuICAgICAgICBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgICAgIHByb3BzLmNoZWNrZWQsXG4gICAgICAgIHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgICAgICBwcm9wcy50eXBlLFxuICAgICAgICBwcm9wcy5uYW1lLFxuICAgICAgICAhMFxuICAgICAgKTtcbiAgICAgIHRyYWNrKGluc3RhbmNlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJpbnZhbGlkXCIsIGluc3RhbmNlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImludmFsaWRcIiwgaW5zdGFuY2UpLFxuICAgICAgICBpbml0VGV4dGFyZWEoaW5zdGFuY2UsIHByb3BzLnZhbHVlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHByb3BzLmNoaWxkcmVuKSxcbiAgICAgICAgdHJhY2soaW5zdGFuY2UpO1xuICB9XG4gIHR5cGUgPSBwcm9wcy5jaGlsZHJlbjtcbiAgKFwic3RyaW5nXCIgIT09IHR5cGVvZiB0eXBlICYmXG4gICAgXCJudW1iZXJcIiAhPT0gdHlwZW9mIHR5cGUgJiZcbiAgICBcImJpZ2ludFwiICE9PSB0eXBlb2YgdHlwZSkgfHxcbiAgaW5zdGFuY2UudGV4dENvbnRlbnQgPT09IFwiXCIgKyB0eXBlIHx8XG4gICEwID09PSBwcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgfHxcbiAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGluc3RhbmNlLnRleHRDb250ZW50LCB0eXBlKVxuICAgID8gKG51bGwgIT0gcHJvcHMucG9wb3ZlciAmJlxuICAgICAgICAobGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImJlZm9yZXRvZ2dsZVwiLCBpbnN0YW5jZSksXG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJ0b2dnbGVcIiwgaW5zdGFuY2UpKSxcbiAgICAgIG51bGwgIT0gcHJvcHMub25TY3JvbGwgJiYgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcInNjcm9sbFwiLCBpbnN0YW5jZSksXG4gICAgICBudWxsICE9IHByb3BzLm9uU2Nyb2xsRW5kICYmXG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJzY3JvbGxlbmRcIiwgaW5zdGFuY2UpLFxuICAgICAgbnVsbCAhPSBwcm9wcy5vbkNsaWNrICYmIChpbnN0YW5jZS5vbmNsaWNrID0gbm9vcCQxKSxcbiAgICAgIChpbnN0YW5jZSA9ICEwKSlcbiAgICA6IChpbnN0YW5jZSA9ICExKTtcbiAgaW5zdGFuY2UgfHwgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGZpYmVyKTtcbn1cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgZm9yIChoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjsgaHlkcmF0aW9uUGFyZW50RmliZXI7IClcbiAgICBzd2l0Y2ggKGh5ZHJhdGlvblBhcmVudEZpYmVyLnRhZykge1xuICAgICAgY2FzZSA1OlxuICAgICAgY2FzZSAxMzpcbiAgICAgICAgcm9vdE9yU2luZ2xldG9uQ29udGV4dCA9ICExO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIDI3OlxuICAgICAgY2FzZSAzOlxuICAgICAgICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG4gIGlmIChmaWJlciAhPT0gaHlkcmF0aW9uUGFyZW50RmliZXIpIHJldHVybiAhMTtcbiAgaWYgKCFpc0h5ZHJhdGluZykgcmV0dXJuIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpLCAoaXNIeWRyYXRpbmcgPSAhMCksICExO1xuICB2YXIgdGFnID0gZmliZXIudGFnLFxuICAgIEpTQ29tcGlsZXJfdGVtcDtcbiAgaWYgKChKU0NvbXBpbGVyX3RlbXAgPSAzICE9PSB0YWcgJiYgMjcgIT09IHRhZykpIHtcbiAgICBpZiAoKEpTQ29tcGlsZXJfdGVtcCA9IDUgPT09IHRhZykpXG4gICAgICAoSlNDb21waWxlcl90ZW1wID0gZmliZXIudHlwZSksXG4gICAgICAgIChKU0NvbXBpbGVyX3RlbXAgPVxuICAgICAgICAgICEoXCJmb3JtXCIgIT09IEpTQ29tcGlsZXJfdGVtcCAmJiBcImJ1dHRvblwiICE9PSBKU0NvbXBpbGVyX3RlbXApIHx8XG4gICAgICAgICAgc2hvdWxkU2V0VGV4dENvbnRlbnQoZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcykpO1xuICAgIEpTQ29tcGlsZXJfdGVtcCA9ICFKU0NvbXBpbGVyX3RlbXA7XG4gIH1cbiAgSlNDb21waWxlcl90ZW1wICYmIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgJiYgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGZpYmVyKTtcbiAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gIGlmICgxMyA9PT0gdGFnKSB7XG4gICAgZmliZXIgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICAgIGZpYmVyID0gbnVsbCAhPT0gZmliZXIgPyBmaWJlci5kZWh5ZHJhdGVkIDogbnVsbDtcbiAgICBpZiAoIWZpYmVyKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMxNykpO1xuICAgIGE6IHtcbiAgICAgIGZpYmVyID0gZmliZXIubmV4dFNpYmxpbmc7XG4gICAgICBmb3IgKHRhZyA9IDA7IGZpYmVyOyApIHtcbiAgICAgICAgaWYgKDggPT09IGZpYmVyLm5vZGVUeXBlKVxuICAgICAgICAgIGlmICgoKEpTQ29tcGlsZXJfdGVtcCA9IGZpYmVyLmRhdGEpLCBcIi8kXCIgPT09IEpTQ29tcGlsZXJfdGVtcCkpIHtcbiAgICAgICAgICAgIGlmICgwID09PSB0YWcpIHtcbiAgICAgICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlKGZpYmVyLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhZy0tO1xuICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgKFwiJFwiICE9PSBKU0NvbXBpbGVyX3RlbXAgJiZcbiAgICAgICAgICAgICAgXCIkIVwiICE9PSBKU0NvbXBpbGVyX3RlbXAgJiZcbiAgICAgICAgICAgICAgXCIkP1wiICE9PSBKU0NvbXBpbGVyX3RlbXApIHx8XG4gICAgICAgICAgICAgIHRhZysrO1xuICAgICAgICBmaWJlciA9IGZpYmVyLm5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgfVxuICB9IGVsc2VcbiAgICAyNyA9PT0gdGFnXG4gICAgICA/ICgodGFnID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSksXG4gICAgICAgIGlzU2luZ2xldG9uU2NvcGUoZmliZXIudHlwZSlcbiAgICAgICAgICA/ICgoZmliZXIgPSBwcmV2aW91c0h5ZHJhdGFibGVPbkVudGVyaW5nU2NvcGVkU2luZ2xldG9uKSxcbiAgICAgICAgICAgIChwcmV2aW91c0h5ZHJhdGFibGVPbkVudGVyaW5nU2NvcGVkU2luZ2xldG9uID0gbnVsbCksXG4gICAgICAgICAgICAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGZpYmVyKSlcbiAgICAgICAgICA6IChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gdGFnKSlcbiAgICAgIDogKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBoeWRyYXRpb25QYXJlbnRGaWJlclxuICAgICAgICAgID8gZ2V0TmV4dEh5ZHJhdGFibGUoZmliZXIuc3RhdGVOb2RlLm5leHRTaWJsaW5nKVxuICAgICAgICAgIDogbnVsbCk7XG4gIHJldHVybiAhMDt
1cbn1cbmZ1bmN0aW9uIHJlc2V0SHlkcmF0aW9uU3RhdGUoKSB7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG4gIGlzSHlkcmF0aW5nID0gITE7XG59XG5mdW5jdGlvbiB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpIHtcbiAgdmFyIHF1ZXVlZEVycm9ycyA9IGh5ZHJhdGlvbkVycm9ycztcbiAgbnVsbCAhPT0gcXVldWVkRXJyb3JzICYmXG4gICAgKG51bGwgPT09IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzXG4gICAgICA/ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IHF1ZXVlZEVycm9ycylcbiAgICAgIDogd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMucHVzaC5hcHBseShcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyxcbiAgICAgICAgICBxdWV1ZWRFcnJvcnNcbiAgICAgICAgKSxcbiAgICAoaHlkcmF0aW9uRXJyb3JzID0gbnVsbCkpO1xuICByZXR1cm4gcXVldWVkRXJyb3JzO1xufVxuZnVuY3Rpb24gcXVldWVIeWRyYXRpb25FcnJvcihlcnJvcikge1xuICBudWxsID09PSBoeWRyYXRpb25FcnJvcnNcbiAgICA/IChoeWRyYXRpb25FcnJvcnMgPSBbZXJyb3JdKVxuICAgIDogaHlkcmF0aW9uRXJyb3JzLnB1c2goZXJyb3IpO1xufVxudmFyIHZhbHVlQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpLFxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbCxcbiAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHtcbiAgcHVzaCh2YWx1ZUN1cnNvciwgY29udGV4dC5fY3VycmVudFZhbHVlKTtcbiAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xufVxuZnVuY3Rpb24gcG9wUHJvdmlkZXIoY29udGV4dCkge1xuICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IpO1xufVxuZnVuY3Rpb24gc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgZm9yICg7IG51bGwgIT09IHBhcmVudDsgKSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IHBhcmVudC5hbHRlcm5hdGU7XG4gICAgKHBhcmVudC5jaGlsZExhbmVzICYgcmVuZGVyTGFuZXMpICE9PSByZW5kZXJMYW5lc1xuICAgICAgPyAoKHBhcmVudC5jaGlsZExhbmVzIHw9IHJlbmRlckxhbmVzKSxcbiAgICAgICAgbnVsbCAhPT0gYWx0ZXJuYXRlICYmIChhbHRlcm5hdGUuY2hpbGRMYW5lcyB8PSByZW5kZXJMYW5lcykpXG4gICAgICA6IG51bGwgIT09IGFsdGVybmF0ZSAmJlxuICAgICAgICAoYWx0ZXJuYXRlLmNoaWxkTGFuZXMgJiByZW5kZXJMYW5lcykgIT09IHJlbmRlckxhbmVzICYmXG4gICAgICAgIChhbHRlcm5hdGUuY2hpbGRMYW5lcyB8PSByZW5kZXJMYW5lcyk7XG4gICAgaWYgKHBhcmVudCA9PT0gcHJvcGFnYXRpb25Sb290KSBicmVhaztcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG59XG5mdW5jdGlvbiBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlcyhcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIGNvbnRleHRzLFxuICByZW5kZXJMYW5lcyxcbiAgZm9yY2VQcm9wYWdhdGVFbnRpcmVUcmVlXG4pIHtcbiAgdmFyIGZpYmVyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIG51bGwgIT09IGZpYmVyICYmIChmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcyk7XG4gIGZvciAoOyBudWxsICE9PSBmaWJlcjsgKSB7XG4gICAgdmFyIGxpc3QgPSBmaWJlci5kZXBlbmRlbmNpZXM7XG4gICAgaWYgKG51bGwgIT09IGxpc3QpIHtcbiAgICAgIHZhciBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIGxpc3QgPSBsaXN0LmZpcnN0Q29udGV4dDtcbiAgICAgIGE6IGZvciAoOyBudWxsICE9PSBsaXN0OyApIHtcbiAgICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gZmliZXI7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dHNbaV0pIHtcbiAgICAgICAgICAgIGxpc3QubGFuZXMgfD0gcmVuZGVyTGFuZXM7XG4gICAgICAgICAgICBkZXBlbmRlbmN5ID0gbGlzdC5hbHRlcm5hdGU7XG4gICAgICAgICAgICBudWxsICE9PSBkZXBlbmRlbmN5ICYmIChkZXBlbmRlbmN5LmxhbmVzIHw9IHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoXG4gICAgICAgICAgICAgIGxpc3QucmV0dXJuLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3JjZVByb3BhZ2F0ZUVudGlyZVRyZWUgfHwgKG5leHRGaWJlciA9IG51bGwpO1xuICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICB9XG4gICAgICAgIGxpc3QgPSBkZXBlbmRlbmN5Lm5leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgxOCA9PT0gZmliZXIudGFnKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5yZXR1cm47XG4gICAgICBpZiAobnVsbCA9PT0gbmV4dEZpYmVyKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDM0MSkpO1xuICAgICAgbmV4dEZpYmVyLmxhbmVzIHw9IHJlbmRlckxhbmVzO1xuICAgICAgbGlzdCA9IG5leHRGaWJlci5hbHRlcm5hdGU7XG4gICAgICBudWxsICE9PSBsaXN0ICYmIChsaXN0LmxhbmVzIHw9IHJlbmRlckxhbmVzKTtcbiAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgobmV4dEZpYmVyLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICB9IGVsc2UgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7XG4gICAgaWYgKG51bGwgIT09IG5leHRGaWJlcikgbmV4dEZpYmVyLnJldHVybiA9IGZpYmVyO1xuICAgIGVsc2VcbiAgICAgIGZvciAobmV4dEZpYmVyID0gZmliZXI7IG51bGwgIT09IG5leHRGaWJlcjsgKSB7XG4gICAgICAgIGlmIChuZXh0RmliZXIgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBmaWJlciA9IG5leHRGaWJlci5zaWJsaW5nO1xuICAgICAgICBpZiAobnVsbCAhPT0gZmliZXIpIHtcbiAgICAgICAgICBmaWJlci5yZXR1cm4gPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgICAgIG5leHRGaWJlciA9IGZpYmVyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5leHRGaWJlciA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICB9XG4gICAgZmliZXIgPSBuZXh0RmliZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZVBhcmVudENvbnRleHRDaGFuZ2VzKFxuICBjdXJyZW50LFxuICB3b3JrSW5Qcm9ncmVzcyxcbiAgcmVuZGVyTGFuZXMsXG4gIGZvcmNlUHJvcGFnYXRlRW50aXJlVHJlZVxuKSB7XG4gIGN1cnJlbnQgPSBudWxsO1xuICBmb3IgKFxuICAgIHZhciBwYXJlbnQgPSB3b3JrSW5Qcm9ncmVzcywgaXNJbnNpZGVQcm9wYWdhdGlvbkJhaWxvdXQgPSAhMTtcbiAgICBudWxsICE9PSBwYXJlbnQ7XG5cbiAgKSB7XG4gICAgaWYgKCFpc0luc2lkZVByb3BhZ2F0aW9uQmFpbG91dClcbiAgICAgIGlmICgwICE9PSAocGFyZW50LmZsYWdzICYgNTI0Mjg4KSkgaXNJbnNpZGVQcm9wYWdhdGlvbkJhaWxvdXQgPSAhMDtcbiAgICAgIGVsc2UgaWYgKDAgIT09IChwYXJlbnQuZmxhZ3MgJiAyNjIxNDQpKSBicmVhaztcbiAgICBpZiAoMTAgPT09IHBhcmVudC50YWcpIHtcbiAgICAgIHZhciBjdXJyZW50UGFyZW50ID0gcGFyZW50LmFsdGVybmF0ZTtcbiAgICAgIGlmIChudWxsID09PSBjdXJyZW50UGFyZW50KSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDM4NykpO1xuICAgICAgY3VycmVudFBhcmVudCA9IGN1cnJlbnRQYXJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgIGlmIChudWxsICE9PSBjdXJyZW50UGFyZW50KSB7XG4gICAgICAgI
1HZhciBjb250ZXh0ID0gcGFyZW50LnR5cGU7XG4gICAgICAgIG9iamVjdElzKHBhcmVudC5wZW5kaW5nUHJvcHMudmFsdWUsIGN1cnJlbnRQYXJlbnQudmFsdWUpIHx8XG4gICAgICAgICAgKG51bGwgIT09IGN1cnJlbnQgPyBjdXJyZW50LnB1c2goY29udGV4dCkgOiAoY3VycmVudCA9IFtjb250ZXh0XSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGFyZW50ID09PSBob3N0VHJhbnNpdGlvblByb3ZpZGVyQ3Vyc29yLmN1cnJlbnQpIHtcbiAgICAgIGN1cnJlbnRQYXJlbnQgPSBwYXJlbnQuYWx0ZXJuYXRlO1xuICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnRQYXJlbnQpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzg3KSk7XG4gICAgICBjdXJyZW50UGFyZW50Lm1lbW9pemVkU3RhdGUubWVtb2l6ZWRTdGF0ZSAhPT1cbiAgICAgICAgcGFyZW50Lm1lbW9pemVkU3RhdGUubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAobnVsbCAhPT0gY3VycmVudFxuICAgICAgICAgID8gY3VycmVudC5wdXNoKEhvc3RUcmFuc2l0aW9uQ29udGV4dClcbiAgICAgICAgICA6IChjdXJyZW50ID0gW0hvc3RUcmFuc2l0aW9uQ29udGV4dF0pKTtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZXMoXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIGN1cnJlbnQsXG4gICAgICByZW5kZXJMYW5lcyxcbiAgICAgIGZvcmNlUHJvcGFnYXRlRW50aXJlVHJlZVxuICAgICk7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDI2MjE0NDtcbn1cbmZ1bmN0aW9uIGNoZWNrSWZDb250ZXh0Q2hhbmdlZChjdXJyZW50RGVwZW5kZW5jaWVzKSB7XG4gIGZvciAoXG4gICAgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0O1xuICAgIG51bGwgIT09IGN1cnJlbnREZXBlbmRlbmNpZXM7XG5cbiAgKSB7XG4gICAgaWYgKFxuICAgICAgIW9iamVjdElzKFxuICAgICAgICBjdXJyZW50RGVwZW5kZW5jaWVzLmNvbnRleHQuX2N1cnJlbnRWYWx1ZSxcbiAgICAgICAgY3VycmVudERlcGVuZGVuY2llcy5tZW1vaXplZFZhbHVlXG4gICAgICApXG4gICAgKVxuICAgICAgcmV0dXJuICEwO1xuICAgIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzLm5leHQ7XG4gIH1cbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IHdvcmtJblByb2dyZXNzO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcztcbiAgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MgJiYgKHdvcmtJblByb2dyZXNzLmZpcnN0Q29udGV4dCA9IG51bGwpO1xufVxuZnVuY3Rpb24gcmVhZENvbnRleHQoY29udGV4dCkge1xuICByZXR1cm4gcmVhZENvbnRleHRGb3JDb25zdW1lcihjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHJlYWRDb250ZXh0RHVyaW5nUmVjb25jaWxpYXRpb24oY29uc3VtZXIsIGNvbnRleHQpIHtcbiAgbnVsbCA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSAmJiBwcmVwYXJlVG9SZWFkQ29udGV4dChjb25zdW1lcik7XG4gIHJldHVybiByZWFkQ29udGV4dEZvckNvbnN1bWVyKGNvbnN1bWVyLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHJlYWRDb250ZXh0Rm9yQ29uc3VtZXIoY29uc3VtZXIsIGNvbnRleHQpIHtcbiAgdmFyIHZhbHVlID0gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICBjb250ZXh0ID0geyBjb250ZXh0OiBjb250ZXh0LCBtZW1vaXplZFZhbHVlOiB2YWx1ZSwgbmV4dDogbnVsbCB9O1xuICBpZiAobnVsbCA9PT0gbGFzdENvbnRleHREZXBlbmRlbmN5KSB7XG4gICAgaWYgKG51bGwgPT09IGNvbnN1bWVyKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMwOCkpO1xuICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGNvbnRleHQ7XG4gICAgY29uc3VtZXIuZGVwZW5kZW5jaWVzID0geyBsYW5lczogMCwgZmlyc3RDb250ZXh0OiBjb250ZXh0IH07XG4gICAgY29uc3VtZXIuZmxhZ3MgfD0gNTI0Mjg4O1xuICB9IGVsc2UgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0O1xuICByZXR1cm4gdmFsdWU7XG59XG52YXIgQWJvcnRDb250cm9sbGVyTG9jYWwgPVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBBYm9ydENvbnRyb2xsZXJcbiAgICAgID8gQWJvcnRDb250cm9sbGVyXG4gICAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2Y
1XIgbGlzdGVuZXJzID0gW10sXG4gICAgICAgICAgICBzaWduYWwgPSAodGhpcy5zaWduYWwgPSB7XG4gICAgICAgICAgICAgIGFib3J0ZWQ6ICExLFxuICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzaWduYWwuYWJvcnRlZCA9ICEwO1xuICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgc2NoZWR1bGVDYWxsYmFjayQyID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssXG4gIE5vcm1hbFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFxuICBDYWNoZUNvbnRleHQgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICBDb25zdW1lcjogbnVsbCxcbiAgICBQcm92aWRlcjogbnVsbCxcbiAgICBfY3VycmVudFZhbHVlOiBudWxsLFxuICAgIF9jdXJyZW50VmFsdWUyOiBudWxsLFxuICAgIF90aHJlYWRDb3VudDogMFxuICB9O1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG4gIHJldHVybiB7XG4gICAgY29udHJvbGxlcjogbmV3IEFib3J0Q29udHJvbGxlckxvY2FsKCksXG4gICAgZGF0YTogbmV3IE1hcCgpLFxuICAgIHJlZkNvdW50OiAwXG4gIH07XG59XG5mdW5jdGlvbiByZWxlYXNlQ2FjaGUoY2FjaGUpIHtcbiAgY2FjaGUucmVmQ291bnQtLTtcbiAgMCA9PT0gY2FjaGUucmVmQ291bnQgJiZcbiAgICBzY2hlZHVsZUNhbGxiYWNrJDIoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhY2hlLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9KTtcbn1cbnZhciBjdXJyZW50RW50YW5nbGVkTGlzdGVuZXJzID0gbnVsbCxcbiAgY3VycmVudEVudGFuZ2xlZFBlbmRpbmdDb3VudCA9IDAsXG4gIGN1cnJlbnRFbnRhbmdsZWRMYW5lID0gMCxcbiAgY3VycmVudEVudGFuZ2xlZEFjdGlvblRoZW5hYmxlID0gbnVsbDtcbmZ1bmN0aW9uIGVudGFuZ2xlQXN5bmNBY3Rpb24odHJhbnNpdGlvbiwgdGhlbmFibGUpIHtcbiAgaWYgKG51bGwgPT09IGN1cnJlbnRFbnRhbmdsZWRMaXN0ZW5lcnMpIHtcbiAgICB2YXIgZW50YW5nbGVkTGlzdGVuZXJzID0gKGN1cnJlbnRFbnRhbmdsZWRMaXN0ZW5lcnMgPSBbXSk7XG4gICAgY3VycmVudEVudGFuZ2xlZFBlbmRpbmdDb3VudCA9IDA7XG4gICAgY3VycmVudEVudGFuZ2xlZExhbmUgPSByZXF1ZXN0VHJhbnNpdGlvbkxhbmUoKTtcbiAgICBjdXJyZW50RW50YW5nbGVkQWN0aW9uVGhlbmFibGUgPSB7XG4gICAgICBzdGF0dXM6IFwicGVuZGluZ1wiLFxuICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIGVudGFuZ2xlZExpc3RlbmVycy5wdXNoKHJlc29sdmUpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgY3VycmVudEVudGFuZ2xlZFBlbmRpbmdDb3VudCsrO1xuICB0aGVuYWJsZS50aGVuKHBpbmdFbmd0YW5nbGVkQWN0aW9uU2NvcGUsIHBpbmdFbmd0YW5nbGVkQWN0aW9uU2NvcGUpO1xuICByZXR1cm4gdGhlbmFibGU7XG59XG5mdW5jdGlvbiBwaW5nRW5ndGFuZ2xlZEFjdGlvblNjb3BlKCkge1xuICBpZiAoXG4gICAgMCA9PT0gLS1jdXJyZW50RW50YW5nbGVkUGVuZGluZ0NvdW50ICYmXG4gICAgbnVsbCAhPT0gY3VycmVudEVudGFuZ2xlZExpc3RlbmVyc1xuICApIHtcbiAgICBudWxsICE9PSBjdXJyZW50RW50YW5nbGVkQWN0aW9uVGhlbmFibGUgJiZcbiAgICAgIChjdXJyZW50RW50YW5nbGVkQWN0aW9uVGhlbmFibGUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIik7XG4gICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnRFbnRhbmdsZWRMaXN0ZW5lcnM7XG4gICAgY3VycmVudEVudGFuZ2xlZExpc3RlbmVycyA9IG51bGw7XG4gICAgY3VycmVudEVudGFuZ2xlZExhbmUgPSAwO1xuICAgIGN1cnJlbnRFbnRhbmdsZWRBY3Rpb25UaGVuYWJsZSA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspICgwLCBsaXN0ZW5lcnNbaV0pKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNoYWluVGhlbmFibGVWYWx1ZSh0aGVuYWJsZSwgcmVzdWx0KSB7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXSxcbiAgICB0aGVuYWJsZVdpdGhPdmVycmlkZSA9IHtcbiAgICAgIHN0YXR1czogXCJwZW5kaW5nXCIsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIHJlYXNvbjogbnVsbCxcbiAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKHJlc29sdmUpO1xuICAgICAgfVxuICAgIH07XG4gIHRoZW5hYmxlLnRoZW4oXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgdGhlbmFibGVXaXRoT3ZlcnJpZGUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIjtcbiAgICAgIHRoZW5hYmxlV2l0aE92ZXJyaWRlLnZhbHVlID0gcmVzdWx0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspICgwLCBsaXN0ZW5lcnNbaV0pKHJlc3VsdCk7XG4gICAgfSxcbiAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIHRoZW5hYmxlV2l0aE92ZXJyaWRlLnN0YXR1cyA9IFwicmVqZWN0ZWRcIjtcbiAgICAgIHRoZW5hYmxlV2l0aE92ZXJyaWRlLnJlYXNvbiA9IGVycm9yO1xuICAgICAgZm9yIChlcnJvciA9IDA7IGVycm9yIDwgbGlzdGVuZXJzLmxlbmd0aDsgZXJyb3IrKylcbiAgICAgICAgKDAsIGxpc3RlbmVyc1tlcnJvcl0pKHZvaWQgMCk7XG4gICAgfVxuICApO1xuICByZXR1cm4gdGhlbmFibGVXaXRoT3ZlcnJpZGU7XG59XG52YXIgcHJldk9uU3RhcnRUcmFuc2l0aW9uRmluaXNoID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUztcblJlYWN0U2hhcmVkSW50ZXJuYWxzLlMgPSBmdW5jdGlvbiAodHJhbnNpdGlvbiwgcmV0dXJuVmFsdWUpIHtcbiAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlICYmXG4gICAgbnVsbCAhPT0gcmV0dXJuVmFsdWUgJiZcbiAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZXR1cm5WYWx1ZS50aGVuICYmXG4gICAgZW50YW5nbGVBc3luY0FjdGlvbih0cmFuc2l0aW9uLCByZXR1cm5WYWx1ZSk7XG4gIG51bGwgIT09IHByZXZPblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCAmJlxuICAgI
1HByZXZPblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCh0cmFuc2l0aW9uLCByZXR1cm5WYWx1ZSk7XG59O1xudmFyIHJlc3VtZWRDYWNoZSA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbmZ1bmN0aW9uIHBlZWtDYWNoZUZyb21Qb29sKCkge1xuICB2YXIgY2FjaGVSZXN1bWVkRnJvbVByZXZpb3VzUmVuZGVyID0gcmVzdW1lZENhY2hlLmN1cnJlbnQ7XG4gIHJldHVybiBudWxsICE9PSBjYWNoZVJlc3VtZWRGcm9tUHJldmlvdXNSZW5kZXJcbiAgICA/IGNhY2hlUmVzdW1lZEZyb21QcmV2aW91c1JlbmRlclxuICAgIDogd29ya0luUHJvZ3Jlc3NSb290LnBvb2xlZENhY2hlO1xufVxuZnVuY3Rpb24gcHVzaFRyYW5zaXRpb24ob2Zmc2NyZWVuV29ya0luUHJvZ3Jlc3MsIHByZXZDYWNoZVBvb2wpIHtcbiAgbnVsbCA9PT0gcHJldkNhY2hlUG9vbFxuICAgID8gcHVzaChyZXN1bWVkQ2FjaGUsIHJlc3VtZWRDYWNoZS5jdXJyZW50KVxuICAgIDogcHVzaChyZXN1bWVkQ2FjaGUsIHByZXZDYWNoZVBvb2wucG9vbCk7XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5kZWRDYWNoZSgpIHtcbiAgdmFyIGNhY2hlRnJvbVBvb2wgPSBwZWVrQ2FjaGVGcm9tUG9vbCgpO1xuICByZXR1cm4gbnVsbCA9PT0gY2FjaGVGcm9tUG9vbFxuICAgID8gbnVsbFxuICAgIDogeyBwYXJlbnQ6IENhY2hlQ29udGV4dC5fY3VycmVudFZhbHVlLCBwb29sOiBjYWNoZUZyb21Qb29sIH07XG59XG52YXIgU3VzcGVuc2VFeGNlcHRpb24gPSBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQ2MCkpLFxuICBTdXNwZW5zZXlDb21taXRFeGNlcHRpb24gPSBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQ3NCkpLFxuICBTdXNwZW5zZUFjdGlvbkV4Y2VwdGlvbiA9IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNTQyKSksXG4gIG5vb3BTdXNwZW5zZXlDb21taXRUaGVuYWJsZSA9IHsgdGhlbjogZnVuY3Rpb24gKCkge30gfTtcbmZ1bmN0aW9uIGlzVGhlbmFibGVSZXNvbHZlZCh0aGVuYWJsZSkge1xuICB0aGVuYWJsZSA9IHRoZW5hYmxlLnN0YXR1cztcbiAgcmV0dXJuIFwiZnVsZmlsbGVkXCIgPT09IHRoZW5hYmxlIHx8IFwicmVqZWN0ZWRcIiA9PT0gdGhlbmFibGU7XG59XG5mdW5jdGlvbiBub29wJDMoKSB7fVxuZnVuY3Rpb24gdHJhY2tVc2VkVGhlbmFibGUodGhlbmFibGVTdGF0ZSwgdGhlbmFibGUsIGluZGV4KSB7XG4gIGluZGV4ID0gdGhlbmFibGVTdGF0ZVtpbmRleF07XG4gIHZvaWQgMCA9PT0gaW5kZXhcbiAgICA/IHRoZW5hYmxlU3RhdGUucHVzaCh0aGVuYWJsZSlcbiAgICA6IGluZGV4ICE9PSB0aGVuYWJsZSAmJiAodGhlbmFibGUudGhlbihub29wJDMsIG5vb3AkMyksICh0aGVuYWJsZSA9IGluZGV4KSk7XG4gIHN3aXRjaCAodGhlbmFibGUuc3RhdHVzKSB7XG4gICAgY2FzZSBcImZ1bGZpbGxlZFwiOlxuICAgICAgcmV0dXJuIHRoZW5hYmxlLnZhbHVlO1xuICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgdGhyb3cgKFxuICAgICAgICAoKHRoZW5hYmxlU3RhdGUgPSB0aGVuYWJsZS5yZWFzb24pLFxuICAgICAgICBjaGVja0lmVXNlV3JhcHBlZEluQXN5bmNDYXRjaCh0aGVuYWJsZVN0YXRlKSxcbiAgICAgICAgdGhlbmFibGVTdGF0ZSlcbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdGhlbmFibGUuc3RhdHVzKSB0aGVuYWJsZS50aGVuKG5vb3AkMywgbm9vcCQzKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGVuYWJsZVN0YXRlID0gd29ya0luUHJvZ3Jlc3NSb290O1xuICAgICAgICBpZiAobnVsbCAhPT0gdGhlbmFibGVTdGF0ZSAmJiAxMDAgPCB0aGVuYWJsZVN0YXRlLnNoZWxsU3VzcGVuZENvdW50ZXIpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0ODIpKTtcbiAgICAgICAgdGhlbmFibGVTdGF0ZSA9IHRoZW5hYmxlO1xuICAgICAgICB0aGVuYWJsZVN0YXRlLnN0YXR1cyA9IFwicGVuZGluZ1wiO1xuICAgICAgICB0aGVuYWJsZVN0YXRlLnRoZW4oXG4gICAgICAgICAgZnVuY3Rpb24gKGZ1bGZpbGxlZFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoXCJwZW5kaW5nXCIgPT09IHRoZW5hYmxlLnN0YXR1cykge1xuICAgICAgICAgICAgICB2Y
1XIgZnVsZmlsbGVkVGhlbmFibGUgPSB0aGVuYWJsZTtcbiAgICAgICAgICAgICAgZnVsZmlsbGVkVGhlbmFibGUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIjtcbiAgICAgICAgICAgICAgZnVsZmlsbGVkVGhlbmFibGUudmFsdWUgPSBmdWxmaWxsZWRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKFwicGVuZGluZ1wiID09PSB0aGVuYWJsZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgdmFyIHJlamVjdGVkVGhlbmFibGUgPSB0aGVuYWJsZTtcbiAgICAgICAgICAgICAgcmVqZWN0ZWRUaGVuYWJsZS5zdGF0dXMgPSBcInJlamVjdGVkXCI7XG4gICAgICAgICAgICAgIHJlamVjdGVkVGhlbmFibGUucmVhc29uID0gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh0aGVuYWJsZS5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSBcImZ1bGZpbGxlZFwiOlxuICAgICAgICAgIHJldHVybiB0aGVuYWJsZS52YWx1ZTtcbiAgICAgICAgY2FzZSBcInJlamVjdGVkXCI6XG4gICAgICAgICAgdGhyb3cgKFxuICAgICAgICAgICAgKCh0aGVuYWJsZVN0YXRlID0gdGhlbmFibGUucmVhc29uKSxcbiAgICAgICAgICAgIGNoZWNrSWZVc2VXcmFwcGVkSW5Bc3luY0NhdGNoKHRoZW5hYmxlU3RhdGUpLFxuICAgICAgICAgICAgdGhlbmFibGVTdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgc3VzcGVuZGVkVGhlbmFibGUgPSB0aGVuYWJsZTtcbiAgICAgIHRocm93IFN1c3BlbnNlRXhjZXB0aW9uO1xuICB9XG59XG52YXIgc3VzcGVuZGVkVGhlbmFibGUgPSBudWxsO1xuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVGhlbmFibGUoKSB7XG4gIGlmIChudWxsID09PSBzdXNwZW5kZWRUaGVuYWJsZSkgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0NTkpKTtcbiAgdmFyIHRoZW5hYmxlID0gc3VzcGVuZGVkVGhlbmFibGU7XG4gIHN1c3BlbmRlZFRoZW5hYmxlID0gbnVsbDtcbiAgcmV0dXJuIHRoZW5hYmxlO1xufVxuZnVuY3Rpb24gY2hlY2tJZlVzZVdyYXBwZWRJbkFzeW5jQ2F0Y2gocmVqZWN0ZWRSZWFzb24pIHtcbiAgaWYgKFxuICAgIHJlamVjdGVkUmVhc29uID09PSBTdXNwZW5zZUV4Y2VwdGlvbiB8fFxuICAgIHJlamVjdGVkUmVhc29uID09PSBTdXNwZW5zZUFjdGlvbkV4Y2VwdGlvblxuICApXG4gICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0ODMpKTtcbn1cbnZhciBoYXNGb3JjZVVwZGF0ZSA9ICExO1xuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0ge1xuICAgIGJhc2VTdGF0ZTogZmliZXIubWVtb2l6ZWRTdGF0ZSxcbiAgICBmaXJzdEJhc2VVcGRhdGU6IG51bGwsXG4gICAgbGFzdEJhc2VVcGRhdGU6IG51bGwsXG4gICAgc2hhcmVkOiB7IHBlbmRpbmc6IG51bGwsIGxhbmVzOiAwLCBoaWRkZW5DYWxsYmFja3M6IG51bGwgfSxcbiAgICBjYWxsYmFja3M6IG51bGxcbiAgfTtcbn1cbmZ1bmN0aW9uIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgY3VycmVudCA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID09PSBjdXJyZW50ICYmXG4gICAgKHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0ge1xuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50LmJhc2VTdGF0ZSxcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZTogY3VycmVudC5maXJzdEJhc2VVcGRhdGUsXG4gICAgICBsYXN0QmFzZVVwZGF0ZTogY3VycmVudC5sYXN0QmFzZVVwZGF0ZSxcbiAgICAgIHNoYXJlZDogY3VycmVudC5zaGFyZWQsXG4gICAgICBjYWxsYmFja3M6IG51bGxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZShsYW5lKSB7XG4gIHJldHVybiB7IGxhbmU6IGxhbmUsIHRhZzogMCwgcGF5bG9hZDogbnVsbCwgY2FsbGJhY2s6IG51bGwsIG5leHQ6IG51bGwgfTtcbn1cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcbiAgaWYgKG51bGwgPT09IHVwZGF0ZVF1ZXVlKSByZXR1cm4gbnVsbDtcbiAgdXBkYXRlUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gIGlmICgwICE9PSAoZXhlY3V0aW9uQ29udGV4dCAmIDIpKSB7XG4gICAgdmFyIHBlbmRpbmcgPSB1cGRhdGVRdWV1ZS5wZW5kaW5nO1xuICAgIG51bGwgPT09IHBlbmRpbmdcbiAgICAgID8gKHVwZGF0ZS5uZXh0ID0gdXBkYXRlKVxuICAgICAgOiAoKHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0KSwgKHBlbmRpbmcubmV4dCA9IHVwZGF0ZSkpO1xuICAgIHVwZGF0ZVF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgdXBkYXRlID0gZ2V0Um9vdEZvclVwZGF0ZWRGaWJlcihmaWJlcik7XG4gICAgbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIG51bGwsIGxhbmUpO1xuICAgIHJldHVybiB1cGRhdGU7XG4gIH1cbiAgZW5xdWV1ZVVwZGF0ZSQxKGZpYmVyLCB1cGRhdGVRdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgcmV0dXJuIGdldFJvb3RGb3JVcGRhdGVkRmliZXIoZmliZXIpO1xufVxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSkge1xuICBmaWJlciA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuICBpZiAobnVsbCAhPT0gZmliZXIgJiYgKChmaWJlciA9IGZpYmVyLnNoYXJlZCksIDAgIT09IChsYW5lICYgNDE5NDA0OCkpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBmaWJlci5sYW5lcztcbiAgICBxdWV1ZUxhbmVzICY9IHJvb3QucGVuZGluZ0xhbmVzO1xuICAgIGxhbmUgfD0gcXVldWVMYW5lcztcbiAgICBmaWJlci5sYW5lcyA9IGxhbmU7XG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY2FwdHVyZWRVcGRhdGUpIHtcbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUsXG4gICAgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcbiAgaWYgKFxuICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAoKGN1cnJlbnQgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlKSwgcXVldWUgPT09IGN1cnJlbnQpXG4gICkge1xuICAgIHZhciBuZXdGaXJzdCA9IG51bGwsXG4gICAgICBuZXdMYXN0ID0gbnVsbDtcbiAgICBxdWV1ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcbiAgICBpZiAobnVsbCAhPT0gcXVldWUpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGxhbmU6IHF1ZXVlLmxhbmUsXG4gICAgICAgICAgdGFnOiBxdWV1ZS50YWcsXG4gICAgICAgICAgcGF5bG9hZDogcXVldWUucGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogbnVsbCxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgI
1H07XG4gICAgICAgIG51bGwgPT09IG5ld0xhc3RcbiAgICAgICAgICA/IChuZXdGaXJzdCA9IG5ld0xhc3QgPSBjbG9uZSlcbiAgICAgICAgICA6IChuZXdMYXN0ID0gbmV3TGFzdC5uZXh0ID0gY2xvbmUpO1xuICAgICAgICBxdWV1ZSA9IHF1ZXVlLm5leHQ7XG4gICAgICB9IHdoaWxlIChudWxsICE9PSBxdWV1ZSk7XG4gICAgICBudWxsID09PSBuZXdMYXN0XG4gICAgICAgID8gKG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlKVxuICAgICAgICA6IChuZXdMYXN0ID0gbmV3TGFzdC5uZXh0ID0gY2FwdHVyZWRVcGRhdGUpO1xuICAgIH0gZWxzZSBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICBxdWV1ZSA9IHtcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudC5iYXNlU3RhdGUsXG4gICAgICBmaXJzdEJhc2VVcGRhdGU6IG5ld0ZpcnN0LFxuICAgICAgbGFzdEJhc2VVcGRhdGU6IG5ld0xhc3QsXG4gICAgICBzaGFyZWQ6IGN1cnJlbnQuc2hhcmVkLFxuICAgICAgY2FsbGJhY2tzOiBjdXJyZW50LmNhbGxiYWNrc1xuICAgIH07XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBxdWV1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgd29ya0luUHJvZ3Jlc3MgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcbiAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NcbiAgICA/IChxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZSlcbiAgICA6ICh3b3JrSW5Qcm9ncmVzcy5uZXh0ID0gY2FwdHVyZWRVcGRhdGUpO1xuICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xufVxudmFyIGRpZFJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24gPSAhMTtcbmZ1bmN0aW9uIHN1c3BlbmRJZlVwZGF0ZVJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24oKSB7XG4gIGlmIChkaWRSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uKSB7XG4gICAgdmFyIGVudGFuZ2xlZEFjdGlvblRoZW5hYmxlID0gY3VycmVudEVudGFuZ2xlZEFjdGlvblRoZW5hYmxlO1xuICAgIGlmIChudWxsICE9PSBlbnRhbmdsZWRBY3Rpb25UaGVuYWJsZSkgdGhyb3cgZW50YW5nbGVkQWN0aW9uVGhlbmFibGU7XG4gIH1cbn1cbmZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZShcbiAgd29ya0luUHJvZ3Jlc3MkanNjb21wJDAsXG4gIHByb3BzLFxuICBpbnN0YW5jZSRqc2NvbXAkMCxcbiAgcmVuZGVyTGFuZXNcbikge1xuICBkaWRSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uID0gITE7XG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzJGpzY29tcCQwLnVwZGF0ZVF1ZXVlO1xuICBoYXNGb3JjZVVwZGF0ZSA9ICExO1xuICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlLFxuICAgIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGUsXG4gICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG4gIGlmIChudWxsICE9PSBwZW5kaW5nUXVldWUpIHtcbiAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7XG4gICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlLFxuICAgICAgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDtcbiAgICBudWxsID09PSBsYXN0QmFzZVVwZGF0ZVxuICAgICAgPyAoZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlKVxuICAgICAgOiAobGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZSk7XG4gICAgbGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzJGpzY29tcCQwLmFsdGVybmF0ZTtcbiAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAoKGN1cnJlbnQgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlKSxcbiAgICAgIChwZW5kaW5nUXVldWUgPSBjdXJyZW50Lmxhc3RCYXNlVXBkYXRlKSxcbiAgICAgIHBlbmRpbmdRdWV1ZSAhPT0gbGFzdEJhc2VVcGRhdGUgJiZcbiAgICAgICAgKG51bGwgPT09IHBlbmRpbmdRdWV1ZVxuICAgICAgICAgID8gKGN1cnJlbnQuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlKVxuICAgICAgICAgIDogKHBlbmRpbmdRdWV1ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlKSxcbiAgICAgICAgKGN1cnJlbnQubGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZSkpKTtcbiAgfVxuICBpZiAobnVsbCAhPT0gZmlyc3RCYXNlVXBkYXRlKSB7XG4gICAgdmFyIG5ld1N0YXRlID0gcXVldWUuYmFzZVN0YXRlO1xuICAgIGxhc3RCYXNlVXBkYXRlID0gMDtcbiAgICBjdXJyZW50ID0gZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUgPSBudWxsO1xuICAgIHBlbmRpbmdRdWV1ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcbiAgICBkbyB7XG4gICAgICB2Y
1XIgdXBkYXRlTGFuZSA9IHBlbmRpbmdRdWV1ZS5sYW5lICYgLTUzNjg3MDkxMyxcbiAgICAgICAgaXNIaWRkZW5VcGRhdGUgPSB1cGRhdGVMYW5lICE9PSBwZW5kaW5nUXVldWUubGFuZTtcbiAgICAgIGlmIChcbiAgICAgICAgaXNIaWRkZW5VcGRhdGVcbiAgICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIHVwZGF0ZUxhbmUpID09PSB1cGRhdGVMYW5lXG4gICAgICAgICAgOiAocmVuZGVyTGFuZXMgJiB1cGRhdGVMYW5lKSA9PT0gdXBkYXRlTGFuZVxuICAgICAgKSB7XG4gICAgICAgIDAgIT09IHVwZGF0ZUxhbmUgJiZcbiAgICAgICAgICB1cGRhdGVMYW5lID09PSBjdXJyZW50RW50YW5nbGVkTGFuZSAmJlxuICAgICAgICAgIChkaWRSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uID0gITApO1xuICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgKGN1cnJlbnQgPSBjdXJyZW50Lm5leHQgPVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYW5lOiAwLFxuICAgICAgICAgICAgICB0YWc6IHBlbmRpbmdRdWV1ZS50YWcsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHBlbmRpbmdRdWV1ZS5wYXlsb2FkLFxuICAgICAgICAgICAgICBjYWxsYmFjazogbnVsbCxcbiAgICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGE6IHtcbiAgICAgICAgICB2YXIgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcyRqc2NvbXAkMCxcbiAgICAgICAgICAgIHVwZGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICAgICAgICB1cGRhdGVMYW5lID0gcHJvcHM7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2UkanNjb21wJDA7XG4gICAgICAgICAgc3dpdGNoICh1cGRhdGUudGFnKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gdXBkYXRlLnBheWxvYWQ7XG4gICAgICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MuY2FsbChpbnN0YW5jZSwgbmV3U3RhdGUsIHVwZGF0ZUxhbmUpO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAtNjU1MzcpIHwgMTI4O1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICAgICAgICB1cGRhdGVMYW5lID1cbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB3b3JrSW5Qcm9ncmVzc1xuICAgICAgICAgICAgICAgICAgPyB3b3JrSW5Qcm9ncmVzcy5jYWxsKGluc3RhbmNlLCBuZXdTdGF0ZSwgdXBkYXRlTGFuZSlcbiAgICAgICAgICAgICAgICAgIDogd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIGlmIChudWxsID09PSB1cGRhdGVMYW5lIHx8IHZvaWQgMCA9PT0gdXBkYXRlTGFuZSkgYnJlYWsgYTtcbiAgICAgICAgICAgICAgbmV3U3RhdGUgPSBhc3NpZ24oe30sIG5ld1N0YXRlLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgaGFzRm9yY2VVcGRhdGUgPSAhMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlTGFuZSA9IHBlbmRpbmdRdWV1ZS5jYWxsYmFjaztcbiAgICAgICAgbnVsbCAhPT0gdXBkYXRlTGFuZSAmJlxuICAgICAgICAgICgod29ya0luUHJvZ3Jlc3MkanNjb21wJDAuZmxhZ3MgfD0gNjQpLFxuICAgICAgICAgIGlzSGlkZGVuVXBkYXRlICYmICh3b3JrSW5Qcm9ncmVzcyRqc2NvbXAkMC5mbGFncyB8PSA4MTkyKSxcbiAgICAgICAgICAoaXNIaWRkZW5VcGRhdGUgPSBxdWV1ZS5jYWxsYmFja3MpLFxuICAgICAgICAgIG51bGwgPT09IGlzSGlkZGVuVXBkYXRlXG4gICAgICAgICAgICA/IChxdWV1ZS5jYWxsYmFja3MgPSBbdXBkYXRlTGFuZV0pXG4gICAgICAgICAgICA6IGlzSGlkZGVuVXBkYXRlLnB1c2godXBkYXRlTGFuZSkpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIChpc0hpZGRlblVwZGF0ZSA9IHtcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIHRhZzogcGVuZGluZ1F1ZXVlLnRhZyxcbiAgICAgICAgICBwYXlsb2FkOiBwZW5kaW5nUXVldWUucGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogcGVuZGluZ1F1ZXVlLmNhbGxiYWNrLFxuICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfSksXG4gICAgICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICAgICAgPyAoKGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGN1cnJlbnQgPSBpc0hpZGRlblVwZGF0ZSksXG4gICAgICAgICAgICAgIChsYXN0UGVuZGluZ1VwZGF0ZSA9IG5ld1N0YXRlKSlcbiAgICAgICAgICAgIDogKGN1cnJlbnQgPSBjdXJyZW50Lm5leHQgPSBpc0hpZGRlblVwZGF0ZSksXG4gICAgICAgICAgKGxhc3RCYXNlVXBkYXRlIHw9IHVwZGF0ZUxhbmUpO1xuICAgICAgcGVuZGluZ1F1ZXVlID0gcGVuZGluZ1F1ZXVlLm5leHQ7XG4gICAgICBpZiAobnVsbCA9PT0gcGVuZGluZ1F1ZXVlKVxuICAgICAgICBpZiAoKChwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZyksIG51bGwgPT09IHBlbmRpbmdRdWV1ZSkpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAoaXNIaWRkZW5VcGRhdGUgPSBwZW5kaW5nUXVldWUpLFxuICAgICAgICAgICAgKHBlbmRpbmdRdWV1ZSA9IGlzSGlkZGVuVXBkYXRlLm5leHQpLFxuICAgICAgICAgICAgKGlzSGlkZGVuVXBkYXRlLm5leHQgPSBudWxsKSxcbiAgICAgICAgICAgIChxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGlzSGlkZGVuVXBkYXRlKSxcbiAgICAgICAgICAgIChxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGwpO1xuICAgIH0gd2hpbGUgKDEpO1xuICAgIG51bGwgPT09IGN1cnJlbnQgJiYgKGxhc3RQZW5kaW5nVXBkYXRlID0gbmV3U3RhdGUpO1xuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlO1xuICAgIHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGN1cnJlbnQ7XG4gICAgbnVsbCA9PT0gZmlyc3RCYXNlVXBkYXRlICYmIChxdWV1ZS5zaGFyZWQubGFuZXMgPSAwKTtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgfD0gbGFzdEJhc2VVcGRhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MkanNjb21wJDAubGFuZXMgPSBsYXN0QmFzZVVwZGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcyRqc2NvbXAkMC5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxDYWxsYmFjayhjYWxsYmFjaywgY29udGV4dCkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgY2FsbGJhY2spXG4gICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxOTEsIGNhbGxiYWNrKSk7XG4gIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7XG59XG5mdW5jdGlvbiBjb21taXRDYWxsYmFja3ModXBkYXRlUXVldWUsIGNvbnRleHQpIHtcbiAgdmFyIGNhbGxiYWNrcyA9IHVwZGF0ZVF1ZXVlLmNhbGxiYWNrcztcbiAgaWYgKG51bGwgIT09IGNhbGxiYWNrcylcbiAgICBmb3IgKFxuICAgICAgdXBkYXRlUXVldWUuY2FsbGJhY2tzID0gbnVsbCwgdXBkYXRlUXVldWUgPSAwO1xuICAgICAgdXBkYXRlUXVldWUgPCBjYWxsYmFja3MubGVuZ3RoO1xuICAgICAgdXBkYXRlUXVldWUrK1xuICAgIClcbiAgICAgIGNhbGxDYWxsYmFjayhjYWxsYmFja3NbdXBkYXRlUXVldWVdLCBjb250ZXh0KTtcbn1cbnZhciBjdXJyZW50VHJlZUhpZGRlblN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpLFxuICBwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXNDdXJzb3IgPSBjcmVhdGVDdXJzb3IoMCk7XG5mdW5jdGlvbiBwdXNoSGlkZGVuQ29udGV4dChmaWJlciwgY29udGV4dCkge1xuICBmaWJlciA9IGVudGFuZ2xlZFJlbmRlckxhbmVzO1xuICBwdXNoKHByZXZFbnRhbmdsZWRSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xuICBwdXNoKGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IsIGNvbnRleHQpO1xuICBlbnRhbmdsZWRSZW5kZXJMYW5lcyA9IGZpYmVyIHwgY29udGV4dC5iYXNlTGFuZXM7XG59XG5mdW5jdGlvbiByZXVzZUhpZGRlbkNvbnRleHRPblN0YWNrKCkge1xuICBwdXNoKHByZXZFbnRhbmdsZWRSZW5kZXJMYW5lc0N1cnNvciwgZW50YW5nbGVkUmVuZGVyTGFuZXMpO1xuICBwdXNoKGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IsIGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IuY3VycmVudCk7XG59XG5mdW5jdGlvbiBwb3BIaWRkZW5Db250ZXh0KCkge1xuICBlbnRhbmdsZWRSZW5kZXJMYW5lcyA9IHByZXZFbnRhbmdsZWRSZW5kZXJMYW5lc0N1cnNvci5jdXJyZW50O1xuICBwb3AoY3VycmVudFRyZWVIaWRkZW5TdGFja0N1cnNvcik7XG4gIHBvcChwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXNDdXJzb3IpO1xufVxudmFyIHJlbmRlckxhbmVzID0gMCxcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsLFxuICBjdXJyZW50SG9vayA9IG51bGwsXG4gIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGwsXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSAhMSxcbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gITEsXG4gIHNob3VsZERvdWJsZUludm9rZVVzZXJGbnNJbkhvb2tzREVWID0gITEsXG4gIGxvY2FsSWRDb3VudGVyID0gMCxcbiAgdGhlbmFibGVJbmRleENvdW50ZXIkMSA9IDAsXG4gIHRoZW5hYmxlU3RhdGUkMSA9IG51bGwsXG4gIGdsb2JhbENsaWVudElkQ29
11bnRlciA9IDA7XG5mdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzIxKSk7XG59XG5mdW5jdGlvbiBhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSB7XG4gIGlmIChudWxsID09PSBwcmV2RGVwcykgcmV0dXJuICExO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZEZXBzLmxlbmd0aCAmJiBpIDwgbmV4dERlcHMubGVuZ3RoOyBpKyspXG4gICAgaWYgKCFvYmplY3RJcyhuZXh0RGVwc1tpXSwgcHJldkRlcHNbaV0pKSByZXR1cm4gITE7XG4gIHJldHVybiAhMDtcbn1cbmZ1bmN0aW9uIHJlbmRlcldpdGhIb29rcyhcbiAgY3VycmVudCxcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIENvbXBvbmVudCxcbiAgcHJvcHMsXG4gIHNlY29uZEFyZyxcbiAgbmV4dFJlbmRlckxhbmVzXG4pIHtcbiAgcmVuZGVyTGFuZXMgPSBuZXh0UmVuZGVyTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gMDtcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9XG4gICAgbnVsbCA9PT0gY3VycmVudCB8fCBudWxsID09PSBjdXJyZW50Lm1lbW9pemVkU3RhdGVcbiAgICAgID8gSG9va3NEaXNwYXRjaGVyT25Nb3VudFxuICAgICAgOiBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZTtcbiAgc2hvdWxkRG91YmxlSW52b2tlVXNlckZuc0luSG9va3NERVYgPSAhMTtcbiAgbmV4dFJlbmRlckxhbmVzID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpO1xuICBzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFViA9ICExO1xuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgJiZcbiAgICAobmV4dFJlbmRlckxhbmVzID0gcmVuZGVyV2l0aEhvb2tzQWdhaW4oXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIHByb3BzLFxuICAgICAgc2Vjb25kQXJnXG4gICAgKSk7XG4gIGZpbmlzaFJlbmRlcmluZ0hvb2tzKGN1cnJlbnQpO1xuICByZXR1cm4gbmV4dFJlbmRlckxhbmVzO1xufVxuZnVuY3Rpb24gZmluaXNoUmVuZGVyaW5nSG9va3MoY3VycmVudCkge1xuICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICB2YXIgZGlkUmVuZGVyVG9vRmV3SG9va3MgPSBudWxsICE9PSBjdXJyZW50SG9vayAmJiBudWxsICE9PSBjdXJyZW50SG9vay5uZXh0O1xuICByZW5kZXJMYW5lcyA9IDA7XG4gIHdvcmtJblByb2dyZXNzSG9vayA9IGN1cnJlbnRIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gITE7XG4gIHRoZW5hYmxlSW5kZXhDb3VudGVyJDEgPSAwO1xuICB0aGVuYWJsZVN0YXRlJDEgPSBudWxsO1xuICBpZiAoZGlkUmVuZGVyVG9vRmV3SG9va3MpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzAwKSk7XG4gIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICBkaWRSZWNlaXZlVXBkYXRlIHx8XG4gICAgKChjdXJyZW50ID0gY3VycmVudC5kZXBlbmRlbmNpZXMpLFxuICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgIGNoZWNrSWZDb250ZXh0Q2hhbmdlZChjdXJyZW50KSAmJlxuICAgICAgKGRpZFJlY2VpdmVVcGRhdGUgPSAhMCkpO1xufVxuZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzQWdhaW4od29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZykge1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuICBkbyB7XG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzICYmICh0aGVuYWJsZVN0YXRlJDEgPSBudWxsKTtcbiAgICB0aGVuYWJsZUluZGV4Q291bnRlciQxID0gMDtcbiAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSAhMTtcbiAgICBpZiAoMjUgPD0gbnVtYmVyT2ZSZVJlbmRlcnMpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzAxKSk7XG4gICAgbnVtYmVyT2ZSZVJlbmRlcnMgKz0gMTtcbiAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBjdXJyZW50SG9vayA9IG51bGw7XG4gICAgaWYgKG51bGwgIT0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgICAgY2hpbGRyZW4ubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgICBjaGlsZHJlbi5ldmVudHMgPSBudWxsO1xuICAgICAgY2hpbGRyZW4uc3RvcmVzID0gbnVsbDtcbiAgICAgIG51bGwgIT0gY2hpbGRyZW4ubWVtb0NhY2hlICYmIChjaGlsZHJlbi5tZW1vQ2FjaGUuaW5kZXggPSAwKTtcbiAgICB9XG4gICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXI7XG4gICAgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gIH0gd2hpbGUgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyk7XG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIFRyYW5zaXRpb25Bd2FyZUhvc3RDb21wb25lbnQoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCxcbiAgICBtYXliZVRoZW5hYmxlID0gZGlzcGF0Y2hlci51c2VTdGF0ZSgpWzBdO1xuICBtYXliZVRoZW5hYmxlID1cbiAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBtYXliZVRoZW5hYmxlLnRoZW5cbiAgICAgID8gdXNlVGhlbmFibGUobWF5YmVUaGVuYWJsZSlcbiAgICAgIDogbWF5YmVUaGVuYWJsZTtcbiAgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXIudXNlU3RhdGUoKVswXTtcbiAgKG51bGwgIT09IGN1cnJlbnRIb29rID8gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSA6IG51bGwpICE9PSBkaXNwYXRjaGVyICYmXG4gICAgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmZsYWdzIHw9IDEwMjQpO1xuICByZXR1cm4gbWF5YmVUaGVuYWJsZTtcbn1cbmZ1bmN0aW9uIGNoZWNrRGlkUmVuZGVySWRIb29rKCkge1xuICB2YXIgZGl
1kUmVuZGVySWRIb29rID0gMCAhPT0gbG9jYWxJZENvdW50ZXI7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgcmV0dXJuIGRpZFJlbmRlcklkSG9vaztcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSAtMjA1MztcbiAgY3VycmVudC5sYW5lcyAmPSB+bGFuZXM7XG59XG5mdW5jdGlvbiByZXNldEhvb2tzT25VbndpbmQod29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHtcbiAgICBmb3IgKFxuICAgICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICApIHtcbiAgICAgIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnF1ZXVlO1xuICAgICAgbnVsbCAhPT0gcXVldWUgJiYgKHF1ZXVlLnBlbmRpbmcgPSBudWxsKTtcbiAgICAgIHdvcmtJblByb2dyZXNzID0gd29ya0luUHJvZ3Jlc3MubmV4dDtcbiAgICB9XG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9ICExO1xuICB9XG4gIHJlbmRlckxhbmVzID0gMDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gY3VycmVudEhvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9ICExO1xuICB0aGVuYWJsZUluZGV4Q291bnRlciQxID0gbG9jYWxJZENvdW50ZXIgPSAwO1xuICB0aGVuYWJsZVN0YXRlJDEgPSBudWxsO1xufVxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIHZhciBob29rID0ge1xuICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgYmFzZVN0YXRlOiBudWxsLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIG51bGwgPT09IHdvcmtJblByb2dyZXNzSG9va1xuICAgID8gKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rKVxuICAgIDogKHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gaG9vayk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5mdW5jdGlvbiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIGlmIChudWxsID09PSBjdXJyZW50SG9vaykge1xuICAgIHZhciBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5hbHRlcm5hdGU7XG4gICAgbmV4dEN1cnJlbnRIb29rID1cbiAgICAgIG51bGwgIT09IG5leHRDdXJyZW50SG9vayA/IG5leHRDdXJyZW50SG9vay5tZW1vaXplZFN0YXRlIDogbnVsbDtcbiAgfSBlbHNlIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gIHZhciBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID1cbiAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzc0hvb2tcbiAgICAgID8gY3VycmVudGx5UmVuZGVyaW5nRmliZXIubWVtb2l6ZWRTdGF0ZVxuICAgICAgOiB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgaWYgKG51bGwgIT09IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2spXG4gICAgKHdvcmtJblByb2dyZXNzSG9vayA9IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2spLFxuICAgICAgKGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rKTtcbiAgZWxzZSB7XG4gICAgaWYgKG51bGwgPT09IG5leHRDdXJyZW50SG9vaykge1xuICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmFsdGVybmF0ZSlcbiAgICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0NjcpKTtcbiAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzEwKSk7XG4gICAgfVxuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICAgIG5leHRDdXJyZW50SG9vayA9IHtcbiAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsXG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRIb29rLmJhc2VTdGF0ZSxcbiAgICAgIGJhc2VRdWV1ZTogY3VycmVudEhvb2suYmFzZVF1ZXVlLFxuICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NIb29rXG4gICAgICA/IChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID1cbiAgICAgICAgICBuZXh0Q3VycmVudEhvb2spXG4gICAgICA6ICh3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IG5leHRDdXJyZW50SG9vayk7XG4gIH1cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7XG4gIHJldHVybiB7IGxhc3RFZmZlY3Q6IG51bGwsIGV2ZW50czogbnVsbCwgc3RvcmVzOiBudWxsLCBtZW1vQ2FjaGU6IG51bGwgfTtcbn1cbmZ1bmN0aW9uIHVzZVRoZW5hYmxlKHRoZW5hYmxlKSB7XG4gIHZhciBpbmRleCA9IHRoZW5hYmxlSW5kZXhDb3VudGVyJDE7XG4gIHRoZW5hYmxlSW5kZXhDb3VudGVyJDEgKz0gMTtcbiAgbnVsbCA9PT0gdGhlbmFibGVTdGF0ZSQxICYmICh0aGVuYWJsZVN0YXRlJDEgPSBbXSk7XG4gIHRoZW5hYmxlID0gdHJhY2tVc2VkVGhlbmFibGUodGhlbmFibGVTdGF0ZSQxLCB0aGVuYWJsZSwgaW5kZXgpO1xuICBpbmRleCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyO1xuICBudWxsID09PVxuICAgIChudWxsID09PSB3b3JrSW5Qcm9ncmVzc0hvb2tcbiAgICAgID8gaW5kZXgubWVtb2l6ZWRTdGF0ZVxuICAgICAgOiB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCkgJiZcbiAgICAoKGluZGV4ID0gaW5kZXguYWx0ZXJuYXRlKSxcbiAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9XG4gICAgICBudWxsID09PSBpbmRleCB8fCBudWxsID09PSBpbmRleC5tZW1vaXplZFN0YXRlXG4gICAgICAgID8gSG9va3NEaXNwYXRjaGVyT25Nb3VudFxuICAgICAgICA6IEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlKSk7XG4gIHJldHVybi
1B0aGVuYWJsZTtcbn1cbmZ1bmN0aW9uIHVzZSh1c2FibGUpIHtcbiAgaWYgKG51bGwgIT09IHVzYWJsZSAmJiBcIm9iamVjdFwiID09PSB0eXBlb2YgdXNhYmxlKSB7XG4gICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHVzYWJsZS50aGVuKSByZXR1cm4gdXNlVGhlbmFibGUodXNhYmxlKTtcbiAgICBpZiAodXNhYmxlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUpIHJldHVybiByZWFkQ29udGV4dCh1c2FibGUpO1xuICB9XG4gIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNDM4LCBTdHJpbmcodXNhYmxlKSkpO1xufVxuZnVuY3Rpb24gdXNlTWVtb0NhY2hlKHNpemUpIHtcbiAgdmFyIG1lbW9DYWNoZSA9IG51bGwsXG4gICAgdXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci51cGRhdGVRdWV1ZTtcbiAgbnVsbCAhPT0gdXBkYXRlUXVldWUgJiYgKG1lbW9DYWNoZSA9IHVwZGF0ZVF1ZXVlLm1lbW9DYWNoZSk7XG4gIGlmIChudWxsID09IG1lbW9DYWNoZSkge1xuICAgIHZhciBjdXJyZW50ID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIuYWx0ZXJuYXRlO1xuICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICgoY3VycmVudCA9IGN1cnJlbnQudXBkYXRlUXVldWUpLFxuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAoKGN1cnJlbnQgPSBjdXJyZW50Lm1lbW9DYWNoZSksXG4gICAgICAgIG51bGwgIT0gY3VycmVudCAmJlxuICAgICAgICAgIChtZW1vQ2FjaGUgPSB7XG4gICAgICAgICAgICBkYXRhOiBjdXJyZW50LmRhdGEubWFwKGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICAgICAgICByZXR1cm4gYXJyYXkuc2xpY2UoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgaW5kZXg6IDBcbiAgICAgICAgICB9KSkpO1xuICB9XG4gIG51bGwgPT0gbWVtb0NhY2hlICYmIChtZW1vQ2FjaGUgPSB7IGRhdGE6IFtdLCBpbmRleDogMCB9KTtcbiAgbnVsbCA9PT0gdXBkYXRlUXVldWUgJiZcbiAgICAoKHVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpKSxcbiAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVRdWV1ZSkpO1xuICB1cGRhdGVRdWV1ZS5tZW1vQ2FjaGUgPSBtZW1vQ2FjaGU7XG4gIHVwZGF0ZVF1ZXVlID0gbWVtb0NhY2hlLmRhdGFbbWVtb0NhY2hlLmluZGV4XTtcbiAgaWYgKHZvaWQgMCA9PT0gdXBkYXRlUXVldWUpXG4gICAgZm9yIChcbiAgICAgIHVwZGF0ZVF1ZXVlID0gbWVtb0NhY2hlLmRhdGFbbWVtb0NhY2hlLmluZGV4XSA9IEFycmF5KHNpemUpLCBjdXJyZW50ID0gMDtcbiAgICAgIGN1cnJlbnQgPCBzaXplO1xuICAgICAgY3VycmVudCsrXG4gICAgKVxuICAgICAgdXBkYXRlUXVldWVbY3VycmVudF0gPSBSRUFDVF9NRU1PX0NBQ0hFX1NFTlRJTkVMO1xuICBtZW1vQ2FjaGUuaW5kZXgrKztcbiAgcmV0dXJuIHVwZGF0ZVF1ZXVlO1xufVxuZnVuY3Rpb24gYmFzaWNTdGF0ZVJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICByZXR1cm4gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgYWN0aW9uID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlcikge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICByZXR1cm4gdXBkYXRlUmVkdWNlckltcGwoaG9vaywgY3VycmVudEhvb2ssIHJlZHVjZXIpO1xufVxuZnVuY3Rpb24gdXBkYXRlUmVkdWNlckltcGwoaG9vaywgY3VycmVudCwgcmVkdWNlcikge1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuICBpZiAobnVsbCA9PT0gcXVldWUpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzExKSk7XG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyO1xuICB2YXIgYmFzZVF1ZXVlID0gaG9vay5iYXNlUXVldWUsXG4gICAgcGVuZGluZ1F1ZXVlID0gcXVldWUucGVuZGluZztcbiAgaWYgKG51bGwgIT09IHBlbmRpbmdRdWV1ZSkge1xuICAgIGlmIChudWxsICE9PSBiYXNlUXVldWUpIHtcbiAgICAgIHZhciBiYXNlRmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICAgIGJhc2VRdWV1ZS5uZXh0ID0gcGVuZGluZ1F1ZXVlLm5leHQ7XG4gICAgICBwZW5kaW5nUXVldWUubmV4dCA9IGJhc2VGaXJzdDtcbiAgICB9XG4gICAgY3VycmVudC5iYXNlUXVldWUgPSBiYXNlUXVldWUgPSBwZW5kaW5nUXVldWU7XG4gICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gIH1cbiAgcGVuZGluZ1F1ZXVlID0gaG9vay5iYXNlU3RhdGU7XG4gIGlmIChudWxsID09PSBiYXNlUXVldWUpIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgZWxzZSB7XG4gICAgY3VycmVudCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgIHZhciBuZXdCYXNlUXVldWVGaXJzdCA9IChiYXNlRmlyc3QgPSBudWxsKSxcbiAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBudWxsLFxuICAgICAgdXBkYXRlID0gY3VycmVudCxcbiAgICAgIGRpZFJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24kMzIgPSAhMTtcbiAgICBkbyB7XG4gICAgICB2Y
1XIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lICYgLTUzNjg3MDkxMztcbiAgICAgIGlmIChcbiAgICAgICAgdXBkYXRlTGFuZSAhPT0gdXBkYXRlLmxhbmVcbiAgICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIHVwZGF0ZUxhbmUpID09PSB1cGRhdGVMYW5lXG4gICAgICAgICAgOiAocmVuZGVyTGFuZXMgJiB1cGRhdGVMYW5lKSA9PT0gdXBkYXRlTGFuZVxuICAgICAgKSB7XG4gICAgICAgIHZhciByZXZlcnRMYW5lID0gdXBkYXRlLnJldmVydExhbmU7XG4gICAgICAgIGlmICgwID09PSByZXZlcnRMYW5lKVxuICAgICAgICAgIG51bGwgIT09IG5ld0Jhc2VRdWV1ZUxhc3QgJiZcbiAgICAgICAgICAgIChuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID1cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhbmU6IDAsXG4gICAgICAgICAgICAgICAgcmV2ZXJ0TGFuZTogMCxcbiAgICAgICAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHVwZGF0ZUxhbmUgPT09IGN1cnJlbnRFbnRhbmdsZWRMYW5lICYmXG4gICAgICAgICAgICAgIChkaWRSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uJDMyID0gITApO1xuICAgICAgICBlbHNlIGlmICgocmVuZGVyTGFuZXMgJiByZXZlcnRMYW5lKSA9PT0gcmV2ZXJ0TGFuZSkge1xuICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICAgIHJldmVydExhbmUgPT09IGN1cnJlbnRFbnRhbmdsZWRMYW5lICYmXG4gICAgICAgICAgICAoZGlkUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbiQzMiA9ICEwKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgKHVwZGF0ZUxhbmUgPSB7XG4gICAgICAgICAgICBsYW5lOiAwLFxuICAgICAgICAgICAgcmV2ZXJ0TGFuZTogdXBkYXRlLnJldmVydExhbmUsXG4gICAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbnVsbCA9PT0gbmV3QmFzZVF1ZXVlTGFzdFxuICAgICAgICAgICAgICA/ICgobmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gdXBkYXRlTGFuZSksXG4gICAgICAgICAgICAgICAgKGJhc2VGaXJzdCA9IHBlbmRpbmdRdWV1ZSkpXG4gICAgICAgICAgICAgIDogKG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSB1cGRhdGVMYW5lKSxcbiAgICAgICAgICAgIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5sYW5lcyB8PSByZXZlcnRMYW5lKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgfD0gcmV2ZXJ0TGFuZSk7XG4gICAgICAgIHVwZGF0ZUxhbmUgPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICBzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFViAmJlxuICAgICAgICAgIHJlZHVjZXIocGVuZGluZ1F1ZXVlLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gdXBkYXRlLmhhc0VhZ2VyU3RhdGVcbiAgICAgICAgICA/IHVwZGF0ZS5lYWdlclN0YXRlXG4gICAgICAgICAgOiByZWR1Y2VyKHBlbmRpbmdRdWV1ZSwgdXBkYXRlTGFuZSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgKHJldmVydExhbmUgPSB7XG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICByZXZlcnRMYW5lOiB1cGRhdGUucmV2ZXJ0TGFuZSxcbiAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9KSxcbiAgICAgICAgICBudWxsID09PSBuZXdCYXNlUXVldWVMYXN0XG4gICAgICAgICAgICA/ICgobmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gcmV2ZXJ0TGFuZSksXG4gICAgICAgICAgICAgIChiYXNlRmlyc3QgPSBwZW5kaW5nUXVldWUpKVxuICAgICAgICAgICAgOiAobmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IHJldmVydExhbmUpLFxuICAgICAgICAgIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5sYW5lcyB8PSB1cGRhdGVMYW5lKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzIHw9IHVwZGF0ZUxhbmUpO1xuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAobnVsbCAhPT0gdXBkYXRlICYmIHVwZGF0ZSAhPT0gY3VycmVudCk7XG4gICAgbnVsbCA9PT0gbmV3QmFzZVF1ZXVlTGFzdFxuICAgICAgPyAoYmFzZUZpcnN0ID0gcGVuZGluZ1F1ZXVlKVxuICAgICAgOiAobmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gbmV3QmFzZVF1ZXVlRmlyc3QpO1xuICAgIGlmIChcbiAgICAgICFvYmplY3RJcyhwZW5kaW5nUXVldWUsIGhvb2subWVtb2l6ZWRTdGF0ZSkgJiZcbiAgICAgICgoZGlkUmVjZWl2ZVVwZGF0ZSA9ICEwKSxcbiAgICAgIGRpZFJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24kMzIgJiZcbiAgICAgICAgKChyZWR1Y2VyID0gY3VycmVudEVudGFuZ2xlZEFjdGlvblRoZW5hYmxlKSwgbnVsbCAhPT0gcmVkdWNlcikpXG4gICAgKVxuICAgICAgdGhyb3cgcmVkdWNlcjtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBwZW5kaW5nUXVldWU7XG4gICAgaG9vay5iYXNlU3RhdGUgPSBiYXNlRmlyc3Q7XG4gICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gcGVuZGluZ1F1ZXVlO1xuICB9XG4gIG51bGwgPT09IGJhc2VRdWV1ZSAmJiAocXVldWUubGFuZXMgPSAwKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIHF1ZXVlLmRpc3BhdGNoXTtcbn1cbmZ1bmN0aW9uIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCksXG4gICAgcXVldWUgPSBob29rLnF1ZXVlO1xuICBpZiAobnVsbCA9PT0gcXVldWUpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzExKSk7XG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCxcbiAgICBsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nLFxuICAgIG5ld1N0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICBpZiAobnVsbCAhPT0gbGFzdFJlbmRlclBoYXNlVXBkYXRlKSB7XG4gICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IChsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dCk7XG4gICAgZG8gKG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgdXBkYXRlLmFjdGlvbikpLCAodXBkYXRlID0gdXBkYXRlLm5leHQpO1xuICAgIHdoaWxlICh1cGRhdGUgIT09IGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSk7XG4gICAgb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkgfHwgKGRpZFJlY2VpdmVVcGRhdGUgPSAhMCk7XG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgbnVsbCA9PT0gaG9vay5iYXNlUXVldWUgJiYgKGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGUpO1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cbiAgcmV0dXJuIFtuZXdTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuZnVuY3Rpb24gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIsXG4gICAgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLFxuICAgIGlzSHlkcmF0aW5nJGpzY29tcCQwID0gaXNIeWRyYXRpbmc7XG4gIGlmIChpc0h5ZHJhdGluZyRqc2NvbXAkMCkge1xuICAgIGlmICh2b2lkIDAgPT09IGdldFNlcnZlclNuYXBzaG90KSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQwNykpO1xuICAgIGdldFNlcnZlclNuYXBzaG90ID0gZ2V0U2VydmVyU25hcHNob3QoKTtcbiAgfSBlbHNlIGdldFNlcnZlclNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcbiAgdmFyIHNuYXBzaG90Q2hhbmdlZCA9ICFvYmplY3RJcyhcbiAgICAoY3VycmVudEhvb2sgfHwgaG9vaykubWVtb2l6ZWRTdGF0ZSxcbiAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICApO1xuICBzbmFwc2hvdENoYW5nZWQgJiZcbiAgICAoKGhvb2subWVtb2l6ZWRTdGF0ZSA9IGdldFNlcnZlclNuYXBzaG90KSwgKGRpZFJlY2VpdmVVcGRhdGUgPSAhMCkpO1xuICBob29rID0gaG9vay5xdWV1ZTtcbiAgdmFyIGNyZWF0ZSA9IHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaG9vaywgc3Vic2NyaWJlKTtcbiAgdXBkYXRlRWZmZWN0SW1wbCgyMDQ4LCA4LCBjcmVhdGUsIFtzdWJzY3JpYmVdKTtcbiAgaWYgKFxuICAgIGhvb2suZ2V0U25hcHNob3QgIT09IGdldFNuYXBzaG90IHx8XG4gICAgc25hcHNob3RDaGFuZ2VkIHx8XG4gICAgKG51bGwgIT09IHdvcmtJblByb2dyZXNzSG9vayAmJi
1B3b3JrSW5Qcm9ncmVzc0hvb2subWVtb2l6ZWRTdGF0ZS50YWcgJiAxKVxuICApIHtcbiAgICBmaWJlci5mbGFncyB8PSAyMDQ4O1xuICAgIHB1c2hTaW1wbGVFZmZlY3QoXG4gICAgICA5LFxuICAgICAgY3JlYXRlRWZmZWN0SW5zdGFuY2UoKSxcbiAgICAgIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgZmliZXIsXG4gICAgICAgIGhvb2ssXG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90LFxuICAgICAgICBnZXRTbmFwc2hvdFxuICAgICAgKSxcbiAgICAgIG51bGxcbiAgICApO1xuICAgIGlmIChudWxsID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzQ5KSk7XG4gICAgaXNIeWRyYXRpbmckanNjb21wJDAgfHxcbiAgICAgIDAgIT09IChyZW5kZXJMYW5lcyAmIDEyNCkgfHxcbiAgICAgIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gIH1cbiAgcmV0dXJuIGdldFNlcnZlclNuYXBzaG90O1xufVxuZnVuY3Rpb24gcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIHJlbmRlcmVkU25hcHNob3QpIHtcbiAgZmliZXIuZmxhZ3MgfD0gMTYzODQ7XG4gIGZpYmVyID0geyBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsIHZhbHVlOiByZW5kZXJlZFNuYXBzaG90IH07XG4gIGdldFNuYXBzaG90ID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIudXBkYXRlUXVldWU7XG4gIG51bGwgPT09IGdldFNuYXBzaG90XG4gICAgPyAoKGdldFNuYXBzaG90ID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpKSxcbiAgICAgIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci51cGRhdGVRdWV1ZSA9IGdldFNuYXBzaG90KSxcbiAgICAgIChnZXRTbmFwc2hvdC5zdG9yZXMgPSBbZmliZXJdKSlcbiAgICA6ICgocmVuZGVyZWRTbmFwc2hvdCA9IGdldFNuYXBzaG90LnN0b3JlcyksXG4gICAgICBudWxsID09PSByZW5kZXJlZFNuYXBzaG90XG4gICAgICAgID8gKGdldFNuYXBzaG90LnN0b3JlcyA9IFtmaWJlcl0pXG4gICAgICAgIDogcmVuZGVyZWRTbmFwc2hvdC5wdXNoKGZpYmVyKSk7XG59XG5mdW5jdGlvbiB1cGRhdGVTdG9yZUluc3RhbmNlKGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSB7XG4gIGluc3QudmFsdWUgPSBuZXh0U25hcHNob3Q7XG4gIGluc3QuZ2V0U25hcHNob3QgPSBnZXRTbmFwc2hvdDtcbiAgY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSAmJiBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xufVxuZnVuY3Rpb24gc3Vic2NyaWJlVG9TdG9yZShmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSB7XG4gIHJldHVybiBzdWJzY3JpYmUoZnVuY3Rpb24gKCkge1xuICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiYgZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgaW5zdCA9IGluc3QudmFsdWU7XG4gIHRyeSB7XG4gICAgdmFyIG5leHRWYWx1ZSA9IGxhdGVzdEdldFNuYXBzaG90KCk7XG4gICAgcmV0dXJuICFvYmplY3RJcyhpbnN0LCBuZXh0VmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAhMDtcbiAgfVxufVxuZnVuY3Rpb24gZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKSB7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCAyKTtcbiAgbnVsbCAhPT0gcm9vdCAmJiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIDIpO1xufVxuZnVuY3Rpb24gbW91bnRTdGF0ZUltcGwoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluaXRpYWxTdGF0ZSkge1xuICAgIHZhciBpbml0aWFsU3RhdGVJbml0aWFsaXplciA9IGluaXRpYWxTdGF0ZTtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGVJbml0aWFsaXplcigpO1xuICAgIGlmIChzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFVikge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5pdGlhbFN0YXRlSW5pdGlhbGl6ZXIoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIGhvb2sucXVldWUgPSB7XG4gICAgcGVuZGluZzogbnVsbCxcbiAgICBsYW5lczogMCxcbiAgICBkaXNwYXRjaDogbnVsbCxcbiAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiBiYXNpY1N0YXRlUmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIHJldHVybiBob29rO1xufVxuZnVuY3Rpb24gdXBkYXRlT3B0aW1pc3RpY0ltcGwoaG9vaywgY3VycmVudCwgcGFzc3Rocm91Z2gsIHJlZHVjZXIpIHtcbiAgaG9vay5iYXNlU3RhdGUgPSBwYXNzdGhyb3VnaDtcbiAgcmV0dXJuIHVwZGF0ZVJlZHVjZXJJbXBsKFxuICAgIGhvb2ssXG4gICAgY3VycmVudEhvb2ssXG4gICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmVkdWNlciA/IHJlZHVjZXIgOiBiYXNpY1N0YXRlUmVkdWNlclxuICApO1xufVxuZnVuY3Rpb24gZGlzcGF0Y2hBY3Rpb25TdGF0ZShcbiAgZmliZXIsXG4gIGFjdGlvblF1ZXVlLFxuICBzZXRQZW5kaW5nU3RhdGUsXG4gIHNldFN0YXRlLFxuICBwYXlsb2FkXG4pIHtcbiAgaWYgKGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQ4NSkpO1xuICBmaWJlciA9IGFjdGlvblF1ZXVlLmFjdGlvbjtcbiAgaWYgKG51bGwgIT09IGZpYmVyKSB7XG4gICAgdmFyIGFjdGlvbk5vZGUgPSB7XG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgYWN0aW9uOiBmaWJlcixcbiAgICAgIG5leHQ6IG51bGwsXG4gICAgICBpc1RyYW5zaXRpb246ICEwLFxuICAgICAgc3RhdHVzOiBcInBlbmRpbmdcIixcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgcmVhc29uOiBudWxsLFxuICAgICAgbGlzdGVuZXJzOiBbXSxcbiAgICAgIHRoZW46IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICBhY3Rpb25Ob2RlLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIG51bGwgIT09IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlRcbiAgICAgID8gc2V0UGVuZGluZ1N0YXRlKCEwKVxuICAgICAgOiAoYWN0aW9uTm9kZS5pc1RyYW5zaXRpb24gPSAhMSk7XG4gICAgc2V0U3RhdGUoYWN0aW9uTm9kZSk7XG4gICAgc2V0UGVuZGluZ1N0YXRlID0gYWN0aW9uUXVldWUucGVuZGluZztcbiAgICBudWxsID09PSBzZXRQZW5kaW5nU3RhdGVcbiAgICAgID8gKChhY3Rpb25Ob2RlLm5leHQgPSBhY3Rpb25RdWV1ZS5wZW5kaW5nID0gYWN0aW9uTm9kZSksXG4gICAgICAgI
1HJ1bkFjdGlvblN0YXRlQWN0aW9uKGFjdGlvblF1ZXVlLCBhY3Rpb25Ob2RlKSlcbiAgICAgIDogKChhY3Rpb25Ob2RlLm5leHQgPSBzZXRQZW5kaW5nU3RhdGUubmV4dCksXG4gICAgICAgIChhY3Rpb25RdWV1ZS5wZW5kaW5nID0gc2V0UGVuZGluZ1N0YXRlLm5leHQgPSBhY3Rpb25Ob2RlKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJ1bkFjdGlvblN0YXRlQWN0aW9uKGFjdGlvblF1ZXVlLCBub2RlKSB7XG4gIHZhciBhY3Rpb24gPSBub2RlLmFjdGlvbixcbiAgICBwYXlsb2FkID0gbm9kZS5wYXlsb2FkLFxuICAgIHByZXZTdGF0ZSA9IGFjdGlvblF1ZXVlLnN0YXRlO1xuICBpZiAobm9kZS5pc1RyYW5zaXRpb24pIHtcbiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdFNoYXJlZEludGVybmFscy5ULFxuICAgICAgY3VycmVudFRyYW5zaXRpb24gPSB7fTtcbiAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gY3VycmVudFRyYW5zaXRpb247XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IGFjdGlvbihwcmV2U3RhdGUsIHBheWxvYWQpLFxuICAgICAgICBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlM7XG4gICAgICBudWxsICE9PSBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCAmJlxuICAgICAgICBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaChjdXJyZW50VHJhbnNpdGlvbiwgcmV0dXJuVmFsdWUpO1xuICAgICAgaGFuZGxlQWN0aW9uUmV0dXJuVmFsdWUoYWN0aW9uUXVldWUsIG5vZGUsIHJldHVyblZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgb25BY3Rpb25FcnJvcihhY3Rpb25RdWV1ZSwgbm9kZSwgZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gcHJldlRyYW5zaXRpb247XG4gICAgfVxuICB9IGVsc2VcbiAgICB0cnkge1xuICAgICAgKHByZXZUcmFuc2l0aW9uID0gYWN0aW9uKHByZXZTdGF0ZSwgcGF5bG9hZCkpLFxuICAgICAgICBoYW5kbGVBY3Rpb25SZXR1cm5WYWx1ZShhY3Rpb25RdWV1ZSwgbm9kZSwgcHJldlRyYW5zaXRpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yJDM4KSB7XG4gICAgICBvbkFjdGlvbkVycm9yKGFjdGlvblF1ZXVlLCBub2RlLCBlcnJvciQzOCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlQWN0aW9uUmV0dXJuVmFsdWUoYWN0aW9uUXVldWUsIG5vZGUsIHJldHVyblZhbHVlKSB7XG4gIG51bGwgIT09IHJldHVyblZhbHVlICYmXG4gIFwib2JqZWN0XCIgPT09IHR5cGVvZiByZXR1cm5WYWx1ZSAmJlxuICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZXR1cm5WYWx1ZS50aGVuXG4gICAgPyByZXR1cm5WYWx1ZS50aGVuKFxuICAgICAgICBmdW5jdGlvbiAobmV4dFN0YXRlKSB7XG4gICAgICAgICAgb25BY3Rpb25TdWNjZXNzKGFjdGlvblF1ZXVlLCBub2RlLCBuZXh0U3RhdGUpO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gb25BY3Rpb25FcnJvcihhY3Rpb25RdWV1ZSwgbm9kZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICApXG4gICAgOiBvbkFjdGlvblN1Y2Nlc3MoYWN0aW9uUXVldWUsIG5vZGUsIHJldHVyblZhbHVlKTtcbn1cbmZ1bmN0aW9uIG9uQWN0aW9uU3VjY2VzcyhhY3Rpb25RdWV1ZSwgYWN0aW9uTm9kZSwgbmV4dFN0YXRlKSB7XG4gIGFjdGlvbk5vZGUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIjtcbiAgYWN0aW9uTm9kZS52YWx1ZSA9IG5leHRTdGF0ZTtcbiAgbm90aWZ5QWN0aW9uTGlzdGVuZXJzKGFjdGlvbk5vZGUpO1xuICBhY3Rpb25RdWV1ZS5zdGF0ZSA9IG5leHRTdGF0ZTtcbiAgYWN0aW9uTm9kZSA9IGFjdGlvblF1ZXVlLnBlbmRpbmc7XG4gIG51bGwgIT09IGFjdGlvbk5vZGUgJiZcbiAgICAoKG5leHRTdGF0ZSA9IGFjdGlvbk5vZGUubmV4dCksXG4gICAgbmV4dFN0YXRlID09PSBhY3Rpb25Ob2RlXG4gICAgICA/IChhY3Rpb25RdWV1ZS5wZW5kaW5nID0gbnVsbClcbiAgICAgIDogKChuZXh0U3RhdGUgPSBuZXh0U3RhdGUubmV4dCksXG4gICAgICAgIChhY3Rpb25Ob2RlLm5leHQgPSBuZXh0U3RhdGUpLFxuICAgICAgICBydW5BY3Rpb25TdGF0ZUFjdGlvbihhY3Rpb25RdWV1ZSwgbmV4dFN0YXRlKSkpO1xufVxuZnVuY3Rpb24gb25BY3Rpb25FcnJvcihhY3Rpb25RdWV1ZSwgYWN0aW9uTm9kZSwgZXJyb3IpIHtcbiAgdmFyIGxhc3QgPSBhY3Rpb25RdWV1ZS5wZW5kaW5nO1xuICBhY3Rpb25RdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgaWYgKG51bGwgIT09IGxhc3QpIHtcbiAgICBsYXN0ID0gbGFzdC5uZXh0O1xuICAgIGRvXG4gICAgICAoYWN0aW9uTm9kZS5zdGF0dXMgPSBcInJlamVjdGVkXCIpLFxuICAgICAgICAoYWN0aW9uTm9kZS5yZWFzb24gPSBlcnJvciksXG4gICAgICAgIG5vdGlmeUFjdGlvbkxpc3RlbmVycyhhY3Rpb25Ob2RlKSxcbiAgICAgICAgKGFjdGlvbk5vZGUgPSBhY3Rpb25Ob2RlLm5leHQpO1xuICAgIHdoaWxlIChhY3Rpb25Ob2RlICE9PSBsYXN0KTtcbiAgfVxuICBhY3Rpb25RdWV1ZS5hY3Rpb24gPSBudWxsO1xufVxuZnVuY3Rpb24gbm90aWZ5QWN0aW9uTGlzdGVuZXJzKGFjdGlvbk5vZGUpIHtcbiAgYWN0aW9uTm9kZSA9IGFjdGlvbk5vZGUubGlzdGVuZXJzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFjdGlvbk5vZGUubGVuZ3RoOyBpKyspICgwLCBhY3Rpb25Ob2RlW2ldKSgpO1xufVxuZnVuY3Rpb24gYWN0aW9uU3RhdGVSZWR1Y2VyKG9sZFN0YXRlLCBuZXdTdGF0ZSkge1xuICByZXR1cm4gbmV3U3RhdGU7XG59XG5mdW5jdGlvbiBtb3VudEFjdGlvblN0YXRlKGFjdGlvbiwgaW5pdGlhbFN0YXRlUHJvcCkge1xuICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICB2YXIgc3NyRm9ybVN0YXRlID0gd29ya0luUHJvZ3Jlc3NSb290LmZvcm1TdGF0ZTtcbiAgICBpZiAobnVsbCAhPT0gc3NyRm9ybVN0YXRlKSB7XG4gICAgICBhOiB7XG4gICAgICAgIHZhciBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcjtcbiAgICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgICAgaWYgKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMCA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG4gICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgdmFyIGluUm9vdE9yU2luZ2xldG9uID0gcm9vdE9yU2luZ2xldG9uQ29udGV4dDtcbiAgICAgICAgICAgICAgICA4ICE9PSBKU0NvbXBpbGVyX2lubGluZV9
1yZXN1bHQkanNjb21wJDAubm9kZVR5cGU7XG5cbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpblJvb3RPclNpbmdsZXRvbikge1xuICAgICAgICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0JGpzY29tcCQwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIGI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMCA9IGdldE5leHRIeWRyYXRhYmxlKFxuICAgICAgICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0JGpzY29tcCQwLm5leHRTaWJsaW5nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0JGpzY29tcCQwKSB7XG4gICAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQkanNjb21wJDAgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgYjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW5Sb290T3JTaW5nbGV0b24gPSBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQkanNjb21wJDAuZGF0YTtcbiAgICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0JGpzY29tcCQwID1cbiAgICAgICAgICAgICAgICBcIkYhXCIgPT09IGluUm9vdE9yU2luZ2xldG9uIHx8IFwiRlwiID09PSBpblJvb3RPclNpbmdsZXRvblxuICAgICAgICAgICAgICAgICAgPyBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQkanNjb21wJDBcbiAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQkanNjb21wJDApIHtcbiAgICAgICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlKFxuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMC5uZXh0U2libGluZ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPVxuICAgICAgICAgICAgICAgIFwiRiFcIiA9PT0gSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0JGpzY29tcCQwLmRhdGE7XG4gICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9ICExO1xuICAgICAgfVxuICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ICYmIChpbml0aWFsU3RhdGVQcm9wID0gc3NyRm9ybVN0YXRlWzBdKTtcbiAgICB9XG4gIH1cbiAgc3NyRm9ybVN0YXRlID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgc3NyRm9ybVN0YXRlLm1lbW9pemVkU3RhdGUgPSBzc3JGb3JtU3RhdGUuYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlUHJvcDtcbiAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgbGFuZXM6IDAsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYWN0aW9uU3RhdGVSZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVQcm9wXG4gIH07XG4gIHNzckZvcm1TdGF0ZS5xdWV1ZSA9IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdDtcbiAgc3NyRm9ybVN0YXRlID0gZGlzcGF0Y2hTZXRTdGF0ZS5iaW5kKFxuICAgIG51bGwsXG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIsXG4gICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0XG4gICk7XG4gIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdC5kaXNwYXRjaCA9IHNzckZvcm1TdGF0ZTtcbiAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gbW91bnRTdGF0ZUltcGwoITEpO1xuICBpblJvb3RPclNpbmdsZXRvbiA9IGRpc3BhdGNoT3B0aW1pc3RpY1NldFN0YXRlLmJpbmQoXG4gICAgbnVsbCxcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcixcbiAgICAhMSxcbiAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQucXVldWVcbiAgKTtcbiAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0JGpzY29tcCQwID0ge1xuICAgIHN0YXRlOiBpbml0aWFsU3RhdGVQcm9wLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIHBlbmRpbmc6IG51bGxcbiAgfTtcbiAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0LnF1ZXVlID0gSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0JGpzY29tcCQwO1xuICBzc3JGb3JtU3RhdGUgPSBkaXNwYXRjaEFjdGlvblN0YXRlLmJpbmQoXG4gICAgbnVsbCxcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcixcbiAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQkanNjb21wJDAsXG4gICAgaW5Sb290T3JTaW5nbGV0b24sXG4gICAgc3NyRm9ybVN0YXRlXG4gICk7XG4gIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMC5kaXNwYXRjaCA9IHNzckZvcm1TdGF0ZTtcbiAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0Lm1lbW9pemVkU3RhdGUgPSBhY3Rpb247XG4gIHJldHVybiBbaW5pdGlhbFN0YXRlUHJvcCwgc3NyRm9ybVN0YXRlLCAhMV07XG59XG5mdW5jdGlvbiB1cGRhdGVBY3Rpb25TdGF0ZShhY3Rpb24pIHtcbiAgdmFyIHN0YXRlSG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICByZXR1cm4gdXBkYXRlQWN0aW9uU3RhdGVJbXBsKHN0YXRlSG9vaywgY3VycmVudEhvb2ssIGFjdGlvbik7XG59XG5mdW5jdGlvbiB1cGRhdGVBY3Rpb25TdGF0ZUltcGwoc3RhdGVIb29rLCBjdXJyZW50U3RhdGVIb29rLCBhY3Rpb24pIHtcbiAgY3VycmVudFN0YXRlSG9vayA9IHVwZGF0ZVJlZHVjZXJJbXBsKFxuICAgIHN0YXRlSG9vayxcbiAgICBjdXJyZW50U3RhdGVIb29rLFxuICAgIGFjdGlvblN0YXRlUmVkdWNlclxuICApWzBdO1xuICBzdGF0ZUhvb2sgP
1SB1cGRhdGVSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKVswXTtcbiAgaWYgKFxuICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBjdXJyZW50U3RhdGVIb29rICYmXG4gICAgbnVsbCAhPT0gY3VycmVudFN0YXRlSG9vayAmJlxuICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGN1cnJlbnRTdGF0ZUhvb2sudGhlblxuICApXG4gICAgdHJ5IHtcbiAgICAgIHZhciBzdGF0ZSA9IHVzZVRoZW5hYmxlKGN1cnJlbnRTdGF0ZUhvb2spO1xuICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgIGlmICh4ID09PSBTdXNwZW5zZUV4Y2VwdGlvbikgdGhyb3cgU3VzcGVuc2VBY3Rpb25FeGNlcHRpb247XG4gICAgICB0aHJvdyB4O1xuICAgIH1cbiAgZWxzZSBzdGF0ZSA9IGN1cnJlbnRTdGF0ZUhvb2s7XG4gIGN1cnJlbnRTdGF0ZUhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIGFjdGlvblF1ZXVlID0gY3VycmVudFN0YXRlSG9vay5xdWV1ZSxcbiAgICBkaXNwYXRjaCA9IGFjdGlvblF1ZXVlLmRpc3BhdGNoO1xuICBhY3Rpb24gIT09IGN1cnJlbnRTdGF0ZUhvb2subWVtb2l6ZWRTdGF0ZSAmJlxuICAgICgoY3VycmVudGx5UmVuZGVyaW5nRmliZXIuZmxhZ3MgfD0gMjA0OCksXG4gICAgcHVzaFNpbXBsZUVmZmVjdChcbiAgICAgIDksXG4gICAgICBjcmVhdGVFZmZlY3RJbnN0YW5jZSgpLFxuICAgICAgYWN0aW9uU3RhdGVBY3Rpb25FZmZlY3QuYmluZChudWxsLCBhY3Rpb25RdWV1ZSwgYWN0aW9uKSxcbiAgICAgIG51bGxcbiAgICApKTtcbiAgcmV0dXJuIFtzdGF0ZSwgZGlzcGF0Y2gsIHN0YXRlSG9va107XG59XG5mdW5jdGlvbiBhY3Rpb25TdGF0ZUFjdGlvbkVmZmVjdChhY3Rpb25RdWV1ZSwgYWN0aW9uKSB7XG4gIGFjdGlvblF1ZXVlLmFjdGlvbiA9IGFjdGlvbjtcbn1cbmZ1bmN0aW9uIHJlcmVuZGVyQWN0aW9uU3RhdGUoYWN0aW9uKSB7XG4gIHZhciBzdGF0ZUhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKSxcbiAgICBjdXJyZW50U3RhdGVIb29rID0gY3VycmVudEhvb2s7XG4gIGlmIChudWxsICE9PSBjdXJyZW50U3RhdGVIb29rKVxuICAgIHJldHVybiB1cGRhdGVBY3Rpb25TdGF0ZUltcGwoc3RhdGVIb29rLCBjdXJyZW50U3RhdGVIb29rLCBhY3Rpb24pO1xuICB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgc3RhdGVIb29rID0gc3RhdGVIb29rLm1lbW9pemVkU3RhdGU7XG4gIGN1cnJlbnRTdGF0ZUhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIGRpc3BhdGNoID0gY3VycmVudFN0YXRlSG9vay5xdWV1ZS5kaXNwYXRjaDtcbiAgY3VycmVudFN0YXRlSG9vay5tZW1vaXplZFN0YXRlID0gYWN0aW9uO1xuICByZXR1cm4gW3N0YXRlSG9vaywgZGlzcGF0Y2gsICExXTtcbn1cbmZ1bmN0aW9uIHB1c2hTaW1wbGVFZmZlY3QodGFnLCBpbnN0LCBjcmVhdGUsIGNyZWF0ZURlcHMpIHtcbiAgdGFnID0geyB0YWc6IHRhZywgY3JlYXRlOiBjcmVhdGUsIGRlcHM6IGNyZWF0ZURlcHMsIGluc3Q6IGluc3QsIG5leHQ6IG51bGwgfTtcbiAgaW5zdCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLnVwZGF0ZVF1ZXVlO1xuICBudWxsID09PSBpbnN0ICYmXG4gICAgKChpbnN0ID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpKSxcbiAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIudXBkYXRlUXVldWUgPSBpbnN0KSk7XG4gIGNyZWF0ZSA9IGluc3QubGFzdEVmZmVjdDtcbiAgbnVsbCA9PT0gY3JlYXRlXG4gICAgPyAoaW5zdC5sYXN0RWZmZWN0ID0gdGFnLm5leHQgPSB0YWcpXG4gICAgOiAoKGNyZWF0ZURlcHMgPSBjcmVhdGUubmV4dCksXG4gICAgICAoY3JlYXRlLm5leHQgPSB0YWcpLFxuICAgICAgKHRhZy5uZXh0ID0gY3JlYXRlRGVwcyksXG4gICAgICAoaW5zdC5sYXN0RWZmZWN0ID0gdGFnKSk7XG4gIHJldHVybiB0YWc7XG59XG5mdW5jdGlvbiBjcmVhdGVFZmZlY3RJbnN0YW5jZSgpIHtcbiAgcmV0dXJuIHsgZGVzdHJveTogdm9pZCAwLCByZXNvdXJjZTogdm9pZCAwIH07XG59XG5mdW5jdGlvbiB1cGRhdGVSZWYoKSB7XG4gIHJldHVybiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlO1xufVxuZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBjcmVhdGVEZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgY3JlYXRlRGVwcyA9IHZvaWQgMCA9PT0gY3JlYXRlRGVwcyA/IG51bGwgOiBjcmVhdGVEZXBzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoU2ltcGxlRWZmZWN0KFxuICAgIDEgfCBob29rRmxhZ3MsXG4gICAgY3JlYXRlRWZmZWN0SW5zdGFuY2UoKSxcbiAgICBjcmVhdGUsXG4gICAgY3JlYXRlRGVwc1xuICApO1xufVxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICBkZXBzID0gdm9pZCAwID09PSBkZXBzID8gbnVsbCA6IGRlcHM7XG4gIHZhciBpbnN0ID0gaG9vay5tZW1vaXplZFN0YXRlLmluc3Q7XG4gIG51bGwgIT09IGN1cnJlbnRIb29rICYmXG4gIG51bGwgIT09IGRlcHMgJiZcbiAgYXJlSG9va0lucHV0c0VxdWFsKGRlcHMsIGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUuZGVwcylcbiAgICA/IChob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoU2ltcGxlRWZmZWN0KGhvb2tGbGFncywgaW5zdCwgY3JlYXRlLCBkZXBzKSlcbiAgICA6ICgoY3VycmVudGx5UmVuZGVyaW5nRmliZXIuZmxhZ3MgfD0gZmliZXJGbGFncyksXG4gICAgICAoaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaFNpbXBsZUVmZmVjdChcbiAgICAgICAgMSB8IGhvb2tGbGFncyxcbiAgICAgICAgaW5zdCxcbiAgICAgICAgY3JlYXRlLFxuICAgICAgICBkZXBzXG4gICAgICApKSk7XG59XG5mdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGNyZWF0ZURlcHMpIHtcbiAgbW91bnRFZmZlY3RJbXBsKDgzOTA2NTYsIDgsIGNyZWF0ZSwgY3JlYXRlRGVwcyk7XG59XG5mdW5jdGlvbiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBjcmVhdGVEZXBzKSB7XG4gIHVwZGF0ZUVmZmVjdEltcGwoMjA0OCwgOCwgY3JlYXRlLCBjcmVhdGVEZXBzKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoNCwgMiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoNCwgNCwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlZikge1xuICAgIGNyZWF0ZSA9IGNyZWF0ZSgpO1xuICAgIHZhciByZWZDbGVhbnVwID0gcmVmKGNyZWF0ZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlZkNsZWFudXAgPyByZWZDbGVhbnVwKCkgOiByZWYobnVsbCk7XG4gICAgfTtcbiAgfVxuICBpZiAobnVsbCAhPT0gcmVmICYmIHZvaWQgMCAhPT0gcmVmKVxuICAgIHJldHVybiAoXG4gICAgICAoY3JlYXRlID0gY3JlYXRlKCkpLFxuICAgICAgKHJlZi5jdXJyZW50ID0gY3JlYXRlKSxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgfVxuICAgICk7XG59XG5mdW5jdGlvbiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIGRlcHMgPSBudWxsICE9PSBkZXBzICYmIHZvaWQgMCAhPT0gZGVwcyA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHVwZGF0ZUVmZmVjdEltcGwoNCwgNCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZGVwcyk7XG59XG5mdW5jdGlvbiBtb3VudERlYnVnVmFsdWUoKSB7fVxuZnVuY3Rpb24gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgZGVwcyA9IHZvaWQgMCA9PT0gZGVwcyA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICBpZiAobnVsbCAhPT0gZGVwcyAmJiBhcmVIb29rSW5wdXRzRXF1YWwoZGVwcywgcHJldlN0YXRlWzFdKSlcbiAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIGRlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5mdW5jdGlvbiB1cGRhdGVNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgZGVwcyA9IHZvaWQgMCA9PT0gZGVwcyA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICBpZiAobnVsbCAhPT0gZGVwcyAmJiBhcmVIb29rSW5wdXRzRXF1YWwoZGVwcywgcHJldlN0YXRlWzFdKSlcbiAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICBwcmV2U3RhdGUgPSBuZXh0Q3JlYXRlKCk7XG4gIGlmIChzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFVikge1xuICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCEwKTtcbiAgICB0cnkge1xuICAgICAgbmV4dENyZWF0ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMSk7XG4gICAgfVxuICB9XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtwcmV2U3RhdGUsIGRlcHNdO1xuICByZXR1cm4gcHJldlN0YXRlO1xufVxuZnVuY3Rpb24gbW91bnREZWZlcnJlZFZhbHVlSW1wbChob29rLCB2YWx1ZSwgaW5pdGlhbFZhbHVlKSB7XG4gIGlmICh2b2lkIDAgPT09IGluaXRpYWxWYWx1ZSB8fCAwICE9PSAocmVuZGVyTGFuZXMgJiAxMDczNzQxODI0KSlcbiAgICByZXR1cm4gKGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaW5pdGlhbFZhbHVlO1xuICBob29rID0gcmVxdWVzdERlZmVycmVkTGFuZSgpO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5sYW5lcyB8PSBob29rO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgfD0gaG9vaztcbiAgcmV0dXJuIGluaXRpYWxWYWx1ZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICBpZiAob2JqZWN0SXModmFsdWUsIHByZXZWYWx1ZSkpIHJldHVybi
1B2YWx1ZTtcbiAgaWYgKG51bGwgIT09IGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IuY3VycmVudClcbiAgICByZXR1cm4gKFxuICAgICAgKGhvb2sgPSBtb3VudERlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHZhbHVlLCBpbml0aWFsVmFsdWUpKSxcbiAgICAgIG9iamVjdElzKGhvb2ssIHByZXZWYWx1ZSkgfHwgKGRpZFJlY2VpdmVVcGRhdGUgPSAhMCksXG4gICAgICBob29rXG4gICAgKTtcbiAgaWYgKDAgPT09IChyZW5kZXJMYW5lcyAmIDQyKSlcbiAgICByZXR1cm4gKGRpZFJlY2VpdmVVcGRhdGUgPSAhMCksIChob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZSk7XG4gIGhvb2sgPSByZXF1ZXN0RGVmZXJyZWRMYW5lKCk7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmxhbmVzIHw9IGhvb2s7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyB8PSBob29rO1xuICByZXR1cm4gcHJldlZhbHVlO1xufVxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKGZpYmVyLCBxdWV1ZSwgcGVuZGluZ1N0YXRlLCBmaW5pc2hlZFN0YXRlLCBjYWxsYmFjaykge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnA7XG4gIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPVxuICAgIDAgIT09IHByZXZpb3VzUHJpb3JpdHkgJiYgOCA+IHByZXZpb3VzUHJpb3JpdHkgPyBwcmV2aW91c1ByaW9yaXR5IDogODtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCxcbiAgICBjdXJyZW50VHJhbnNpdGlvbiA9IHt9O1xuICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gY3VycmVudFRyYW5zaXRpb247XG4gIGRpc3BhdGNoT3B0aW1pc3RpY1NldFN0YXRlKGZpYmVyLCAhMSwgcXVldWUsIHBlbmRpbmdTdGF0ZSk7XG4gIHRyeSB7XG4gICAgdmFyIHJldHVyblZhbHVlID0gY2FsbGJhY2soKSxcbiAgICAgIG9uU3RhcnRUcmFuc2l0aW9uRmluaXNoID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUztcbiAgICBudWxsICE9PSBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCAmJlxuICAgICAgb25TdGFydFRyYW5zaXRpb25GaW5pc2goY3VycmVudFRyYW5zaXRpb24sIHJldHVyblZhbHVlKTtcbiAgICBpZiAoXG4gICAgICBudWxsICE9PSByZXR1cm5WYWx1ZSAmJlxuICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZXR1cm5WYWx1ZS50aGVuXG4gICAgKSB7XG4gICAgICB2Y
1XIgdGhlbmFibGVGb3JGaW5pc2hlZFN0YXRlID0gY2hhaW5UaGVuYWJsZVZhbHVlKFxuICAgICAgICByZXR1cm5WYWx1ZSxcbiAgICAgICAgZmluaXNoZWRTdGF0ZVxuICAgICAgKTtcbiAgICAgIGRpc3BhdGNoU2V0U3RhdGVJbnRlcm5hbChcbiAgICAgICAgZmliZXIsXG4gICAgICAgIHF1ZXVlLFxuICAgICAgICB0aGVuYWJsZUZvckZpbmlzaGVkU3RhdGUsXG4gICAgICAgIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKVxuICAgICAgKTtcbiAgICB9IGVsc2VcbiAgICAgIGRpc3BhdGNoU2V0U3RhdGVJbnRlcm5hbChcbiAgICAgICAgZmliZXIsXG4gICAgICAgIHF1ZXVlLFxuICAgICAgICBmaW5pc2hlZFN0YXRlLFxuICAgICAgICByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcilcbiAgICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZGlzcGF0Y2hTZXRTdGF0ZUludGVybmFsKFxuICAgICAgZmliZXIsXG4gICAgICBxdWV1ZSxcbiAgICAgIHsgdGhlbjogZnVuY3Rpb24gKCkge30sIHN0YXR1czogXCJyZWplY3RlZFwiLCByZWFzb246IGVycm9yIH0sXG4gICAgICByZXF1ZXN0VXBkYXRlTGFuZSgpXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByZXZpb3VzUHJpb3JpdHkpLFxuICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbik7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vb3AkMigpIHt9XG5mdW5jdGlvbiBzdGFydEhvc3RUcmFuc2l0aW9uKGZvcm1GaWJlciwgcGVuZGluZ1N0YXRlLCBhY3Rpb24sIGZvcm1EYXRhKSB7XG4gIGlmICg1ICE9PSBmb3JtRmliZXIudGFnKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQ3NikpO1xuICB2YXIgcXVldWUgPSBlbnN1cmVGb3JtQ29tcG9uZW50SXNTdGF0ZWZ1bChmb3JtRmliZXIpLnF1ZXVlO1xuICBzdGFydFRyYW5zaXRpb24oXG4gICAgZm9ybUZpYmVyLFxuICAgIHF1ZXVlLFxuICAgIHBlbmRpbmdTdGF0ZSxcbiAgICBzaGFyZWROb3RQZW5kaW5nT2JqZWN0LFxuICAgIG51bGwgPT09IGFjdGlvblxuICAgICAgPyBub29wJDJcbiAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlcXVlc3RGb3JtUmVzZXQkMShmb3JtRmliZXIpO1xuICAgICAgICAgIHJldHVybiBhY3Rpb24oZm9ybURhdGEpO1xuICAgICAgICB9XG4gICk7XG59XG5mdW5jdGlvbiBlbnN1cmVGb3JtQ29tcG9uZW50SXNTdGF0ZWZ1bChmb3JtRmliZXIpIHtcbiAgdmFyIGV4aXN0aW5nU3RhdGVIb29rID0gZm9ybUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIGlmIChudWxsICE9PSBleGlzdGluZ1N0YXRlSG9vaykgcmV0dXJuIGV4aXN0aW5nU3RhdGVIb29rO1xuICBleGlzdGluZ1N0YXRlSG9vayA9IHtcbiAgICBtZW1vaXplZFN0YXRlOiBzaGFyZWROb3RQZW5kaW5nT2JqZWN0LFxuICAgIGJhc2VTdGF0ZTogc2hhcmVkTm90UGVuZGluZ09iamVjdCxcbiAgICBiYXNlUXVldWU6IG51bGwsXG4gICAgcXVldWU6IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBsYW5lczogMCxcbiAgICAgIGRpc3BhdGNoOiBudWxsLFxuICAgICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgICBsYXN0UmVuZGVyZWRTdGF0ZTogc2hhcmVkTm90UGVuZGluZ09iamVjdFxuICAgIH0sXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICB2YXIgaW5pdGlhbFJlc2V0U3RhdGUgPSB7fTtcbiAgZXhpc3RpbmdTdGF0ZUhvb2submV4dCA9IHtcbiAgICBtZW1vaXplZFN0YXRlOiBpbml0aWFsUmVzZXRTdGF0ZSxcbiAgICBiYXNlU3RhdGU6IGluaXRpYWxSZXNldFN0YXRlLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZToge1xuICAgICAgcGVuZGluZzogbnVsbCxcbiAgICAgIGxhbmVzOiAwLFxuICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiBiYXNpY1N0YXRlUmVkdWNlcixcbiAgICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsUmVzZXRTdGF0ZVxuICAgIH0sXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICBmb3JtRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGV4aXN0aW5nU3RhdGVIb29rO1xuICBmb3JtRmliZXIgPSBmb3JtRmliZXIuYWx0ZXJuYXRlO1xuICBudWxsICE9PSBmb3JtRmliZXIgJiYgKGZvcm1GaWJlci5tZW1vaXplZFN0YXRlID0gZXhpc3RpbmdTdGF0ZUhvb2spO1xuICByZXR1cm4gZXhpc3RpbmdTdGF0ZUhvb2s7XG59XG5mdW5jdGlvbiByZXF1ZXN0Rm9ybVJlc2V0JDEoZm9ybUZpYmVyKSB7XG4gIHZhciByZXNldFN0YXRlUXVldWUgPSBlbnN1cmVGb3JtQ29tcG9uZW50SXNTdGF0ZWZ1bChmb3JtRmliZXIpLm5leHQucXVldWU7XG4gIGRpc3BhdGNoU2V0U3RhdGVJbnRlcm5hbChmb3JtRmliZXIsIHJlc2V0U3RhdGVRdWV1ZSwge30sIHJlcXVlc3RVcGRhdGVMYW5lKCkpO1xufVxuZnVuY3Rpb24gdXNlSG9zdFRyYW5zaXRpb25TdGF0dXMoKSB7XG4gIHJldHVybiByZWFkQ29udGV4dChIb3N0VHJhbnNpdGlvbkNvbnRleHQpO1xufVxuZnVuY3Rpb24gdXBkYXRlSWQoKSB7XG4gIHJldHVybiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlO1xufVxuZnVuY3Rpb24gdXBkYXRlUmVmcmVzaCgpIHtcbiAgcmV0dXJuIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLm1lbW9pemVkU3RhdGU7XG59XG5mdW5jdGlvbiByZWZyZXNoQ2FjaGUoZmliZXIpIHtcbiAgZm9yICh2YXIgcHJvdmlkZXIgPSBmaWJlci5yZXR1cm47IG51bGwgIT09IHByb3ZpZGVyOyApIHtcbiAgICBzd2l0Y2ggKHByb3ZpZGVyLnRhZykge1xuICAgICAgY2FzZSAyNDpcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZSgpO1xuICAgICAgICBmaWJlciA9IGNyZWF0ZVVwZGF0ZShsYW5lKTtcbiAgICAgICAgdmFyIHJvb3QkNDEgPSBlbnF1ZXVlVXBkYXRlKHByb3ZpZGVyLCBmaWJlciwgbGFuZSk7XG4gICAgICAgIG51bGwgIT09IHJvb3QkNDEgJiZcbiAgICAgICAgICAoc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QkNDEsIHByb3ZpZGVyLCBsYW5lKSxcbiAgICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QkNDEsIHByb3ZpZGVyLCBsYW5lKSk7XG4gICAgICAgI
1HByb3ZpZGVyID0geyBjYWNoZTogY3JlYXRlQ2FjaGUoKSB9O1xuICAgICAgICBmaWJlci5wYXlsb2FkID0gcHJvdmlkZXI7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcHJvdmlkZXIgPSBwcm92aWRlci5yZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIGRpc3BhdGNoUmVkdWNlckFjdGlvbihmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKCk7XG4gIGFjdGlvbiA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIHJldmVydExhbmU6IDAsXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgaGFzRWFnZXJTdGF0ZTogITEsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpXG4gICAgPyBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIGFjdGlvbilcbiAgICA6ICgoYWN0aW9uID0gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgYWN0aW9uLCBsYW5lKSksXG4gICAgICBudWxsICE9PSBhY3Rpb24gJiZcbiAgICAgICAgKHNjaGVkdWxlVXBkYXRlT25GaWJlcihhY3Rpb24sIGZpYmVyLCBsYW5lKSxcbiAgICAgICAgZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKGFjdGlvbiwgcXVldWUsIGxhbmUpKSk7XG59XG5mdW5jdGlvbiBkaXNwYXRjaFNldFN0YXRlKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoKTtcbiAgZGlzcGF0Y2hTZXRTdGF0ZUludGVybmFsKGZpYmVyLCBxdWV1ZSwgYWN0aW9uLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoU2V0U3RhdGVJbnRlcm5hbChmaWJlciwgcXVldWUsIGFjdGlvbiwgbGFuZSkge1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGxhbmU6IGxhbmUsXG4gICAgcmV2ZXJ0TGFuZTogMCxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBoYXNFYWdlclN0YXRlOiAhMSxcbiAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgaWYgKGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpKSBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSk7XG4gIGVsc2Uge1xuICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgaWYgKFxuICAgICAgMCA9PT0gZmliZXIubGFuZXMgJiZcbiAgICAgIChudWxsID09PSBhbHRlcm5hdGUgfHwgMCA9PT0gYWx0ZXJuYXRlLmxhbmVzKSAmJlxuICAgICAgKChhbHRlcm5hdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyKSwgbnVsbCAhPT0gYWx0ZXJuYXRlKVxuICAgIClcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSxcbiAgICAgICAgICBlYWdlclN0YXRlID0gYWx0ZXJuYXRlKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgdXBkYXRlLmhhc0VhZ2VyU3RhdGUgPSAhMDtcbiAgICAgICAgdXBkYXRlLmVhZ2VyU3RhdGUgPSBlYWdlclN0YXRlO1xuICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSlcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZSQxKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCAwKSxcbiAgICAgICAgICAgIG51bGwgPT09IHdvcmtJblByb2dyZXNzUm9vdCAmJiBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCksXG4gICAgICAgICAgICAhMVxuICAgICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgIH1cbiAgICBhY3Rpb24gPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuICAgIGlmIChudWxsICE9PSBhY3Rpb24pXG4gICAgICByZXR1cm4gKFxuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoYWN0aW9uLCBmaWJlciwgbGFuZSksXG4gICAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShhY3Rpb24sIHF1ZXVlLCBsYW5lKSxcbiAgICAgICAgITBcbiAgICAgICk7XG4gIH1cbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gZGlzcGF0Y2hPcHRpbWlzdGljU2V0U3RhdGUoZmliZXIsIHRocm93SWZEdXJpbmdSZW5kZXIsIHF1ZXVlLCBhY3Rpb24pIHtcbiAgYWN0aW9uID0ge1xuICAgIGxhbmU6IDIsXG4gICAgcmV2ZXJ0TGFuZTogcmVxdWVzdFRyYW5zaXRpb25MYW5lKCksXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgaGFzRWFnZXJTdGF0ZTogITEsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGlmICh0aHJvd0lmRHVyaW5nUmVuZGVyKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQ3OSkpO1xuICB9IGVsc2VcbiAgICAodGhyb3dJZkR1cmluZ1JlbmRlciA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShcbiAgICAgIGZpYmVyLFxuICAgICAgcXVldWUsXG4gICAgICBhY3Rpb24sXG4gICAgICAyXG4gICAgKSksXG4gICAgICBudWxsICE9PSB0aHJvd0lmRHVyaW5nUmVuZGVyICYmXG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcih0aHJvd0lmRHVyaW5nUmVuZGVyLCBmaWJlciwgMik7XG59XG5mdW5jdGlvbiBpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gIHJldHVybiAoXG4gICAgZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyIHx8XG4gICAgKG51bGwgIT09IGFsdGVybmF0ZSAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyKVxuICApO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpIHtcbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9XG4gICAgITA7XG4gIHZhciBwZW5kaW5nID0gcXVldWUucGVuZGluZztcbiAgbnVsbCA9PT0gcGVuZGluZ1xuICAgID8gKHVwZGF0ZS5uZXh0ID0gdXBkYXRlKVxuICAgIDogKCh1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dCksIChwZW5kaW5nLm5leHQgPSB1cGRhdGUpKTtcbiAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSkge1xuICBpZiAoMCAhPT0gKGxhbmUgJiA0MTk0MDQ4KSkge1xuICAgIHZhciBxdW
1V1ZUxhbmVzID0gcXVldWUubGFuZXM7XG4gICAgcXVldWVMYW5lcyAmPSByb290LnBlbmRpbmdMYW5lcztcbiAgICBsYW5lIHw9IHF1ZXVlTGFuZXM7XG4gICAgcXVldWUubGFuZXMgPSBsYW5lO1xuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGxhbmUpO1xuICB9XG59XG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICAgIHJlYWRDb250ZXh0OiByZWFkQ29udGV4dCxcbiAgICB1c2U6IHVzZSxcbiAgICB1c2VDYWxsYmFjazogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICB1c2VFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgdXNlTGF5b3V0RWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgdXNlTWVtbzogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgIHVzZVJlZHVjZXI6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICB1c2VTdGF0ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgIHVzZURlYnVnVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgdXNlVHJhbnNpdGlvbjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgdXNlSWQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICB1c2VIb3N0VHJhbnNpdGlvblN0YXR1czogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgIHVzZUZvcm1TdGF0ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgIHVzZUFjdGlvblN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgdXNlT3B0aW1pc3RpYzogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgIHVzZU1lbW9DYWNoZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgIHVzZUNhY2hlUmVmcmVzaDogdGhyb3dJbnZhbGlkSG9va0Vycm9yXG4gIH0sXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnQgPSB7XG4gICAgcmVhZENvbnRleHQ6IHJlYWRDb250ZXh0LFxuICAgIHVzZTogdXNlLFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZSA9IFtcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIHZvaWQgMCA9PT0gZGVwcyA/IG51bGwgOiBkZXBzXG4gICAgICBdO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogcmVhZENvbnRleHQsXG4gICAgdXNlRWZmZWN0OiBtb3VudEVmZmVjdCxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGRlcHMgPSBudWxsICE9PSBkZXBzICYmIHZvaWQgMCAhPT0gZGVwcyA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gICAgICBtb3VudEVmZmVjdEltcGwoXG4gICAgICAgIDQxOTQzMDgsXG4gICAgICAgIDQsXG4gICAgICAgIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksXG4gICAgICAgIGRlcHNcbiAgICAgICk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoNDE5NDMwOCwgNCwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgbW91bnRFZmZlY3RJbXBsKDQsIDIsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAobmV4dENyZWF0ZSwgZGVwcykge1xuICAgICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgZGVwcyA9IHZvaWQgMCA9PT0gZGVwcyA/IG51bGwgOiBkZXBzO1xuICAgICAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgICAgIGlmIChzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFVikge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbmV4dENyZWF0ZSgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgZGVwc107XG4gICAgICByZXR1cm4gbmV4dFZhbHVlO1xuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIGlmICh2b2lkIDAgIT09IGluaXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxTdGF0ZSA9IGluaXQoaW5pdGlhbEFyZyk7XG4gICAgICAgIGlmIChzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFVikge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCEwKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5pdChpbml0aWFsQXJnKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICAgIHJlZHVjZXIgPSB7XG4gICAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICAgIGxhbmVzOiAwLFxuICAgICAgICBkaXNwYXRjaDogbnVsbCxcbiAgICAgICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogcmVkdWNlcixcbiAgICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICAgICAgfTtcbiAgICAgIGhvb2sucXVldWUgPSByZWR1Y2VyO1xuICAgICAgcmVkdWNlciA9IHJlZHVjZXIuZGlzcGF0Y2ggPSBkaXNwYXRjaFJlZHVjZXJBY3Rpb24uYmluZChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIsXG4gICAgICAgI
1HJlZHVjZXJcbiAgICAgICk7XG4gICAgICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgcmVkdWNlcl07XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIGluaXRpYWxWYWx1ZSA9IHsgY3VycmVudDogaW5pdGlhbFZhbHVlIH07XG4gICAgICByZXR1cm4gKGhvb2subWVtb2l6ZWRTdGF0ZSA9IGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgaW5pdGlhbFN0YXRlID0gbW91bnRTdGF0ZUltcGwoaW5pdGlhbFN0YXRlKTtcbiAgICAgIHZhciBxdWV1ZSA9IGluaXRpYWxTdGF0ZS5xdWV1ZSxcbiAgICAgICAgZGlzcGF0Y2ggPSBkaXNwYXRjaFNldFN0YXRlLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIsIHF1ZXVlKTtcbiAgICAgIHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2g7XG4gICAgICByZXR1cm4gW2luaXRpYWxTdGF0ZS5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBtb3VudERlYnVnVmFsdWUsXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHZhbHVlLCBpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0YXRlSG9vayA9IG1vdW50U3RhdGVJbXBsKCExKTtcbiAgICAgIHN0YXRlSG9vayA9IHN0YXJ0VHJhbnNpdGlvbi5iaW5kKFxuICAgICAgICBudWxsLFxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcixcbiAgICAgICAgc3RhdGVIb29rLnF1ZXVlLFxuICAgICAgICAhMCxcbiAgICAgICAgITFcbiAgICAgICk7XG4gICAgICBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpLm1lbW9pemVkU3RhdGUgPSBzdGF0ZUhvb2s7XG4gICAgICByZXR1cm4gWyExLCBzdGF0ZUhvb2tdO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIsXG4gICAgICAgIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IGdldFNlcnZlclNuYXBzaG90KVxuICAgICAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNDA3KSk7XG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90ID0gZ2V0U2VydmVyU25hcHNob3QoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcbiAgICAgICAgaWYgKG51bGwgPT09IHdvcmtJblByb2dyZXNzUm9vdClcbiAgICAgICAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDM0OSkpO1xuICAgICAgICAwICE9PSAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiAxMjQpIHx8XG4gICAgICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICAgIH1cbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGdldFNlcnZlclNuYXBzaG90O1xuICAgICAgdmFyIGluc3QgPSB7IHZhbHVlOiBnZXRTZXJ2ZXJTbmFwc2hvdCwgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90IH07XG4gICAgICBob29rLnF1ZXVlID0gaW5zdDtcbiAgICAgIG1vdW50RWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW1xuICAgICAgICBzdWJzY3JpYmVcbiAgICAgIF0pO1xuICAgICAgZmliZXIuZmxhZ3MgfD0gMjA0ODtcbiAgICAgIHB1c2hTaW1wbGVFZmZlY3QoXG4gICAgICAgIDksXG4gICAgICAgIGNyZWF0ZUVmZmVjdEluc3RhbmNlKCksXG4gICAgICAgIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgIGluc3QsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3QsXG4gICAgICAgICAgZ2V0U25hcHNob3RcbiAgICAgICAgKSxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcbiAgICAgIHJldHVybiBnZXRTZXJ2ZXJTbmFwc2hvdDtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
1XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCksXG4gICAgICAgIGlkZW50aWZpZXJQcmVmaXggPSB3b3JrSW5Qcm9ncmVzc1Jvb3QuaWRlbnRpZmllclByZWZpeDtcbiAgICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgICB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgICAgICAgdmFyIGlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPVxuICAgICAgICAgIChcbiAgICAgICAgICAgIGlkV2l0aExlYWRpbmdCaXQgJiB+KDEgPDwgKDMyIC0gY2x6MzIoaWRXaXRoTGVhZGluZ0JpdCkgLSAxKSlcbiAgICAgICAgICApLnRvU3RyaW5nKDMyKSArIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdDtcbiAgICAgICAgaWRlbnRpZmllclByZWZpeCA9XG4gICAgICAgICAgXCJcXHUwMGFiXCIgKyBpZGVudGlmaWVyUHJlZml4ICsgXCJSXCIgKyBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQ7XG4gICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9IGxvY2FsSWRDb3VudGVyKys7XG4gICAgICAgIDAgPCBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgJiZcbiAgICAgICAgICAoaWRlbnRpZmllclByZWZpeCArPSBcIkhcIiArIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdC50b1N0cmluZygzMikpO1xuICAgICAgICBpZGVudGlmaWVyUHJlZml4ICs9IFwiXFx1MDBiYlwiO1xuICAgICAgfSBlbHNlXG4gICAgICAgIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSBnbG9iYWxDbGllbnRJZENvdW50ZXIrKyksXG4gICAgICAgICAgKGlkZW50aWZpZXJQcmVmaXggPVxuICAgICAgICAgICAgXCJcXHUwMGFiXCIgK1xuICAgICAgICAgICAgaWRlbnRpZmllclByZWZpeCArXG4gICAgICAgICAgICBcInJcIiArXG4gICAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQudG9TdHJpbmcoMzIpICtcbiAgICAgICAgICAgIFwiXFx1MDBiYlwiKTtcbiAgICAgIHJldHVybiAoaG9vay5tZW1vaXplZFN0YXRlID0gaWRlbnRpZmllclByZWZpeCk7XG4gICAgfSxcbiAgICB1c2VIb3N0VHJhbnNpdGlvblN0YXR1czogdXNlSG9zdFRyYW5zaXRpb25TdGF0dXMsXG4gICAgdXNlRm9ybVN0YXRlOiBtb3VudEFjdGlvblN0YXRlLFxuICAgIHVzZUFjdGlvblN0YXRlOiBtb3VudEFjdGlvblN0YXRlLFxuICAgIHVzZU9wdGltaXN0aWM6IGZ1bmN0aW9uIChwYXNzdGhyb3VnaCkge1xuICAgICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBwYXNzdGhyb3VnaDtcbiAgICAgIHZhciBxdWV1ZSA9IHtcbiAgICAgICAgcGVuZGluZzogbnVsbCxcbiAgICAgICAgbGFuZXM6IDAsXG4gICAgICAgIGRpc3BhdGNoOiBudWxsLFxuICAgICAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiBudWxsLFxuICAgICAgICBsYXN0UmVuZGVyZWRTdGF0ZTogbnVsbFxuICAgICAgfTtcbiAgICAgIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgICAgIGhvb2sgPSBkaXNwYXRjaE9wdGltaXN0aWNTZXRTdGF0ZS5iaW5kKFxuICAgICAgICBudWxsLFxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcixcbiAgICAgICAgITAsXG4gICAgICAgIHF1ZXVlXG4gICAgICApO1xuICAgICAgcXVldWUuZGlzcGF0Y2ggPSBob29rO1xuICAgICAgcmV0dXJuIFtwYXNzdGhyb3VnaCwgaG9va107XG4gICAgfSxcbiAgICB1c2VNZW1vQ2FjaGU6IHVzZU1lbW9DYWNoZSxcbiAgICB1c2VDYWNoZVJlZnJlc2g6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAobW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlID0gcmVmcmVzaENhY2hlLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyXG4gICAgICApKTtcbiAgICB9XG4gIH0sXG4gIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlID0ge1xuICAgIHJlYWRDb250ZXh0OiByZWFkQ29udGV4dCxcbiAgICB1c2U6IHVzZSxcbiAgICB1c2VDYWxsYmFjazogdXBkYXRlQ2FsbGJhY2ssXG4gICAgdXNlQ29udGV4dDogcmVhZENvbnRleHQsXG4gICAgdXNlRWZmZWN0OiB1cGRhdGVFZmZlY3QsXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IHVwZGF0ZUluc2VydGlvbkVmZmVjdCxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IHVwZGF0ZUxheW91dEVmZmVjdCxcbiAgICB1c2VNZW1vOiB1cGRhdGVNZW1vLFxuICAgIHVzZVJlZHVjZXI6IHVwZGF0ZVJlZHVjZXIsXG4gICAgdXNlUmVmOiB1cGRhdGVSZWYsXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IG1vdW50RGVidWdWYWx1ZSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChcbiAgICAgICAgaG9vayxcbiAgICAgICAgY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZVxuICAgICAgKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBib29sZWFuT3JUaGVuYWJsZSA9IHVwZGF0ZVJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpWzBdLFxuICAgICAgICBzdGFydCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLm1lbW9pemVkU3RhdGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIGJvb2xlYW5PclRoZW5hYmxlXG4gICAgICAgICAgPyBib29sZWFuT3JUaGVuYWJsZVxuICAgICAgICAgIDogdXNlVGhlbmFibGUoYm9vbGVhbk9yVGhlbmFibGUpLFxuICAgICAgICBzdGFydFxuICAgICAgXTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZSxcbiAgICB1c2VJZDogdXBkYXRlSWQsXG4gICAgdXNlSG9zdFRyYW5zaXRpb25TdGF0dXM6IHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzLFxuICAgIHVzZUZvcm1TdGF0ZTogdXBkYXRlQWN0aW9uU3RhdGUsXG4gICAgdXNlQWN0aW9uU3RhdGU6IHVwZGF0ZUFjdGlvblN0YXRlLFxuICAgIHVzZU9wdGltaXN0aWM6IGZ1bmN0aW9uIChwYXNzdGhyb3VnaCwgcmVkdWNlcikge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHJldHVybi
1B1cGRhdGVPcHRpbWlzdGljSW1wbChob29rLCBjdXJyZW50SG9vaywgcGFzc3Rocm91Z2gsIHJlZHVjZXIpO1xuICAgIH0sXG4gICAgdXNlTWVtb0NhY2hlOiB1c2VNZW1vQ2FjaGUsXG4gICAgdXNlQ2FjaGVSZWZyZXNoOiB1cGRhdGVSZWZyZXNoXG4gIH0sXG4gIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXIgPSB7XG4gICAgcmVhZENvbnRleHQ6IHJlYWRDb250ZXh0LFxuICAgIHVzZTogdXNlLFxuICAgIHVzZUNhbGxiYWNrOiB1cGRhdGVDYWxsYmFjayxcbiAgICB1c2VDb250ZXh0OiByZWFkQ29udGV4dCxcbiAgICB1c2VFZmZlY3Q6IHVwZGF0ZUVmZmVjdCxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlLFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogdXBkYXRlSW5zZXJ0aW9uRWZmZWN0LFxuICAgIHVzZUxheW91dEVmZmVjdDogdXBkYXRlTGF5b3V0RWZmZWN0LFxuICAgIHVzZU1lbW86IHVwZGF0ZU1lbW8sXG4gICAgdXNlUmVkdWNlcjogcmVyZW5kZXJSZWR1Y2VyLFxuICAgIHVzZVJlZjogdXBkYXRlUmVmLFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IG1vdW50RGVidWdWYWx1ZSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHJldHVybiBudWxsID09PSBjdXJyZW50SG9va1xuICAgICAgICA/IG1vdW50RGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgdmFsdWUsIGluaXRpYWxWYWx1ZSlcbiAgICAgICAgOiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChcbiAgICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgICBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsVmFsdWVcbiAgICAgICAgICApO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGJvb2xlYW5PclRoZW5hYmxlID0gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKVswXSxcbiAgICAgICAgc3RhcnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiBib29sZWFuT3JUaGVuYWJsZVxuICAgICAgICAgID8gYm9vbGVhbk9yVGhlbmFibGVcbiAgICAgICAgICA6IHVzZVRoZW5hYmxlKGJvb2xlYW5PclRoZW5hYmxlKSxcbiAgICAgICAgc3RhcnRcbiAgICAgIF07XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogdXBkYXRlU3luY0V4dGVybmFsU3RvcmUsXG4gICAgdXNlSWQ6IHVwZGF0ZUlkLFxuICAgIHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzOiB1c2VIb3N0VHJhbnNpdGlvblN0YXR1cyxcbiAgICB1c2VGb3JtU3RhdGU6IHJlcmVuZGVyQWN0aW9uU3RhdGUsXG4gICAgdXNlQWN0aW9uU3RhdGU6IHJlcmVuZGVyQWN0aW9uU3RhdGUsXG4gICAgdXNlT3B0aW1pc3RpYzogZnVuY3Rpb24gKHBhc3N0aHJvdWdoLCByZWR1Y2VyKSB7XG4gICAgICB2Y
1XIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnRIb29rKVxuICAgICAgICByZXR1cm4gdXBkYXRlT3B0aW1pc3RpY0ltcGwoaG9vaywgY3VycmVudEhvb2ssIHBhc3N0aHJvdWdoLCByZWR1Y2VyKTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gcGFzc3Rocm91Z2g7XG4gICAgICByZXR1cm4gW3Bhc3N0aHJvdWdoLCBob29rLnF1ZXVlLmRpc3BhdGNoXTtcbiAgICB9LFxuICAgIHVzZU1lbW9DYWNoZTogdXNlTWVtb0NhY2hlLFxuICAgIHVzZUNhY2hlUmVmcmVzaDogdXBkYXRlUmVmcmVzaFxuICB9LFxuICB0aGVuYWJsZVN0YXRlID0gbnVsbCxcbiAgdGhlbmFibGVJbmRleENvdW50ZXIgPSAwO1xuZnVuY3Rpb24gdW53cmFwVGhlbmFibGUodGhlbmFibGUpIHtcbiAgdmFyIGluZGV4ID0gdGhlbmFibGVJbmRleENvdW50ZXI7XG4gIHRoZW5hYmxlSW5kZXhDb3VudGVyICs9IDE7XG4gIG51bGwgPT09IHRoZW5hYmxlU3RhdGUgJiYgKHRoZW5hYmxlU3RhdGUgPSBbXSk7XG4gIHJldHVybiB0cmFja1VzZWRUaGVuYWJsZSh0aGVuYWJsZVN0YXRlLCB0aGVuYWJsZSwgaW5kZXgpO1xufVxuZnVuY3Rpb24gY29lcmNlUmVmKHdvcmtJblByb2dyZXNzLCBlbGVtZW50KSB7XG4gIGVsZW1lbnQgPSBlbGVtZW50LnByb3BzLnJlZjtcbiAgd29ya0luUHJvZ3Jlc3MucmVmID0gdm9pZCAwICE9PSBlbGVtZW50ID8gZWxlbWVudCA6IG51bGw7XG59XG5mdW5jdGlvbiB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKSB7XG4gIGlmIChuZXdDaGlsZC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEVHQUNZX0VMRU1FTlRfVFlQRSlcbiAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUyNSkpO1xuICByZXR1cm5GaWJlciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdDaGlsZCk7XG4gIHRocm93IEVycm9yKFxuICAgIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoXG4gICAgICAzMSxcbiAgICAgIFwiW29iamVjdCBPYmplY3RdXCIgPT09IHJldHVybkZpYmVyXG4gICAgICAgID8gXCJvYmplY3Qgd2l0aCBrZXlzIHtcIiArIE9iamVjdC5rZXlzKG5ld0NoaWxkKS5qb2luKFwiLCBcIikgKyBcIn1cIlxuICAgICAgICA6IHJldHVybkZpYmVyXG4gICAgKVxuICApO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenkobGF6eVR5cGUpIHtcbiAgdmFyIGluaXQgPSBsYXp5VHlwZS5faW5pdDtcbiAgcmV0dXJuIGluaXQobGF6eVR5cGUuX3BheWxvYWQpO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcbiAgICAgIG51bGwgPT09IGRlbGV0aW9uc1xuICAgICAgICA/ICgocmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2NoaWxkVG9EZWxldGVdKSwgKHJldHVybkZpYmVyLmZsYWdzIHw9IDE2KSlcbiAgICAgICAgOiBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKDsgbnVsbCAhPT0gY3VycmVudEZpcnN0Q2hpbGQ7IClcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCksXG4gICAgICAgIChjdXJyZW50Rmlyc3RDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIG1hcFJlbWFpbmluZ0NoaWxkcmVuKGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgZm9yICh2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG5ldyBNYXAoKTsgbnVsbCAhPT0gY3VycmVudEZpcnN0Q2hpbGQ7IClcbiAgICAgIG51bGwgIT09IGN1cnJlbnRGaXJzdENoaWxkLmtleVxuICAgICAgICA/IGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGN1cnJlbnRGaXJzdENoaWxkLmtleSwgY3VycmVudEZpcnN0Q2hpbGQpXG4gICAgICAgIDogZXhpc3RpbmdDaGlsZHJlbi5zZXQoY3VycmVudEZpcnN0Q2hpbGQuaW5kZXgsIGN1cnJlbnRGaXJzdENoaWxkKSxcbiAgICAgICAgKGN1cnJlbnRGaXJzdENoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQuc2libGluZyk7XG4gICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gIH1cbiAgZnVuY3Rpb24gdXNlRmliZXIoZmliZXIsIHBlbmRpbmdQcm9wcykge1xuICAgIGZpYmVyID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcyk7XG4gICAgZmliZXIuaW5kZXggPSAwO1xuICAgIGZpYmVyLnNpYmxpbmcgPSBudWxsO1xuICAgIHJldHVybiBmaWJlcjtcbiAgfVxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpXG4gICAgICByZXR1cm4gKG5ld0ZpYmVyLmZsYWdzIHw9IDEwNDg1NzYpLCBsYXN0UGxhY2VkSW5kZXg7XG4gICAgbmV3SW5kZXggPSBuZXdGaWJlci5hbHRlcm5hdGU7XG4gICAgaWYgKG51bGwgIT09IG5ld0luZGV4KVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKG5ld0luZGV4ID0gbmV3SW5kZXguaW5kZXgpLFxuICAgICAgICBuZXdJbmRleCA8IGxhc3RQbGFjZWRJbmRleFxuICAgICAgICAgID8gKChuZXdGaWJlci5mbGFncyB8PSA2NzEwODg2NiksIGxhc3RQbGFjZWRJbmRleClcbiAgICAgICAgICA6IG5ld0luZGV4XG4gICAgICApO1xuICAgIG5ld0ZpYmVyLmZsYWdzIHw9IDY3MTA4ODY2O1xuICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gIH1cbiAgZnVuY3Rpb24gcGxhY2VTaW5nbGVDaGlsZChuZXdGaWJlcikge1xuICAgIHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiZcbiAgICAgIG51bGwgPT09IG5ld0ZpYmVyLmFsdGVybmF0ZSAmJlxuICAgICAgKG5ld0ZpYmVyLmZsYWdzIHw9IDY3MTA4ODY2KTtcbiAgICByZXR1cm4gbmV3RmliZXI7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIGlmIChudWxsID09PSBjdXJyZW50IHx8IDYgIT09IGN1cnJlbnQudGFnKVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGN1cnJlbnQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcykpLFxuICAgICAgICAoY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgIGN1cnJlbnRcbiAgICAgICk7XG4gICAgY3VycmVudCA9IHVzZUZpYmVyKGN1cnJlbnQsIHRleHRDb250ZW50KTtcbiAgICBjdXJyZW50LnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybi
1BjdXJyZW50O1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSlcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChcbiAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGxhbmVzLFxuICAgICAgICBlbGVtZW50LmtleVxuICAgICAgKTtcbiAgICBpZiAoXG4gICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAoY3VycmVudC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHxcbiAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBlbGVtZW50VHlwZSAmJlxuICAgICAgICAgIG51bGwgIT09IGVsZW1lbnRUeXBlICYmXG4gICAgICAgICAgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJlxuICAgICAgICAgIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY3VycmVudC50eXBlKSlcbiAgICApXG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY3VycmVudCA9IHVzZUZpYmVyKGN1cnJlbnQsIGVsZW1lbnQucHJvcHMpKSxcbiAgICAgICAgY29lcmNlUmVmKGN1cnJlbnQsIGVsZW1lbnQpLFxuICAgICAgICAoY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgIGN1cnJlbnRcbiAgICAgICk7XG4gICAgY3VycmVudCA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyhcbiAgICAgIGVsZW1lbnQudHlwZSxcbiAgICAgIGVsZW1lbnQua2V5LFxuICAgICAgZWxlbWVudC5wcm9wcyxcbiAgICAgIG51bGwsXG4gICAgICByZXR1cm5GaWJlci5tb2RlLFxuICAgICAgbGFuZXNcbiAgICApO1xuICAgIGNvZXJjZVJlZihjdXJyZW50LCBlbGVtZW50KTtcbiAgICBjdXJyZW50LnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudCwgcG9ydGFsLCBsYW5lcykge1xuICAgIGlmIChcbiAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgIDQgIT09IGN1cnJlbnQudGFnIHx8XG4gICAgICBjdXJyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fFxuICAgICAgY3VycmVudC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gIT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICAgIClcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjdXJyZW50ID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpKSxcbiAgICAgICAgKGN1cnJlbnQucmV0dXJuID0gcmV0dXJuRmliZXIpLFxuICAgICAgICBjdXJyZW50XG4gICAgICApO1xuICAgIGN1cnJlbnQgPSB1c2VGaWJlcihjdXJyZW50LCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgIGN1cnJlbnQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGZyYWdtZW50LCBsYW5lcywga2V5KSB7XG4gICAgaWYgKG51bGwgPT09IGN1cnJlbnQgfHwgNyAhPT0gY3VycmVudC50YWcpXG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY3VycmVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KFxuICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgbGFuZXMsXG4gICAgICAgICAga2V5XG4gICAgICAgICkpLFxuICAgICAgICAoY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgIGN1cnJlbnRcbiAgICAgICk7XG4gICAgY3VycmVudCA9IHVzZUZpYmVyKGN1cnJlbnQsIGZyYWdtZW50KTtcbiAgICBjdXJyZW50LnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAoXG4gICAgICAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG5ld0NoaWxkICYmIFwiXCIgIT09IG5ld0NoaWxkKSB8fFxuICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIG5ld0NoaWxkIHx8XG4gICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgbmV3Q2hpbGRcbiAgICApXG4gICAgICByZXR1cm4gKFxuICAgICAgICAobmV3Q2hpbGQgPSBjcmVhdGVGaWJlckZyb21UZXh0KFxuICAgICAgICAgIFwiXCIgKyBuZXdDaGlsZCxcbiAgICAgICAgICByZXR1cm5GaWJlci5tb2RlLFxuICAgICAgICAgIGxhbmVzXG4gICAgICAgICkpLFxuICAgICAgICAobmV3Q2hpbGQucmV0dXJuID0gcmV0dXJuRmliZXIpLFxuICAgICAgICBuZXdDaGlsZFxuICAgICAgKTtcbiAgICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIG5ld0NoaWxkICYmIG51bGwgIT09IG5ld0NoaWxkKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAobGFuZXMgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoXG4gICAgICAgICAgICAgIG5ld0NoaWxkLnR5cGUsXG4gICAgICAgICAgICAgIG5ld0NoaWxkLmtleSxcbiAgICAgICAgICAgICAgbmV3Q2hpbGQucHJvcHMsXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIGNvZXJjZVJlZihsYW5lcywgbmV3Q2hpbGQpLFxuICAgICAgICAgICAgKGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKG5ld0NoaWxkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKFxuICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIubW9kZSxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKG5ld0NoaWxkLnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgIG5ld0NoaWxkXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICBuZXdDaGlsZCA9IGluaXQobmV3Q2hpbGQuX3B
1heWxvYWQpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5SW1wbChuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKG5ld0NoaWxkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoXG4gICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApKSxcbiAgICAgICAgICAobmV3Q2hpbGQucmV0dXJuID0gcmV0dXJuRmliZXIpLFxuICAgICAgICAgIG5ld0NoaWxkXG4gICAgICAgICk7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbmV3Q2hpbGQudGhlbilcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCB1bndyYXBUaGVuYWJsZShuZXdDaGlsZCksIGxhbmVzKTtcbiAgICAgIGlmIChuZXdDaGlsZC4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFKVxuICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGQoXG4gICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgcmVhZENvbnRleHREdXJpbmdSZWNvbmNpbGlhdGlvbihyZXR1cm5GaWJlciwgbmV3Q2hpbGQpLFxuICAgICAgICAgIGxhbmVzXG4gICAgICAgICk7XG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBudWxsICE9PSBvbGRGaWJlciA/IG9sZEZpYmVyLmtleSA6IG51bGw7XG4gICAgaWYgKFxuICAgICAgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBcIlwiICE9PSBuZXdDaGlsZCkgfHxcbiAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBuZXdDaGlsZCB8fFxuICAgICAgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIG5ld0NoaWxkXG4gICAgKVxuICAgICAgcmV0dXJuIG51bGwgIT09IGtleVxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgb2xkRmliZXIsIFwiXCIgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgbnVsbCAhPT0gbmV3Q2hpbGQpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIG5ld0NoaWxkLmtleSA9PT0ga2V5XG4gICAgICAgICAgICA/IHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIG5ld0NoaWxkLmtleSA9PT0ga2V5XG4gICAgICAgICAgICA/IHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcylcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChrZXkgPSBuZXdDaGlsZC5faW5pdCksXG4gICAgICAgICAgICAobmV3Q2hpbGQgPSBrZXkobmV3Q2hpbGQuX3B
1heWxvYWQpKSxcbiAgICAgICAgICAgIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5SW1wbChuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpXG4gICAgICAgIHJldHVybiBudWxsICE9PSBrZXlcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdDaGlsZC50aGVuKVxuICAgICAgICByZXR1cm4gdXBkYXRlU2xvdChcbiAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICBvbGRGaWJlcixcbiAgICAgICAgICB1bndyYXBUaGVuYWJsZShuZXdDaGlsZCksXG4gICAgICAgICAgbGFuZXNcbiAgICAgICAgKTtcbiAgICAgIGlmIChuZXdDaGlsZC4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFKVxuICAgICAgICByZXR1cm4gdXBkYXRlU2xvdChcbiAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICBvbGRGaWJlcixcbiAgICAgICAgICByZWFkQ29udGV4dER1cmluZ1JlY29uY2lsaWF0aW9uKHJldHVybkZpYmVyLCBuZXdDaGlsZCksXG4gICAgICAgICAgbGFuZXNcbiAgICAgICAgKTtcbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVGcm9tTWFwKFxuICAgIGV4aXN0aW5nQ2hpbGRyZW4sXG4gICAgcmV0dXJuRmliZXIsXG4gICAgbmV3SWR4LFxuICAgIG5ld0NoaWxkLFxuICAgIGxhbmVzXG4gICkge1xuICAgIGlmIChcbiAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgXCJcIiAhPT0gbmV3Q2hpbGQpIHx8XG4gICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgbmV3Q2hpbGQgfHxcbiAgICAgIFwiYmlnaW50XCIgPT09IHR5cGVvZiBuZXdDaGlsZFxuICAgIClcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChleGlzdGluZ0NoaWxkcmVuID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsKSxcbiAgICAgICAgdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGV4aXN0aW5nQ2hpbGRyZW4sIFwiXCIgKyBuZXdDaGlsZCwgbGFuZXMpXG4gICAgICApO1xuICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgbnVsbCAhPT0gbmV3Q2hpbGQpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChleGlzdGluZ0NoaWxkcmVuID1cbiAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5nZXQoXG4gICAgICAgICAgICAgICAgbnVsbCA9PT0gbmV3Q2hpbGQua2V5ID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5XG4gICAgICAgICAgICAgICkgfHwgbnVsbCksXG4gICAgICAgICAgICB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBleGlzdGluZ0NoaWxkcmVuLCBuZXdDaGlsZCwgbGFuZXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGV4aXN0aW5nQ2hpbGRyZW4gPVxuICAgICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmdldChcbiAgICAgICAgICAgICAgICBudWxsID09PSBuZXdDaGlsZC5rZXkgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXlcbiAgICAgICAgICAgICAgKSB8fCBudWxsKSxcbiAgICAgICAgICAgIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgZXhpc3RpbmdDaGlsZHJlbiwgbmV3Q2hpbGQsIGxhbmVzKVxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgbmV3Q2hpbGQgPSBpbml0KG5ld0NoaWxkLl9wYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4sXG4gICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlJbXBsKG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoZXhpc3RpbmdDaGlsZHJlbiA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbCksXG4gICAgICAgICAgdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGV4aXN0aW5nQ2hpbGRyZW4sIG5ld0NoaWxkLCBsYW5lcywgbnVsbClcbiAgICAgICAgKTtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdDaGlsZC50aGVuKVxuICAgICAgICByZXR1cm4gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLFxuICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICB1bndyYXBUaGVuYWJsZShuZXdDaGlsZCksXG4gICAgICAgICAgbGFuZXNcbiAgICAgICAgKTtcbiAgICAgIGlmIChuZXdDaGlsZC4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFKVxuICAgICAgICByZXR1cm4gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLFxuICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICByZWFkQ29udGV4dER1cmluZ1JlY29uY2lsaWF0aW9uKHJldHVybkZpYmVyLCBuZXdDaGlsZCksXG4gICAgICAgICAgbGFuZXNcbiAgICAgICAgKTtcbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KFxuICAgIHJldHVybkZpYmVyLFxuICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgIG5ld0NoaWxkcmVuLFxuICAgIGxhbmVzXG4gICkge1xuICAgIGZvciAoXG4gICAgICB2Y
1XIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGwsXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBudWxsLFxuICAgICAgICBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICBuZXdJZHggPSAoY3VycmVudEZpcnN0Q2hpbGQgPSAwKSxcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gbnVsbDtcbiAgICAgIG51bGwgIT09IG9sZEZpYmVyICYmIG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDtcbiAgICAgIG5ld0lkeCsrXG4gICAgKSB7XG4gICAgICBvbGRGaWJlci5pbmRleCA+IG5ld0lkeFxuICAgICAgICA/ICgobmV4dE9sZEZpYmVyID0gb2xkRmliZXIpLCAob2xkRmliZXIgPSBudWxsKSlcbiAgICAgICAgOiAobmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZyk7XG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KFxuICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgb2xkRmliZXIsXG4gICAgICAgIG5ld0NoaWxkcmVuW25ld0lkeF0sXG4gICAgICAgIGxhbmVzXG4gICAgICApO1xuICAgICAgaWYgKG51bGwgPT09IG5ld0ZpYmVyKSB7XG4gICAgICAgIG51bGwgPT09IG9sZEZpYmVyICYmIChvbGRGaWJlciA9IG5leHRPbGRGaWJlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2hvdWxkVHJhY2tTaWRlRWZmZWN0cyAmJlxuICAgICAgICBvbGRGaWJlciAmJlxuICAgICAgICBudWxsID09PSBuZXdGaWJlci5hbHRlcm5hdGUgJiZcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgIGN1cnJlbnRGaXJzdENoaWxkID0gcGxhY2VDaGlsZChuZXdGaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0lkeCk7XG4gICAgICBudWxsID09PSBwcmV2aW91c05ld0ZpYmVyXG4gICAgICAgID8gKHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcilcbiAgICAgICAgOiAocHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXIpO1xuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuICAgIGlmIChuZXdJZHggPT09IG5ld0NoaWxkcmVuLmxlbmd0aClcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlciksXG4gICAgICAgIGlzSHlkcmF0aW5nICYmIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbmV3SWR4KSxcbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZFxuICAgICAgKTtcbiAgICBpZiAobnVsbCA9PT0gb2xkRmliZXIpIHtcbiAgICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKVxuICAgICAgICAob2xkRmliZXIgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpKSxcbiAgICAgICAgICBudWxsICE9PSBvbGRGaWJlciAmJlxuICAgICAgICAgICAgKChjdXJyZW50Rmlyc3RDaGlsZCA9IHBsYWNlQ2hpbGQoXG4gICAgICAgICAgICAgIG9sZEZpYmVyLFxuICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgbmV3SWR4XG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIG51bGwgPT09IHByZXZpb3VzTmV3RmliZXJcbiAgICAgICAgICAgICAgPyAocmVzdWx0aW5nRmlyc3RDaGlsZCA9IG9sZEZpYmVyKVxuICAgICAgICAgICAgICA6IChwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBvbGRGaWJlciksXG4gICAgICAgICAgICAocHJldmlvdXNOZXdGaWJlciA9IG9sZEZpYmVyKSk7XG4gICAgICBpc0h5ZHJhdGluZyAmJiBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG5ld0lkeCk7XG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG4gICAgZm9yIChcbiAgICAgIG9sZEZpYmVyID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ob2xkRmliZXIpO1xuICAgICAgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgbmV3SWR4KytcbiAgICApXG4gICAgICAobmV4dE9sZEZpYmVyID0gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgb2xkRmliZXIsXG4gICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICBuZXdJZHgsXG4gICAgICAgIG5ld0NoaWxkcmVuW25ld0lkeF0sXG4gICAgICAgIGxhbmVzXG4gICAgICApKSxcbiAgICAgICAgbnVsbCAhPT0gbmV4dE9sZEZpYmVyICYmXG4gICAgICAgICAgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiZcbiAgICAgICAgICAgIG51bGwgIT09IG5leHRPbGRGaWJlci5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAgIG9sZEZpYmVyLmRlbGV0ZShcbiAgICAgICAgICAgICAgbnVsbCA9PT0gbmV4dE9sZEZpYmVyLmtleSA/IG5ld0lkeCA6IG5leHRPbGRGaWJlci5rZXlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKGN1cnJlbnRGaXJzdENoaWxkID0gcGxhY2VDaGlsZChcbiAgICAgICAgICAgIG5leHRPbGRGaWJlcixcbiAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgbmV3SWR4XG4gICAgICAgICAgKSksXG4gICAgICAgICAgbnVsbCA9PT0gcHJldmlvdXNOZXdGaWJlclxuICAgICAgICAgICAgPyAocmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5leHRPbGRGaWJlcilcbiAgICAgICAgICAgIDogKHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5leHRPbGRGaWJlciksXG4gICAgICAgICAgKHByZXZpb3VzTmV3RmliZXIgPSBuZXh0T2xkRmliZXIpKTtcbiAgICBzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmXG4gICAgICBvbGRGaWJlci5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIGlzSHlkcmF0aW5nICYmIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbmV3SWR4KTtcbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKFxuICAgIHJldHVybkZpYmVyLFxuICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgIG5ld0NoaWxkcmVuLFxuICAgIGxhbmVzXG4gICkge1xuICAgIGlmIChudWxsID09IG5ld0NoaWxkcmVuKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1MSkpO1xuICAgIGZvciAoXG4gICAgICB2Y
1XIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGwsXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBudWxsLFxuICAgICAgICBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICBuZXdJZHggPSAoY3VycmVudEZpcnN0Q2hpbGQgPSAwKSxcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gbnVsbCxcbiAgICAgICAgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTtcbiAgICAgIG51bGwgIT09IG9sZEZpYmVyICYmICFzdGVwLmRvbmU7XG4gICAgICBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKVxuICAgICkge1xuICAgICAgb2xkRmliZXIuaW5kZXggPiBuZXdJZHhcbiAgICAgICAgPyAoKG5leHRPbGRGaWJlciA9IG9sZEZpYmVyKSwgKG9sZEZpYmVyID0gbnVsbCkpXG4gICAgICAgIDogKG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmcpO1xuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcbiAgICAgIGlmIChudWxsID09PSBuZXdGaWJlcikge1xuICAgICAgICBudWxsID09PSBvbGRGaWJlciAmJiAob2xkRmliZXIgPSBuZXh0T2xkRmliZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiZcbiAgICAgICAgb2xkRmliZXIgJiZcbiAgICAgICAgbnVsbCA9PT0gbmV3RmliZXIuYWx0ZXJuYXRlICYmXG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICBjdXJyZW50Rmlyc3RDaGlsZCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdJZHgpO1xuICAgICAgbnVsbCA9PT0gcHJldmlvdXNOZXdGaWJlclxuICAgICAgICA/IChyZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXIpXG4gICAgICAgIDogKHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyKTtcbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cbiAgICBpZiAoc3RlcC5kb25lKVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKSxcbiAgICAgICAgaXNIeWRyYXRpbmcgJiYgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBuZXdJZHgpLFxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkXG4gICAgICApO1xuICAgIGlmIChudWxsID09PSBvbGRGaWJlcikge1xuICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKVxuICAgICAgICAoc3RlcCA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcykpLFxuICAgICAgICAgIG51bGwgIT09IHN0ZXAgJiZcbiAgICAgICAgICAgICgoY3VycmVudEZpcnN0Q2hpbGQgPSBwbGFjZUNoaWxkKHN0ZXAsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdJZHgpKSxcbiAgICAgICAgICAgIG51bGwgPT09IHByZXZpb3VzTmV3RmliZXJcbiAgICAgICAgICAgICAgPyAocmVzdWx0aW5nRmlyc3RDaGlsZCA9IHN0ZXApXG4gICAgICAgICAgICAgIDogKHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IHN0ZXApLFxuICAgICAgICAgICAgKHByZXZpb3VzTmV3RmliZXIgPSBzdGVwKSk7XG4gICAgICBpc0h5ZHJhdGluZyAmJiBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG5ld0lkeCk7XG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG4gICAgZm9yIChcbiAgICAgIG9sZEZpYmVyID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ob2xkRmliZXIpO1xuICAgICAgIXN0ZXAuZG9uZTtcbiAgICAgIG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpXG4gICAgKVxuICAgICAgKHN0ZXAgPSB1cGRhdGVGcm9tTWFwKG9sZEZpYmVyLCByZXR1cm5GaWJlciwgbmV3SWR4LCBzdGVwLnZhbHVlLCBsYW5lcykpLFxuICAgICAgICBudWxsICE9PSBzdGVwICYmXG4gICAgICAgICAgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiZcbiAgICAgICAgICAgIG51bGwgIT09IHN0ZXAuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgICBvbGRGaWJlci5kZWxldGUobnVsbCA9PT0gc3RlcC5rZXkgPyBuZXdJZHggOiBzdGVwLmtleSksXG4gICAgICAgICAgKGN1cnJlbnRGaXJzdENoaWxkID0gcGxhY2VDaGlsZChzdGVwLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3SWR4KSksXG4gICAgICAgICAgbnVsbCA9PT0gcHJldmlvdXNOZXdGaWJlclxuICAgICAgICAgICAgPyAocmVzdWx0aW5nRmlyc3RDaGlsZCA9IHN0ZXApXG4gICAgICAgICAgICA6IChwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBzdGVwKSxcbiAgICAgICAgICAocHJldmlvdXNOZXdGaWJlciA9IHN0ZXApKTtcbiAgICBzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmXG4gICAgICBvbGRGaWJlci5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIGlzSHlkcmF0aW5nICYmIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbmV3SWR4KTtcbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZEZpYmVyc0ltcGwoXG4gICAgcmV0dXJuRmliZXIsXG4gICAgY3VycmVudEZpcnN0Q2hpbGQsXG4gICAgbmV3Q2hpbGQsXG4gICAgbGFuZXNcbiAgKSB7XG4gICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG5ld0NoaWxkICYmXG4gICAgICBudWxsICE9PSBuZXdDaGlsZCAmJlxuICAgICAgbmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSAmJlxuICAgICAgbnVsbCA9PT0gbmV3Q2hpbGQua2V5ICYmXG4gICAgICAobmV3Q2hpbGQgPSBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbik7XG4gICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBudWxsICE9PSBuZXdDaGlsZCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBhOiB7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgPSBuZXdDaGlsZC5rZXk7IG51bGwgIT09IGN1cnJlbnRGaXJzdENoaWxkOyApIHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaXJzdENoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgICAga2V5ID0gbmV3Q2hpbGQudHlwZTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoNyA9PT0gY3VycmVudEZpcnN0Q2hpbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKFxuICAgICAgICAgICAgICAgICAgICAgI
1HJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgbGFuZXMgPSB1c2VGaWJlcihcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBsYW5lcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQuZWxlbWVudFR5cGUgPT09IGtleSB8fFxuICAgICAgICAgICAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBrZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0ga2V5ICYmXG4gICAgICAgICAgICAgICAgICAgIGtleS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVMYXp5KGtleSkgPT09IGN1cnJlbnRGaXJzdENoaWxkLnR5cGUpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBsYW5lcyA9IHVzZUZpYmVyKGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZC5wcm9wcyk7XG4gICAgICAgICAgICAgICAgICBjb2VyY2VSZWYobGFuZXMsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgICAgICAgIGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBsYW5lcztcbiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH0gZWxzZSBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFXG4gICAgICAgICAgICAgID8gKChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KFxuICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICByZXR1cm5GaWJlci5tb2RlLFxuICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICBuZXdDaGlsZC5rZXlcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAobGFuZXMucmV0dXJuID0gcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGxhbmVzKSlcbiAgICAgICAgICAgICAgOiAoKGxhbmVzID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKFxuICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQudHlwZSxcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLmtleSxcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLnByb3BzLFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIGNvZXJjZVJlZihsYW5lcywgbmV3Q2hpbGQpLFxuICAgICAgICAgICAgICAgIChsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gbGFuZXMpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmV0dXJuRmliZXIpO1xuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgIGZvciAoa2V5ID0gbmV3Q2hpbGQua2V5OyBudWxsICE9PSBjdXJyZW50Rmlyc3RDaGlsZDsgKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50Rmlyc3RDaGlsZC5rZXkgPT09IGtleSlcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICA0ID09PSBjdXJyZW50Rmlyc3RDaGlsZC50YWcgJiZcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvID09PVxuICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZC5jb250YWluZXJJbmZvICYmXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gPT09XG4gICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLmltcGxlbWVudGF0aW9uXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBsYW5lcyA9IHVzZUZpYmVyKGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgICAgICAgICAgICBsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyID0gbGFuZXM7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQuc2libGluZztcbiAgICAgICAgICAgI
1H1cbiAgICAgICAgICAgIGxhbmVzID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICAgICAgICBsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybkZpYmVyID0gbGFuZXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJldHVybkZpYmVyKTtcbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChrZXkgPSBuZXdDaGlsZC5faW5pdCksXG4gICAgICAgICAgICAobmV3Q2hpbGQgPSBrZXkobmV3Q2hpbGQuX3BheWxvYWQpKSxcbiAgICAgICAgICAgIHJlY29uY2lsZUNoaWxkRmliZXJzSW1wbChcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlJbXBsKG5ld0NoaWxkKSlcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkoXG4gICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQsXG4gICAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgICAgbGFuZXNcbiAgICAgICAgKTtcbiAgICAgIGlmIChnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICBrZXkgPSBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKTtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIGtleSkgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNTApKTtcbiAgICAgICAgbmV3Q2hpbGQgPSBrZXkuY2FsbChuZXdDaGlsZCk7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKFxuICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgIGxhbmVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbmV3Q2hpbGQudGhlbilcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzSW1wbChcbiAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICB1bndyYXBUaGVuYWJsZShuZXdDaGlsZCksXG4gICAgICAgICAgbGFuZXNcbiAgICAgICAgKTtcbiAgICAgIGlmIChuZXdDaGlsZC4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFKVxuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnNJbXBsKFxuICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgIHJlYWRDb250ZXh0RHVyaW5nUmVjb25jaWxpYXRpb24ocmV0dXJuRmliZXIsIG5ld0NoaWxkKSxcbiAgICAgICAgICBsYW5lc1xuICAgICAgICApO1xuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG5ld0NoaWxkICYmIFwiXCIgIT09IG5ld0NoaWxkKSB8fFxuICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIG5ld0NoaWxkIHx8XG4gICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgbmV3Q2hpbGRcbiAgICAgID8gKChuZXdDaGlsZCA9IFwiXCIgKyBuZXdDaGlsZCksXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnRGaXJzdENoaWxkICYmIDYgPT09IGN1cnJlbnRGaXJzdENoaWxkLnRhZ1xuICAgICAgICAgID8gKGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nKSxcbiAgICAgICAgICAgIChsYW5lcyA9IHVzZUZpYmVyKGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCkpLFxuICAgICAgICAgICAgKGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGxhbmVzKSlcbiAgICAgICAgICA6IChkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpLFxuICAgICAgICAgICAgKGxhbmVzID0gY3JlYXRlRmliZXJGcm9tVGV4dChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpKSxcbiAgICAgICAgICAgIChsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAocmV0dXJuRmliZXIgPSBsYW5lcykpLFxuICAgICAgICBwbGFjZVNpbmdsZUNoaWxkKHJldHVybkZpYmVyKSlcbiAgICAgIDogZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyID0gMDtcbiAgICAgIHZhciBmaXJzdENoaWxkRmliZXIgPSByZWNvbmNpbGVDaGlsZEZpYmVyc0ltcGwoXG4gICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgIGxhbmVzXG4gICAgICApO1xuICAgICAgdGhlbmFibGVTdGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gZmlyc3RDaGlsZEZpYmVyO1xuICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgIGlmICh4ID09PSBTdXNwZW5zZUV4Y2VwdGlvbiB8fCB4ID09PSBTdXNwZW5zZUFjdGlvbkV4Y2VwdGlvbikgdGhyb3cgeDtcbiAgICAgIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVySW1wbENsYXNzKDI5LCB4LCBudWxsLCByZXR1cm5GaWJlci5tb2RlKTtcbiAgICAgIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gICAgICBmaWJlci5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBmaWJlcjtcbiAgICB9IGZpbmFsbHkge1xuICAgIH1cbiAgfTtcbn1cbnZhciByZWNvbmNpbGVDaGlsZEZpYmVycyA9IGNyZWF0ZUNoaWxkUmVjb25jaWxlcighMCksXG4gIG1vdW50Q2hpbGRGaWJlcnMgPSBjcmVhdGVDaGlsZFJlY29uY2lsZXIoITEpLFxuICBzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKSxcbiAgc2hlbGxCb3VuZGFyeSA9IG51bGw7XG5mdW5jdGlvbiBwdXNoUHJpbWFyeVRyZWVTdXNwZW5zZUhhbmRsZXIoaGFuZGxlcikge1xuICB2YXIgY3VycmVudCA9IGhhbmRsZXIuYWx0ZXJuYXRlO1xuICBwdXNoKHN1c3BlbnNlU3RhY2tDdXJzb3IsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCAmIDEpO1xuICBwdXNoKHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLCBoYW5kbGVyKTtcbiAgbnVsbCA9PT0gc2hlbGxCb3VuZGFyeSAmJlxuICAgIChudWxsID09PSBjdXJyZW50IHx8IG51bGwgIT09IGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IuY3VycmVudFxuICAgICAgPyAoc2hlbGxCb3VuZGFyeSA9IGh
1hbmRsZXIpXG4gICAgICA6IG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAmJiAoc2hlbGxCb3VuZGFyeSA9IGhhbmRsZXIpKTtcbn1cbmZ1bmN0aW9uIHB1c2hPZmZzY3JlZW5TdXNwZW5zZUhhbmRsZXIoZmliZXIpIHtcbiAgaWYgKDIyID09PSBmaWJlci50YWcpIHtcbiAgICBpZiAoXG4gICAgICAocHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpLFxuICAgICAgcHVzaChzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvciwgZmliZXIpLFxuICAgICAgbnVsbCA9PT0gc2hlbGxCb3VuZGFyeSlcbiAgICApIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgKHNoZWxsQm91bmRhcnkgPSBmaWJlcik7XG4gICAgfVxuICB9IGVsc2UgcmV1c2VTdXNwZW5zZUhhbmRsZXJPblN0YWNrKGZpYmVyKTtcbn1cbmZ1bmN0aW9uIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjaygpIHtcbiAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICBwdXNoKHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLCBzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvci5jdXJyZW50KTtcbn1cbmZ1bmN0aW9uIHBvcFN1c3BlbnNlSGFuZGxlcihmaWJlcikge1xuICBwb3Aoc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IpO1xuICBzaGVsbEJvdW5kYXJ5ID09PSBmaWJlciAmJiAoc2hlbGxCb3VuZGFyeSA9IG51bGwpO1xuICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvcik7XG59XG52YXIgc3VzcGVuc2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcigwKTtcbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgZm9yICh2YXIgbm9kZSA9IHJvdzsgbnVsbCAhPT0gbm9kZTsgKSB7XG4gICAgaWYgKDEzID09PSBub2RlLnRhZykge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9PSBzdGF0ZSAmJlxuICAgICAgICAoKHN0YXRlID0gc3RhdGUuZGVoeWRyYXRlZCksXG4gICAgICAgIG51bGwgPT09IHN0YXRlIHx8XG4gICAgICAgICAgXCIkP1wiID09PSBzdGF0ZS5kYXRhIHx8XG4gICAgICAgICAgaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3RhdGUpKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9IGVsc2UgaWYgKDE5ID09PSBub2RlLnRhZyAmJiB2b2lkIDAgIT09IG5vZGUubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlcikge1xuICAgICAgaWYgKDAgIT09IChub2RlLmZsYWdzICYgMTI4KSkgcmV0dXJuIG5vZGU7XG4gICAgfSBlbHNlIGlmIChudWxsICE9PSBub2RlLmNoaWxkKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobm9kZSA9PT0gcm93KSBicmVhaztcbiAgICBmb3IgKDsgbnVsbCA9PT0gbm9kZS5zaWJsaW5nOyApIHtcbiAgICAgIGlmIChudWxsID09PSBub2RlLnJldHVybiB8fCBub2RlLnJldHVybiA9PT0gcm93KSByZXR1cm4gbnVsbDtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyhcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIGN0b3IsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyxcbiAgbmV4dFByb3BzXG4pIHtcbiAgY3RvciA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIGN0b3IpO1xuICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPVxuICAgIG51bGwgPT09IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyB8fCB2b2lkIDAgPT09IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1xuICAgICAgPyBjdG9yXG4gICAgICA6IGFzc2lnbih7fSwgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgMCA9PT0gd29ya0luUHJvZ3Jlc3MubGFuZXMgJiZcbiAgICAod29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUuYmFzZVN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKTtcbn1cbnZhciBjbGFzc0NvbXBvbmVudFVwZGF0ZXIgPSB7XG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgaW5zdCA9IGluc3QuX3JlYWN0SW50ZXJuYWxzO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoKSxcbiAgICAgIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShsYW5lKTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgdm9pZCAwICE9PSBjYWxsYmFjayAmJiBudWxsICE9PSBjYWxsYmFjayAmJiAodXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2spO1xuICAgIHBheWxvYWQgPSBlbnF1ZXVlVXBkYXRlKGluc3QsIHVwZGF0ZSwgbGFuZSk7XG4gICAgbnVsbCAhPT0gcGF5bG9hZCAmJlxuICAgICAgKHNjaGVkdWxlVXBkYXRlT25GaWJlcihwYXlsb2FkLCBpbnN0LCBsYW5lKSxcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocGF5bG9hZCwgaW5zdCwgbGFuZSkpO1xuICB9LFxuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICBpbnN0ID0gaW5zdC5fcmVhY3RJbnRlcm5hbHM7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZSgpLFxuICAgICAgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSAxO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB2b2lkIDAgIT09IGNhbGxiYWNrICYmIG51bGwgIT09IGNhbGxiYWNrICYmICh1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjayk7XG4gICAgcGF5bG9hZCA9IGVucXVldWVVcGRhdGUoaW5zdCwgdXBkYXRlLCBsYW5lKTtcbiAgICBudWxsICE9PSBwYXlsb2FkICYmXG4gICAgICAoc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHBheWxvYWQsIGluc3QsIGxhbmUpLFxuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhwYXlsb2FkLCBpbnN0LCBsYW5lKSk7XG4gIH0sXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKGluc3QsIGNhbGxiYWNrKSB7XG4gICAgaW5zdCA9IGluc3QuX3JlYWN0SW50ZXJuYWxzO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoKSxcbiAgICAgIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gMjtcbiAgICB2b2lkIDAgIT09IGNhbGxiYWNrICYmIG51bGwgIT09IGNhbGxiYWNrICYmICh1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjayk7XG4gICAgY2FsbGJhY2sgPSBlbnF1ZXVlVXBkYXRlKGluc3QsIHVwZGF0ZSwgbGFuZSk7XG4gICAgbnVsbCAhPT0gY2FsbGJhY2sgJiZcbiAgICAgIChzY2hlZHVsZVVwZGF0ZU9uRmliZXIoY2FsbGJhY2ssIGluc3QsIGxhbmUpLFxuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhjYWxsYmFjaywgaW5zdCwgbGFuZSkpO1xuICB9XG59O1xuZnVuY3Rpb24gY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUoXG4gIHdvcmtJblByb2dyZXNzLFxuICBjdG9yLFxuICBvbGRQcm9wcyxcbiAgbmV3UHJvcHMsXG4gIG9sZFN0YXRlLFxuICBuZXdTdGF0ZSxcbiAgbmV4dENvbnRleHRcbikge1xuICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHdvcmtJblByb2dyZXNzLnNob3VsZENvbXBvbmVudFVwZGF0ZVxuICAgID8gd29ya0luUHJvZ3Jlc3Muc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpXG4gICAgOiBjdG9yLnByb3RvdHlwZSAmJiBjdG9yLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudFxuICAgICAgPyAhc2hhbGxvd0VxdWFsKG9sZFByb3BzLCBuZXdQcm9wcykgfHwgIXNoYWxsb3dFcXVhbChvbGRTdGF0ZSwgbmV3U3RhdGUpXG4gICAgICA6ICEwO1xufVxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJv
1cHMoXG4gIHdvcmtJblByb2dyZXNzLFxuICBpbnN0YW5jZSxcbiAgbmV3UHJvcHMsXG4gIG5leHRDb250ZXh0XG4pIHtcbiAgd29ya0luUHJvZ3Jlc3MgPSBpbnN0YW5jZS5zdGF0ZTtcbiAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgJiZcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICBpbnN0YW5jZS5zdGF0ZSAhPT0gd29ya0luUHJvZ3Jlc3MgJiZcbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzQ29tcG9uZW50UHJvcHMoQ29tcG9uZW50LCBiYXNlUHJvcHMpIHtcbiAgdmFyIG5ld1Byb3BzID0gYmFzZVByb3BzO1xuICBpZiAoXCJyZWZcIiBpbiBiYXNlUHJvcHMpIHtcbiAgICBuZXdQcm9wcyA9IHt9O1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIGJhc2VQcm9wcylcbiAgICAgIFwicmVmXCIgIT09IHByb3BOYW1lICYmIChuZXdQcm9wc1twcm9wTmFtZV0gPSBiYXNlUHJvcHNbcHJvcE5hbWVdKTtcbiAgfVxuICBpZiAoKENvbXBvbmVudCA9IENvbXBvbmVudC5kZWZhdWx0UHJvcHMpKSB7XG4gICAgbmV3UHJvcHMgPT09IGJhc2VQcm9wcyAmJiAobmV3UHJv
1cHMgPSBhc3NpZ24oe30sIG5ld1Byb3BzKSk7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUkNzMgaW4gQ29tcG9uZW50KVxuICAgICAgdm9pZCAwID09PSBuZXdQcm9wc1twcm9wTmFtZSQ3M10gJiZcbiAgICAgICAgKG5ld1Byb3BzW3Byb3BOYW1lJDczXSA9IENvbXBvbmVudFtwcm9wTmFtZSQ3M10pO1xuICB9XG4gIHJldHVybiBuZXdQcm9wcztcbn1cbnZhciByZXBvcnRHbG9iYWxFcnJvciA9XG4gIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlcG9ydEVycm9yXG4gICAgPyByZXBvcnRFcnJvclxuICAgIDogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2Ygd2luZG93ICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygd2luZG93LkVycm9yRXZlbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIGV2ZW50ID0gbmV3IHdpbmRvdy5FcnJvckV2ZW50KFwiZXJyb3JcIiwge1xuICAgICAgICAgICAgYnViYmxlczogITAsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiAhMCxcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBlcnJvciAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBlcnJvciAmJlxuICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgID8gU3RyaW5nKGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCkpIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgcHJvY2VzcyAmJlxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHByb2Nlc3MuZW1pdFxuICAgICAgICApIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoXCJ1bmNhdWdodEV4Y2VwdGlvblwiLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfTtcbmZ1bmN0aW9uIGRlZmF1bHRPblVuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgcmVwb3J0R2xvYmFsRXJyb3IoZXJyb3IpO1xufVxuZnVuY3Rpb24gZGVmYXVsdE9uQ2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgY29uc29sZS5lcnJvcihlcnJvcik7XG59XG5mdW5jdGlvbiBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yKGVycm9yKSB7XG4gIHJlcG9ydEdsb2JhbEVycm9yKGVycm9yKTtcbn1cbmZ1bmN0aW9uIGxvZ1VuY2F1Z2h0RXJyb3Iocm9vdCwgZXJyb3JJbmZvKSB7XG4gIHRyeSB7XG4gICAgdmFyIG9uVW5jYXVnaHRFcnJvciA9IHJvb3Qub25VbmNhdWdodEVycm9yO1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvckluZm8udmFsdWUsIHsgY29tcG9uZW50U3RhY2s6IGVycm9ySW5mby5zdGFjayB9KTtcbiAgfSBjYXRjaCAoZSQ3NCkge1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZSQ3NDtcbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gbG9nQ2F1Z2h0RXJyb3Iocm9vdCwgYm91bmRhcnksIGVycm9ySW5mbykge1xuICB0cnkge1xuICAgIHZhciBvbkNhdWdodEVycm9yID0gcm9vdC5vbkNhdWdodEVycm9yO1xuICAgIG9uQ2F1Z2h0RXJyb3IoZXJyb3JJbmZvLnZhbHVlLCB7XG4gICAgICBjb21wb25lbnRTdGFjazogZXJyb3JJbmZvLnN0YWNrLFxuICAgICAgZXJyb3JCb3VuZGFyeTogMSA9PT0gYm91bmRhcnkudGFnID8gYm91bmRhcnkuc3RhdGVOb2RlIDogbnVsbFxuICAgIH0pO1xuICB9IGNhdGNoIChlJDc1KSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlJDc1O1xuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdCwgZXJyb3JJbmZvLCBsYW5lKSB7XG4gIGxhbmUgPSBjcmVhdGVVcGRhdGUobGFuZSk7XG4gIGxhbmUudGFnID0gMztcbiAgbGFuZS5wYXlsb2FkID0geyBlbGVtZW50OiBudWxsIH07XG4gIGxhbmUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgbG9nVW5jYXVnaHRFcnJvcihyb290LCBlcnJvckluZm8pO1xuICB9O1xuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUobGFuZSkge1xuICBsYW5lID0gY3JlYXRlVXBkYXRlKGxhbmUpO1xuICBsYW5lLnRhZyA9IDM7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gaW5pdGlhbGl6ZUNsYXNzRXJyb3JVcGRhdGUodXBkYXRlLCByb290LCBmaWJlciwgZXJyb3JJbmZvKSB7XG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPSBmaWJlci50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtcbiAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcikge1xuICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IpO1xuICAgIH07XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgbG9nQ2F1Z2h0RXJyb3Iocm9vdCwgZmliZXIsIGVycm9ySW5mbyk7XG4gICAgfTtcbiAgfVxuICB2YXIgaW5zdCA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgbnVsbCAhPT0gaW5zdCAmJlxuICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluc3QuY29tcG9uZW50RGlkQ2F0Y2ggJiZcbiAgICAodXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgbG9nQ2F1Z2h0RXJyb3Iocm9vdCwgZmliZXIsIGVycm9ySW5mbyk7XG4gICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgJiZcbiAgICAgICAgKG51bGwgPT09IGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkXG4gICAgICAgICAgPyAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFt0aGlzXSkpXG4gICAgICAgICAgOiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5hZGQodGhpcykpO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdGhpcy5jb21wb25lbnREaWRDYXRjaChlcnJvckluZm8udmFsdWUsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IG51bGwgIT09IHN0YWNrID8gc3RhY2sgOiBcIlwiXG4gICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKFxuICByb290LFxuICByZXR1cm5GaWJlcixcbiAgc291cmNlRmliZXIsXG4gIHZhbHVlLFxuICByb290UmVuZGVyTGFuZXNcbikge1xuICBzb3VyY2VGaWJlci5mbGFncyB8PSAzMjc2ODtcbiAgaWYgKFxuICAgIG51bGwgIT09IHZhbHVlICYmXG4gICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHZhbHVlICYmXG4gICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUudGhlblxuICApIHtcbiAgICByZXR1cm5GaWJlciA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcbiAgICBudWxsICE9PSByZXR1cm5GaWJlciAmJlxuICAgICAgcHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoXG4gICAgICAgI
1HJldHVybkZpYmVyLFxuICAgICAgICBzb3VyY2VGaWJlcixcbiAgICAgICAgcm9vdFJlbmRlckxhbmVzLFxuICAgICAgICAhMFxuICAgICAgKTtcbiAgICBzb3VyY2VGaWJlciA9IHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgaWYgKG51bGwgIT09IHNvdXJjZUZpYmVyKSB7XG4gICAgICBzd2l0Y2ggKHNvdXJjZUZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBudWxsID09PSBzaGVsbEJvdW5kYXJ5XG4gICAgICAgICAgICAgID8gcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpXG4gICAgICAgICAgICAgIDogbnVsbCA9PT0gc291cmNlRmliZXIuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgICAgICAgMCA9PT0gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAmJlxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gMyksXG4gICAgICAgICAgICAoc291cmNlRmliZXIuZmxhZ3MgJj0gLTI1NyksXG4gICAgICAgICAgICAoc291cmNlRmliZXIuZmxhZ3MgfD0gNjU1MzYpLFxuICAgICAgICAgICAgKHNvdXJjZUZpYmVyLmxhbmVzID0gcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgIHZhbHVlID09PSBub29wU3VzcGVuc2V5Q29tbWl0VGhlbmFibGVcbiAgICAgICAgICAgICAgPyAoc291cmNlRmliZXIuZmxhZ3MgfD0gMTYzODQpXG4gICAgICAgICAgICAgIDogKChyZXR1cm5GaWJlciA9IHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlKSxcbiAgICAgICAgICAgICAgICBudWxsID09PSByZXR1cm5GaWJlclxuICAgICAgICAgICAgICAgICAgPyAoc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBuZXcgU2V0KFt2YWx1ZV0pKVxuICAgICAgICAgICAgICAgICAgOiByZXR1cm5GaWJlci5hZGQodmFsdWUpLFxuICAgICAgICAgICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB2YWx1ZSwgcm9vdFJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICAhMVxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChzb3VyY2VGaWJlci5mbGFncyB8PSA2NTUzNiksXG4gICAgICAgICAgICB2YWx1ZSA9PT0gbm9vcFN1c3BlbnNleUNvbW1pdFRoZW5hYmxlXG4gICAgICAgICAgICAgID8gKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDE2Mzg0KVxuICAgICAgICAgICAgICA6ICgocmV0dXJuRmliZXIgPSBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSksXG4gICAgICAgICAgICAgICAgbnVsbCA9PT0gcmV0dXJuRmliZXJcbiAgICAgICAgICAgICAgICAgID8gKChyZXR1cm5GaWJlciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0cnlRdWV1ZTogbmV3IFNldChbdmFsdWVdKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gcmV0dXJuRmliZXIpKVxuICAgICAgICAgICAgICAgICAgOiAoKHNvdXJjZUZpYmVyID0gcmV0dXJuRmliZXIucmV0cnlRdWV1ZSksXG4gICAgICAgICAgICAgICAgICAgIG51bGwgPT09IHNvdXJjZUZpYmVyXG4gICAgICAgICAgICAgICAgICAgICAgPyAocmV0dXJuRmliZXIucmV0cnlRdWV1ZSA9IG5ldyBTZXQoW3ZhbHVlXSkpXG4gICAgICAgICAgICAgICAgICAgICAgOiBzb3VyY2VGaWJlci5hZGQodmFsdWUpKSxcbiAgICAgICAgICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcykpLFxuICAgICAgICAgICAgITFcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0MzUsIHNvdXJjZUZpYmVyLnRhZykpO1xuICAgIH1cbiAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgIHJldHVybiAhMTtcbiAgfVxuICBpZiAoaXNIeWRyYXRpbmcpXG4gICAgcmV0dXJuIChcbiAgICAgIChyZXR1cm5GaWJlciA9IHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLmN1cnJlbnQpLFxuICAgICAgbnVsbCAhPT0gcmV0dXJuRmliZXJcbiAgICAgICAgPyAoMCA9PT0gKHJldHVybkZpYmVyLmZsYWdzICYgNjU1MzYpICYmIChyZXR1cm5GaWJlci5mbGFncyB8PSAyNTYpLFxuICAgICAgICAgIChyZXR1cm5GaWJlci5mbGFncyB8PSA2NTUzNiksXG4gICAgICAgICAgKHJldHVybkZpYmVyLmxhbmVzID0gcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICB2YWx1ZSAhPT0gSHlkcmF0aW9uTWlzbWF0Y2hFeGNlcHRpb24gJiZcbiAgICAgICAgICAgICgocm9vdCA9IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNDIyKSwgeyBjYXVzZTogdmFsdWUgfSkpLFxuICAgICAgICAgICAgcXVldWVIeWRyYXRpb25FcnJvcihjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihyb290LCBzb3VyY2VGaWJlcikpKSlcbiAgICAgICAgOiAodmFsdWUgIT09IEh5ZHJhdGlvbk1pc21hdGNoRXhjZXB0aW9uICYmXG4gICAgICAgICAgICAoKHJldHVybkZpYmVyID0gRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0MjMpLCB7XG4gICAgICAgICAgICAgIGNhdXNlOiB2YWx1ZVxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgcXVldWVIeWRyYXRpb25FcnJvcihcbiAgICAgICAgICAgICAgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIocmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyKVxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgKHJvb3QgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlKSxcbiAgICAgICAgICAocm9vdC5mbGFncyB8PSA2NTUzNiksXG4gICAgICAgICAgKHJvb3RSZW5kZXJMYW5lcyAmPSAtcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAocm9vdC5sYW5lcyB8PSByb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICh2YWx1ZSA9IGNyZWF0ZUNhcH
1R1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcikpLFxuICAgICAgICAgIChyb290UmVuZGVyTGFuZXMgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUoXG4gICAgICAgICAgICByb290LnN0YXRlTm9kZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgcm9vdFJlbmRlckxhbmVzXG4gICAgICAgICAgKSksXG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHJvb3QsIHJvb3RSZW5kZXJMYW5lcyksXG4gICAgICAgICAgNCAhPT0gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAmJlxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSAyKSksXG4gICAgICAhMVxuICAgICk7XG4gIHZhciB3cmFwcGVyRXJyb3IgPSBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUyMCksIHsgY2F1c2U6IHZhbHVlIH0pO1xuICB3cmFwcGVyRXJyb3IgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih3cmFwcGVyRXJyb3IsIHNvdXJjZUZpYmVyKTtcbiAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9yc1xuICAgID8gKHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBbd3JhcHBlckVycm9yXSlcbiAgICA6IHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMucHVzaCh3cmFwcGVyRXJyb3IpO1xuICA0ICE9PSB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzICYmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gMik7XG4gIGlmIChudWxsID09PSByZXR1cm5GaWJlcikgcmV0dXJuICEwO1xuICB2YWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gIHNvdXJjZUZpYmVyID0gcmV0dXJuRmliZXI7XG4gIGRvIHtcbiAgICBzd2l0Y2ggKHNvdXJjZUZpYmVyLnRhZykge1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChzb3VyY2VGaWJlci5mbGFncyB8PSA2NTUzNiksXG4gICAgICAgICAgKHJvb3QgPSByb290UmVuZGVyTGFuZXMgJiAtcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAoc291cmNlRmliZXIubGFuZXMgfD0gcm9vdCksXG4gICAgICAgICAgKHJvb3QgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUoc291cmNlRmliZXIuc3RhdGVOb2RlLCB2YWx1ZSwgcm9vdCkpLFxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZShzb3VyY2VGaWJlciwgcm9vdCksXG4gICAgICAgICAgITFcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgICgocmV0dXJuRmliZXIgPSBzb3VyY2VGaWJlci50eXBlKSxcbiAgICAgICAgICAod3JhcHBlckVycm9yID0gc291cmNlRmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgICAwID09PSAoc291cmNlRmliZXIuZmxhZ3MgJiAxMjgpICYmXG4gICAgICAgICAgICAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmV0dXJuRmliZXIuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIHx8XG4gICAgICAgICAgICAgIChudWxsICE9PSB3cmFwcGVyRXJyb3IgJiZcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB3cmFwcGVyRXJyb3IuY29tcG9uZW50RGlkQ2F0Y2ggJiZcbiAgICAgICAgICAgICAgICAobnVsbCA9PT0gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgfHxcbiAgICAgICAgICAgICAgICAgICFsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMod3JhcHBlckVycm9yKSkpKSlcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc291cmNlRmliZXIuZmxhZ3MgfD0gNjU1MzYpLFxuICAgICAgICAgICAgKHJvb3RSZW5kZXJMYW5lcyAmPSAtcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgIChzb3VyY2VGaWJlci5sYW5lcyB8PSByb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgKHJvb3RSZW5kZXJMYW5lcyA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUocm9vdFJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICBpbml0aWFsaXplQ2xhc3NFcnJvclVwZGF0ZShcbiAgICAgICAgICAgICAgcm9vdFJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICBzb3VyY2VGaWJlcixcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUoc291cmNlRmliZXIsIHJvb3RSZW5kZXJMYW5lcyksXG4gICAgICAgICAgICAhMVxuICAgICAgICAgICk7XG4gICAgfVxuICAgIHNvdXJjZUZpYmVyID0gc291cmNlRmliZXIucmV0dXJuO1xuICB9IHdoaWxlIChudWxsICE9PSBzb3VyY2VGaWJlcik7XG4gIHJldHVybiAhMTtcbn1cbnZhciBTZWxlY3RpdmVIeWRyYXRpb25FeGNlcHRpb24gPSBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQ2MSkpLFxuICBkaWRSZWNlaXZlVXBkYXRlID0gITE7XG5mdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9XG4gICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgPyBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKVxuICAgICAgOiByZWNvbmNpbGVDaGlsZEZpYmVycyhcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICBjdXJyZW50LmNoaWxkLFxuICAgICAgICAgIG5leHRDaGlsZHJlbixcbiAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICApO1xufVxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihcbiAgY3VycmVudCxcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIENvbXBvbmVudCxcbiAgbmV4dFByb3BzLFxuICByZW5kZXJMYW5lc1xuKSB7XG4gIENvbXBvbmVudCA9IENvbXBvbmVudC5yZW5kZXI7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gIGlmIChcInJlZlwiIGluIG5leHRQcm9wcykge1xuICAgIHZhciBwcm9wc1dpdGhvdXRSZWYgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbmV4dFByb3BzKVxuICAgICAgXCJyZWZcIiAhPT0ga2V5ICYmIChwcm9wc1dpdGhvdXRSZWZba2V5XSA9IG5leHRQcm9wc1trZXldKTtcbiAgfSBlbHNlIHByb3BzV2l0aG91dFJlZiA9IG5leHRQcm9wcztcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICBuZXh0UHJvcHMgP
1SByZW5kZXJXaXRoSG9va3MoXG4gICAgY3VycmVudCxcbiAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICBDb21wb25lbnQsXG4gICAgcHJvcHNXaXRob3V0UmVmLFxuICAgIHJlZixcbiAgICByZW5kZXJMYW5lc1xuICApO1xuICBrZXkgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSlcbiAgICByZXR1cm4gKFxuICAgICAgYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyksXG4gICAgICBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcylcbiAgICApO1xuICBpc0h5ZHJhdGluZyAmJiBrZXkgJiYgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDE7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuZnVuY3Rpb24gdXBkYXRlTWVtb0NvbXBvbmVudChcbiAgY3VycmVudCxcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIENvbXBvbmVudCxcbiAgbmV4dFByb3BzLFxuICByZW5kZXJMYW5lc1xuKSB7XG4gIGlmIChudWxsID09PSBjdXJyZW50KSB7XG4gICAgdmFyIHR5cGUgPSBDb21wb25lbnQudHlwZTtcbiAgICBpZiAoXG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlICYmXG4gICAgICAhc2hvdWxkQ29uc3RydWN0KHR5cGUpICYmXG4gICAgICB2b2lkIDAgPT09IHR5cGUuZGVmYXVsdFByb3BzICYmXG4gICAgICBudWxsID09PSBDb21wb25lbnQuY29tcGFyZVxuICAgIClcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy50YWcgPSAxNSksXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy50eXBlID0gdHlwZSksXG4gICAgICAgIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICApXG4gICAgICApO1xuICAgIGN1cnJlbnQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoXG4gICAgICBDb21wb25lbnQudHlwZSxcbiAgICAgIG51bGwsXG4gICAgICBuZXh0UHJvcHMsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHdvcmtJblByb2dyZXNzLm1vZGUsXG4gICAgICByZW5kZXJMYW5lc1xuICAgICk7XG4gICAgY3VycmVudC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgY3VycmVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICByZXR1cm4gKHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudCk7XG4gIH1cbiAgdHlwZSA9IGN1cnJlbnQuY2hpbGQ7XG4gIGlmICghY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgdmFyIHByZXZQcm9wcyA9IHR5cGUubWVtb2l6ZWRQcm9wcztcbiAgICBDb21wb25lbnQgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBDb21wb25lbnQgPSBudWxsICE9PSBDb21wb25lbnQgPyBDb21wb25lbnQgOiBzaGFsbG93RXF1YWw7XG4gICAgaWYgKENvbXBvbmVudChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZilcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTtcbiAgY3VycmVudCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHR5cGUsIG5leHRQcm9wcyk7XG4gIGN1cnJlbnQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICBjdXJyZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICByZXR1cm4gKHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudCk7XG59XG5mdW5jdGlvbiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KFxuICBjdXJyZW50LFxuICB3b3JrSW5Qcm9ncmVzcyxcbiAgQ29tcG9uZW50LFxuICBuZXh0UHJvcHMsXG4gIHJlbmRlckxhbmVzXG4pIHtcbiAgaWYgKG51bGwgIT09IGN1cnJlbnQpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIGlmIChcbiAgICAgIHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiZcbiAgICAgIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWZcbiAgICApXG4gICAgICBpZiAoXG4gICAgICAgICgoZGlkUmVjZWl2ZVVwZGF0ZSA9ICExKSxcbiAgICAgICAgKHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IG5leHRQcm9wcyA9IHByZXZQcm9wcyksXG4gICAgICAgIGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSlcbiAgICAgIClcbiAgICAgICAgMCAhPT0gKGN1cnJlbnQuZmxhZ3MgJiAxMzEwNzIpICYmIChkaWRSZWNlaXZlVXBkYXRlID0gITApO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXMpLFxuICAgICAgICAgIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKVxuICAgICAgICApO1xuICB9XG4gIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChcbiAgICBjdXJyZW50LFxuICAgIHdvcmtJblByb2dyZXNzLFxuICAgIENvbXBvbmVudCxcbiAgICBuZXh0UHJvcHMsXG4gICAgcmVuZGVyTGFuZXNcbiAgKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW4sXG4gICAgcHJldlN0YXRlID0gbnVsbCAhPT0gY3VycmVudCA/IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSA6IG51bGw7XG4gIGlmIChcImhpZGRlblwiID09PSBuZXh0UHJvcHMubW9kZSkge1xuICAgIGlmICgwICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpKSB7XG4gICAgICBuZXh0UHJvcHMgPVxuICAgICAgICBudWxsICE9PSBwcmV2U3RhdGUgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIHwgcmVuZGVyTGFuZXMgOiByZW5kZXJMYW5lcztcbiAgICAgIGlmIChudWxsICE9PSBjdXJyZW50KSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICAgICAgZm9yIChwcmV2U3RhdGUgPSAwOyBudWxsICE9PSBuZXh0Q2hpbGRyZW47IClcbiAgICAgICAgICAocHJldlN0YXRlID1cbiAgICAgICAgICAgI
1HByZXZTdGF0ZSB8IG5leHRDaGlsZHJlbi5sYW5lcyB8IG5leHRDaGlsZHJlbi5jaGlsZExhbmVzKSxcbiAgICAgICAgICAgIChuZXh0Q2hpbGRyZW4gPSBuZXh0Q2hpbGRyZW4uc2libGluZyk7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBwcmV2U3RhdGUgJiB+bmV4dFByb3BzO1xuICAgICAgfSBlbHNlICh3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gMCksICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGwpO1xuICAgICAgcmV0dXJuIGRlZmVySGlkZGVuT2Zmc2NyZWVuQ29tcG9uZW50KFxuICAgICAgICBjdXJyZW50LFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKDAgIT09IChyZW5kZXJMYW5lcyAmIDUzNjg3MDkxMikpXG4gICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHsgYmFzZUxhbmVzOiAwLCBjYWNoZVBvb2w6IG51bGwgfSksXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICBwdXNoVHJhbnNpdGlvbihcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgbnVsbCAhPT0gcHJldlN0YXRlID8gcHJldlN0YXRlLmNhY2hlUG9vbCA6IG51bGxcbiAgICAgICAgICApLFxuICAgICAgICBudWxsICE9PSBwcmV2U3RhdGVcbiAgICAgICAgICA/IHB1c2hIaWRkZW5Db250ZXh0KHdvcmtJblByb2dyZXNzLCBwcmV2U3RhdGUpXG4gICAgICAgICAgOiByZXVzZUhpZGRlbkNvbnRleHRPblN0YWNrKCksXG4gICAgICAgIHB1c2hPZmZzY3JlZW5TdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSA1MzY4NzA5MTIpLFxuICAgICAgICBkZWZlckhpZGRlbk9mZnNjcmVlbkNvbXBvbmVudChcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIG51bGwgIT09IHByZXZTdGF0ZSA/IHByZXZTdGF0ZS5iYXNlTGFuZXMgfCByZW5kZXJMYW5lcyA6IHJlbmRlckxhbmVzLFxuICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgIClcbiAgICAgICk7XG4gIH0gZWxzZVxuICAgIG51bGwgIT09IHByZXZTdGF0ZVxuICAgICAgPyAocHVzaFRyYW5zaXRpb24od29ya0luUHJvZ3Jlc3MsIHByZXZTdGF0ZS5jYWNoZVBvb2wpLFxuICAgICAgICBwdXNoSGlkZGVuQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcHJldlN0YXRlKSxcbiAgICAgICAgcmV1c2VTdXNwZW5zZUhhbmRsZXJPblN0YWNrKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsKSlcbiAgICAgIDogKG51bGwgIT09IGN1cnJlbnQgJiYgcHVzaFRyYW5zaXRpb24od29ya0luUHJvZ3Jlc3MsIG51bGwpLFxuICAgICAgICByZXVzZUhpZGRlbkNvbnRleHRPblN0YWNrKCksXG4gICAgICAgIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcykpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cbmZ1bmN0aW9uIGRlZmVySGlkZGVuT2Zmc2NyZWVuQ29tcG9uZW50KFxuICBjdXJyZW50LFxuICB3b3JrSW5Qcm9ncmVzcyxcbiAgbmV4dEJhc2VMYW5lcyxcbiAgcmVuZGVyTGFuZXNcbikge1xuICB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gcGVla0NhY2hlRnJvbVBvb2woKTtcbiAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID1cbiAgICBudWxsID09PSBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHRcbiAgICAgID8gbnVsbFxuICAgICAgOiB7IHBhcmVudDogQ2FjaGVDb250ZXh0Ll9jdXJyZW50VmFsdWUsIHBvb2w6IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCB9O1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0ge1xuICAgIGJhc2VMYW5lczogbmV4dEJhc2VMYW5lcyxcbiAgICBjYWNoZVBvb2w6IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdFxuICB9O1xuICBudWxsICE9PSBjdXJyZW50ICYmIHB1c2hUcmFuc2l0aW9uKHdvcmtJblByb2dyZXNzLCBudWxsKTtcbiAgcmV1c2VIaWRkZW5Db250ZXh0T25TdGFjaygpO1xuICBwdXNoT2Zmc2NyZWVuU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgI
1HByb3BhZ2F0ZVBhcmVudENvbnRleHRDaGFuZ2VzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgITApO1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgaWYgKG51bGwgPT09IHJlZilcbiAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICBudWxsICE9PSBjdXJyZW50LnJlZiAmJlxuICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQxOTQ4MTYpO1xuICBlbHNlIHtcbiAgICBpZiAoXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgcmVmICYmIFwib2JqZWN0XCIgIT09IHR5cGVvZiByZWYpXG4gICAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI4NCkpO1xuICAgIGlmIChudWxsID09PSBjdXJyZW50IHx8IGN1cnJlbnQucmVmICE9PSByZWYpXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0MTk0ODE2O1xuICB9XG59XG5mdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChcbiAgY3VycmVudCxcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIENvbXBvbmVudCxcbiAgbmV4dFByb3BzLFxuICByZW5kZXJMYW5lc1xuKSB7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgQ29tcG9uZW50ID0gcmVuZGVyV2l0aEhvb2tzKFxuICAgIGN1cnJlbnQsXG4gICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgQ29tcG9uZW50LFxuICAgIG5leHRQcm9wcyxcbiAgICB2b2lkIDAsXG4gICAgcmVuZGVyTGFuZXNcbiAgKTtcbiAgbmV4dFByb3BzID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgaWYgKG51bGwgIT09IGN1cnJlbnQgJiYgIWRpZFJlY2VpdmVVcGRhdGUpXG4gICAgcmV0dXJuIChcbiAgICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpLFxuICAgICAgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpXG4gICAgKTtcbiAgaXNIeWRyYXRpbmcgJiYgbmV4dFByb3BzICYmIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cbmZ1bmN0aW9uIHJlcGxheUZ1bmN0aW9uQ29tcG9uZW50KFxuICBjdXJyZW50LFxuICB3b3JrSW5Qcm9ncmVzcyxcbiAgbmV4dFByb3BzLFxuICBDb21wb25lbnQsXG4gIHNlY29uZEFyZyxcbiAgcmVuZGVyTGFuZXNcbikge1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgbmV4dFByb3BzID0gcmVuZGVyV2l0aEhvb2tzQWdhaW4oXG4gICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgQ29tcG9uZW50LFxuICAgIG5leHRQcm9wcyxcbiAgICBzZWNvbmRBcmdcbiAgKTtcbiAgZmluaXNoUmVuZGVyaW5nSG9va3MoY3VycmVudCk7XG4gIENvbXBvbmVudCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gIGlmIChudWxsICE9PSBjdXJyZW50ICYmICFkaWRSZWNlaXZlVXBkYXRlKVxuICAgIHJldHVybiAoXG4gICAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSxcbiAgICAgIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKVxuICAgICk7XG4gIGlzSHlkcmF0aW5nICYmIENvbXBvbmVudCAmJiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5mdW5jdGlvbiB1cGRhdGVDbGFzc0NvbXBvbmVudChcbiAgY3VycmVudCxcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIENvbXBvbmVudCxcbiAgbmV4dFByb3BzLFxuICByZW5kZXJMYW5lc1xuKSB7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgaWYgKG51bGwgPT09IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSkge1xuICAgIHZhciBjb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0LFxuICAgICAgY29udGV4dFR5cGUgPSBDb21wb25lbnQuY29udGV4dFR5cGU7XG4gICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGNvbnRleHRUeXBlICYmXG4gICAgICBudWxsICE9PSBjb250ZXh0VHlwZSAmJlxuICAgICAgKGNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSkpO1xuICAgIGNvbnRleHQgPSBuZXcgQ29tcG9uZW50KG5leHRQcm9wcywgY29udGV4dCk7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9XG4gICAgICBudWxsICE9PSBjb250ZXh0LnN0YXRlICYmIHZvaWQgMCAhPT0gY29udGV4dC5zdGF0ZSA/IGNvbnRleHQuc3RhdGUgOiBudWxsO1xuICAgIGNvbnRleHQudXBkYXRlciA9IGNsYXNzQ29tcG9uZW50VXBkYXRlcjtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjb250ZXh0O1xuICAgIGNvbnRleHQuX3JlYWN0SW50ZXJuYWxzID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBjb250ZXh0LnByb3BzID0gbmV4dFByb3BzO1xuICAgIGNvbnRleHQuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgIGNvbnRleHQucmVmcyA9IHt9O1xuICAgIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgY29udGV4dFR5cGUgPSBDb21wb25lbnQuY29udGV4dFR5cGU7XG4gICAgY29udGV4dC5jb250ZXh0ID1cbiAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBjb250ZXh0VHlwZSAmJiBudWxsICE9PSBjb250ZXh0VHlwZVxuICAgICAgICA/IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKVxuICAgICAgICA6IGVt
1cHR5Q29udGV4dE9iamVjdDtcbiAgICBjb250ZXh0LnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICBjb250ZXh0VHlwZSA9IENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dFR5cGUgJiZcbiAgICAgIChhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyhcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgY29udGV4dFR5cGUsXG4gICAgICAgIG5leHRQcm9wc1xuICAgICAgKSxcbiAgICAgIChjb250ZXh0LnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSkpO1xuICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgfHxcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGNvbnRleHQuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgfHxcbiAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjb250ZXh0LlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgY29udGV4dC5jb21wb25lbnRXaWxsTW91bnQpIHx8XG4gICAgICAoKGNvbnRleHRUeXBlID0gY29udGV4dC5zdGF0ZSksXG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjb250ZXh0LmNvbXBvbmVudFdpbGxNb3VudCAmJlxuICAgICAgICBjb250ZXh0LmNvbXBvbmVudFdpbGxNb3VudCgpLFxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ICYmXG4gICAgICAgIGNvbnRleHQuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpLFxuICAgICAgY29udGV4dFR5cGUgIT09IGNvbnRleHQuc3RhdGUgJiZcbiAgICAgICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoY29udGV4dCwgY29udGV4dC5zdGF0ZSwgbnVsbCksXG4gICAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpLFxuICAgICAgc3VzcGVuZElmVXBkYXRlUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbigpLFxuICAgICAgKGNvbnRleHQuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlKSk7XG4gICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dC5jb21wb25lbnREaWRNb3VudCAmJlxuICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQxOTQzMDgpO1xuICAgIG5leHRQcm9wcyA9ICEwO1xuICB9IGVsc2UgaWYgKG51bGwgPT09IGN1cnJlbnQpIHtcbiAgICBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLFxuICAgICAgb2xkUHJvcHMgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gICAgY29udGV4dC5wcm9wcyA9IG9sZFByb3BzO1xuICAgIHZhciBvbGRDb250ZXh0ID0gY29udGV4dC5jb250ZXh0LFxuICAgICAgY29udGV4dFR5cGUkanNjb21wJDAgPSBDb21wb25lbnQuY29udGV4dFR5cGU7XG4gICAgY29udGV4dFR5cGUgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGNvbnRleHRUeXBlJGpzY29tcCQwICYmXG4gICAgICBudWxsICE9PSBjb250ZXh0VHlwZSRqc2NvbXAkMCAmJlxuICAgICAgKGNvbnRleHRUeXBlID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUkanNjb21wJDApKTtcbiAgICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgICBjb250ZXh0VHlwZSRqc2NvbXAkMCA9XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgfHxcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGNvbnRleHQuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU7XG4gICAgdW5yZXNvbHZlZE9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzICE9PSB1bnJlc29sdmVkT2xkUHJvcHM7XG4gICAgY29udGV4dFR5cGUkanNjb21wJDAgfHxcbiAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjb250ZXh0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzICYmXG4gICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIGNvbnRleHQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcykgfHxcbiAgICAgICgodW5yZXNvbHZlZE9sZFByb3BzIHx8IG9sZENvbnRleHQgIT09IGNvbnRleHRUeXBlKSAmJlxuICAgICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICBjb250ZXh0VHlwZVxuICAgICAgICApKTtcbiAgICBoYXNGb3JjZVVwZGF0ZSA9ICExO1xuICAgIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgY29udGV4dC5zdGF0ZSA9IG9sZFN0YXRlO1xuICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgc3VzcGVuZElmVXBkYXRlUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbigpO1xuICAgIG9sZENvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgIHVucmVzb2x2ZWRPbGRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gb2xkQ29udGV4dCB8fCBoYXNGb3JjZVVwZGF0ZVxuICAgICAgPyAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICYmXG4gICAgICAgICAgKGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsXG4gICAgICAgICAgICBuZXh0UHJvcHNcbiAgICAgICAgICApLFxuICAgICAgICAgIChvbGRDb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSkpLFxuICAgICAgICAob2xkUHJvcHMgPVxuICAgICAgICAgIGhhc0ZvcmNlVXBkYXRlIHx8XG4gICAgICAgICAgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgICAgIG9sZFByb3BzLFxuICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgb2xkU3RhdGUsXG4gICAgICAgICAgICBvbGRDb250ZXh0LFxuICAgICAgICAgICAgY29udGV4dFR5cGVcbiAgICAgICAgICApKVxuICAgICAgICAgID8gKGNvbnRleHRUeXBlJGpzY29tcCQwIHx8XG4gICAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjb250ZXh0LlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgJiZcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjb250ZXh0LmNvbXBvbmVudFdpbGxNb3VudCkgfHxcbiAgICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGNvbnRleHQuY29tcG9uZW50V2lsbE1vdW50ICYmXG4gICAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRXaWxsTW91bnQoKSxcbiAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ICYmXG4gICAgICAgICAgICAgICAgY29udGV4dC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLFxuICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dC5jb21wb25lbnREaWRNb3VudCAmJlxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNDE5NDMwOCkpXG4gICAgICAgICAgOiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dC5jb21wb25lbnREaWRNb3VudCAmJlxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNDE5NDMwOCksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5leHRQcm9wcyksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG9sZENvbnRleHQpKSxcbiAgICAgICAgKGNvbnRleHQucHJvcHMgP
1SBuZXh0UHJvcHMpLFxuICAgICAgICAoY29udGV4dC5zdGF0ZSA9IG9sZENvbnRleHQpLFxuICAgICAgICAoY29udGV4dC5jb250ZXh0ID0gY29udGV4dFR5cGUpLFxuICAgICAgICAobmV4dFByb3BzID0gb2xkUHJvcHMpKVxuICAgICAgOiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dC5jb21wb25lbnREaWRNb3VudCAmJlxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0MTk0MzA4KSxcbiAgICAgICAgKG5leHRQcm9wcyA9ICExKSk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICBjb250ZXh0VHlwZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gICAgY29udGV4dFR5cGUkanNjb21wJDAgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhDb21wb25lbnQsIGNvbnRleHRUeXBlKTtcbiAgICBjb250ZXh0LnByb3BzID0gY29udGV4dFR5cGUkanNjb21wJDA7XG4gICAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgIG9sZFN0YXRlID0gY29udGV4dC5jb250ZXh0O1xuICAgIG9sZENvbnRleHQgPSBDb21wb25lbnQuY29udGV4dFR5cGU7XG4gICAgb2xkUHJvcHMgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9sZENvbnRleHQgJiZcbiAgICAgIG51bGwgIT09IG9sZENvbnRleHQgJiZcbiAgICAgIChvbGRQcm9wcyA9IHJlYWRDb250ZXh0KG9sZENvbnRleHQpKTtcbiAgICB1bnJlc29sdmVkT2xkUHJvcHMgPSBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICAgIChvbGRDb250ZXh0ID1cbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHVucmVzb2x2ZWRPbGRQcm9wcyB8fFxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSkgfHxcbiAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjb250ZXh0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzICYmXG4gICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIGNvbnRleHQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcykgfHxcbiAgICAgICgoY29udGV4dFR5cGUgIT09IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyB8fCBvbGRTdGF0ZSAhPT0gb2xkUHJvcHMpICYmXG4gICAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgIG9sZFByb3BzXG4gICAgICAgICkpO1xuICAgIGhhc0ZvcmNlVXBkYXRlID0gITE7XG4gICAgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgIGNvbnRleHQuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIHN1c3BlbmRJZlVwZGF0ZVJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24oKTtcbiAgICB2YXIgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgIGNvbnRleHRUeXBlICE9PSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgfHxcbiAgICBvbGRTdGF0ZSAhPT0gbmV3U3RhdGUgfHxcbiAgICBoYXNGb3JjZVVwZGF0ZSB8fFxuICAgIChudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICBudWxsICE9PSBjdXJyZW50LmRlcGVuZGVuY2llcyAmJlxuICAgICAgY2hlY2tJZkNvbnRleHRDaGFuZ2VkKGN1cnJlbnQuZGVwZW5kZW5jaWVzKSlcbiAgICAgID8gKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHVucmVzb2x2ZWRPbGRQcm9wcyAmJlxuICAgICAgICAgIChhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyhcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICAgICAgdW5yZXNvbHZlZE9sZFByb3BzLFxuICAgICAgICAgICAgbmV4dFByb3BzXG4gICAgICAgICAgKSxcbiAgICAgICAgICAobmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlKSksXG4gICAgICAgIChjb250ZXh0VHlwZSRqc2NvbXAkMCA9XG4gICAgICAgICAgaGFzRm9yY2VVcGRhdGUgfHxcbiAgICAgICAgICBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZShcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICAgICAgY29udGV4dFR5cGUkanNjb21wJDAsXG4gICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICBvbGRTdGF0ZSxcbiAgICAgICAgICAgIG5ld1N0YXRlLFxuICAgICAgICAgICAgb2xkUHJvcHNcbiAgICAgICAgICApIHx8XG4gICAgICAgICAgKG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQuZGVwZW5kZW5jaWVzICYmXG4gICAgICAgICAgICBjaGVja0lmQ29udGV4dENoYW5nZWQoY3VycmVudC5kZXBlbmRlbmNpZXMpKSlcbiAgICAgICAgICA/IChvbGRDb250ZXh0IHx8XG4gICAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjb250ZXh0LlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlICYmXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgY29udGV4dC5jb21wb25lbnRXaWxsVXBkYXRlKSB8fFxuICAgICAgICAgICAgICAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dC5jb21wb25lbnRXaWxsVXBkYXRlICYmXG4gICAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV3U3RhdGUsIG9sZFByb3BzKSxcbiAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dC5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgIGNvbnRleHQuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUoXG4gICAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgICBuZXdTdGF0ZSxcbiAgICAgICAgICAgICAgICAgIG9sZFByb3BzXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjb250ZXh0LmNvbXBvbmVudERpZFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNCksXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjb250ZXh0LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICYmXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMDI0KSlcbiAgICAgICAgICA6IChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjb250ZXh0LmNvbXBvbmVudERpZFVwZGF0ZSB8fFxuICAgICAgICAgICAgICAoY29udGV4dFR5cGUgPT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgICAgICAgIG9sZFN0YXRlID09PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHx8XG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KSxcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIGNvbnRleHQuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgfHxcbiAgICAgICAgICAgICAgKGNvbnRleHRUeXBlID09PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgJiZcbiAgICAgICAgICAgICAgICBvbGRTdGF0ZSA9PT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB8fFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTAyNCksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5leHRQcm9wcyksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlKSksXG4gICAgICAgIChjb250ZXh0LnByb3BzID0gbmV4dFByb3BzKSxcbiAgICAgICAgKGNvbnRleHQuc3RhdGUgPSBuZXdTdGF0ZSksXG4gICAgICAgIChjb250ZXh0LmNvbnRleHQgPSBvbGRQcm9wcyksXG4gICAgICAgIChuZXh0UHJvcHMgP
1SBjb250ZXh0VHlwZSRqc2NvbXAkMCkpXG4gICAgICA6IChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjb250ZXh0LmNvbXBvbmVudERpZFVwZGF0ZSB8fFxuICAgICAgICAgIChjb250ZXh0VHlwZSA9PT0gY3VycmVudC5tZW1vaXplZFByb3BzICYmXG4gICAgICAgICAgICBvbGRTdGF0ZSA9PT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB8fFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KSxcbiAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgY29udGV4dC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSB8fFxuICAgICAgICAgIChjb250ZXh0VHlwZSA9PT0gY3VycmVudC5tZW1vaXplZFByb3BzICYmXG4gICAgICAgICAgICBvbGRTdGF0ZSA9PT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB8fFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMDI0KSxcbiAgICAgICAgKG5leHRQcm9wcyA9ICExKSk7XG4gIH1cbiAgY29udGV4dCA9IG5leHRQcm9wcztcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIG5leHRQcm9wcyA9IDAgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOCk7XG4gIGNvbnRleHQgfHwgbmV4dFByb3BzXG4gICAgPyAoKGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUpLFxuICAgICAgKENvbXBvbmVudCA9XG4gICAgICAgIG5leHRQcm9wcyAmJiBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiBjb250ZXh0LnJlbmRlcigpKSxcbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxKSxcbiAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgbmV4dFByb3BzXG4gICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICBjdXJyZW50LmNoaWxkLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgKSksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICkpKVxuICAgICAgICA6IHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSxcbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY29udGV4dC5zdGF0ZSksXG4gICAgICAoY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSlcbiAgICA6IChjdXJyZW50ID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhcbiAgICAgICAgY3VycmVudCxcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgIHJlbmRlckxhbmVzXG4gICAgICApKTtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5mdW5jdGlvbiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhcbiAgY3VycmVudCxcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIG5leHRDaGlsZHJlbixcbiAgcmVuZGVyTGFuZXNcbikge1xuICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDI1NjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG52YXIgU1VTUEVOREVEX01BUktFUiA9IHtcbiAgZGVoeWRyYXRlZDogbnVsbCxcbiAgdHJlZUNvbnRleHQ6IG51bGwsXG4gIHJldHJ5TGFuZTogMCxcbiAgaHlkcmF0aW9uRXJyb3JzOiBudWxsXG59O1xuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7IGJhc2VMYW5lczogcmVuZGVyTGFuZXMsIGNhY2hlUG9vbDogZ2V0U3VzcGVuZGVkQ2FjaGUoKSB9O1xufVxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoXG4gIGN1cnJlbnQsXG4gIHByaW1hcnlUcmVlRGlkRGVmZXIsXG4gIHJlbmRlckxhbmVzXG4pIHtcbiAgY3VycmVudCA9IG51bGwgIT09IGN1cnJlbnQgPyBjdXJyZW50LmNoaWxkTGFuZXMgJiB+cmVuZGVyTGFuZXMgOiAwO1xuICBwcmltYXJ5VHJlZURpZERlZmVyICYmIChjdXJyZW50IHw9IHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lKTtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICBzaG93RmFsbGJhY2sgPSAhMSxcbiAgICBkaWRTdXNwZW5kID0gMCAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KSxcbiAgICBKU0NvbXBpbGVyX3RlbXA7XG4gIChKU0NvbXBpbGVyX3RlbXAgPSBkaWRTdXNwZW5kKSB8fFxuICAgIChKU0NvbXBpbGVyX3RlbXAgPVxuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiBudWxsID09PSBjdXJyZW50Lm1lbW9pemVkU3RhdGVcbiAgICAgICAgPyAhMVxuICAgICAgICA6IDAgIT09IChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQgJiAyKSk7XG4gIEpTQ29tcGlsZXJfdGVtcCAmJiAoKHNob3dGYWxsYmFjayA9ICEwKSwgKHdvcmtJblByb2dyZXNzLmZsYWdzICY9IC0xMjkpKTtcbiAgSlNDb21waWxlcl90ZW1wID0gMCAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMzIpO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSAtMzM7XG4gIGlmIChudWxsID09PSBjdXJyZW50KSB7XG4gICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICBzaG93RmFsbGJhY2tcbiAgICAgICAgPyBwdXNoUHJpbWFyeVRyZWVTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpXG4gICAgICAgIDogcmV1c2VTdXNwZW5zZUhhbmRsZXJPblN0YWNrKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgICB2Y
1XIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSxcbiAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAkanNjb21wJDA7XG4gICAgICAgIGlmICgoSlNDb21waWxlcl90ZW1wJGpzY29tcCQwID0gbmV4dEluc3RhbmNlKSkge1xuICAgICAgICAgIGM6IHtcbiAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMCA9IG5leHRJbnN0YW5jZTtcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIG5leHRJbnN0YW5jZSA9IHJvb3RPclNpbmdsZXRvbkNvbnRleHQ7XG4gICAgICAgICAgICAgIDggIT09IEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMC5ub2RlVHlwZTtcblxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgbmV4dEluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhayBjO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMCA9IGdldE5leHRIeWRyYXRhYmxlKFxuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMC5uZXh0U2libGluZ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gSlNDb21waWxlcl90ZW1wJGpzY29tcCQwKSB7XG4gICAgICAgICAgICAgICAgbmV4dEluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhayBjO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0SW5zdGFuY2UgPSBKU0NvbXBpbGVyX3RlbXAkanNjb21wJDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIG51bGwgIT09IG5leHRJbnN0YW5jZVxuICAgICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgZGVoeWRyYXRlZDogbmV4dEluc3RhbmNlLFxuICAgICAgICAgICAgICAgIHRyZWVDb250ZXh0OlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdHJlZUNvbnRleHRQcm92aWRlclxuICAgICAgICAgICAgICAgICAgICA/IHsgaWQ6IHRyZWVDb250ZXh0SWQsIG92ZXJmbG93OiB0cmVlQ29udGV4dE92ZXJmbG93IH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIHJldHJ5TGFuZTogNTM2ODcwOTEyLFxuICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkVycm9yczogbnVsbFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMCA9IGNyZWF0ZUZpYmVySW1wbENsYXNzKFxuICAgICAgICAgICAgICAgIDE4LFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAoSlNDb21waWxlcl90ZW1wJGpzY29tcCQwLnN0YXRlTm9kZSA9IG5leHRJbnN0YW5jZSksXG4gICAgICAgICAgICAgIChKU0NvbXBpbGVyX3RlbXAkanNjb21wJDAucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBKU0NvbXBpbGVyX3RlbXAkanNjb21wJDApLFxuICAgICAgICAgICAgICAoaHlkcmF0aW9uUGFyZW50RmliZXIgPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgIChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbCksXG4gICAgICAgICAgICAgIChKU0NvbXBpbGVyX3RlbXAkanNjb21wJDAgPSAhMCkpXG4gICAgICAgICAgICA6IChKU0NvbXBpbGVyX3RlbXAkanNjb21wJDAgPSAhMSk7XG4gICAgICAgIH1cbiAgICAgICAgSlNDb21waWxlcl90ZW1wJGpzY29tcCQwIHx8IHRocm93T25IeWRyYXRpb25NaXNtYXRjaCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9XG4gICAgICBuZXh0SW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9PSBuZXh0SW5zdGFuY2UgJiZcbiAgICAgICAgKChuZXh0SW5zdGFuY2UgPSBuZXh0SW5zdGFuY2UuZGVoeWRyYXRlZCksIG51bGwgIT09IG5leHRJbnN0YW5jZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhuZXh0SW5zdGFuY2UpXG4gICAgICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IDMyKVxuICAgICAgICAgICAgOiAod29ya0luUHJvZ3Jlc3MubGFuZXMgPSA1MzY4NzA5MTIpLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICAgIG5leHRJbnN0YW5jZSA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICBuZXh0UHJvcHMgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgaWYgKHNob3dGYWxsYmFjaylcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgIChzaG93RmFsbGJhY2sgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlKSxcbiAgICAgICAgKG5leHRJbnN0YW5jZSA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihcbiAgICAgICAgICB7IG1vZGU6IFwiaGlkZGVuXCIsIGNoaWxkcmVuOiBuZXh0SW5zdGFuY2UgfSxcbiAgICAgICAgICBzaG93RmFsbGJhY2tcbiAgICAgICAgKSksXG4gICAgICAgIChuZXh0UHJvcHMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChcbiAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgc2hvd0ZhbGxiYWNrLFxuICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKSksXG4gICAgICAgIChuZXh0SW5zdGFuY2UucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAobmV4dFByb3BzLnJldHVybiA9IHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgKG5leHRJbnN0YW5jZS5zaWJsaW5nID0gbmV4dFByb3BzKSxcbiAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV4dEluc3RhbmNlKSxcbiAgICAgICAgKHNob3dGYWxsYmFjayA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgKHNob3dGYWxsYmFjay5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSksXG4gICAgICAgIChzaG93RmFsbGJhY2suY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKFxuICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgSlNDb21waWxlcl90ZW1wLFxuICAgICAgICAgI
1HJlbmRlckxhbmVzXG4gICAgICAgICkpLFxuICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVIpLFxuICAgICAgICBuZXh0UHJvcHNcbiAgICAgICk7XG4gICAgcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dEluc3RhbmNlKTtcbiAgfVxuICBKU0NvbXBpbGVyX3RlbXAkanNjb21wJDAgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIGlmIChcbiAgICBudWxsICE9PSBKU0NvbXBpbGVyX3RlbXAkanNjb21wJDAgJiZcbiAgICAoKG5leHRJbnN0YW5jZSA9IEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMC5kZWh5ZHJhdGVkKSxcbiAgICBudWxsICE9PSBuZXh0SW5zdGFuY2UpXG4gICkge1xuICAgIGlmIChkaWRTdXNwZW5kKVxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAyNTZcbiAgICAgICAgPyAocHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gLTI1NyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICkpKVxuICAgICAgICA6IG51bGwgIT09IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGVcbiAgICAgICAgICA/IChyZXVzZVN1c3BlbnNlSGFuZGxlck9uU3RhY2sod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZCksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4KSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcyA9IG51bGwpKVxuICAgICAgICAgIDogKHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoc2hvd0ZhbGxiYWNrID0gbmV4dFByb3BzLmZhbGxiYWNrKSxcbiAgICAgICAgICAgIChuZXh0SW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlKSxcbiAgICAgICAgICAgIChuZXh0UHJvcHMgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoXG4gICAgICAgICAgICAgIHsgbW9kZTogXCJ2aXNpYmxlXCIsIGNoaWxkcmVuOiBuZXh0UHJvcHMuY2hpbGRyZW4gfSxcbiAgICAgICAgICAgICAgbmV4dEluc3RhbmNlXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIChzaG93RmFsbGJhY2sgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChcbiAgICAgICAgICAgICAgc2hvd0ZhbGxiYWNrLFxuICAgICAgICAgICAgICBuZXh0SW5zdGFuY2UsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIChzaG93RmFsbGJhY2suZmxhZ3MgfD0gMiksXG4gICAgICAgICAgICAobmV4dFByb3BzLnJldHVybiA9IHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIChzaG93RmFsbGJhY2sucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgKG5leHRQcm9wcy5zaWJsaW5nID0gc2hvd0ZhbGxiYWNrKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5leHRQcm9wcyksXG4gICAgICAgICAgICByZWNvbmNpbGVDaGlsZEZpYmVycyhcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIGN1cnJlbnQuY2hpbGQsXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgKG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAgIChuZXh0UHJvcHMubWVtb2l6ZWRTdGF0ZSA9XG4gICAgICAgICAgICAgIG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykpLFxuICAgICAgICAgICAgKG5leHRQcm9wcy5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcyA9IHNob3dGYWxsYmFjaykpO1xuICAgIGVsc2UgaWYgKFxuICAgICAgKHB1c2hQcmltYXJ5VHJlZVN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhuZXh0SW5zdGFuY2UpKVxuICAgICkge1xuICAgICAgSlNDb21waWxlcl90ZW1wID1cbiAgICAgICAgbmV4dEluc3RhbmNlLm5leHRTaWJsaW5nICYmIG5leHRJbnN0YW5jZS5uZXh0U2libGluZy5kYXRhc2V0O1xuICAgICAgaWYgKEpTQ29tcGlsZXJfdGVtcCkgdmFyIGRpZ2VzdCA9IEpTQ29tcGlsZXJfdGVtcC5kZ3N0O1xuICAgICAgSlNDb21waWxlcl90ZW1wID0gZGlnZXN0O1xuICAgICAgbmV4dFByb3BzID0gRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0MTkpKTtcbiAgICAgIG5leHRQcm9wcy5zdGFjayA9IFwiXCI7XG4gICAgICBuZXh0UHJvcHMuZGlnZXN0ID0gSlNDb21waWxlcl90ZW1wO1xuICAgICAgcXVldWVIeWRyYXRpb25FcnJvcih7IHZhbHVlOiBuZXh0UHJvcHMsIHNvdXJjZTogbnVsbCwgc3RhY2s6IG51bGwgfSk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKFxuICAgICAgICBjdXJyZW50LFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIChkaWRSZWNlaXZlVXBkYXRlIHx8XG4gICAgICAgIHByb3BhZ2F0ZVBhcmVudENvbnRleHRDaGFuZ2VzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgITEpLFxuICAgICAgKEpTQ29tcGlsZXJfdGVtcCA9IDAgIT09IChyZW5kZXJMYW5lcyAmIGN1cnJlbnQuY2hpbGRMYW5lcykpLFxuICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSB8fCBKU0NvbXBpbGVyX3RlbXApXG4gICAgKSB7XG4gICAgICBKU0NvbXBpbGVyX3RlbXAgPSB3b3JrSW5Qcm9ncmVzc1Jvb3Q7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IEpTQ29tcGlsZXJfdGVtcCAmJlxuICAgICAgICAoKG5leHRQcm9wcyA9IHJlbmRlckxhbmVzICYgLXJlbmRlckxhbmVzKSxcbiAgICAgICAgKG5leHRQcm9wcyA9XG4gICAgICAgICAgMCAhPT0gKG5leHRQcm9wcyAmIDQyKVxuICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICA6IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb25CeUxhbmUobmV4dFByb3BzKSksXG4gICAgICAgIChuZXh0UHJvcHMgPVxuICAgICAgICAgIDAgIT09IChuZXh0UHJvcHMgJiAoSlNDb21waWxlcl90ZW1wLnN1c3BlbmRlZExhbmVzIHwgcmVuZGVyTGFuZXMpKVxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IG5leHRQcm9wcyksXG4gICAgICAgIDAgIT09IG5leHRQcm9wcyAmJiBuZXh0UHJvcHMgIT09IEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMC5yZXRyeUxhbmUpXG4gICAgICApXG4gICAgICAgI
1HRocm93IChcbiAgICAgICAgICAoKEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMC5yZXRyeUxhbmUgPSBuZXh0UHJvcHMpLFxuICAgICAgICAgIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShjdXJyZW50LCBuZXh0UHJvcHMpLFxuICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihKU0NvbXBpbGVyX3RlbXAsIGN1cnJlbnQsIG5leHRQcm9wcyksXG4gICAgICAgICAgU2VsZWN0aXZlSHlkcmF0aW9uRXhjZXB0aW9uKVxuICAgICAgICApO1xuICAgICAgXCIkP1wiID09PSBuZXh0SW5zdGFuY2UuZGF0YSB8fCByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKFxuICAgICAgICBjdXJyZW50LFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICk7XG4gICAgfSBlbHNlXG4gICAgICBcIiQ/XCIgPT09IG5leHRJbnN0YW5jZS5kYXRhXG4gICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxOTIpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcyA9IG51bGwpKVxuICAgICAgICA6ICgoY3VycmVudCA9IEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMC50cmVlQ29udGV4dCksXG4gICAgICAgICAgKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZShcbiAgICAgICAgICAgIG5leHRJbnN0YW5jZS5uZXh0U2libGluZ1xuICAgICAgICAgICkpLFxuICAgICAgICAgIChoeWRyYXRpb25QYXJlbnRGaWJlciA9IHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAoaXNIeWRyYXRpbmcgPSAhMCksXG4gICAgICAgICAgKGh5ZHJhdGlvbkVycm9ycyA9IG51bGwpLFxuICAgICAgICAgIChyb290T3JTaW5nbGV0b25Db250ZXh0ID0gITEpLFxuICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICgoaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkKSxcbiAgICAgICAgICAgIChpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3cpLFxuICAgICAgICAgICAgKGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlciksXG4gICAgICAgICAgICAodHJlZUNvbnRleHRJZCA9IGN1cnJlbnQuaWQpLFxuICAgICAgICAgICAgKHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBjdXJyZW50Lm92ZXJmbG93KSxcbiAgICAgICAgICAgICh0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3MpKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICBuZXh0UHJvcHMuY2hpbGRyZW5cbiAgICAgICAgICApKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNDA5NikpO1xuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuICBpZiAoc2hvd0ZhbGxiYWNrKVxuICAgIHJldHVybiAoXG4gICAgICByZXVzZVN1c3BlbnNlSGFuZGxlck9uU3RhY2sod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgKHNob3dGYWxsYmFjayA9IG5leHRQcm9wcy5mYWxsYmFjayksXG4gICAgICAobmV4dEluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3MubW9kZSksXG4gICAgICAoSlNDb21waWxlcl90ZW1wJGpzY29tcCQwID0gY3VycmVudC5jaGlsZCksXG4gICAgICAoZGlnZXN0ID0gSlNDb21waWxlcl90ZW1wJGpzY29tcCQwLnNpYmxpbmcpLFxuICAgICAgKG5leHRQcm9wcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMCwge1xuICAgICAgICBtb2RlOiBcImhpZGRlblwiLFxuICAgICAgICBjaGlsZHJlbjogbmV4dFByb3BzLmNoaWxkcmVuXG4gICAgICB9KSksXG4gICAgICAobmV4dFByb3BzLnN1YnRyZWVGbGFncyA9XG4gICAgICAgIEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMC5zdWJ0cmVlRmxhZ3MgJiA2NTAxMTcxMiksXG4gICAgICBudWxsICE9PSBkaWdlc3RcbiAgICAgICAgPyAoc2hvd0ZhbGxiYWNrID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZGlnZXN0LCBzaG93RmFsbGJhY2spKVxuICAgICAgICA6ICgoc2hvd0ZhbGxiYWNrID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoXG4gICAgICAgICAgICBzaG93RmFsbGJhY2ssXG4gICAgICAgICAgICBuZXh0SW5zdGFuY2UsXG4gICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApKSxcbiAgICAgICAgICAoc2hvd0ZhbGxiYWNrLmZsYWdzIHw9IDIpKSxcbiAgICAgIChzaG93RmFsbGJhY2sucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgKG5leHRQcm9wcy5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAobmV4dFByb3BzLnNpYmxpbmcgPSBzaG93RmFsbGJhY2spLFxuICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV4dFByb3BzKSxcbiAgICAgIChuZXh0UHJvcHMgPSBzaG93RmFsbGJhY2spLFxuICAgICAgKHNob3dGYWxsYmFjayA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgIChuZXh0SW5zdGFuY2UgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGUpLFxuICAgICAgbnVsbCA9PT0gbmV4dEluc3RhbmNlXG4gICAgICAgID8gKG5leHRJbnN0YW5jZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykpXG4gICAgICAgIDogKChKU0NvbXBpbGVyX3RlbXAkanNjb21wJDAgPSBuZXh0SW5zdGFuY2UuY2FjaGVQb29sKSxcbiAgICAgICAgICBudWxsICE9PSBKU0NvbXBpbGVyX3RlbXAkanNjb21wJDBcbiAgICAgICAgICAgID8gKChkaWdlc3QgPSBDYWNoZUNvbnRleHQuX2N1cnJlbnRWYWx1ZSksXG4gICAgICAgICAgICAgIChKU0NvbXBpbGVyX3RlbXAkanNjb21wJDAgPVxuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCRqc2NvbXAkMC5wYXJlbnQgIT09IGRpZ2VzdFxuICAgICAgICAgICAgICAgICAgPyB7IHBhcmVudDogZGlnZXN0LCBwb29sOiBkaWdlc3QgfVxuICAgICAgICAgICAgICAgICAgOiBKU0NvbXBpbGVyX3RlbXAkanNjb21wJDApKVxuICAgICAgICAgICAgOiAoSlNDb21waWxlcl90ZW1wJGpzY29tcCQwID0gZ2V0U3VzcGVuZGVkQ2FjaGUoKSksXG4gICAgICAgICAgKG5leHRJbnN0YW5jZSA9IHtcbiAgICAgICAgICAgIGJhc2VMYW5lczogbmV4dEluc3RhbmNlLmJhc2VMYW5lcyB8IHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgY2FjaGVQb29sOiBKU0NvbXBpbGVyX3RlbXAkanNjb21wJDBcbiAgICAgICAgICB9KSksXG4gICAgICAoc2hvd0ZhbGxiYWNrLm1lbW9pemVkU3RhdGUgPSBuZXh0SW5zdGFuY2UpLFxuICAgICAgKHNob3dGYWxsYmFjay5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIE
1pTQ29tcGlsZXJfdGVtcCxcbiAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICkpLFxuICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSKSxcbiAgICAgIG5leHRQcm9wc1xuICAgICk7XG4gIHB1c2hQcmltYXJ5VHJlZVN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIHJlbmRlckxhbmVzID0gY3VycmVudC5jaGlsZDtcbiAgY3VycmVudCA9IHJlbmRlckxhbmVzLnNpYmxpbmc7XG4gIHJlbmRlckxhbmVzID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MocmVuZGVyTGFuZXMsIHtcbiAgICBtb2RlOiBcInZpc2libGVcIixcbiAgICBjaGlsZHJlbjogbmV4dFByb3BzLmNoaWxkcmVuXG4gIH0pO1xuICByZW5kZXJMYW5lcy5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcmVuZGVyTGFuZXMuc2libGluZyA9IG51bGw7XG4gIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAoKEpTQ29tcGlsZXJfdGVtcCA9IHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyksXG4gICAgbnVsbCA9PT0gSlNDb21waWxlcl90ZW1wXG4gICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gW2N1cnJlbnRdKSwgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDE2KSlcbiAgICAgIDogSlNDb21waWxlcl90ZW1wLnB1c2goY3VycmVudCkpO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlckxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIHJlbmRlckxhbmVzO1xufVxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKSB7XG4gIHByaW1hcnlDaGlsZHJlbiA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihcbiAgICB7IG1vZGU6IFwidmlzaWJsZVwiLCBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuIH0sXG4gICAgd29ya0luUHJvZ3Jlc3MubW9kZVxuICApO1xuICBwcmltYXJ5Q2hpbGRyZW4ucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHJldHVybiAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRyZW4pO1xufVxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKG9mZnNjcmVlblByb3BzLCBtb2RlKSB7XG4gIG9mZnNjcmVlblByb3BzID0gY3JlYXRlRmliZXJJbXBsQ2xhc3MoMjIsIG9mZnNjcmVlblByb3BzLCBudWxsLCBtb2RlKTtcbiAgb2Zmc2NyZWVuUHJvcHMubGFuZXMgPSAwO1xuICBvZmZzY3JlZW5Qcm9wcy5zdGF0ZU5vZGUgPSB7XG4gICAgX3Zpc2liaWxpdHk6IDEsXG4gICAgX3BlbmRpbmdNYXJrZXJzOiBudWxsLFxuICAgIF9yZXRyeUNhY2hlOiBudWxsLFxuICAgIF90cmFuc2l0aW9uczogbnVsbFxuICB9O1xuICByZXR1cm4gb2Zmc2NyZWVuUHJvcHM7XG59XG5mdW5jdGlvbiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhcbiAgY3VycmVudCxcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIHJlbmRlckxhbmVzXG4pIHtcbiAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgY3VycmVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oXG4gICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuXG4gICk7XG4gIGN1cnJlbnQuZmxhZ3MgfD0gMjtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHJldHVybiBjdXJyZW50O1xufVxuZnVuY3Rpb24gc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGZpYmVyLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7XG4gIGZpYmVyLmxhbmVzIHw9IHJlbmRlckxhbmVzO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICBudWxsICE9PSBhbHRlcm5hdGUgJiYgKGFsdGVybmF0ZS5sYW5lcyB8PSByZW5kZXJMYW5lcyk7XG4gIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KTtcbn1cbmZ1bmN0aW9uIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZShcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIGlzQmFja3dhcmRzLFxuICB0YWlsLFxuICBsYXN0Q29udGVudFJvdyxcbiAgdGFpbE1vZGVcbikge1xuICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICBudWxsID09PSByZW5kZXJTdGF0ZVxuICAgID8gKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgICAgcmVuZGVyaW5nOiBudWxsLFxuICAgICAgICByZW5kZXJpbmdTdGFydFRpbWU6IDAsXG4gICAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgICB0YWlsOiB0YWlsLFxuICAgICAgICB0YWlsTW9kZTogdGFpbE1vZGVcbiAgICAgIH0pXG4gICAgOiAoKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzID0gaXNCYWNrd2FyZHMpLFxuICAgICAgKHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGwpLFxuICAgICAgKHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IDApLFxuICAgICAgKHJlbmRlclN0YXRlLmxhc3QgPSBsYXN0Q29udGVudFJvdyksXG4gICAgICAocmVuZGVyU3RhdGUudGFpbCA9IHRhaWwpLFxuICAgICAgKHJlbmRlclN0YXRlLnRhaWxNb2RlID0gdGFpbE1vZGUpKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcixcbiAgICB0YWlsTW9kZSA9IG5leHRQcm9wcy50YWlsO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLmNoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIG5leHRQcm9wcyA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgaWYgKDAgIT09IChuZXh0UHJvcHMgJiAyKSlcbiAgICAobmV4dFByb3BzID0gKG5leHRQcm9wcyAmIDEpIHwgMiksICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpO1xuICBlbHNlIHtcbiAgICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiAwICE9PSAoY3VycmVudC5mbGFncyAmIDEyOCkpXG4gICAgICBhOiBmb3IgKGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsgbnVsbCAhPT0gY3VycmVudDsgKSB7XG4gICAgICAgIGlmICgxMyA9PT0gY3VycmVudC50YWcpXG4gICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIoY3VycmVudCwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgZWxzZSBpZiAoMTkgPT09IGN1cnJlbnQudGFnKVxuICAgICAgICAgI
1HNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihjdXJyZW50LCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBlbHNlIGlmIChudWxsICE9PSBjdXJyZW50LmNoaWxkKSB7XG4gICAgICAgICAgY3VycmVudC5jaGlsZC5yZXR1cm4gPSBjdXJyZW50O1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50ID09PSB3b3JrSW5Qcm9ncmVzcykgYnJlYWsgYTtcbiAgICAgICAgZm9yICg7IG51bGwgPT09IGN1cnJlbnQuc2libGluZzsgKSB7XG4gICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQucmV0dXJuIHx8IGN1cnJlbnQucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuc2libGluZy5yZXR1cm4gPSBjdXJyZW50LnJldHVybjtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuc2libGluZztcbiAgICAgIH1cbiAgICBuZXh0UHJvcHMgJj0gMTtcbiAgfVxuICBwdXNoKHN1c3BlbnNlU3RhY2tDdXJzb3IsIG5leHRQcm9wcyk7XG4gIHN3aXRjaCAocmV2ZWFsT3JkZXIpIHtcbiAgICBjYXNlIFwiZm9yd2FyZHNcIjpcbiAgICAgIHJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBmb3IgKHJldmVhbE9yZGVyID0gbnVsbDsgbnVsbCAhPT0gcmVuZGVyTGFuZXM7IClcbiAgICAgICAgKGN1cnJlbnQgPSByZW5kZXJMYW5lcy5hbHRlcm5hdGUpLFxuICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgIG51bGwgPT09IGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50KSAmJlxuICAgICAgICAgICAgKHJldmVhbE9yZGVyID0gcmVuZGVyTGFuZXMpLFxuICAgICAgICAgIChyZW5kZXJMYW5lcyA9IHJlbmRlckxhbmVzLnNpYmxpbmcpO1xuICAgICAgcmVuZGVyTGFuZXMgPSByZXZlYWxPcmRlcjtcbiAgICAgIG51bGwgPT09IHJlbmRlckxhbmVzXG4gICAgICAgID8gKChyZXZlYWxPcmRlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSwgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbCkpXG4gICAgICAgIDogKChyZXZlYWxPcmRlciA9IHJlbmRlckxhbmVzLnNpYmxpbmcpLCAocmVuZGVyTGFuZXMuc2libGluZyA9IG51bGwpKTtcbiAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZShcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICExLFxuICAgICAgICByZXZlYWxPcmRlcixcbiAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgIHRhaWxNb2RlXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImJhY2t3YXJkc1wiOlxuICAgICAgcmVuZGVyTGFuZXMgPSBudWxsO1xuICAgICAgcmV2ZWFsT3JkZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIGZvciAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsOyBudWxsICE9PSByZXZlYWxPcmRlcjsgKSB7XG4gICAgICAgIGN1cnJlbnQgPSByZXZlYWxPcmRlci5hbHRlcm5hdGU7XG4gICAgICAgIGlmIChudWxsICE9PSBjdXJyZW50ICYmIG51bGwgPT09IGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50KSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmV2ZWFsT3JkZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IHJldmVhbE9yZGVyLnNpYmxpbmc7XG4gICAgICAgIHJldmVhbE9yZGVyLnNpYmxpbmcgPSByZW5kZXJMYW5lcztcbiAgICAgICAgcmVuZGVyTGFuZXMgPSByZXZlYWxPcmRlcjtcbiAgICAgICAgcmV2ZWFsT3JkZXIgPSBjdXJyZW50O1xuICAgICAgfVxuICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgITAsXG4gICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICBudWxsLFxuICAgICAgICB0YWlsTW9kZVxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ0b2dldGhlclwiOlxuICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCAhMSwgbnVsbCwgbnVsbCwgdm9pZCAwKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgfVxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5mdW5jdGlvbiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBudWxsICE9PSBjdXJyZW50ICYmICh3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcyk7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyB8PSB3b3JrSW5Qcm9ncmVzcy5sYW5lcztcbiAgaWYgKDAgPT09IChyZW5kZXJMYW5lcyAmIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpKVxuICAgIGlmIChudWxsICE9PSBjdXJyZW50KSB7XG4gICAgICBpZiAoXG4gICAgICAgIChwcm9wYWdhdGVQYXJlbnRDb250ZXh0Q2hhbmdlcyhcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICExXG4gICAgICAgICksXG4gICAgICAgIDAgPT09IChyZW5kZXJMYW5lcyAmIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgcmV0dXJuIG51bGw7XG4gIGlmIChudWxsICE9PSBjdXJyZW50ICYmIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50LmNoaWxkKVxuICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTUzKSk7XG4gIGlmIChudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5jaGlsZCkge1xuICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICByZW5kZXJMYW5lcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIGN1cnJlbnQucGVuZGluZ1Byb3BzKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlckxhbmVzO1xuICAgIGZvciAocmVuZGVyTGFuZXMucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7IG51bGwgIT09IGN1cnJlbnQuc2libGluZzsgKVxuICAgICAgKGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmcpLFxuICAgICAgICAocmVuZGVyTGFuZXMgPSByZW5kZXJMYW5lcy5zaWJsaW5nID1cbiAgICAgICAgICBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBjdXJyZW50LnBlbmRpbmdQcm9wcykpLFxuICAgICAgICAocmVuZGVyTGFuZXMucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpO1xuICAgIHJlbmRlckxhbmVzLnNpYmxpbmcgPSBudWxsO1xuICB9XG4gI
1HJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cbmZ1bmN0aW9uIGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIGlmICgwICE9PSAoY3VycmVudC5sYW5lcyAmIHJlbmRlckxhbmVzKSkgcmV0dXJuICEwO1xuICBjdXJyZW50ID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIHJldHVybiBudWxsICE9PSBjdXJyZW50ICYmIGNoZWNrSWZDb250ZXh0Q2hhbmdlZChjdXJyZW50KSA/ICEwIDogITE7XG59XG5mdW5jdGlvbiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShcbiAgY3VycmVudCxcbiAgd29ya0luUHJvZ3Jlc3MsXG4gIHJlbmRlckxhbmVzXG4pIHtcbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIDM6XG4gICAgICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBDYWNoZUNvbnRleHQsIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZSk7XG4gICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI3OlxuICAgIGNhc2UgNTpcbiAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMDpcbiAgICAgIHB1c2hQcm92aWRlcihcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudmFsdWVcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOlxuICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIGlmIChudWxsICE9PSBzdGF0ZSkge1xuICAgICAgICBpZiAobnVsbCAhPT0gc3RhdGUuZGVoeWRyYXRlZClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgIGlmICgwICE9PSAocmVuZGVyTGFuZXMgJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZC5jaGlsZExhbmVzKSlcbiAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgY3VycmVudCA9IGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gY3VycmVudCA/IGN1cnJlbnQuc2libGluZyA6IG51bGw7XG4gICAgICB9XG4gICAgICBwdXNoUHJpbWFyeVRyZWVTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOTpcbiAgICAgIHZhciBkaWRTdXNwZW5kQmVmb3JlID0gMCAhPT0gKGN1cnJlbnQuZmxhZ3MgJiAxMjgpO1xuICAgICAgc3RhdGUgPSAwICE9PSAocmVuZGVyTGFuZXMgJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcbiAgICAgIHN0YXRlIHx8XG4gICAgICAgIChwcm9wYWdhdGVQYXJlbnRDb250ZXh0Q2hhbmdlcyhcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICExXG4gICAgICAgICksXG4gICAgICAgIChzdGF0ZSA9IDAgIT09IChyZW5kZXJMYW5lcyAmIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpKSk7XG4gICAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgICBpZiAoc3RhdGUpXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4O1xuICAgICAgfVxuICAgICAgZGlkU3VzcGVuZEJlZm9yZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICBudWxsICE9PSBkaWRTdXNwZW5kQmVmb3JlICYmXG4gICAgICAgICgoZGlkU3VzcGVuZEJlZm9yZS5yZW5kZXJpbmcgPSBudWxsKSxcbiAgICAgICAgKGRpZFN1c3BlbmRCZWZvcmUudGFpbCA9IG51bGwpLFxuICAgICAgICAoZGlkU3VzcGVuZEJlZm9yZS5sYXN0RWZmZWN0ID0gbnVsbCkpO1xuICAgICAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICAgICAgaWYgKHN0YXRl
1KSBicmVhaztcbiAgICAgIGVsc2UgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAyMjpcbiAgICBjYXNlIDIzOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHdvcmtJblByb2dyZXNzLmxhbmVzID0gMCksXG4gICAgICAgIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpXG4gICAgICApO1xuICAgIGNhc2UgMjQ6XG4gICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENhY2hlQ29udGV4dCwgY3VycmVudC5tZW1vaXplZFN0YXRlLmNhY2hlKTtcbiAgfVxuICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xufVxuZnVuY3Rpb24gYmVnaW5Xb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBpZiAobnVsbCAhPT0gY3VycmVudClcbiAgICBpZiAoY3VycmVudC5tZW1vaXplZFByb3BzICE9PSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMpXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gITA7XG4gICAgZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgICFjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykgJiZcbiAgICAgICAgMCA9PT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KVxuICAgICAgKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChkaWRSZWNlaXZlVXBkYXRlID0gITEpLFxuICAgICAgICAgIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gMCAhPT0gKGN1cnJlbnQuZmxhZ3MgJiAxMzEwNzIpID8gITAgOiAhMTtcbiAgICB9XG4gIGVsc2VcbiAgICAoZGlkUmVjZWl2ZVVwZGF0ZSA9ICExKSxcbiAgICAgIGlzSHlkcmF0aW5nICYmXG4gICAgICAgIDAgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEwNDg1NzYpICYmXG4gICAgICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIHRyZWVGb3JrQ291bnQsIHdvcmtJblByb2dyZXNzLmluZGV4KTtcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSAwO1xuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgMTY6XG4gICAgICBhOiB7XG4gICAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUsXG4gICAgICAgICAgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG4gICAgICAgIGxhenlDb21wb25lbnQgPSBpbml0KGxhenlDb21wb25lbnQuX3BheWxvYWQpO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gbGF6eUNvbXBvbmVudDtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGxhenlDb21wb25lbnQpXG4gICAgICAgICAgc2hvdWxkQ29uc3RydWN0KGxhenlDb21wb25lbnQpXG4gICAgICAgICAgICA/ICgoY3VycmVudCA9IHJlc29sdmVDbGFzc0NvbXBvbmVudFByb3BzKGxhenlDb21wb25lbnQsIGN1cnJlbnQpKSxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnRhZyA9IDEpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MgPSB1cGRhdGVDbGFzc0NvbXBvbmVudChcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIGxhenlDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICApKSlcbiAgICAgICAgICAgIDogKCh3b3JrSW5Qcm9ncmVzcy50YWcgPSAwKSxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBsYXp5Q29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKSkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodm9pZCAwICE9PSBsYXp5Q29tcG9uZW50ICYmIG51bGwgIT09IGxhenlDb21wb25lbnQpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICgoaW5pdCA9IGxhenlDb21wb25lbnQuJCR0eXBlb2YpLCBpbml0ID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IDExO1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHVwZGF0ZUZvcndhcmRSZWYoXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBsYXp5Q29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdCA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IDE0O1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHVwZGF0ZU1lbW9Db21wb25lbnQoXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBsYXp5Q29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9XG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUobGF6eUNvbXBvbmVudCkgfHwgbGF6eUNvbXBvbmVudDtcbiAgICAgICAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMwNiwgd29ya0luUHJvZ3Jlc3MsIFwiXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybi
1B1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChcbiAgICAgICAgY3VycmVudCxcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICk7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGxhenlDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlKSxcbiAgICAgICAgKGluaXQgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhcbiAgICAgICAgICBsYXp5Q29tcG9uZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wc1xuICAgICAgICApKSxcbiAgICAgICAgdXBkYXRlQ2xhc3NDb21wb25lbnQoXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICBsYXp5Q29tcG9uZW50LFxuICAgICAgICAgIGluaXQsXG4gICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICBjYXNlIDM6XG4gICAgICBhOiB7XG4gICAgICAgIHB1c2hIb3N0Q29udGFpbmVyKFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICk7XG4gICAgICAgIGlmIChudWxsID09PSBjdXJyZW50KSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDM4NykpO1xuICAgICAgICBsYXp5Q29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgICB2Y
1XIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgaW5pdCA9IHByZXZTdGF0ZS5lbGVtZW50O1xuICAgICAgICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBsYXp5Q29tcG9uZW50LCBudWxsLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICBsYXp5Q29tcG9uZW50ID0gbmV4dFN0YXRlLmNhY2hlO1xuICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENhY2hlQ29udGV4dCwgbGF6eUNvbXBvbmVudCk7XG4gICAgICAgIGxhenlDb21wb25lbnQgIT09IHByZXZTdGF0ZS5jYWNoZSAmJlxuICAgICAgICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VzKFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICBbQ2FjaGVDb250ZXh0XSxcbiAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgITBcbiAgICAgICAgICApO1xuICAgICAgICBzdXNwZW5kSWZVcGRhdGVSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uKCk7XG4gICAgICAgIGxhenlDb21wb25lbnQgPSBuZXh0U3RhdGUuZWxlbWVudDtcbiAgICAgICAgaWYgKHByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKChwcmV2U3RhdGUgPSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6IGxhenlDb21wb25lbnQsXG4gICAgICAgICAgICAgIGlzRGVoeWRyYXRlZDogITEsXG4gICAgICAgICAgICAgIGNhY2hlOiBuZXh0U3RhdGUuY2FjaGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IHByZXZTdGF0ZSksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHByZXZTdGF0ZSksXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDI1NilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICBsYXp5Q29tcG9uZW50LFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgfSBlbHNlIGlmIChsYXp5Q29tcG9uZW50ICE9PSBpbml0KSB7XG4gICAgICAgICAgICBpbml0ID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoXG4gICAgICAgICAgICAgIEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNDI0KSksXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcXVldWVIeWRyYXRpb25FcnJvcihpbml0KTtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICBsYXp5Q29tcG9uZW50LFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudC5ub2RlVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuYm9keTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjdXJyZW50ID1cbiAgICAgICAgICAgICAgICAgIFwiSFRNTFwiID09PSBjdXJyZW50Lm5vZGVOYW1lXG4gICAgICAgICAgICAgICAgICAgID8gY3VycmVudC5vd25lckRvY3VtZW50LmJvZHlcbiAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlKGN1cnJlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgaXNIeWRyYXRpbmcgPSAhMDtcbiAgICAgICAgICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gICAgICAgICAgICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITA7XG4gICAgICAgICAgICByZW5kZXJMYW5lcyA9IG1vdW50Q2hpbGRGaWJlcnMoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBsYXp5Q29tcG9uZW50LFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZvciAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJMYW5lczsgcmVuZGVyTGFuZXM7IClcbiAgICAgICAgICAgICAgKHJlbmRlckxhbmVzLmZsYWdzID0gKHJlbmRlckxhbmVzLmZsYWdzICYgLTMpIHwgNDA5NiksXG4gICAgICAgICAgICAgICAgKHJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXMuc2libGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgICAgaWYgKGxhenlDb21wb25lbnQgPT09IGluaXQpIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICBsYXp5Q29tcG9uZW50LFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgI
1HdvcmtJblByb2dyZXNzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgY2FzZSAyNjpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICBudWxsID09PSBjdXJyZW50XG4gICAgICAgICAgPyAocmVuZGVyTGFuZXMgPSBnZXRSZXNvdXJjZShcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApKVxuICAgICAgICAgICAgPyAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHJlbmRlckxhbmVzKVxuICAgICAgICAgICAgOiBpc0h5ZHJhdGluZyB8fFxuICAgICAgICAgICAgICAoKHJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3MudHlwZSksXG4gICAgICAgICAgICAgIChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzKSxcbiAgICAgICAgICAgICAgKGxhenlDb21wb25lbnQgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIoXG4gICAgICAgICAgICAgICAgcm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudFxuICAgICAgICAgICAgICApLmNyZWF0ZUVsZW1lbnQocmVuZGVyTGFuZXMpKSxcbiAgICAgICAgICAgICAgKGxhenlDb21wb25lbnRbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgIChsYXp5Q29tcG9uZW50W2ludGVybmFsUHJvcHNLZXldID0gY3VycmVudCksXG4gICAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGxhenlDb21wb25lbnQsIHJlbmRlckxhbmVzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShsYXp5Q29tcG9uZW50KSxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGxhenlDb21wb25lbnQpKVxuICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBnZXRSZXNvdXJjZShcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgICAgY3VycmVudC5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICAgIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgKSksXG4gICAgICAgIG51bGxcbiAgICAgICk7XG4gICAgY2FzZSAyNzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgICBpc0h5ZHJhdGluZyAmJlxuICAgICAgICAgICgobGF6eUNvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9XG4gICAgICAgICAgICByZXNvbHZlU2luZ2xldG9uSW5zdGFuY2UoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgICAgcm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudFxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgIChyb290T3JTaW5nbGV0b25Db250ZXh0ID0gITApLFxuICAgICAgICAgIChpbml0ID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSksXG4gICAgICAgICAgaXNTaW5nbGV0b25TY29wZSh3b3JrSW5Qcm9ncmVzcy50eXBlKVxuICAgICAgICAgICAgPyAoKHByZXZpb3VzSHlkcmF0YWJsZU9uRW50ZXJpbmdTY29wZWRTaW5nbGV0b24gPSBpbml0KSxcbiAgICAgICAgICAgICAgKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZShcbiAgICAgICAgICAgICAgICBsYXp5Q29tcG9uZW50LmZpcnN0Q2hpbGRcbiAgICAgICAgICAgICAgKSkpXG4gICAgICAgICAgICA6IChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaW5pdCkpLFxuICAgICAgICByZWNvbmNpbGVDaGlsZHJlbihcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICApLFxuICAgICAgICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgbnVsbCA9PT0gY3VycmVudCAmJiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNDE5NDMwNCksXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkXG4gICAgICApO1xuICAgIGNhc2UgNTpcbiAgICAgIGlmIChudWxsID09PSBjdXJyZW50ICYmIGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIGlmICgoaW5pdCA9IGxhenlDb21wb25lbnQgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlKSlcbiAgICAgICAgICAobGF6eUNvbXBvbmVudCA9IGNhbkh5ZHJhdGVJbnN0YW5jZShcbiAgICAgICAgICAgIGxhenlDb21wb25lbnQsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgcm9vdE9yU2luZ2xldG9uQ29udGV4dFxuICAgICAgICAgICkpLFxuICAgICAgICAgICAgbnVsbCAhPT0gbGF6eUNvbXBvbmVudFxuICAgICAgICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbGF6eUNvbXBvbmVudCksXG4gICAgICAgICAgICAgICAgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgIChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoXG4gICAgICAgICAgICAgICAgICBsYXp5Q29tcG9uZW50LmZpcnN0Q2hpbGRcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAocm9vdE9yU2luZ2xldG9uQ29udGV4dCA9ICExKSxcbiAgICAgICAgICAgICAgICAoaW5pdCA9ICEwKSlcbiAgICAgICAgICAgICAgOiAoaW5pdCA9ICExKTtcbiAgICAgICAgaW5pdCB8fCB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2god29ya0luUHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgICAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGluaXQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgbmV4dFN0YXRlID0gbnVsbCAhPT0gY3VycmVudCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG51bGw7XG4gICAgICBsYXp5Q29tcG9uZW50ID0gcHJldlN0YXRlLmNoaWxkcmVuO1xuICAgICAgc2hvdWxkU2V0VGV4dENvbnRlbnQoaW5pdCwgcHJldlN0YXRlKVxuICAgICAgICA/IChsYXp5Q29tcG9uZW50ID0gbnVsbClcbiAgICAgICAgOiBudWxsICE9PSBuZXh0U3RhdGUgJiZcbiAgICAgICAgICBzaG91bGRTZXRUZXh0Q29udGVudChpbml0LCBuZXh0U3RhdGUpICYmXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDMyKTtcbiAgICAgIG51bGwgIT09IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgKChpbml0ID0gcmVuZGVyV2l0aEhvb2tzKFxuICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgVHJhbnNpdGlvbkF3YXJlSG9zdENvbXBvbmVudCxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgKSksXG4gICAgICAgIChIb3N0VHJhbnNpdGlvbkNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IGluaXQpKTtcbiAgICAgIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGxhenlDb21wb25lbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgIHJldHVybi
1B3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICBjYXNlIDY6XG4gICAgICBpZiAobnVsbCA9PT0gY3VycmVudCAmJiBpc0h5ZHJhdGluZykge1xuICAgICAgICBpZiAoKGN1cnJlbnQgPSByZW5kZXJMYW5lcyA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2UpKVxuICAgICAgICAgIChyZW5kZXJMYW5lcyA9IGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UoXG4gICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgIHJvb3RPclNpbmdsZXRvbkNvbnRleHRcbiAgICAgICAgICApKSxcbiAgICAgICAgICAgIG51bGwgIT09IHJlbmRlckxhbmVzXG4gICAgICAgICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSByZW5kZXJMYW5lcyksXG4gICAgICAgICAgICAgICAgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgIChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbCksXG4gICAgICAgICAgICAgICAgKGN1cnJlbnQgPSAhMCkpXG4gICAgICAgICAgICAgIDogKGN1cnJlbnQgPSAhMSk7XG4gICAgICAgIGN1cnJlbnQgfHwgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgMTM6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBwdXNoSG9zdENvbnRhaW5lcihcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mb1xuICAgICAgICApLFxuICAgICAgICAobGF6eUNvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyksXG4gICAgICAgIG51bGwgPT09IGN1cnJlbnRcbiAgICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgbGF6eUNvbXBvbmVudCxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICkpXG4gICAgICAgICAgOiByZWNvbmNpbGVDaGlsZHJlbihcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIGxhenlDb21wb25lbnQsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZFxuICAgICAgKTtcbiAgICBjYXNlIDExOlxuICAgICAgcmV0dXJuIHVwZGF0ZUZvcndhcmRSZWYoXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgIHJlbmRlckxhbmVzXG4gICAgICApO1xuICAgIGNhc2UgNzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICksXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkXG4gICAgICApO1xuICAgIGNhc2UgODpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICksXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkXG4gICAgICApO1xuICAgIGNhc2UgMTI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICByZWNvbmNpbGVDaGlsZHJlbihcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICApLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZFxuICAgICAgKTtcbiAgICBjYXNlIDEwOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGxhenlDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMpLFxuICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIGxhenlDb21wb25lbnQudmFsdWUpLFxuICAgICAgICByZWNvbmNpbGVDaGlsZHJlbihcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIGxhenlDb21wb25lbnQuY2hpbGRyZW4sXG4gICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgKSxcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRcbiAgICAgICk7XG4gICAgY2FzZSA5OlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGluaXQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0KSxcbiAgICAgICAgKGxhenlDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW4pLFxuICAgICAgICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgIChpbml0ID0gcmVhZENvbnRleHQoaW5pdCkpLFxuICAgICAgICAobGF6eUNvbXBvbmVudCA9IGxhenlDb21wb25lbnQoaW5pdCkpLFxuICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMSksXG4gICAgICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBsYXp5Q29tcG9uZW50LCByZW5kZXJMYW5lcyksXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkXG4gICAgICApO1xuICAgIGNhc2UgMTQ6XG4gICAgICByZXR1cm4gdXBkYXRlTWVtb0NvbXBvbmVudChcbiAgICAgICAgY3VycmVudCxcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgI
1HdvcmtJblByb2dyZXNzLnR5cGUsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICk7XG4gICAgY2FzZSAxNTpcbiAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KFxuICAgICAgICBjdXJyZW50LFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgKTtcbiAgICBjYXNlIDE5OlxuICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIGNhc2UgMzE6XG4gICAgICByZXR1cm4gKFxuICAgICAgICAobGF6eUNvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyksXG4gICAgICAgIChyZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLm1vZGUpLFxuICAgICAgICAobGF6eUNvbXBvbmVudCA9IHtcbiAgICAgICAgICBtb2RlOiBsYXp5Q29tcG9uZW50Lm1vZGUsXG4gICAgICAgICAgY2hpbGRyZW46IGxhenlDb21wb25lbnQuY2hpbGRyZW5cbiAgICAgICAgfSksXG4gICAgICAgIG51bGwgPT09IGN1cnJlbnRcbiAgICAgICAgICA/ICgocmVuZGVyTGFuZXMgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoXG4gICAgICAgICAgICAgIGxhenlDb21wb25lbnQsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIChyZW5kZXJMYW5lcy5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWYpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgKHJlbmRlckxhbmVzLnJldHVybiA9IHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcyA9IHJlbmRlckxhbmVzKSlcbiAgICAgICAgICA6ICgocmVuZGVyTGFuZXMgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LmNoaWxkLCBsYXp5Q29tcG9uZW50KSksXG4gICAgICAgICAgICAocmVuZGVyTGFuZXMucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgIChyZW5kZXJMYW5lcy5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MgPSByZW5kZXJMYW5lcykpLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1xuICAgICAgKTtcbiAgICBjYXNlIDIyOlxuICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIGNhc2UgMjQ6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgIChsYXp5Q29tcG9uZW50ID0gcmVhZENvbnRleHQoQ2FjaGVDb250ZXh0KSksXG4gICAgICAgIG51bGwgPT09IGN1cnJlbnRcbiAgICAgICAgICA/ICgoaW5pdCA9IHBlZWtDYWNoZUZyb21Qb29sKCkpLFxuICAgICAgICAgICAgbnVsbCA9PT0gaW5pdCAmJlxuICAgICAgICAgICAgICAoKGluaXQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3QpLFxuICAgICAgICAgICAgICAocHJldlN0YXRlID0gY3JlYXRlQ2FjaGUoKSksXG4gICAgICAgICAgICAgIChpbml0LnBvb2xlZENhY2hlID0gcHJldlN0YXRlKSxcbiAgICAgICAgICAgICAgcHJldlN0YXRlLnJlZkNvdW50KyssXG4gICAgICAgICAgICAgIG51bGwgIT09IHByZXZTdGF0ZSAmJiAoaW5pdC5wb29sZWRDYWNoZUxhbmVzIHw9IHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgKGluaXQgPSBwcmV2U3RhdGUpKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0ge1xuICAgICAgICAgICAgICBwYXJlbnQ6IGxhenlDb21wb25lbnQsXG4gICAgICAgICAgICAgIGNhY2hlOiBpbml0XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENhY2hlQ29udGV4dCwgaW5pdCkpXG4gICAgICAgICAgOiAoMCAhPT0gKGN1cnJlbnQubGFuZXMgJiByZW5kZXJMYW5lcykgJiZcbiAgICAgICAgICAgICAgKGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG51bGwsIG51bGwsIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgc3VzcGVuZElmVXBkYXRlUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbigpKSxcbiAgICAgICAgICAgIChpbml0ID0gY3VycmVudC5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICAgIChwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICAgIGluaXQucGFyZW50ICE9PSBsYXp5Q29tcG9uZW50XG4gICAgICAgICAgICAgID8gKChpbml0ID0geyBwYXJlbnQ6IGxhenlDb21wb25lbnQsIGNhY2hlOiBsYXp5Q29tcG9uZW50IH0pLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5pdCksXG4gICAgICAgICAgICAgICAgMCA9PT0gd29ya0luUHJvZ3Jlc3MubGFuZXMgJiZcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID1cbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUuYmFzZVN0YXRlID1cbiAgICAgICAgICAgICAgICAgICAgICBpbml0KSxcbiAgICAgICAgICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENhY2hlQ29udGV4dCwgbGF6eUNvbXBvbmVudCkpXG4gICAgICAgICAgICAgIDogKChsYXp5Q29tcG9uZW50ID0gcHJldlN0YXRlLmNhY2hlKSxcbiAgICAgICAgICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENhY2hlQ29udGV4dCwgbGF6eUNvbXBvbmVudCksXG4gICAgICAgICAgICAgICAgbGF6eUNvbXBvbmVudCAhPT0gaW5pdC5jYWNoZSAmJlxuICAgICAgICAgICAgICAgICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZXMoXG4gICAgICAgICAgICAgICAgICAgI
1HdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgICBbQ2FjaGVDb250ZXh0XSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgICApKSksXG4gICAgICAgIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICksXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkXG4gICAgICApO1xuICAgIGNhc2UgMjk6XG4gICAgICB0aHJvdyB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIH1cbiAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNTYsIHdvcmtJblByb2dyZXNzLnRhZykpO1xufVxuZnVuY3Rpb24gbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcykge1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0O1xufVxuZnVuY3Rpb24gcHJlbG9hZFJlc291cmNlQW5kU3VzcGVuZElmTmVlZGVkKHdvcmtJblByb2dyZXNzLCByZXNvdXJjZSkge1xuICBpZiAoXCJzdHlsZXNoZWV0XCIgIT09IHJlc291cmNlLnR5cGUgfHwgMCAhPT0gKHJlc291cmNlLnN0YXRlLmxvYWRpbmcgJiA0KSlcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSAtMTY3NzcyMTc7XG4gIGVsc2UgaWYgKCgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTY3NzcyMTYpLCAhcHJlbG9hZFJlc291cmNlKHJlc291cmNlKSkpIHtcbiAgICByZXNvdXJjZSA9IHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgaWYgKFxuICAgICAgbnVsbCAhPT0gcmVzb3VyY2UgJiZcbiAgICAgICgod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA0MTk0MDQ4KSA9PT1cbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzXG4gICAgICAgID8gbnVsbCAhPT0gc2hlbGxCb3VuZGFyeVxuICAgICAgICA6ICgod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA2MjkxNDU2MCkgIT09XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgMCA9PT0gKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgNTM2ODcwOTEyKSkgfHxcbiAgICAgICAgICByZXNvdXJjZSAhPT0gc2hlbGxCb3VuZGFyeSlcbiAgICApXG4gICAgICB0aHJvdyAoXG4gICAgICAgICgoc3VzcGVuZGVkVGhlbmFibGUgPSBub29wU3VzcGVuc2V5Q29tbWl0VGhlbmFibGUpLFxuICAgICAgICBTdXNwZW5zZXlDb21taXRFeGNlcHRpb24pXG4gICAgICApO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDgxOTI7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlUmV0cnlFZmZlY3Qod29ya0luUHJvZ3Jlc3MsIHJldHJ5UXVldWUpIHtcbiAgbnVsbCAhPT0gcmV0cnlRdWV1ZSAmJiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNCk7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTYzODQgJiZcbiAgICAoKHJldHJ5UXVldWUgPVxuICAgICAgMjIgIT09IHdvcmtJblByb2dyZXNzLnRhZyA/IGNsYWltTmV4dFJldHJ5TGFuZSgpIDogNTM2ODcwOTEyKSxcbiAgICAod29ya0luUHJvZ3Jlc3MubGFuZXMgfD0gcmV0cnlRdWV1ZSksXG4gICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyB8PSByZXRyeVF1ZXVlKSk7XG59XG5mdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykge1xuICBpZiAoIWlzSHlkcmF0aW5nKVxuICAgIHN3aXRjaCAocmVuZGVyU3RhdGUudGFpbE1vZGUpIHtcbiAgICAgIGNhc2UgXCJoaWRkZW5cIjpcbiAgICAgICAgaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgZm9yICh2YXIgbGFzdFRhaWxOb2RlID0gbnVsbDsgbnVsbCAhPT0gaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrOyApXG4gICAgICAgICAgbnVsbCAhPT0gaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrLmFsdGVybmF0ZSAmJlxuICAgICAgICAgICAgKGxhc3RUYWlsTm9kZSA9IGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjayksXG4gICAgICAgICAgICAoaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrID0gaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrLnNpYmxpbmcpO1xuICAgICAgICBudWxsID09PSBsYXN0VGFpbE5vZGVcbiAgICAgICAgICA/IChyZW5kZXJTdGF0ZS50YWlsID0gbnVsbClcbiAgICAgICAgICA6IChsYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJjb2xsYXBzZWRcIjpcbiAgICAgICAgbGFzdFRhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgZm9yICh2YXIgbGFzdFRhaWxOb2RlJDExMyA9IG51bGw7IG51bGwgIT09IGxhc3RUYWlsTm9kZTsgKVxuICAgICAgICAgIG51bGwgIT09IGxhc3RUYWlsTm9kZS5hbHRlcm5hdGUgJiYgKGxhc3RUYWlsTm9kZSQxMTMgPSBsYXN0VGFpbE5vZGUpLFxuICAgICAgICAgICAgKGxhc3RUYWlsTm9kZSA9IGxhc3RUYWlsTm9kZS5zaWJsaW5nKTtcbiAgICAgICAgbnVsbCA9PT0gbGFzdFRhaWxOb2RlJDExM1xuICAgICAgICAgID8gaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrIHx8IG51bGwgPT09IHJlbmRlclN0YXRlLnRhaWxcbiAgICAgICAgICAgID8gKHJlbmRlclN0YXRlLnRhaWwgPSBudWxsKVxuICAgICAgICAgICAgOiAocmVuZGVyU3RhdGUudGFpbC5zaWJsaW5nID0gbnVsbClcbiAgICAgICAgICA6IChsYXN0VGFpbE5vZGUkMTEzLnNpYmxpbmcgPSBudWxsKTtcbiAgICB9XG59XG5mdW5jdGlvbiBidWJibGVQcm9wZXJ0aWVzKGNvbXBsZXRlZFdvcmspIHtcbiAgdmFyIGRpZEJhaWxvdXQgPVxuICAgICAgbnVsbCAhPT0gY29tcGxldGVkV29yay5hbHRlcm5hdGUgJiZcbiAgICAgIGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlLmNoaWxkID09PSBjb21wbGV0ZWRXb3JrLmNoaWxkLFxuICAgIG5ld0NoaWxkTGFuZXMgPSAwLFxuICAgIHN1YnRyZWVGbGFncyA9IDA7XG4gIGlmIChkaWRCYWlsb3V0KVxuICAgIGZvciAodmFyIGNoaWxkJDExNCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7IG51bGwgIT09IGNoaWxkJDExNDsgKVxuICAgICAgKG5ld0NoaWxkTGFuZXMgfD0gY2hpbGQkMTE0LmxhbmVzIHwgY2hpbGQkMTE0LmNoaWxkTGFuZXMpLFxuICAgICAgICAoc3VidHJlZUZsYWdzIHw9IGNoaWxkJDExNC5zdWJ0cmVlRmxhZ3MgJiA2NTAxMTcxMiksXG4gICAgICAgIChzdWJ0cmVlRmxhZ3MgfD0gY2hpbGQkMTE0LmZsYWdzICYgNjUwMTE3MTIpLFxuICAgICAgICAoY2hpbGQkMTE0LnJldHVybiA9IGNvbXBsZXRlZFdvcmspLFxuICAgICAgICAoY2hpbGQkMTE0ID0gY2hpbGQkMTE0LnNpYmxpbmcpO1xuICBlbHNlXG4gICAgZm9yIChjaGlsZCQxMTQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkOyBudWxsICE9PSBjaGlsZCQxMTQ7IClcbiAgICAgIChuZXdDaGlsZExhbmVzIHw9IGNoaWxkJDExNC5sYW5lcyB8IGNoaWxkJDExNC5jaGlsZExhbmVzKSxcbiAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBjaGlsZCQxMTQuc3VidHJlZUZsYWdzKSxcbiAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBjaGlsZCQxMTQuZmxhZ3MpLFxuICAgICAgICAoY2hpbGQkMTE0LnJldHVybiA9IGNvbXBsZXRlZFdvcmspLFxuICAgICAgICAoY2hpbGQkMTE0ID0gY2hpbGQkMTE0LnNpYmxpbmcpO1xuICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7XG4gIGNvbXBsZXRlZFdvcmsuY2hpbGRMYW5lcyA9IG5ld0NoaWxkTGFuZXM7XG4gIHJldHVybi
1BkaWRCYWlsb3V0O1xufVxuZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIDMxOlxuICAgIGNhc2UgMTY6XG4gICAgY2FzZSAxNTpcbiAgICBjYXNlIDA6XG4gICAgY2FzZSAxMTpcbiAgICBjYXNlIDc6XG4gICAgY2FzZSA4OlxuICAgIGNhc2UgMTI6XG4gICAgY2FzZSA5OlxuICAgIGNhc2UgMTQ6XG4gICAgICByZXR1cm4gYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksIG51bGw7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLCBudWxsO1xuICAgIGNhc2UgMzpcbiAgICAgIHJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgbmV3UHJvcHMgPSBudWxsO1xuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiAobmV3UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUuY2FjaGUpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZS5jYWNoZSAhPT0gbmV3UHJvcHMgJiZcbiAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDIwNDgpO1xuICAgICAgcG9wUHJvdmlkZXIoQ2FjaGVDb250ZXh0KTtcbiAgICAgIHBvcEhvc3RDb250YWluZXIoKTtcbiAgICAgIHJlbmRlckxhbmVzLnBlbmRpbmdDb250ZXh0ICYmXG4gICAgICAgICgocmVuZGVyTGFuZXMuY29udGV4dCA9IHJlbmRlckxhbmVzLnBlbmRpbmdDb250ZXh0KSxcbiAgICAgICAgKHJlbmRlckxhbmVzLnBlbmRpbmdDb250ZXh0ID0gbnVsbCkpO1xuICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQgfHwgbnVsbCA9PT0gY3VycmVudC5jaGlsZClcbiAgICAgICAgcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpXG4gICAgICAgICAgPyBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgIDogbnVsbCA9PT0gY3VycmVudCB8fFxuICAgICAgICAgICAgKGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQgJiZcbiAgICAgICAgICAgICAgMCA9PT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMjU2KSkgfHxcbiAgICAgICAgICAgICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTAyNCksXG4gICAgICAgICAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAyNjpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChyZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUpLFxuICAgICAgICBudWxsID09PSBjdXJyZW50XG4gICAgICAgICAgPyAobWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBudWxsICE9PSByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICA/IChidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICBwcmVsb2FkUmVzb3VyY2VBbmRTdXNwZW5kSWZOZWVkZWQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSlcbiAgICAgICAgICAgICAgOiAoYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzICY9IC0xNjc3NzIxNykpKVxuICAgICAgICAgIDogcmVuZGVyTGFuZXNcbiAgICAgICAgICAgID8gcmVuZGVyTGFuZXMgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgICA/IChtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICBwcmVsb2FkUmVzb3VyY2VBbmRTdXNwZW5kSWZOZWVkZWQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSlcbiAgICAgICAgICAgICAgOiAoYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzICY9IC0xNjc3NzIxNykpXG4gICAgICAgICAgICA6IChjdXJyZW50Lm1lbW9pemVkUHJvcHMgIT09IG5ld1Byb3BzICYmIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzICY9IC0xNjc3NzIxNykpLFxuICAgICAgICBudWxsXG4gICAgICApO1xuICAgIGNhc2UgMjc6XG4gICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZW5kZXJMYW5lcyA9IHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgICB2Y
1XIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiBudWxsICE9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSlcbiAgICAgICAgY3VycmVudC5tZW1vaXplZFByb3BzICE9PSBuZXdQcm9wcyAmJiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgaWYgKG51bGwgPT09IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTY2KSk7XG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICA/IHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQpXG4gICAgICAgICAgOiAoKGN1cnJlbnQgPSByZXNvbHZlU2luZ2xldG9uSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudCksXG4gICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSk7XG4gICAgICB9XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgNTpcbiAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgIGlmIChudWxsICE9PSBjdXJyZW50ICYmIG51bGwgIT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlKVxuICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHMgIT09IG5ld1Byb3BzICYmIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICghbmV3UHJvcHMpIHtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNjYpKTtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgICAgIGlmIChwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcykpXG4gICAgICAgICAgcHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3VycmVudCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHR5cGUgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIoXG4gICAgICAgICAgICByb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgY3VycmVudCA9IHR5cGUuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgY3VycmVudCA9IHR5cGUuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiLFxuICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgc3dpdGNoIChyZW5kZXJMYW5lcykge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdmdcIjpcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0eXBlLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICAgICAgICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtYXRoXCI6XG4gICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdHlwZS5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAgICAgICAgICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0eXBlLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50LmlubmVySFRNTCA9IFwiPHNjcmlwdD5cXHgzYy9zY3JpcHQ+XCI7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5yZW1vdmVDaGlsZChjdXJyZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICAgICAgICAgICAgY3VycmVudCA9XG4gICAgICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBuZXdQcm9wcy5pc1xuICAgICAgICAgICAgICAgICAgICAgID8gdHlwZS5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIsIHsgaXM6IG5ld1Byb3BzLmlzIH0pXG4gICAgICAgICAgICAgICAgICAgICAgOiB0eXBlLmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIik7XG4gICAgICAgICAgICAgICAgICBuZXdQcm9wcy5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICA/IChjdXJyZW50Lm11bHRpcGxlID0gITApXG4gICAgICAgICAgICAgICAgICAgIDogbmV3UHJvcHMuc2l6ZSAmJiAoY3VycmVudC5zaXplID0gbmV3UHJvcHMuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgY3VycmVudCA9XG4gICAgICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBuZXdQcm9wcy5pc1xuICAgICAgICAgICAgICAgICAgICAgID8gdHlwZS5jcmVhdGVFbGVtZW50KHJlbmRlckxhbmVzLCB7IGlzOiBuZXdQcm9wcy5pcyB9KVxuICAgICAgICAgICAgICAgICAgICAgIDogdHlwZS5jcmVhdGVFbGVtZW50KHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgI
1H1cbiAgICAgICAgICBjdXJyZW50W2ludGVybmFsSW5zdGFuY2VLZXldID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgY3VycmVudFtpbnRlcm5hbFByb3BzS2V5XSA9IG5ld1Byb3BzO1xuICAgICAgICAgIGE6IGZvciAodHlwZSA9IHdvcmtJblByb2dyZXNzLmNoaWxkOyBudWxsICE9PSB0eXBlOyApIHtcbiAgICAgICAgICAgIGlmICg1ID09PSB0eXBlLnRhZyB8fCA2ID09PSB0eXBlLnRhZylcbiAgICAgICAgICAgICAgY3VycmVudC5hcHBlbmRDaGlsZCh0eXBlLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICBlbHNlIGlmICg0ICE9PSB0eXBlLnRhZyAmJiAyNyAhPT0gdHlwZS50YWcgJiYgbnVsbCAhPT0gdHlwZS5jaGlsZCkge1xuICAgICAgICAgICAgICB0eXBlLmNoaWxkLnJldHVybiA9IHR5cGU7XG4gICAgICAgICAgICAgIHR5cGUgPSB0eXBlLmNoaWxkO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09PSB3b3JrSW5Qcm9ncmVzcykgYnJlYWsgYTtcbiAgICAgICAgICAgIGZvciAoOyBudWxsID09PSB0eXBlLnNpYmxpbmc7ICkge1xuICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gdHlwZS5yZXR1cm4gfHwgdHlwZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIHR5cGUgPSB0eXBlLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHR5cGUuc2libGluZy5yZXR1cm4gPSB0eXBlLnJldHVybjtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLnNpYmxpbmc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGN1cnJlbnQ7XG4gICAgICAgICAgYTogc3dpdGNoIChcbiAgICAgICAgICAgIChzZXRJbml0aWFsUHJvcGVydGllcyhjdXJyZW50LCByZW5kZXJMYW5lcywgbmV3UHJvcHMpLCByZW5kZXJMYW5lcylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNhc2UgXCJidXR0b25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICAgICAgY2FzZSBcInRleHRhcmVhXCI6XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSAhIW5ld1Byb3BzLmF1dG9Gb2N1cztcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICAgICAgY3VycmVudCA9ICEwO1xuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY3VycmVudCA9ICExO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50ICYmIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IC0xNjc3NzIxNztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgNjpcbiAgICAgIGlmIChjdXJyZW50ICYmIG51bGwgIT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlKVxuICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHMgIT09IG5ld1Byb3BzICYmIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChcInN0cmluZ1wiICE9PSB0eXBlb2YgbmV3UHJvcHMgJiYgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlKVxuICAgICAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTY2KSk7XG4gICAgICAgIGN1cnJlbnQgPSByb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50O1xuICAgICAgICBpZiAocG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgICAgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICByZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgbmV3UHJvcHMgP
1SBudWxsO1xuICAgICAgICAgIHR5cGUgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gdHlwZSlcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS50YWcpIHtcbiAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gdHlwZS5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICBjdXJyZW50ID1cbiAgICAgICAgICAgIGN1cnJlbnQubm9kZVZhbHVlID09PSByZW5kZXJMYW5lcyB8fFxuICAgICAgICAgICAgKG51bGwgIT09IG5ld1Byb3BzICYmICEwID09PSBuZXdQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpIHx8XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoY3VycmVudC5ub2RlVmFsdWUsIHJlbmRlckxhbmVzKVxuICAgICAgICAgICAgICA/ICEwXG4gICAgICAgICAgICAgIDogITE7XG4gICAgICAgICAgY3VycmVudCB8fCB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2god29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAoY3VycmVudCA9XG4gICAgICAgICAgICBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIoY3VycmVudCkuY3JlYXRlVGV4dE5vZGUoXG4gICAgICAgICAgICAgIG5ld1Byb3BzXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIChjdXJyZW50W2ludGVybmFsSW5zdGFuY2VLZXldID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlIDEzOlxuICAgICAgbmV3UHJvcHMgP
1SB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgaWYgKFxuICAgICAgICBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgIChudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZClcbiAgICAgICkge1xuICAgICAgICB0eXBlID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBpZiAobnVsbCAhPT0gbmV3UHJvcHMgJiYgbnVsbCAhPT0gbmV3UHJvcHMuZGVoeWRyYXRlZCkge1xuICAgICAgICAgIGlmIChudWxsID09PSBjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAoIXR5cGUpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzE4KSk7XG4gICAgICAgICAgICB0eXBlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHR5cGUgPSBudWxsICE9PSB0eXBlID8gdHlwZS5kZWh5ZHJhdGVkIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghdHlwZSkgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMTcpKTtcbiAgICAgICAgICAgIHR5cGVbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKSxcbiAgICAgICAgICAgICAgMCA9PT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KSAmJlxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbCksXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KTtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB0eXBlID0gITE7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICh0eXBlID0gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSksXG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICAoY3VycmVudC5tZW1vaXplZFN0YXRlLmh5ZHJhdGlvbkVycm9ycyA9IHR5cGUpLFxuICAgICAgICAgICAgKHR5cGUgPSAhMCk7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDI1NilcbiAgICAgICAgICAgIHJldHVybiBwb3BTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpLCB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICBwb3BTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwb3BTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgaWYgKDAgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOCkpXG4gICAgICAgIHJldHVybiAod29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lcyksIHdvcmtJblByb2dyZXNzO1xuICAgICAgcmVuZGVyTGFuZXMgPSBudWxsICE9PSBuZXdQcm9wcztcbiAgICAgIGN1cnJlbnQgPSBudWxsICE9PSBjdXJyZW50ICYmIG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIGlmIChyZW5kZXJMYW5lcykge1xuICAgICAgICBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICB0eXBlID0gbnVsbDtcbiAgICAgICAgbnVsbCAhPT0gbmV3UHJvcHMuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgbnVsbCAhPT0gbmV3UHJvcHMuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICBudWxsICE9PSBuZXdQcm9wcy5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wgJiZcbiAgICAgICAgICAodHlwZSA9IG5ld1Byb3BzLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKTtcbiAgICAgICAgdmFyIGNhY2hlJDEyNyA9IG51bGw7XG4gICAgICAgIG51bGwgIT09IG5ld1Byb3BzLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICBudWxsICE9PSBuZXdQcm9wcy5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbCAmJlxuICAgICAgICAgIChjYWNoZSQxMjcgPSBuZXdQcm9wcy5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKTtcbiAgICAgICAgY2FjaGUkMTI3ICE9PSB0eXBlICYmIChuZXdQcm9wcy5mbGFncyB8PSAyMDQ4KTtcbiAgICAgIH1cbiAgICAgIHJlbmRlckxhbmVzICE9PSBjdXJyZW50ICYmXG4gICAgICAgIHJlbmRlckxhbmVzICYmXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZC5mbGFncyB8PSA4MTkyKTtcbiAgICAgIHNjaGVkdWxlUmV0cnlFZmZlY3Qod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcigpLFxuICAgICAgICBudWxsID09PSBjdXJyZW50ICYmXG4gICAgICAgICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLFxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcbiAgICBjYXNlIDEwOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgcG9wUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MudHlwZSksIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLCBudWxsXG4gICAgICApO1xuICAgIGNhc2UgMTk6XG4gICAgICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvcik7XG4gICAgICB0eXBlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIGlmIChudWxsID09PSB0eXBlKSByZXR1cm4gYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksIG51bGw7XG4gICAgICBuZXdQcm9wcyA9IDAgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOCk7XG4gICAgICBjYWNoZSQxMjcgPSB0eXBlLnJlbmRlcmluZztcbiAgICAgIGlmIChudWxsID09PSBjYWNoZS
1QxMjcpXG4gICAgICAgIGlmIChuZXdQcm9wcykgY3V0T2ZmVGFpbElmTmVlZGVkKHR5cGUsICExKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgMCAhPT0gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyB8fFxuICAgICAgICAgICAgKG51bGwgIT09IGN1cnJlbnQgJiYgMCAhPT0gKGN1cnJlbnQuZmxhZ3MgJiAxMjgpKVxuICAgICAgICAgIClcbiAgICAgICAgICAgIGZvciAoY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkOyBudWxsICE9PSBjdXJyZW50OyApIHtcbiAgICAgICAgICAgICAgY2FjaGUkMTI3ID0gZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnQpO1xuICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gY2FjaGUkMTI3KSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4O1xuICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZCh0eXBlLCAhMSk7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGNhY2hlJDEyNy51cGRhdGVRdWV1ZTtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVSZXRyeUVmZmVjdCh3b3JrSW5Qcm9ncmVzcywgY3VycmVudCk7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gMDtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gcmVuZGVyTGFuZXM7XG4gICAgICAgICAgICAgICAgZm9yIChyZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkOyBudWxsICE9PSByZW5kZXJMYW5lczsgKVxuICAgICAgICAgICAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzcyhyZW5kZXJMYW5lcywgY3VycmVudCksXG4gICAgICAgICAgICAgICAgICAgIChyZW5kZXJMYW5lcyA9IHJlbmRlckxhbmVzLnNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICAgICAgICBzdXNwZW5zZVN0YWNrQ3Vyc29yLFxuICAgICAgICAgICAgICAgICAgKHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCAmIDEpIHwgMlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgbnVsbCAhPT0gdHlwZS50YWlsICYmXG4gICAgICAgICAgICBub3coKSA+IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgJiZcbiAgICAgICAgICAgICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4KSxcbiAgICAgICAgICAgIChuZXdQcm9wcyA9ICEwKSxcbiAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZCh0eXBlLCAhMSksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubGFuZXMgPSA0MTk0MzA0KSk7XG4gICAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoIW5ld1Byb3BzKVxuICAgICAgICAgIGlmICgoKGN1cnJlbnQgPSBmaW5kRmlyc3RTdXNwZW5kZWQoY2FjaGUkMTI3KSksIG51bGwgIT09IGN1cnJlbnQpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4KSxcbiAgICAgICAgICAgICAgKG5ld1Byb3BzID0gITApLFxuICAgICAgICAgICAgICAoY3VycmVudCA9IGN1cnJlbnQudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50KSxcbiAgICAgICAgICAgICAgc2NoZWR1bGVSZXRyeUVmZmVjdCh3b3JrSW5Qcm9ncmVzcywgY3VycmVudCksXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZCh0eXBlLCAhMCksXG4gICAgICAgICAgICAgIG51bGwgPT09IHR5cGUudGFpbCAmJlxuICAgICAgICAgICAgICAgIFwiaGlkZGVuXCIgPT09IHR5cGUudGFpbE1vZGUgJiZcbiAgICAgICAgICAgICAgICAhY2FjaGUkMTI3LmFsdGVybmF0ZSAmJlxuICAgICAgICAgICAgICAgICFpc0h5ZHJhdGluZylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgcmV0dXJuIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLCBudWxsO1xuICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgMiAqIG5vdygpIC0gdHlwZS5yZW5kZXJpbmdTdGFydFRpbWUgPlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lICYmXG4gICAgICAgICAgICAgIDUzNjg3MDkxMiAhPT0gcmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpLFxuICAgICAgICAgICAgICAobmV3UHJvcHMgP
1SAhMCksXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZCh0eXBlLCAhMSksXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IDQxOTQzMDQpKTtcbiAgICAgICAgdHlwZS5pc0JhY2t3YXJkc1xuICAgICAgICAgID8gKChjYWNoZSQxMjcuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNhY2hlJDEyNykpXG4gICAgICAgICAgOiAoKGN1cnJlbnQgPSB0eXBlLmxhc3QpLFxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudFxuICAgICAgICAgICAgICA/IChjdXJyZW50LnNpYmxpbmcgPSBjYWNoZSQxMjcpXG4gICAgICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2FjaGUkMTI3KSxcbiAgICAgICAgICAgICh0eXBlLmxhc3QgPSBjYWNoZSQxMjcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChudWxsICE9PSB0eXBlLnRhaWwpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gdHlwZS50YWlsKSxcbiAgICAgICAgICAodHlwZS5yZW5kZXJpbmcgPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgKHR5cGUudGFpbCA9IHdvcmtJblByb2dyZXNzLnNpYmxpbmcpLFxuICAgICAgICAgICh0eXBlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IG5vdygpKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG51bGwpLFxuICAgICAgICAgIChjdXJyZW50ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSxcbiAgICAgICAgICBwdXNoKHN1c3BlbnNlU3RhY2tDdXJzb3IsIG5ld1Byb3BzID8gKGN1cnJlbnQgJiAxKSB8IDIgOiBjdXJyZW50ICYgMSksXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAyMjpcbiAgICBjYXNlIDIzOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgcG9wU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgcG9wSGlkZGVuQ29udGV4dCgpLFxuICAgICAgICAobmV3UHJvcHMgP
1SBudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudFxuICAgICAgICAgID8gKG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkgIT09IG5ld1Byb3BzICYmXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gODE5MilcbiAgICAgICAgICA6IG5ld1Byb3BzICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA4MTkyKSxcbiAgICAgICAgbmV3UHJvcHNcbiAgICAgICAgICA/IDAgIT09IChyZW5kZXJMYW5lcyAmIDUzNjg3MDkxMikgJiZcbiAgICAgICAgICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOCkgJiZcbiAgICAgICAgICAgIChidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyAmIDYgJiYgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDgxOTIpKVxuICAgICAgICAgIDogYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgIChyZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlKSxcbiAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICBzY2hlZHVsZVJldHJ5RWZmZWN0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcy5yZXRyeVF1ZXVlKSxcbiAgICAgICAgKHJlbmRlckxhbmVzID0gbnVsbCksXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUuY2FjaGVQb29sICYmXG4gICAgICAgICAgKHJlbmRlckxhbmVzID0gY3VycmVudC5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKSxcbiAgICAgICAgKG5ld1Byb3BzID0gbnVsbCksXG4gICAgICAgIG51bGwgIT09IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbCAmJlxuICAgICAgICAgIChuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUuY2FjaGVQb29sLnBvb2wpLFxuICAgICAgICBuZXdQcm9wcyAhPT0gcmVuZGVyTGFuZXMgJiYgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDIwNDgpLFxuICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIHBvcChyZXN1bWVkQ2FjaGUpLFxuICAgICAgICBudWxsXG4gICAgICApO1xuICAgIGNhc2UgMjQ6XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocmVuZGVyTGFuZXMgPSBudWxsKSxcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiAocmVuZGVyTGFuZXMgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUuY2FjaGUpLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlLmNhY2hlICE9PSByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyMDQ4KSxcbiAgICAgICAgcG9wUHJvdmlkZXIoQ2FjaGVDb250ZXh0KSxcbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgIG51bGxcbiAgICAgICk7XG4gICAgY2FzZSAyNTpcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgMzA6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1Niwgd29ya0luUHJvZ3Jlc3MudGFnKSk7XG59XG5mdW5jdGlvbiB1bndpbmRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmZsYWdzKSxcbiAgICAgICAgY3VycmVudCAmIDY1NTM2XG4gICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzLmZsYWdzID0gKGN1cnJlbnQgJiAtNjU1MzcpIHwgMTI4KSwgd29ya0luUHJvZ3Jlc3MpXG4gICAgICAgICAgOiBudWxsXG4gICAgICApO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHBvcFByb3ZpZGVyKENhY2hlQ29udGV4dCksXG4gICAgICAgIHBvcEhvc3RDb250YWluZXIoKSxcbiAgICAgICAgKGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncyksXG4gICAgICAgIDAgIT09IChjdXJyZW50ICYgNjU1MzYpICYmIDAgPT09IChjdXJyZW50ICYgMTI4KVxuICAgICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IChjdXJyZW50ICYgLTY1NTM3KSB8IDEyOCksIHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgIDogbnVsbFxuICAgICAgKTtcbiAgICBjYXNlIDI2OlxuICAgIGNhc2UgMjc6XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICBjYXNlIDEzOlxuICAgICAgcG9wU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5kZWh5ZHJhdGVkKSB7XG4gICAgICAgIGlmIChudWxsID09PSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzNDApKTtcbiAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuICAgICAgcmV0dXJuIGN1cnJlbnQgJiA2NTUzNlxuICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAoY3VycmVudCAmIC02NTUzNykgfCAxMjgpLCB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgOiBudWxsO1xuICAgIGNhc2UgMTk6XG4gICAgICByZXR1cm4gcG9wKHN1c3BlbnNlU3RhY2tDdXJzb3IpLCBudWxsO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBwb3BIb3N0Q29udGFpbmVyKCksIG51bGw7XG4gICAgY2FzZSAxMDpcbiAgICAgIHJldHVybi
1Bwb3BQcm92aWRlcih3b3JrSW5Qcm9ncmVzcy50eXBlKSwgbnVsbDtcbiAgICBjYXNlIDIyOlxuICAgIGNhc2UgMjM6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBwb3BTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICBwb3BIaWRkZW5Db250ZXh0KCksXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgcG9wKHJlc3VtZWRDYWNoZSksXG4gICAgICAgIChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MpLFxuICAgICAgICBjdXJyZW50ICYgNjU1MzZcbiAgICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAoY3VycmVudCAmIC02NTUzNykgfCAxMjgpLCB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICA6IG51bGxcbiAgICAgICk7XG4gICAgY2FzZSAyNDpcbiAgICAgIHJldHVybiBwb3BQcm92aWRlcihDYWNoZUNvbnRleHQpLCBudWxsO1xuICAgIGNhc2UgMjU6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmspIHtcbiAgcG9wVHJlZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgY2FzZSAzOlxuICAgICAgcG9wUHJvdmlkZXIoQ2FjaGVDb250ZXh0KTtcbiAgICAgIHBvcEhvc3RDb250YWluZXIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjY6XG4gICAgY2FzZSAyNzpcbiAgICBjYXNlIDU6XG4gICAgICBwb3BIb3N0Q29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgcG9wSG9zdENvbnRhaW5lcigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMzpcbiAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOTpcbiAgICAgIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTA6XG4gICAgICBwb3BQcm92aWRlcihpbnRlcnJ1cHRlZFdvcmsudHlwZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDIyOlxuICAgIGNhc2UgMjM6XG4gICAgICBwb3BTdXNwZW5zZUhhbmRsZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIHBvcEhpZGRlbkNvbnRleHQoKTtcbiAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgcG9wKHJlc3VtZWRDYWNoZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI0OlxuICAgICAgcG9wUHJvdmlkZXIoQ2FjaGVDb250ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChmbGFncywgZmluaXNoZWRXb3JrKSB7XG4gIHRyeSB7XG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlLFxuICAgICAgbGFzdEVmZmVjdCA9IG51bGwgIT09IHVwZGF0ZVF1ZXVlID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG4gICAgaWYgKG51bGwgIT09IGxhc3RFZmZlY3QpIHtcbiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgIHVwZGF0ZVF1ZXVlID0gZmlyc3RFZmZlY3Q7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICgodXBkYXRlUXVldWUudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICAgIGxhc3RFZmZlY3QgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIGNyZWF0ZSA9IHVwZGF0ZVF1ZXVlLmNyZWF0ZSxcbiAgICAgICAgICAgIGluc3QgPSB1cGRhdGVRdWV1ZS5pbnN0O1xuICAgICAgICAgIGxhc3RFZmZlY3QgPSBjcmVhdGUoKTtcbiAgICAgICAgICBpbnN0LmRlc3Ryb3kgPSBsYXN0RWZmZWN0O1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWUubmV4dDtcbiAgICAgIH0gd2hpbGUgKHVwZGF0ZVF1ZXVlICE9PSBmaXJzdEVmZmVjdCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICB9XG59XG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoXG4gIGZsYWdzLFxuICBmaW5pc2hlZFdvcmssXG4gIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IkanNjb21wJDBcbikge1xuICB0cnkge1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSxcbiAgICAgIGxhc3RFZmZlY3QgPSBudWxsICE9PSB1cGRhdGVRdWV1ZSA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuICAgIGlmIChudWxsICE9PSBsYXN0RWZmZWN0KSB7XG4gICAgICB2Y
1XIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICB1cGRhdGVRdWV1ZSA9IGZpcnN0RWZmZWN0O1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKHVwZGF0ZVF1ZXVlLnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAgICB2YXIgaW5zdCA9IHVwZGF0ZVF1ZXVlLmluc3QsXG4gICAgICAgICAgICBkZXN0cm95ID0gaW5zdC5kZXN0cm95O1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IGRlc3Ryb3kpIHtcbiAgICAgICAgICAgIGluc3QuZGVzdHJveSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGxhc3RFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgICAgICAgICB2YXIgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciA9IG5lYXJlc3RNb3VudGVkQW5jZXN0b3IkanNjb21wJDAsXG4gICAgICAgICAgICAgIGRlc3Ryb3lfID0gZGVzdHJveTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGRlc3Ryb3lfKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihcbiAgICAgICAgICAgICAgICBsYXN0RWZmZWN0LFxuICAgICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlUXVldWUgPSB1cGRhdGVRdWV1ZS5uZXh0O1xuICAgICAgfSB3aGlsZSAodXBkYXRlUXVldWUgIT09IGZpcnN0RWZmZWN0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbW1pdENsYXNzQ2FsbGJhY2tzKGZpbmlzaGVkV29yaykge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIGlmIChudWxsICE9PSB1cGRhdGVRdWV1ZSkge1xuICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdENhbGxiYWNrcyh1cGRhdGVRdWV1ZSwgaW5zdGFuY2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChcbiAgY3VycmVudCxcbiAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgaW5zdGFuY2Vcbikge1xuICBpbnN0YW5jZS5wcm9wcyA9IHJlc29sdmVDbGFzc0NvbXBvbmVudFByb3BzKFxuICAgIGN1cnJlbnQudHlwZSxcbiAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHNcbiAgKTtcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHRyeSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIHNhZmVseUF0dGFjaFJlZihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgdmFyIHJlZiA9IGN1cnJlbnQucmVmO1xuICAgIGlmIChudWxsICE9PSByZWYpIHtcbiAgICAgIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHZhciBpbnN0YW5jZVRvVXNlID0gY3VycmVudC5zdGF0ZU5vZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGluc3RhbmNlVG9Vc2UgPSBjdXJyZW50LnN0YXRlTm9kZTtcbiAgICAgIH1cbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlZlxuICAgICAgICA/IChjdXJyZW50LnJlZkNsZWFudXAgPSByZWYoaW5zdGFuY2VUb1VzZSkpXG4gICAgICAgIDogKHJlZi5jdXJyZW50ID0gaW5zdGFuY2VUb1VzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuZnVuY3Rpb24gc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHJlZiA9IGN1cnJlbnQucmVmLFxuICAgIHJlZkNsZWFudXAgPSBjdXJyZW50LnJlZkNsZWFudXA7XG4gIGlmIChudWxsICE9PSByZWYpXG4gICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlZkNsZWFudXApXG4gICAgICB0cnkge1xuICAgICAgICByZWZDbGVhbnVwKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAoY3VycmVudC5yZWZDbGVhbnVwID0gbnVsbCksXG4gICAgICAgICAgKGN1cnJlbnQgPSBjdXJyZW50LmFsdGVybmF0ZSksXG4gICAgICAgICAgbnVsbCAhPSBjdXJyZW50ICYmIChjdXJyZW50LnJlZkNsZWFudXAgPSBudWxsKTtcbiAgICAgIH1cbiAgICBlbHNlIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZWYpXG4gICAgICB0cnkge1xuICAgICAgICByZWYobnVsbCk7XG4gICAgICB9IGNhdGNoIChlcnJvciQxNDMpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IkMTQzKTtcbiAgICAgIH1cbiAgICBlbHNlIHJlZi5jdXJyZW50ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNvbW1pdEhvc3RNb3VudChmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZSxcbiAgICBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgdHJ5IHtcbiAgICBhOiBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJidXR0b25cIjpcbiAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgY2FzZSBcInRleHRhcmVhXCI6XG4gICAgICAgI
1HByb3BzLmF1dG9Gb2N1cyAmJiBpbnN0YW5jZS5mb2N1cygpO1xuICAgICAgICBicmVhayBhO1xuICAgICAgY2FzZSBcImltZ1wiOlxuICAgICAgICBwcm9wcy5zcmNcbiAgICAgICAgICA/IChpbnN0YW5jZS5zcmMgPSBwcm9wcy5zcmMpXG4gICAgICAgICAgOiBwcm9wcy5zcmNTZXQgJiYgKGluc3RhbmNlLnNyY3NldCA9IHByb3BzLnNyY1NldCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICB9XG59XG5mdW5jdGlvbiBjb21taXRIb3N0VXBkYXRlKGZpbmlzaGVkV29yaywgbmV3UHJvcHMsIG9sZFByb3BzKSB7XG4gIHRyeSB7XG4gICAgdmFyIGRvbUVsZW1lbnQgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgZmluaXNoZWRXb3JrLnR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG4gICAgZG9tRWxlbWVudFtpbnRlcm5hbFByb3BzS2V5XSA9IG5ld1Byb3BzO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICB9XG59XG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIChcbiAgICA1ID09PSBmaWJlci50YWcgfHxcbiAgICAzID09PSBmaWJlci50YWcgfHxcbiAgICAyNiA9PT0gZmliZXIudGFnIHx8XG4gICAgKDI3ID09PSBmaWJlci50YWcgJiYgaXNTaW5nbGV0b25TY29wZShmaWJlci50eXBlKSkgfHxcbiAgICA0ID09PSBmaWJlci50YWdcbiAgKTtcbn1cbmZ1bmN0aW9uIGdldEhvc3RTaWJsaW5nKGZpYmVyKSB7XG4gIGE6IGZvciAoOzspIHtcbiAgICBmb3IgKDsgbnVsbCA9PT0gZmliZXIuc2libGluZzsgKSB7XG4gICAgICBpZiAobnVsbCA9PT0gZmliZXIucmV0dXJuIHx8IGlzSG9zdFBhcmVudChmaWJlci5yZXR1cm4pKSByZXR1cm4gbnVsbDtcbiAgICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICAgIH1cbiAgICBmaWJlci5zaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICBmb3IgKFxuICAgICAgZmliZXIgPSBmaWJlci5zaWJsaW5nO1xuICAgICAgNSAhPT0gZmliZXIudGFnICYmIDYgIT09IGZpYmVyLnRhZyAmJiAxOCAhPT0gZmliZXIudGFnO1xuXG4gICAgKSB7XG4gICAgICBpZiAoMjcgPT09IGZpYmVyLnRhZyAmJiBpc1NpbmdsZXRvblNjb3BlKGZpYmVyLnR5cGUpKSBjb250aW51ZSBhO1xuICAgICAgaWYgKGZpYmVyLmZsYWdzICYgMikgY29udGludWUgYTtcbiAgICAgIGlmIChudWxsID09PSBmaWJlci5jaGlsZCB8fCA0ID09PSBmaWJlci50YWcpIGNvbnRpbnVlIGE7XG4gICAgICBlbHNlIChmaWJlci5jaGlsZC5yZXR1cm4gPSBmaWJlciksIChmaWJlciA9IGZpYmVyLmNoaWxkKTtcbiAgICB9XG4gICAgaWYgKCEoZmliZXIuZmxhZ3MgJiAyKSkgcmV0dXJuIGZpYmVyLnN0YXRlTm9kZTtcbiAgfVxufVxuZnVuY3Rpb24gaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIGlmICg1ID09PSB0YWcgfHwgNiA9PT0gdGFnKVxuICAgIChub2RlID0gbm9kZS5zdGF0ZU5vZGUpLFxuICAgICAgYmVmb3JlXG4gICAgICAgID8gKDkgPT09IHBhcmVudC5ub2RlVHlwZVxuICAgICAgICAgICAgPyBwYXJlbnQuYm9keVxuICAgICAgICAgICAgOiBcIkhUTUxcIiA9PT0gcGFyZW50Lm5vZGVOYW1lXG4gICAgICAgICAgICAgID8gcGFyZW50Lm93bmVyRG9jdW1lbnQuYm9keVxuICAgICAgICAgICAgICA6IHBhcmVudFxuICAgICAgICAgICkuaW5zZXJ0QmVmb3JlKG5vZGUsIGJlZm9yZSlcbiAgICAgICAgOiAoKGJlZm9yZSA9XG4gICAgICAgICAgICA5ID09PSBwYXJlbnQubm9kZVR5cGVcbiAgICAgICAgICAgICAgPyBwYXJlbnQuYm9keVxuICAgICAgICAgICAgICA6IFwiSFRNTFwiID09PSBwYXJlbnQubm9kZU5hbWVcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5vd25lckRvY3VtZW50LmJvZHlcbiAgICAgICAgICAgICAgICA6IHBhcmVudCksXG4gICAgICAgICAgYmVmb3JlLmFwcGVuZENoaWxkKG5vZGUpLFxuICAgICAgICAgIChwYXJlbnQgPSBwYXJlbnQuX3JlYWN0Um9vdENvbnRhaW5lciksXG4gICAgICAgICAgKG51bGwgIT09IHBhcmVudCAmJiB2b2lkIDAgIT09IHBhcmVudCkgfHxcbiAgICAgICAgICAgIG51bGwgIT09IGJlZm9yZS5vbmNsaWNrIHx8XG4gICAgICAgICAgICAoYmVmb3JlLm9uY2xpY2sgPSBub29wJDEpKTtcbiAgZWxzZSBpZiAoXG4gICAgNCAhPT0gdGFnICYmXG4gICAgKDI3ID09PSB0YWcgJiZcbiAgICAgIGlzU2luZ2xldG9uU2NvcGUobm9kZS50eXBlKSAmJlxuICAgICAgKChwYXJlbnQgPSBub2RlLnN0YXRlTm9kZSksIChiZWZvcmUgPSBudWxsKSksXG4gICAgKG5vZGUgPSBub2RlLmNoaWxkKSxcbiAgICBudWxsICE9PSBub2RlKVxuICApXG4gICAgZm9yIChcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIobm9kZSwgYmVmb3JlLCBwYXJlbnQpLFxuICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgbnVsbCAhPT0gbm9kZTtcblxuICAgIClcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIobm9kZSwgYmVmb3JlLCBwYXJlbnQpLFxuICAgICAgICAobm9kZSA9IG5vZGUuc2libGluZyk7XG59XG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICBpZiAoNSA9PT0gdGFnIHx8IDYgPT09IHRhZylcbiAgICAobm9kZSA9IG5vZGUuc3RhdGVOb2RlKSxcbiAgICAgIGJlZm9yZSA/IHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgYmVmb3JlKSA6IHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgZWxzZSBpZiAoXG4gICAgNCAhPT0gdGFnICYmXG4gICAgKDI3ID09PSB0YWcgJiYgaXNTaW5nbGV0b25TY29wZShub2RlLnR5cGUpICYmIChwYXJlbnQgPSBub2RlLnN0YXRlTm9kZSksXG4gICAgKG5vZGUgPSBub2RlLmNoaWxkKSxcbiAgICBudWxsICE9PSBub2RlKVxuICApXG4gICAgZm9yIChcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShub2RlLCBiZWZvcmUsIHBhcmVudCksIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgICBudWxsICE9PSBub2RlO1xuXG4gICAgKVxuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKG5vZGUsIGJlZm9yZSwgcGFyZW50KSwgKG5vZGUgPSBub2RlLnNpYmxpbmcpO1xufVxuZnVuY3Rpb24gY29tbWl0SG9zdFNpbmdsZXRvbkFjcXVpc2l0aW9uKGZpbmlzaGVkV29yaykge1xuICB2YXIgc2luZ2xldG9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSxcbiAgICBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICB0cnkge1xuICAgIGZvciAoXG4gICAgICB2Y
1XIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlLCBhdHRyaWJ1dGVzID0gc2luZ2xldG9uLmF0dHJpYnV0ZXM7XG4gICAgICBhdHRyaWJ1dGVzLmxlbmd0aDtcblxuICAgIClcbiAgICAgIHNpbmdsZXRvbi5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZXNbMF0pO1xuICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKHNpbmdsZXRvbiwgdHlwZSwgcHJvcHMpO1xuICAgIHNpbmdsZXRvbltpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGZpbmlzaGVkV29yaztcbiAgICBzaW5nbGV0b25baW50ZXJuYWxQcm9wc0tleV0gPSBwcm9wcztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgfVxufVxudmFyIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9ICExLFxuICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gITEsXG4gIG5lZWRzRm9ybVJlc2V0ID0gITEsXG4gIFBvc3NpYmx5V2Vha1NldCA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFdlYWtTZXQgPyBXZWFrU2V0IDogU2V0LFxuICBuZXh0RWZmZWN0ID0gbnVsbDtcbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaXJzdENoaWxkKSB7XG4gIHJvb3QgPSByb290LmNvbnRhaW5lckluZm87XG4gIGV2ZW50c0VuYWJsZWQgPSBfZW5hYmxlZDtcbiAgcm9vdCA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKHJvb3QpO1xuICBpZiAoaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKHJvb3QpKSB7XG4gICAgaWYgKFwic2VsZWN0aW9uU3RhcnRcIiBpbiByb290KVxuICAgICAgdmFyIEpTQ29tcGlsZXJfdGVtcCA9IHtcbiAgICAgICAgc3RhcnQ6IHJvb3Quc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIGVuZDogcm9vdC5zZWxlY3Rpb25FbmRcbiAgICAgIH07XG4gICAgZWxzZVxuICAgICAgYToge1xuICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPVxuICAgICAgICAgICgoSlNDb21waWxlcl90ZW1wID0gcm9vdC5vd25lckRvY3VtZW50KSAmJlxuICAgICAgICAgICAgSlNDb21waWxlcl90ZW1wLmRlZmF1bHRWaWV3KSB8fFxuICAgICAgICAgIHdpbmRvdztcbiAgICAgICAgdmFyIHNlbGVjdGlvbiA9XG4gICAgICAgICAgSlNDb21waWxlcl90ZW1wLmdldFNlbGVjdGlvbiAmJiBKU0NvbXBpbGVyX3RlbXAuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgMCAhPT0gc2VsZWN0aW9uLnJhbmdlQ291bnQpIHtcbiAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZTtcbiAgICAgICAgICB2Y
1XIgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgICAgICAgIGZvY3VzTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGU7XG4gICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAubm9kZVR5cGUsIGZvY3VzTm9kZS5ub2RlVHlwZTtcbiAgICAgICAgICB9IGNhdGNoIChlJDIwKSB7XG4gICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPSBudWxsO1xuICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGxlbmd0aCA9IDAsXG4gICAgICAgICAgICBzdGFydCA9IC0xLFxuICAgICAgICAgICAgZW5kID0gLTEsXG4gICAgICAgICAgICBpbmRleFdpdGhpbkFuY2hvciA9IDAsXG4gICAgICAgICAgICBpbmRleFdpdGhpbkZvY3VzID0gMCxcbiAgICAgICAgICAgIG5vZGUgPSByb290LFxuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IG51bGw7XG4gICAgICAgICAgYjogZm9yICg7Oykge1xuICAgICAgICAgICAgZm9yICh2YXIgbmV4dDsgOyApIHtcbiAgICAgICAgICAgICAgbm9kZSAhPT0gSlNDb21waWxlcl90ZW1wIHx8XG4gICAgICAgICAgICAgICAgKDAgIT09IGFuY2hvck9mZnNldCAmJiAzICE9PSBub2RlLm5vZGVUeXBlKSB8fFxuICAgICAgICAgICAgICAgIChzdGFydCA9IGxlbmd0aCArIGFuY2hvck9mZnNldCk7XG4gICAgICAgICAgICAgIG5vZGUgIT09IGZvY3VzTm9kZSB8fFxuICAgICAgICAgICAgICAgICgwICE9PSBzZWxlY3Rpb24gJiYgMyAhPT0gbm9kZS5ub2RlVHlwZSkgfHxcbiAgICAgICAgICAgICAgICAoZW5kID0gbGVuZ3RoICsgc2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgMyA9PT0gbm9kZS5ub2RlVHlwZSAmJiAobGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICAgIGlmIChudWxsID09PSAobmV4dCA9IG5vZGUuZmlyc3RDaGlsZCkpIGJyZWFrO1xuICAgICAgICAgICAgICBwYXJlbnROb2RlID0gbm9kZTtcbiAgICAgICAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgIGlmIChub2RlID09PSByb290KSBicmVhayBiO1xuICAgICAgICAgICAgICBwYXJlbnROb2RlID09PSBKU0NvbXBpbGVyX3RlbXAgJiZcbiAgICAgICAgICAgICAgICArK2luZGV4V2l0aGluQW5jaG9yID09PSBhbmNob3JPZmZzZXQgJiZcbiAgICAgICAgICAgICAgICAoc3RhcnQgPSBsZW5ndGgpO1xuICAgICAgICAgICAgICBwYXJlbnROb2RlID09PSBmb2N1c05vZGUgJiZcbiAgICAgICAgICAgICAgICArK2luZGV4V2l0aGluRm9jdXMgPT09IHNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAgIChlbmQgPSBsZW5ndGgpO1xuICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gKG5leHQgPSBub2RlLm5leHRTaWJsaW5nKSkgYnJlYWs7XG4gICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgICAgICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9XG4gICAgICAgICAgICAtMSA9PT0gc3RhcnQgfHwgLTEgPT09IGVuZCA/IG51bGwgOiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTtcbiAgICAgICAgfSBlbHNlIEpTQ29tcGlsZXJfdGVtcCA9IG51bGw7XG4gICAgICB9XG4gICAgSlNDb21waWxlcl90ZW1wID0gSlNDb21waWxlcl90ZW1wIHx8IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICB9IGVsc2UgSlNDb21waWxlcl90ZW1wID0gbnVsbDtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSB7IGZvY3VzZWRFbGVtOiByb290LCBzZWxlY3Rpb25SYW5nZTogSlNDb21waWxlcl90ZW1wIH07XG4gIF9lbmFibGVkID0gITE7XG4gIGZvciAobmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7IG51bGwgIT09IG5leHRFZmZlY3Q7IClcbiAgICBpZiAoXG4gICAgICAoKGZpcnN0Q2hpbGQgPSBuZXh0RWZmZWN0KSxcbiAgICAgIChyb290ID0gZmlyc3RDaGlsZC5jaGlsZCksXG4gICAgICAwICE9PSAoZmlyc3RDaGlsZC5zdWJ0cmVlRmxhZ3MgJiAxMDI0KSAmJiBudWxsICE9PSByb290KVxuICAgIClcbiAgICAgIChyb290LnJldHVybiA9IGZpcnN0Q2hpbGQpLCAobmV4dEVmZmVjdCA9IHJvb3QpO1xuICAgIGVsc2VcbiAgICAgIGZvciAoOyBudWxsICE9PSBuZXh0RWZmZWN0OyApIHtcbiAgICAgICAgZmlyc3RDaGlsZCA9IG5leHRFZmZlY3Q7XG4gICAgICAgIGZvY3VzTm9kZSA9IGZpcnN0Q2hpbGQuYWx0ZXJuYXRlO1xuICAgICAgICByb290ID0gZmlyc3RDaGlsZC5mbGFncztcbiAgICAgICAgc3dpdGNoIChmaXJzdENoaWxkLnRhZykge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGlmICgwICE9PSAocm9vdCAmIDEwMjQpICYmIG51bGwgIT09IGZvY3VzTm9kZSkge1xuICAgICAgICAgICAgICByb290ID0gdm9pZCAwO1xuICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPSBmaXJzdENoaWxkO1xuICAgICAgICAgICAgICBhbmNob3JPZmZzZXQgPSBmb2N1c05vZGUubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgICAgZm9jdXNOb2RlID0gZm9jdXNOb2RlLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICAgIHNlbGVjdGlvbiA9IEpTQ29tcGlsZXJfdGVtcC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkUHJldlByb3BzID0gcmVzb2x2ZUNsYXNzQ29tcG9uZW50UHJvcHMoXG4gICAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAudHlwZSxcbiAgICAgICAgICAgICAgICAgIGFuY2hvck9mZnNldCxcbiAgICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcC5lbGVtZW50VHlwZSA9PT0gSlNDb21waWxlcl90ZW1wLnR5cGVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgI
1HJvb3QgPSBzZWxlY3Rpb24uZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoXG4gICAgICAgICAgICAgICAgICByZXNvbHZlZFByZXZQcm9wcyxcbiAgICAgICAgICAgICAgICAgIGZvY3VzTm9kZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlID0gcm9vdDtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCxcbiAgICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcC5yZXR1cm4sXG4gICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGlmICgwICE9PSAocm9vdCAmIDEwMjQpKVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKChyb290ID0gZmlyc3RDaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksXG4gICAgICAgICAgICAgICAgKEpTQ29tcGlsZXJfdGVtcCA9IHJvb3Qubm9kZVR5cGUpLFxuICAgICAgICAgICAgICAgIDkgPT09IEpTQ29tcGlsZXJfdGVtcClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyU3BhcmluZ2x5KHJvb3QpO1xuICAgICAgICAgICAgICBlbHNlIGlmICgxID09PSBKU0NvbXBpbGVyX3RlbXApXG4gICAgICAgICAgICAgICAgc3dpdGNoIChyb290Lm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiSEVBRFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcIkhUTUxcIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJCT0RZXCI6XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyU3BhcmluZ2x5KHJvb3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJvb3QudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICgwICE9PSAocm9vdCAmIDEwMjQpKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2MykpO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QgPSBmaXJzdENoaWxkLnNpYmxpbmc7XG4gICAgICAgIGlmIChudWxsICE9PSByb290KSB7XG4gICAgICAgICAgcm9vdC5yZXR1cm4gPSBmaXJzdENoaWxkLnJldHVybjtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gcm9vdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZC5yZXR1cm47XG4gICAgICB9XG59XG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKGZpbmlzaGVkUm9vdCwgY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSAwOlxuICAgIGNhc2UgMTE6XG4gICAgY2FzZSAxNTpcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgIGZsYWdzICYgNCAmJiBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KDUsIGZpbmlzaGVkV29yayk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlTGF5b3V0RWZmZWN0cyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICBpZiAoZmxhZ3MgJiA0KVxuICAgICAgICBpZiAoKChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlKSwgbnVsbCA9PT0gY3VycmVudCkpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdC5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay50eXBlLFxuICAgICAgICAgICAgY3VycmVudC5tZW1vaXplZFByb3BzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QuY29tcG9uZW50RGlkVXBkYXRlKFxuICAgICAgICAgICAgICBwcmV2UHJvcHMsXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIGZpbmlzaGVkUm9vdC5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvciQxNDIpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICAgIGVycm9yJDE0MlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGZsYWdzICYgNjQgJiYgY29tbWl0Q2xhc3NDYWxsYmFja3MoZmluaXNoZWRXb3JrKTtcbiAgICAgIGZsYWdzICYgNTEyICYmIHNhZmVseUF0dGFjaFJlZihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZUxheW91dEVmZmVjdHMoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgaWYgKFxuICAgICAgICBmbGFncyAmIDY0
1ICYmXG4gICAgICAgICgoZmluaXNoZWRSb290ID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlKSwgbnVsbCAhPT0gZmluaXNoZWRSb290KVxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICBpZiAobnVsbCAhPT0gZmluaXNoZWRXb3JrLmNoaWxkKVxuICAgICAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLmNoaWxkLnRhZykge1xuICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgY3VycmVudCA9IGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29tbWl0Q2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgY3VycmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjc6XG4gICAgICBudWxsID09PSBjdXJyZW50ICYmXG4gICAgICAgIGZsYWdzICYgNCAmJlxuICAgICAgICBjb21taXRIb3N0U2luZ2xldG9uQWNxdWlzaXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICBjYXNlIDI2OlxuICAgIGNhc2UgNTpcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgIG51bGwgPT09IGN1cnJlbnQgJiYgZmxhZ3MgJiA0ICYmIGNvbW1pdEhvc3RNb3VudChmaW5pc2hlZFdvcmspO1xuICAgICAgZmxhZ3MgJiA1MTIgJiYgc2FmZWx5QXR0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEyOlxuICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZUxheW91dEVmZmVjdHMoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMzpcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgIGZsYWdzICYgNCAmJiBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICBmbGFncyAmIDY0ICYmXG4gICAgICAgICgoZmluaXNoZWRSb290ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpLFxuICAgICAgICBudWxsICE9PSBmaW5pc2hlZFJvb3QgJiZcbiAgICAgICAgICAoKGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkUm9vdC5kZWh5ZHJhdGVkKSxcbiAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFJvb3QgJiZcbiAgICAgICAgICAgICgoZmluaXNoZWRXb3JrID0gcmV0cnlEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeS5iaW5kKFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmtcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspKSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMjpcbiAgICAgIGZsYWdzID0gbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgfHwgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgaWYgKCFmbGFncykge1xuICAgICAgICBjdXJyZW50ID1cbiAgICAgICAgICAobnVsbCAhPT0gY3VycmVudCAmJiBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHx8XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgcHJldlByb3BzID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICB2Y
1XIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBmbGFncztcbiAgICAgICAgKG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBjdXJyZW50KSAmJiAhcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW5cbiAgICAgICAgICA/IHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAwICE9PSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIDg3NzIpXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiByZWN1cnNpdmVseVRyYXZlcnNlTGF5b3V0RWZmZWN0cyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IHByZXZQcm9wcztcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzMDpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlTGF5b3V0RWZmZWN0cyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gIG51bGwgIT09IGFsdGVybmF0ZSAmJlxuICAgICgoZmliZXIuYWx0ZXJuYXRlID0gbnVsbCksIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGFsdGVybmF0ZSkpO1xuICBmaWJlci5jaGlsZCA9IG51bGw7XG4gIGZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gIGZpYmVyLnNpYmxpbmcgPSBudWxsO1xuICA1ID09PSBmaWJlci50YWcgJiZcbiAgICAoKGFsdGVybmF0ZSA9IGZpYmVyLnN0YXRlTm9kZSksXG4gICAgbnVsbCAhPT0gYWx0ZXJuYXRlICYmIGRldGFjaERlbGV0ZWRJbnN0YW5jZShhbHRlcm5hdGUpKTtcbiAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDtcbiAgZmliZXIucmV0dXJuID0gbnVsbDtcbiAgZmliZXIuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gIGZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICBmaWJlci5wZW5kaW5nUHJvcHMgPSBudWxsO1xuICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsO1xuICBmaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG59XG52YXIgaG9zdFBhcmVudCA9IG51bGwsXG4gIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9ICExO1xuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgZmluaXNoZWRSb290LFxuICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICBwYXJlbnRcbikge1xuICBmb3IgKHBhcmVudCA9IHBhcmVudC5jaGlsZDsgbnVsbCAhPT0gcGFyZW50OyApXG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIHBhcmVudCksXG4gICAgICAocGFyZW50ID0gcGFyZW50LnNpYmxpbmcpO1xufVxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihcbiAgZmluaXNoZWRSb290LFxuICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICBkZWxldGVkRmliZXJcbikge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudClcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGRlbGV0ZWRGaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyKSB7fVxuICBzd2l0Y2ggKGRlbGV0ZWRGaWJlci50YWcpIHtcbiAgICBjYXNlIDI2OlxuICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoXG4gICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgZGVsZXRlZEZpYmVyXG4gICAgICApO1xuICAgICAgZGVsZXRlZEZpYmVyLm1lbW9pemVkU3RhdGVcbiAgICAgICAgPyBkZWxldGVkRmliZXIubWVtb2l6ZWRTdGF0ZS5jb3VudC0tXG4gICAgICAgIDogZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSAmJlxuICAgICAgICAgICgoZGVsZXRlZEZpYmVyID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSksXG4gICAgICAgICAgZGVsZXRlZEZpYmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGVsZXRlZEZpYmVyKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI3OlxuICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgIHZhciBwcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQsXG4gICAgICAgIHByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICBpc1NpbmdsZXRvblNjb3BlKGRlbGV0ZWRGaWJlci50eXBlKSAmJlxuICAgICAgICAoKGhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlKSwgKGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9ICExKSk7XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKFxuICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgIGRlbGV0ZWRGaWJlclxuICAgICAgKTtcbiAgICAgIHJlbGVhc2VTaW5nbGV0b25JbnN0YW5jZShkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDU6XG4gICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgI
1HNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgIGNhc2UgNjpcbiAgICAgIHByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgIHByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoXG4gICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgZGVsZXRlZEZpYmVyXG4gICAgICApO1xuICAgICAgaG9zdFBhcmVudCA9IHByZXZIb3N0UGFyZW50O1xuICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgIGlmIChudWxsICE9PSBob3N0UGFyZW50KVxuICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAoOSA9PT0gaG9zdFBhcmVudC5ub2RlVHlwZVxuICAgICAgICAgICAgICA/IGhvc3RQYXJlbnQuYm9keVxuICAgICAgICAgICAgICA6IFwiSFRNTFwiID09PSBob3N0UGFyZW50Lm5vZGVOYW1lXG4gICAgICAgICAgICAgICAgPyBob3N0UGFyZW50Lm93bmVyRG9jdW1lbnQuYm9keVxuICAgICAgICAgICAgICAgIDogaG9zdFBhcmVudFxuICAgICAgICAgICAgKS5yZW1vdmVDaGlsZChkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoXG4gICAgICAgICAgICAgIGRlbGV0ZWRGaWJlcixcbiAgICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQucmVtb3ZlQ2hpbGQoZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKFxuICAgICAgICAgICAgICBkZWxldGVkRmliZXIsXG4gICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTg6XG4gICAgICBudWxsICE9PSBob3N0UGFyZW50ICYmXG4gICAgICAgIChob3N0UGFyZW50SXNDb250YWluZXJcbiAgICAgICAgICA/ICgoZmluaXNoZWRSb290ID0gaG9zdFBhcmVudCksXG4gICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoXG4gICAgICAgICAgICAgIDkgPT09IGZpbmlzaGVkUm9vdC5ub2RlVHlwZVxuICAgICAgICAgICAgICAgID8gZmluaXNoZWRSb290LmJvZHlcbiAgICAgICAgICAgICAgICA6IFwiSFRNTFwiID09PSBmaW5pc2hlZFJvb3Qubm9kZU5hbWVcbiAgICAgICAgICAgICAgICAgID8gZmluaXNoZWRSb290Lm93bmVyRG9jdW1lbnQuYm9keVxuICAgICAgICAgICAgICAgICAgOiBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICByZXRyeUlmQmxvY2tlZE9uKGZpbmlzaGVkUm9vdCkpXG4gICAgICAgICAgOiBjbGVhclN1c3BlbnNlQm91bmRhcnkoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgIGhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSAhMDtcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoXG4gICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgZGVsZXRlZEZpYmVyXG4gICAgICApO1xuICAgICAgaG9zdFBhcmVudCA9IHByZXZIb3N0UGFyZW50O1xuICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMDpcbiAgICBjYXNlIDExOlxuICAgIGNhc2UgMTQ6XG4gICAgY2FzZSAxNTpcbiAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHxcbiAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KDIsIGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudCg0LCBkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgIChzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSxcbiAgICAgICAgKHByZXZIb3N0UGFyZW50ID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSksXG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHByZXZIb3N0UGFyZW50LmNvbXBvbmVudFdpbGxVbm1vdW50ICYmXG4gICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyLFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICAgIHByZXZIb3N0UGFyZW50XG4gICAgICAgICAgKSk7XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKFxuICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgIGRlbGV0ZWRGaWJlclxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjE6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKFxuICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgIGRlbGV0ZWRGaWJlclxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjI6XG4gICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID1cbiAgICAgICAgKHByZXZIb3N0UGFyZW50ID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikgfHxcbiAgICAgICAgbnVsbCAhPT0gZGVsZXRlZEZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKFxuICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgIGRlbGV0ZWRGaWJlclxuICAgICAgKTtcbiAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKFxuICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgIGRlbGV0ZWRGaWJlclxuICAgICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcbiAgaWYgKFxuICAgIG51bGwgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlICYmXG4gICAgKChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlKSxcbiAgICBudWxsICE9PSBmaW5pc2hlZFJvb3QgJiZcbiAgICAgICgoZmluaXNoZWRSb290ID0gZmluaXNoZWRSb290Lm1lbW9pemVkU3RhdGUpLFxuICAgICAgbnVsbCAhPT0gZmluaXNoZWRSb290ICYmXG4gICAgICAgICgoZmluaXNoZWRSb290ID0gZmluaXNoZWRSb290LmRlaHlkcmF0ZWQ
1pLCBudWxsICE9PSBmaW5pc2hlZFJvb3QpKSlcbiAgKVxuICAgIHRyeSB7XG4gICAgICByZXRyeUlmQmxvY2tlZE9uKGZpbmlzaGVkUm9vdCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFJldHJ5Q2FjaGUoZmluaXNoZWRXb3JrKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgMTM6XG4gICAgY2FzZSAxOTpcbiAgICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgIG51bGwgPT09IHJldHJ5Q2FjaGUgJiZcbiAgICAgICAgKHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gbmV3IFBvc3NpYmx5V2Vha1NldCgpKTtcbiAgICAgIHJldHVybiByZXRyeUNhY2hlO1xuICAgIGNhc2UgMjI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSksXG4gICAgICAgIChyZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLl9yZXRyeUNhY2hlKSxcbiAgICAgICAgbnVsbCA9PT0gcmV0cnlDYWNoZSAmJlxuICAgICAgICAgIChyZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLl9yZXRyeUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha1NldCgpKSxcbiAgICAgICAgcmV0cnlDYWNoZVxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0MzUsIGZpbmlzaGVkV29yay50YWcpKTtcbiAgfVxufVxuZnVuY3Rpb24gYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmssIHdha2VhYmxlcykge1xuICB2YXIgcmV0cnlDYWNoZSA9IGdldFJldHJ5Q2FjaGUoZmluaXNoZWRXb3JrKTtcbiAgd2FrZWFibGVzLmZvckVhY2goZnVuY3Rpb24gKHdha2VhYmxlKSB7XG4gICAgdmFyIHJldHJ5ID0gcmVzb2x2ZVJldHJ5V2FrZWFibGUuYmluZChudWxsLCBmaW5pc2hlZFdvcmssIHdha2VhYmxlKTtcbiAgICByZXRyeUNhY2hlLmhhcyh3YWtlYWJsZSkgfHxcbiAgICAgIChyZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSksIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290JGpzY29tcCQwLCBwYXJlbnRGaWJlcikge1xuICB2YXIgZGVsZXRpb25zID0gcGFyZW50RmliZXIuZGVsZXRpb25zO1xuICBpZiAobnVsbCAhPT0gZGVsZXRpb25zKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2Y
1XIgY2hpbGRUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXSxcbiAgICAgICAgcm9vdCA9IHJvb3QkanNjb21wJDAsXG4gICAgICAgIHJldHVybkZpYmVyID0gcGFyZW50RmliZXIsXG4gICAgICAgIHBhcmVudCA9IHJldHVybkZpYmVyO1xuICAgICAgYTogZm9yICg7IG51bGwgIT09IHBhcmVudDsgKSB7XG4gICAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICBpZiAoaXNTaW5nbGV0b25TY29wZShwYXJlbnQudHlwZSkpIHtcbiAgICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9ICExO1xuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSAhMTtcbiAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSAhMDtcbiAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChudWxsID09PSBob3N0UGFyZW50KSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2MCkpO1xuICAgICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihyb290LCByZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9ICExO1xuICAgICAgcm9vdCA9IGNoaWxkVG9EZWxldGUuYWx0ZXJuYXRlO1xuICAgICAgbnVsbCAhPT0gcm9vdCAmJiAocm9vdC5yZXR1cm4gPSBudWxsKTtcbiAgICAgIGNoaWxkVG9EZWxldGUucmV0dXJuID0gbnVsbDtcbiAgICB9XG4gIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiAxMzg3OClcbiAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKHBhcmVudEZpYmVyLCByb290JGpzY29tcCQwKSxcbiAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG59XG52YXIgY3VycmVudEhvaXN0YWJsZVJvb3QgPSBudWxsO1xuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QpIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLFxuICAgIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIDA6XG4gICAgY2FzZSAxMTpcbiAgICBjYXNlIDE0OlxuICAgIGNhc2UgMTU6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIGZsYWdzICYgNCAmJlxuICAgICAgICAoY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KDMsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiksXG4gICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoMywgZmluaXNoZWRXb3JrKSxcbiAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KDUsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybikpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICBmbGFncyAmIDUxMiAmJlxuICAgICAgICAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pKTtcbiAgICAgIGZsYWdzICYgNjQgJiZcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuICYmXG4gICAgICAgICgoZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlKSxcbiAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrICYmXG4gICAgICAgICAgKChmbGFncyA9IGZpbmlzaGVkV29yay5jYWxsYmFja3MpLFxuICAgICAgICAgIG51bGwgIT09IGZsYWdzICYmXG4gICAgICAgICAgICAoKGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuc2hhcmVkLmhpZGRlbkNhbGxiYWNrcyksXG4gICAgICAgICAgICAoZmluaXNoZWRXb3JrLnNoYXJlZC5oaWRkZW5DYWxsYmFja3MgPVxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50ID8gZmxhZ3MgOiBjdXJyZW50LmNvbmNhdChmbGFncykpKSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyNjpcbiAgICAgIHZhciBob2lzdGFibGVSb290ID0gY3VycmVudEhvaXN0YWJsZVJvb3Q7XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIGZsYWdzICYgNTEyICYmXG4gICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgbnVsbCA9PT0gY3VycmVudCB8fFxuICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybikpO1xuICAgICAgaWYgKGZsYWdzICYgNCkge1xuICAgICAgICB2Y
1XIgY3VycmVudFJlc291cmNlID0gbnVsbCAhPT0gY3VycmVudCA/IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSA6IG51bGw7XG4gICAgICAgIGZsYWdzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIGlmIChudWxsID09PSBjdXJyZW50KVxuICAgICAgICAgIGlmIChudWxsID09PSBmbGFncylcbiAgICAgICAgICAgIGlmIChudWxsID09PSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlKSB7XG4gICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICBmbGFncyA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgICAgICBob2lzdGFibGVSb290ID0gaG9pc3RhYmxlUm9vdC5vd25lckRvY3VtZW50IHx8IGhvaXN0YWJsZVJvb3Q7XG4gICAgICAgICAgICAgICAgYjogc3dpdGNoIChmbGFncykge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcInRpdGxlXCI6XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZSA9XG4gICAgICAgICAgICAgICAgICAgICAgaG9pc3RhYmxlUm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRpdGxlXCIpWzBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgIWN1cnJlbnRSZXNvdXJjZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZVtpbnRlcm5hbEhvaXN0YWJsZU1hcmtlcl0gfHxcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2VbaW50ZXJuYWxJbnN0YW5jZUtleV0gfHxcbiAgICAgICAgICAgICAgICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UubmFtZXNwYWNlVVJJIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlLmhhc0F0dHJpYnV0ZShcIml0ZW1wcm9wXCIpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudFJlc291cmNlID0gaG9pc3RhYmxlUm9vdC5jcmVhdGVFbGVtZW50KGZsYWdzKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBob2lzdGFibGVSb290LmhlYWQuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvaXN0YWJsZVJvb3QucXVlcnlTZWxlY3RvcihcImhlYWQgPiB0aXRsZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoY3VycmVudFJlc291cmNlLCBmbGFncywgY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGZpbmlzaGVkV29yaztcbiAgICAgICAgICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShjdXJyZW50UmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGN1cnJlbnRSZXNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXliZU5vZGVzID0gZ2V0SHlkcmF0YWJsZUhvaXN0YWJsZUNhY2hlKFxuICAgICAgICAgICAgICAgICAgICAgIFwibGlua1wiLFxuICAgICAgICAgICAgICAgICAgICAgIFwiaHJlZlwiLFxuICAgICAgICAgICAgICAgICAgICAgIGhvaXN0YWJsZVJvb3RcbiAgICAgICAgICAgICAgICAgICAgKS5nZXQoZmxhZ3MgKyAoY3VycmVudC5ocmVmIHx8IFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heWJlTm9kZXMpXG4gICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXliZU5vZGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKGN1cnJlbnRSZXNvdXJjZSA9IG1heWJlTm9kZXNbaV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBjdXJyZW50LmhyZWYgfHwgXCJcIiA9PT0gY3VycmVudC5ocmVmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudC5ocmVmKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZS5nZXRBdHRyaWJ1dGUoXCJyZWxcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBjdXJyZW50LnJlbCA/IG51bGwgOiBjdXJyZW50LnJlbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UuZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBjdXJyZW50LnRpdGxlID8gbnVsbCA6IGN1cnJlbnQudGl0bGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlLmdldEF0dHJpYnV0ZShcImNyb3Nzb3JpZ2luXCIpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gY3VycmVudC5jcm9zc09yaWdpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50LmNyb3NzT3JpZ2luKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZU5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlID0gaG9pc3RhYmxlUm9vdC5jcmVhdGVFbGVtZW50KGZsYWdzKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoY3VycmVudFJlc291cmNlLCBmbGFncywgY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGhvaXN0YWJsZVJvb3QuaGVhZC5hcHBlbmRDaGlsZChjdXJyZW50UmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAobWF5YmVOb2RlcyA9IGdldEh5ZHJhdGFibGVIb2lzdGFibGVDYWNoZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibWV0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb250ZW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBob2lzdGFibGVSb290XG4gICAgICAgICAgICAgICAgICAgICAgKS5nZXQoZmxhZ3MgKyAoY3VycmVudC5jb250ZW50IHx8IFwiXCIpKSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXliZU5vZGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKGN1cnJlbnRSZXNvdXJjZSA9IG1heWJlTm9kZXNbaV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBjdXJyZW50LmNvbnRlbn
1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlwiICsgY3VycmVudC5jb250ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gY3VycmVudC5uYW1lID8gbnVsbCA6IGN1cnJlbnQubmFtZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UuZ2V0QXR0cmlidXRlKFwicHJvcGVydHlcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBjdXJyZW50LnByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnQucHJvcGVydHkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlLmdldEF0dHJpYnV0ZShcImh0dHAtZXF1aXZcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBjdXJyZW50Lmh0dHBFcXVpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50Lmh0dHBFcXVpdikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UuZ2V0QXR0cmlidXRlKFwiY2hhcnNldFwiKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsID09IGN1cnJlbnQuY2hhclNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50LmNoYXJTZXQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlTm9kZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UgPSBob2lzdGFibGVSb290LmNyZWF0ZUVsZW1lbnQoZmxhZ3MpO1xuICAgICAgICAgICAgICAgICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhjdXJyZW50UmVzb3VyY2UsIGZsYWdzLCBjdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaG9pc3RhYmxlUm9vdC5oZWFkLmFwcGVuZENoaWxkKGN1cnJlbnRSZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0NjgsIGZsYWdzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGZpbmlzaGVkV29yaztcbiAgICAgICAgICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKGN1cnJlbnRSZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgZmxhZ3MgPSBjdXJyZW50UmVzb3VyY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IGZsYWdzO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgIG1vdW50SG9pc3RhYmxlKFxuICAgICAgICAgICAgICAgIGhvaXN0YWJsZVJvb3QsXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnR5cGUsXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBhY3F1aXJlUmVzb3VyY2UoXG4gICAgICAgICAgICAgIGhvaXN0YWJsZVJvb3QsXG4gICAgICAgICAgICAgIGZsYWdzLFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZSAhPT0gZmxhZ3NcbiAgICAgICAgICAgID8gKG51bGwgPT09IGN1cnJlbnRSZXNvdXJjZVxuICAgICAgICAgICAgICAgID8gbnVsbCAhPT0gY3VycmVudC5zdGF0ZU5vZGUgJiZcbiAgICAgICAgICAgICAgICAgICgoY3VycmVudCA9IGN1cnJlbnQuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjdXJyZW50KSlcbiAgICAgICAgICAgICAgICA6IGN1cnJlbnRSZXNvdXJjZS5jb3VudC0tLFxuICAgICAgICAgICAgICBudWxsID09PSBmbGFnc1xuICAgICAgICAgICAgICAgID8gbW91bnRIb2lzdGFibGUoXG4gICAgICAgICAgICAgICAgICAgIGhvaXN0YWJsZVJvb3QsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay50eXBlLFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBhY3F1aXJlUmVzb3VyY2UoXG4gICAgICAgICAgICAgICAgICAgIGhvaXN0YWJsZVJvb3QsXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wc1xuICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIDogbnVsbCA9PT0gZmxhZ3MgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAmJlxuICAgICAgICAgICAgICBjb21taXRIb3N0VXBkYXRlKFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjc6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIGZsYWdzICYgNTEyICYmXG4gICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgbnVsbCA9PT0gY3VycmVudCB8fFxuICAgICAgICAgI
1HNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybikpO1xuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgY29tbWl0SG9zdFVwZGF0ZShcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgY3VycmVudC5tZW1vaXplZFByb3BzXG4gICAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDU6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIGZsYWdzICYgNTEyICYmXG4gICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgbnVsbCA9PT0gY3VycmVudCB8fFxuICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybikpO1xuICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIDMyKSB7XG4gICAgICAgIGhvaXN0YWJsZVJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNldFRleHRDb250ZW50KGhvaXN0YWJsZVJvb3QsIFwiXCIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgbnVsbCAhPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlICYmXG4gICAgICAgICgoaG9pc3RhYmxlUm9vdCA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSxcbiAgICAgICAgY29tbWl0SG9zdFVwZGF0ZShcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgaG9pc3RhYmxlUm9vdCxcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogaG9pc3RhYmxlUm9vdFxuICAgICAgICApKTtcbiAgICAgIGZsYWdzICYgMTAyNCAmJiAobmVlZHNGb3JtUmVzZXQgPSAhMCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDY6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIGlmIChmbGFncyAmIDQpIHtcbiAgICAgICAgaWYgKG51bGwgPT09IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNjIpKTtcbiAgICAgICAgZmxhZ3MgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgY3VycmVudCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY3VycmVudC5ub2RlVmFsdWUgPSBmbGFncztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgdGFnQ2FjaGVzID0gbnVsbDtcbiAgICAgIGhvaXN0YWJsZVJvb3QgPSBjdXJyZW50SG9pc3RhYmxlUm9vdDtcbiAgICAgIGN1cnJlbnRIb2lzdGFibGVSb290ID0gZ2V0SG9pc3RhYmxlUm9vdChyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgY3VycmVudEhvaXN0YWJsZVJvb3QgPSBob2lzdGFibGVSb290O1xuICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICBpZiAoZmxhZ3MgJiA0ICYmIG51bGwgIT09IGN1cnJlbnQgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXRyeUlmQmxvY2tlZE9uKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIG5lZWRzRm9ybVJlc2V0ICYmXG4gICAgICAgICgobmVlZHNGb3JtUmVzZXQgPSAhMSksIHJlY3Vyc2l2ZWx5UmVzZXRGb3JtcyhmaW5pc2hlZFdvcmspKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIGZsYWdzID0gY3VycmVudEhvaXN0YWJsZVJvb3Q7XG4gICAgICBjdXJyZW50SG9pc3RhYmxlUm9vdCA9IGdldEhvaXN0YWJsZVJvb3QoXG4gICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuY29udGFpbmVySW5mb1xuICAgICAgKTtcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgY3VycmVudEhvaXN0YWJsZVJvb3QgPSBmbGFncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTI6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTM6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIGZpbmlzaGVkV29yay5jaGlsZC5mbGFncyAmIDgxOTIgJiZcbiAgICAgICAgKG51bGwgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSAhPT1cbiAgICAgICAgICAobnVsbCAhPT0gY3VycmVudCAmJiBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpICYmXG4gICAgICAgIChnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gbm93KCkpO1xuICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICgoZmxhZ3MgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUpLFxuICAgICAgICBudWxsICE9PSBmbGFncyAmJlxuICAgICAgICAgICgoZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbCksXG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmssIGZsYWdzKSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMjpcbiAgICAgIGhvaXN0YWJsZVJvb3QgPSBudWxsICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHZhciB3YXNIaWRkZW4gPSBudWxsICE9PSBjdXJyZW50ICYmIG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSxcbiAgICAgICAgcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbixcbiAgICAgICAgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiB8fCBob2lzdGFibGVSb290O1xuICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IHdhc0hpZGRlbjtcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIGlmIChmbGFncyAmIDgxOTIpXG4gICAgICAgIGE6IGZvciAoXG4gICAgICAgICAgcm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUsXG4gICAgICAgICAgICByb290Ll92aXNpYmlsaXR5ID0gaG9pc3RhYmxlUm9vdFxuICAgICAgICAgICAgICA/IHJvb3QuX3Zpc2liaWxpdHkgJiAtMlxuICAgICAgICAgICAgICA6IHJvb3QuX3Zpc2liaWxpdHkgfCAxLFxuICAgICAgICAgICAgaG9pc3RhYmxlUm9vdCAmJlxuICAgICAgICAgICAgICAobnVsbCA9PT0gY3VycmVudCB8fFxuICAgICAgICAgICAgICAgI
1Hdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiB8fFxuICAgICAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHxcbiAgICAgICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzYXBwZWFyTGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmspKSxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBudWxsLFxuICAgICAgICAgICAgcm9vdCA9IGZpbmlzaGVkV29yaztcbiAgICAgICAgICA7XG5cbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKDUgPT09IHJvb3QudGFnIHx8IDI2ID09PSByb290LnRhZykge1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgd2FzSGlkZGVuID0gY3VycmVudCA9IHJvb3Q7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgoY3VycmVudFJlc291cmNlID0gd2FzSGlkZGVuLnN0YXRlTm9kZSksIGhvaXN0YWJsZVJvb3QpKVxuICAgICAgICAgICAgICAgICAgKG1heWJlTm9kZXMgPSBjdXJyZW50UmVzb3VyY2Uuc3R5bGUpLFxuICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBtYXliZU5vZGVzLnNldFByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgPyBtYXliZU5vZGVzLnNldFByb3BlcnR5KFwiZGlzcGxheVwiLCBcIm5vbmVcIiwgXCJpbXBvcnRhbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICA6IChtYXliZU5vZGVzLmRpc3BsYXkgPSBcIm5vbmVcIik7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpID0gd2FzSGlkZGVuLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHZhciBzdHlsZVByb3AgPSB3YXNIaWRkZW4ubWVtb2l6ZWRQcm9wcy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheSA9XG4gICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSBzdHlsZVByb3AgJiZcbiAgICAgICAgICAgICAgICAgICAgICBudWxsICE9PSBzdHlsZVByb3AgJiZcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZVByb3AuaGFzT3duUHJvcGVydHkoXCJkaXNwbGF5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHN0eWxlUHJvcC5kaXNwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICBpLnN0eWxlLmRpc3BsYXkgPVxuICAgICAgICAgICAgICAgICAgICBudWxsID09IGRpc3BsYXkgfHwgXCJib29sZWFuXCIgPT09IHR5cGVvZiBkaXNwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgOiAoXCJcIiArIGRpc3BsYXkpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3Iod2FzSGlkZGVuLCB3YXNIaWRkZW4ucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKDYgPT09IHJvb3QudGFnKSB7XG4gICAgICAgICAgICBpZiAobnVsbCA9PT0gY3VycmVudCkge1xuICAgICAgICAgICAgICB3YXNIaWRkZW4gPSByb290O1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdhc0hpZGRlbi5zdGF0ZU5vZGUubm9kZVZhbHVlID0gaG9pc3RhYmxlUm9vdFxuICAgICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgICA6IHdhc0hpZGRlbi5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHdhc0hpZGRlbiwgd2FzSGlkZGVuLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICgoMjIgIT09IHJvb3QudGFnICYmIDIzICE9PSByb290LnRhZykgfHxcbiAgICAgICAgICAgICAgbnVsbCA9PT0gcm9vdC5tZW1vaXplZFN0YXRlIHx8XG4gICAgICAgICAgICAgIHJvb3QgPT09IGZpbmlzaGVkV29yaykgJiZcbiAgICAgICAgICAgIG51bGwgIT09IHJvb3QuY2hpbGRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJvb3QuY2hpbGQucmV0dXJuID0gcm9vdDtcbiAgICAgICAgICAgIHJvb3QgPSByb290LmNoaWxkO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyb290ID09PSBmaW5pc2hlZFdvcmspIGJyZWFrIGE7XG4gICAgICAgICAgZm9yICg7IG51bGwgPT09IHJvb3Quc2libGluZzsgKSB7XG4gICAgICAgICAgICBpZiAobnVsbCA9PT0gcm9vdC5yZXR1cm4gfHwgcm9vdC5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykgYnJlYWsgYTtcbiAgICAgICAgICAgIGN1cnJlbnQgPT09IHJvb3QgJiYgKGN1cnJlbnQgPSBudWxsKTtcbiAgICAgICAgICAgIHJvb3QgPSByb290LnJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9PT0gcm9vdCAmJiAoY3VycmVudCA9IG51bGwpO1xuICAgICAgICAgIHJvb3Quc2libGluZy5yZXR1cm4gPSByb290LnJldHVybjtcbiAgICAgICAgICByb290ID0gcm9vdC5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgKChmbGFncyA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSksXG4gICAgICAgIG51bGwgIT09IGZsYWdzICYmXG4gICAgICAgICAgKChjdXJyZW50ID0gZmxhZ3MucmV0cnlRdWV1ZSksXG4gICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgKChmbGFncy5yZXRyeVF1ZXVlID0gbnVsbCksXG4gICAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yaywgY3VycmVudCkpKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE5OlxuICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgKChmbGFncyA9IGZpbmlzaGVkV29yay51cGRhdGV
1RdWV1ZSksXG4gICAgICAgIG51bGwgIT09IGZsYWdzICYmXG4gICAgICAgICAgKChmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsKSxcbiAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yaywgZmxhZ3MpKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDMwOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMTpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayksXG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICB9XG59XG5mdW5jdGlvbiBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcbiAgaWYgKGZsYWdzICYgMikge1xuICAgIHRyeSB7XG4gICAgICBmb3IgKFxuICAgICAgICB2YXIgaG9zdFBhcmVudEZpYmVyLCBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG4gICAgICAgIG51bGwgIT09IHBhcmVudEZpYmVyO1xuXG4gICAgICApIHtcbiAgICAgICAgaWYgKGlzSG9zdFBhcmVudChwYXJlbnRGaWJlcikpIHtcbiAgICAgICAgICBob3N0UGFyZW50RmliZXIgPSBwYXJlbnRGaWJlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChudWxsID09IGhvc3RQYXJlbnRGaWJlcikgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNjApKTtcbiAgICAgIHN3aXRjaCAoaG9zdFBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIHZhciBwYXJlbnQgPSBob3N0UGFyZW50RmliZXIuc3RhdGVOb2RlLFxuICAgICAgICAgICAgYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoZmluaXNoZWRXb3JrLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICB2Y
1XIgcGFyZW50JDE0NCA9IGhvc3RQYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgaG9zdFBhcmVudEZpYmVyLmZsYWdzICYgMzIgJiZcbiAgICAgICAgICAgIChzZXRUZXh0Q29udGVudChwYXJlbnQkMTQ0LCBcIlwiKSwgKGhvc3RQYXJlbnRGaWJlci5mbGFncyAmPSAtMzMpKTtcbiAgICAgICAgICB2YXIgYmVmb3JlJDE0NSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGZpbmlzaGVkV29yaywgYmVmb3JlJDE0NSwgcGFyZW50JDE0NCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHZhciBwYXJlbnQkMTQ2ID0gaG9zdFBhcmVudEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLFxuICAgICAgICAgICAgYmVmb3JlJDE0NyA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGJlZm9yZSQxNDcsXG4gICAgICAgICAgICBwYXJlbnQkMTQ2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2MSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IC0zO1xuICB9XG4gIGZsYWdzICYgNDA5NiAmJiAoZmluaXNoZWRXb3JrLmZsYWdzICY9IC00MDk3KTtcbn1cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5UmVzZXRGb3JtcyhwYXJlbnRGaWJlcikge1xuICBpZiAocGFyZW50RmliZXIuc3VidHJlZUZsYWdzICYgMTAyNClcbiAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApIHtcbiAgICAgIHZhciBmaWJlciA9IHBhcmVudEZpYmVyO1xuICAgICAgcmVjdXJzaXZlbHlSZXNldEZvcm1zKGZpYmVyKTtcbiAgICAgIDUgPT09IGZpYmVyLnRhZyAmJiBmaWJlci5mbGFncyAmIDEwMjQgJiYgZmliZXIuc3RhdGVOb2RlLnJlc2V0KCk7XG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnNpYmxpbmc7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZUxheW91dEVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIpIHtcbiAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDg3NzIpXG4gICAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKVxuICAgICAgY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihyb290LCBwYXJlbnRGaWJlci5hbHRlcm5hdGUsIHBhcmVudEZpYmVyKSxcbiAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG59XG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlRGlzYXBwZWFyTGF5b3V0RWZmZWN0cyhwYXJlbnRGaWJlcikge1xuICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApIHtcbiAgICB2YXIgZmluaXNoZWRXb3JrID0gcGFyZW50RmliZXI7XG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDExOlxuICAgICAgY2FzZSAxNDpcbiAgICAgIGNhc2UgMTU6XG4gICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudCg0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzYXBwZWFyTGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ICYmXG4gICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLnJldHVybixcbiAgICAgICAgICAgIGluc3RhbmNlXG4gICAgICAgICAgKTtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURpc2FwcGVhckxheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3OlxuICAgICAgICByZWxlYXNlU2luZ2xldG9uSW5zdGFuY2UoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSk7XG4gICAgICBjYXNlIDI2OlxuICAgICAgY2FzZSA1OlxuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURpc2FwcGVhckxheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDIyOlxuICAgICAgICBudWxsID09PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzMDpcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURpc2FwcGVhckxheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzYXBwZWFyTGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgIH1cbiAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnNpYmxpbmc7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gIGZpbmlzaGVkUm9vdCRqc2NvbXAkMCxcbiAgcGFyZW50RmliZXIsXG4gIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHNcbikge1xuICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzID1cbiAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzICYmIDAgIT09IChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiA4NzcyKTtcbiAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBwYXJlbnRGaWJlci5hbHRlcm5hdGUsXG4gICAgICBmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFJvb3QkanNjb21wJDAsXG4gICAgICBmaW5pc2hlZFdvcmsgPSBwYXJlbnRGaWJlcixcbiAgICAgIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuICAgIHN3aXRjaCAo
1ZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxMTpcbiAgICAgIGNhc2UgMTU6XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzXG4gICAgICAgICk7XG4gICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoNCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzXG4gICAgICAgICk7XG4gICAgICAgIGN1cnJlbnQgPSBmaW5pc2hlZFdvcms7XG4gICAgICAgIGZpbmlzaGVkUm9vdCA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZmluaXNoZWRSb290LmNvbXBvbmVudERpZE1vdW50KVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgY3VycmVudC5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBmaW5pc2hlZFdvcms7XG4gICAgICAgIGZpbmlzaGVkUm9vdCA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG4gICAgICAgIGlmIChudWxsICE9PSBmaW5pc2hlZFJvb3QpIHtcbiAgICAgICAgICB2Y
1XIgaW5zdGFuY2UgPSBjdXJyZW50LnN0YXRlTm9kZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhpZGRlbkNhbGxiYWNrcyA9IGZpbmlzaGVkUm9vdC5zaGFyZWQuaGlkZGVuQ2FsbGJhY2tzO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IGhpZGRlbkNhbGxiYWNrcylcbiAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3Quc2hhcmVkLmhpZGRlbkNhbGxiYWNrcyA9IG51bGwsIGZpbmlzaGVkUm9vdCA9IDA7XG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290IDwgaGlkZGVuQ2FsbGJhY2tzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QrK1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY2FsbENhbGxiYWNrKGhpZGRlbkNhbGxiYWNrc1tmaW5pc2hlZFJvb3RdLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgICBmbGFncyAmIDY0ICYmXG4gICAgICAgICAgY29tbWl0Q2xhc3NDYWxsYmFja3MoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzpcbiAgICAgICAgY29tbWl0SG9zdFNpbmdsZXRvbkFjcXVpc2l0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICBjYXNlIDI2OlxuICAgICAgY2FzZSA1OlxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0c1xuICAgICAgICApO1xuICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzICYmXG4gICAgICAgICAgbnVsbCA9PT0gY3VycmVudCAmJlxuICAgICAgICAgIGZsYWdzICYgNCAmJlxuICAgICAgICAgIGNvbW1pdEhvc3RNb3VudChmaW5pc2hlZFdvcmspO1xuICAgICAgICBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEyOlxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0c1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzXG4gICAgICAgICk7XG4gICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyMjpcbiAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0c1xuICAgICAgICAgICk7XG4gICAgICAgIHNhZmVseUF0dGFjaFJlZihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzA6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVJlYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHNcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nO1xuICB9XG59XG5mdW5jdGlvbiBjb21taXRPZmZzY3JlZW5QYXNzaXZlTW91bnRFZmZlY3RzKGN1cnJlbnQsIGZpbmlzaGVkV29yaykge1xuICB2YXIgcHJldmlvdXNDYWNoZSA9IG51bGw7XG4gIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUuY2FjaGVQb29sICYmXG4gICAgKHByZXZpb3VzQ2FjaGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUuY2FjaGVQb29sLnBvb2wpO1xuICBjdXJyZW50ID0gbnVsbDtcbiAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wgJiZcbiAgICAoY3VycmVudCA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKTtcbiAgY3VycmVudCAhPT0gcHJldmlvdXNDYWNoZSAmJlxuICAgIChudWxsICE9IGN1cnJlbnQgJiYgY3VycmVudC5yZWZDb3VudCsrLFxuICAgIG51bGwgIT0gcHJldmlvdXNDYWNoZSAmJiByZWxlYXNlQ2FjaGUocHJldmlvdXNDYWNoZSkpO1xufVxuZnVuY3Rpb24gY29tbWl0Q2FjaGVQYXNzaXZlTW91bnRFZmZlY3QoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gIGN1cnJlbnQgPSBudWxsO1xuICBudWxsICE9PSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlICYmXG4gICAgKGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUuY2FjaGUpO1xuICBmaW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZS5jYWNoZTtcbiAgZmluaXNoZWRXb3JrICE9PSBjdXJyZW50ICYmXG4gICAgKGZpbmlzaGVkV29yay5yZWZDb3VudCsrLCBudWxsICE9IGN1cnJlbnQgJiYgcmVsZWFzZUNhY2hlKGN1cnJlbnQpKTtcbn1cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICByb290LFxuICBwYXJlbnRGaWJlcixcbiAgY29tbWl0dGVkTGFuZXMsXG4gIGNvbW1pdHRlZF
1RyYW5zaXRpb25zXG4pIHtcbiAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDEwMjU2KVxuICAgIGZvciAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5jaGlsZDsgbnVsbCAhPT0gcGFyZW50RmliZXI7IClcbiAgICAgIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIHBhcmVudEZpYmVyLFxuICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnNcbiAgICAgICksXG4gICAgICAgIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnNpYmxpbmcpO1xufVxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihcbiAgZmluaXNoZWRSb290LFxuICBmaW5pc2hlZFdvcmssXG4gIGNvbW1pdHRlZExhbmVzLFxuICBjb21taXR0ZWRUcmFuc2l0aW9uc1xuKSB7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSAwOlxuICAgIGNhc2UgMTE6XG4gICAgY2FzZSAxNTpcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zXG4gICAgICApO1xuICAgICAgZmxhZ3MgJiAyMDQ4ICYmIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoOSwgZmluaXNoZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVNb3VudEVmZmVjdHMoXG4gICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnNcbiAgICAgICk7XG4gICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgKChmaW5pc2hlZFJvb3QgPSBudWxsKSxcbiAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSAmJlxuICAgICAgICAgIChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUuY2FjaGUpLFxuICAgICAgICAoZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUuY2FjaGUpLFxuICAgICAgICBmaW5pc2hlZFdvcmsgIT09IGZpbmlzaGVkUm9vdCAmJlxuICAgICAgICAgIChmaW5pc2hlZFdvcmsucmVmQ291bnQrKyxcbiAgICAgICAgICBudWxsICE9IGZpbmlzaGVkUm9vdCAmJiByZWxlYXNlQ2FjaGUoZmluaXNoZWRSb290KSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjpcbiAgICAgIGlmIChmbGFncyAmIDIwNDgpIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVNb3VudEVmZmVjdHMoXG4gICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9uc1xuICAgICAgICApO1xuICAgICAgICBmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICBpZCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIuaWQsXG4gICAgICAgICAgICBvblBvc3RDb21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uUG9zdENvbW1pdDtcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBvblBvc3RDb21taXQgJiZcbiAgICAgICAgICAgIG9uUG9zdENvbW1pdChcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIG51bGwgPT09IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgPyBcIm1vdW50XCIgOiBcInVwZGF0ZVwiLFxuICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uLFxuICAgICAgICAgICAgICAtMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTM6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9uc1xuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjM6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDIyOlxuICAgICAgX2ZpbmlzaGVkV29yayRtZW1vaXplMiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICBpZCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZVxuICAgICAgICA/IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIuX3Zpc2liaWxpdHkgJiAyXG4gICAgICAgICAgPyByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9uc1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogcmVjdXJzaXZlbHlUcmF2ZXJzZUF0b21pY1Bhc3NpdmVFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKVxuICAgICAgICA6IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIuX3Zpc2liaWxpdHkgJiAyXG4gICAgICAgICAgPyByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9uc1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogKChfZmluaXNoZWRXb3JrJG1lbW9pemUyLl92aXNpYmlsaXR5IHw9IDIpLFxuICAgICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgIGNvbW1pdHRlZF
1RyYW5zaXRpb25zLFxuICAgICAgICAgICAgICAwICE9PSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIDEwMjU2KVxuICAgICAgICAgICAgKSk7XG4gICAgICBmbGFncyAmIDIwNDggJiYgY29tbWl0T2Zmc2NyZWVuUGFzc2l2ZU1vdW50RWZmZWN0cyhpZCwgZmluaXNoZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjQ6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9uc1xuICAgICAgKTtcbiAgICAgIGZsYWdzICYgMjA0OCAmJlxuICAgICAgICBjb21taXRDYWNoZVBhc3NpdmVNb3VudEVmZmVjdChmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLCBmaW5pc2hlZFdvcmspO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zXG4gICAgICApO1xuICB9XG59XG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlUmVjb25uZWN0UGFzc2l2ZUVmZmVjdHMoXG4gIGZpbmlzaGVkUm9vdCRqc2NvbXAkMCxcbiAgcGFyZW50RmliZXIsXG4gIGNvbW1pdHRlZExhbmVzJGpzY29tcCQwLFxuICBjb21taXR0ZWRUcmFuc2l0aW9ucyRqc2NvbXAkMCxcbiAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0c1xuKSB7XG4gIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgPVxuICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiYgMCAhPT0gKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDEwMjU2KTtcbiAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKSB7XG4gICAgdmFyIGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkUm9vdCRqc2NvbXAkMCxcbiAgICAgIGZpbmlzaGVkV29yayA9IHBhcmVudEZpYmVyLFxuICAgICAgY29tbWl0dGVkTGFuZXMgPSBjb21taXR0ZWRMYW5lcyRqc2NvbXAkMCxcbiAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zID0gY29tbWl0dGVkVHJhbnNpdGlvbnMkanNjb21wJDAsXG4gICAgICBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgIGNhc2UgMTE6XG4gICAgICBjYXNlIDE1OlxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVjb25uZWN0UGFzc2l2ZUVmZmVjdHMoXG4gICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzXG4gICAgICAgICk7XG4gICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoOCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDIzOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjI6XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgPyBpbnN0YW5jZS5fdmlzaWJpbGl0eSAmIDJcbiAgICAgICAgICAgID8gcmVjdXJzaXZlbHlUcmF2ZXJzZVJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0c1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICA6ICgoaW5zdGFuY2UuX3Zpc2liaWxpdHkgfD0gMiksXG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVjb25uZWN0UGFzc2l2ZUVmZmVjdHMoXG4gICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHNcbiAgICAgICAgICAgICkpO1xuICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzICYmXG4gICAgICAgICAgZmxhZ3MgJiAyMDQ4ICYmXG4gICAgICAgICAgY29tbWl0T2Zmc2NyZWVuUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5hbHRlcm5hdGUsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmtcbiAgICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjQ6XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWNvbm5lY3RQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHNcbiAgICAgICAgKTtcbiAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyAmJlxuICAgICAgICAgIGZsYWdzICYgMjA0OCAmJlxuICAgICAgICAgIGNvbW1pdENhY2hlUGFzc2l2ZU1vdW50RWZmZWN0KGZpbmlzaGVkV29yay5hbHRlcm5hdGUsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0c1xuICAgICAgICApO1xuICAgIH1cbiAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnNpYmxpbmc7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhcbiAgZmluaXNoZWRSb290JGpzY29tcCQwLFxuICBwYXJlbnRGaWJlclxuKSB7XG4gIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiAxMDI1NilcbiAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApIHtcbiAgICAgIHZhciBmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFJvb3QkanNjb21wJDAsXG4gICAgICAgIGZpbmlzaGVkV29yayA9IHBhcmVudEZpYmVyLFxuICAgICAgICBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcbiAgICAgIHN3aXRjaCAo
1ZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiAyMDQ4ICYmXG4gICAgICAgICAgICBjb21taXRPZmZzY3JlZW5QYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmtcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZUF0b21pY1Bhc3NpdmVFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgIGNvbW1pdENhY2hlUGFzc2l2ZU1vdW50RWZmZWN0KGZpbmlzaGVkV29yay5hbHRlcm5hdGUsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZUF0b21pY1Bhc3NpdmVFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZztcbiAgICB9XG59XG52YXIgc3VzcGVuc2V5Q29tbWl0RmxhZyA9IDgxOTI7XG5mdW5jdGlvbiByZWN1cnNpdmVseUFjY3VtdWxhdGVTdXNwZW5zZXlDb21taXQocGFyZW50RmliZXIpIHtcbiAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIHN1c3BlbnNleUNvbW1pdEZsYWcpXG4gICAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKVxuICAgICAgYWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdE9uRmliZXIocGFyZW50RmliZXIpLFxuICAgICAgICAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nKTtcbn1cbmZ1bmN0aW9uIGFjY3VtdWxhdGVTdXNwZW5zZXlDb21taXRPbkZpYmVyKGZpYmVyKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSAyNjpcbiAgICAgIHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChmaWJlcik7XG4gICAgICBmaWJlci5mbGFncyAmIHN1c3BlbnNleUNvbW1pdEZsYWcgJiZcbiAgICAgICAgbnVsbCAhPT0gZmliZXIubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICBzdXNwZW5kUmVzb3VyY2UoXG4gICAgICAgICAgY3VycmVudEhvaXN0YWJsZVJvb3QsXG4gICAgICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSxcbiAgICAgICAgICBmaWJlci5tZW1vaXplZFByb3BzXG4gICAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDU6XG4gICAgICByZWN1cnNpdmVseUFjY3VtdWxhdGVTdXNwZW5zZXlDb21taXQoZmliZXIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgIGNhc2UgNDpcbiAgICAgIHZhciBwcmV2aW91c0hvaXN0YWJsZVJvb3QgPSBjdXJyZW50SG9pc3RhYmxlUm9vdDtcbiAgICAgIGN1cnJlbnRIb2lzdGFibGVSb290ID0gZ2V0SG9pc3RhYmxlUm9vdChmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICByZWN1cnNpdmVseUFjY3VtdWxhdGVTdXNwZW5zZXlDb21taXQoZmliZXIpO1xuICAgICAgY3VycmVudEhvaXN0YWJsZVJvb3QgPSBwcmV2aW91c0hvaXN0YWJsZVJvb3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDIyOlxuICAgICAgbnVsbCA9PT0gZmliZXIubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAoKHByZXZpb3VzSG9pc3RhYmxlUm9vdCA9IGZpYmVyLmFsdGVybmF0ZSksXG4gICAgICAgIG51bGwgIT09IHByZXZpb3VzSG9pc3RhYmxlUm9vdCAmJlxuICAgICAgICBudWxsICE9PSBwcmV2aW91c0hvaXN0YWJsZVJvb3QubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgID8gKChwcmV2aW91c0hvaXN0YWJsZVJvb3QgPSBzdXNwZW5zZXlDb21taXRGbGFnKSxcbiAgICAgICAgICAgIChzdXNwZW5zZXlDb21taXRGbGFnID0gMTY3NzcyMTYpLFxuICAgICAgICAgICAgcmVjdXJzaXZlbHlBY2N1bXVsYXRlU3VzcGVuc2V5Q29tbWl0KGZpYmVyKSxcbiAgICAgICAgICAgIChzdXNwZW5zZXlDb21taXRGbGFnID0gcHJldmlvdXNIb2lzdGFibGVSb290KSlcbiAgICAgICAgICA6IHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChmaWJlcikpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChmaWJlcik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRldGFjaEFsdGVybmF0ZVNpYmxpbmdzKHBhcmVudEZpYmVyKSB7XG4gIHZhciBwcmV2aW91c0ZpYmVyID0gcGFyZW50RmliZXIuYWx0ZXJuYXRlO1xuICBpZiAoXG4gICAgbnVsbCAhPT0gcHJldmlvdXNGaWJlciAmJlxuICAgICgocGFyZW50RmliZXIgPSBwcmV2aW91c0ZpYmVyLmNoaWxkKSwgbnVsbCAhPT0gcGFyZW50RmliZXIpXG4gICkge1xuICAgIHByZXZpb3VzRmliZXIuY2hpbGQgPSBudWxsO1xuICAgIGRvXG4gICAgICAocHJldmlvdXNGaWJlciA9IHBhcmVudEZpYmVyLnNpYmxpbmcpLFxuICAgICAgICAocGFyZW50RmliZXIuc2libGluZyA9IG51bGwpLFxuICAgICAgICAocGFyZW50RmliZXIgPSBwcmV2aW91c0ZpYmVyKTtcbiAgICB3aGlsZSAobnVsbCAhPT0gcGFyZW50RmliZXIpO1xuICB9XG59XG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZVVubW91bnRFZmZlY3RzKHBhcmVudEZpYmVyKSB7XG4gIHZhciBkZWxldGlvbnMgPSBwYXJlbnRGaWJlci5kZWxldGlvbnM7XG4gIGlmICgwICE9PSAocGFyZW50RmliZXIuZmxhZ3MgJiAxNikpIHtcbiAgICBpZiAobnVsbCAhPT0gZGVsZXRpb25zKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG4gICAgICAgIG5leHRFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKFxuICAgICAgICAgIGNoaWxkVG9EZWxldGUsXG4gICAgICAgICAgcGFyZW50RmliZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICBkZXRhY2hBbHRlcm5hdGVTaWJsaW5ncyhwYXJlbnRGaWJlcik7XG4gIH1cbiAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDEwMjU2KVxuICAgIGZvciAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5jaGlsZDsgbnVsbCAhPT0gcGFyZW50RmliZXI7IClcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihwYXJlbnRGaWJlciksXG4gICAgICAgIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnNpYmxpbmcpO1xufVxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIDA6XG4gICAgY2FzZSAxMTpcbiAgICBjYXNlIDE1OlxuICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgZmluaXNoZWRXb3JrLmZsYWdzICYgMjA0OCAmJlxuICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoOSwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlVW5tb3VudEVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTI6XG4gICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZVVubW91bnRFZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDIyOlxuICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlICYmXG4gICAgICBpbnN0YW5jZS5fdmlzaWJpbGl0eSAmIDIgJiZcbiAgICAgIChudWxsID09PSBmaW5pc2hlZFdvcmsucmV0dXJuIHx8IDEzICE9PSBmaW5pc2hlZFdvcmsucmV0dXJuLnRhZylcbiAgICAgICAgPyAoKGluc3RhbmNlLl92aXNpYmlsaXR5ICY9IC0zKSxcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzY29ubmVjdFBhc3NpdmVFZmZlY3RzKGZpbmlzaGVkV29yaykpXG4gICAgICAgIDogcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlVW5tb3VudEVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZURpc2Nvbm5lY3RQYXNzaXZlRWZmZWN0cyhwYXJlbnRGaWJlcikge1xuICB2YXIgZGVsZXRpb25zID0gcGFyZW50RmliZXIuZGVsZXRpb25zO1xuICBpZiAoMCAhPT0gKHBhcmVudEZpYmVyLmZsYWdzICYgMTYpKSB7XG4gICAgaWYgKG51bGwgIT09IGRlbGV0aW9ucylcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgI
1HZhciBjaGlsZFRvRGVsZXRlID0gZGVsZXRpb25zW2ldO1xuICAgICAgICBuZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihcbiAgICAgICAgICBjaGlsZFRvRGVsZXRlLFxuICAgICAgICAgIHBhcmVudEZpYmVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgZGV0YWNoQWx0ZXJuYXRlU2libGluZ3MocGFyZW50RmliZXIpO1xuICB9XG4gIGZvciAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5jaGlsZDsgbnVsbCAhPT0gcGFyZW50RmliZXI7ICkge1xuICAgIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyO1xuICAgIHN3aXRjaCAoZGVsZXRpb25zLnRhZykge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxMTpcbiAgICAgIGNhc2UgMTU6XG4gICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudCg4LCBkZWxldGlvbnMsIGRlbGV0aW9ucy5yZXR1cm4pO1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzY29ubmVjdFBhc3NpdmVFZmZlY3RzKGRlbGV0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyMjpcbiAgICAgICAgaSA9IGRlbGV0aW9ucy5zdGF0ZU5vZGU7XG4gICAgICAgIGkuX3Zpc2liaWxpdHkgJiAyICYmXG4gICAgICAgICAgKChpLl92aXNpYmlsaXR5ICY9IC0zKSxcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzY29ubmVjdFBhc3NpdmVFZmZlY3RzKGRlbGV0aW9ucykpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNjb25uZWN0UGFzc2l2ZUVmZmVjdHMoZGVsZXRpb25zKTtcbiAgICB9XG4gICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nO1xuICB9XG59XG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKFxuICBkZWxldGVkU3VidHJlZVJvb3QsXG4gIG5lYXJlc3RNb3VudGVkQW5jZXN0b3Jcbikge1xuICBmb3IgKDsgbnVsbCAhPT0gbmV4dEVmZmVjdDsgKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxMTpcbiAgICAgIGNhc2UgMTU6XG4gICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudCg4LCBmaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyMzpcbiAgICAgIGNhc2UgMjI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICBudWxsICE9PSBmaWJlci5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgbnVsbCAhPT0gZmliZXIubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2xcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIGNhY2hlID0gZmliZXIubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wucG9vbDtcbiAgICAgICAgICBudWxsICE9IGNhY2hlICYmIGNhY2hlLnJlZkNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI0OlxuICAgICAgICByZWxlYXNlQ2FjaGUoZmliZXIubWVtb2l6ZWRTdGF0ZS5jYWNoZSk7XG4gICAgfVxuICAgIGNhY2hlID0gZmliZXIuY2hpbGQ7XG4gICAgaWYgKG51bGwgIT09IGNhY2hlKSAoY2FjaGUucmV0dXJuID0gZmliZXIpLCAobmV4dEVmZmVjdCA9IGNhY2hlKTtcbiAgICBlbHNlXG4gICAgICBhOiBmb3IgKGZpYmVyID0gZGVsZXRlZFN1YnRyZWVSb290OyBudWxsICE9PSBuZXh0RWZmZWN0OyApIHtcbiAgICAgICAgY2FjaGUgPSBuZXh0RWZmZWN0O1xuICAgICAgICB2Y
1XIgc2libGluZyA9IGNhY2hlLnNpYmxpbmcsXG4gICAgICAgICAgcmV0dXJuRmliZXIgPSBjYWNoZS5yZXR1cm47XG4gICAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGNhY2hlKTtcbiAgICAgICAgaWYgKGNhY2hlID09PSBmaWJlcikge1xuICAgICAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bGwgIT09IHNpYmxpbmcpIHtcbiAgICAgICAgICBzaWJsaW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dEVmZmVjdCA9IHJldHVybkZpYmVyO1xuICAgICAgfVxuICB9XG59XG52YXIgRGVmYXVsdEFzeW5jRGlzcGF0Y2hlciA9IHtcbiAgICBnZXRDYWNoZUZvclR5cGU6IGZ1bmN0aW9uIChyZXNvdXJjZVR5cGUpIHtcbiAgICAgIHZhciBjYWNoZSA9IHJlYWRDb250ZXh0KENhY2hlQ29udGV4dCksXG4gICAgICAgIGNhY2hlRm9yVHlwZSA9IGNhY2hlLmRhdGEuZ2V0KHJlc291cmNlVHlwZSk7XG4gICAgICB2b2lkIDAgPT09IGNhY2hlRm9yVHlwZSAmJlxuICAgICAgICAoKGNhY2hlRm9yVHlwZSA9IHJlc291cmNlVHlwZSgpKSxcbiAgICAgICAgY2FjaGUuZGF0YS5zZXQocmVzb3VyY2VUeXBlLCBjYWNoZUZvclR5cGUpKTtcbiAgICAgIHJldHVybiBjYWNoZUZvclR5cGU7XG4gICAgfVxuICB9LFxuICBQb3NzaWJseVdlYWtNYXAgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBXZWFrTWFwID8gV2Vha01hcCA6IE1hcCxcbiAgZXhlY3V0aW9uQ29udGV4dCA9IDAsXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGwsXG4gIHdvcmtJblByb2dyZXNzID0gbnVsbCxcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSAwLFxuICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IDAsXG4gIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsLFxuICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3MgPSAhMSxcbiAgd29ya0luUHJvZ3Jlc3NSb290SXNQcmVyZW5kZXJpbmcgPSAhMSxcbiAgd29ya0luUHJvZ3Jlc3NSb290RGlkQXR0YWNoUGluZ0xpc3RlbmVyID0gITEsXG4gIGVudGFuZ2xlZFJlbmRlckxhbmVzID0gMCxcbiAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IDAsXG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IDAsXG4gIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gMCxcbiAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSAwLFxuICB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZSA9IDAsXG4gIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyA9IDAsXG4gIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBudWxsLFxuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGwsXG4gIHdvcmtJblByb2dyZXNzUm9vdERpZEluY2x1ZGVSZWN1cnNpdmVSZW5kZXJVcGRhdGUgPSAhMSxcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IDAsXG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBJbmZpbml0eSxcbiAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IG51bGwsXG4gIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbCxcbiAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPSAwLFxuICBwZW5kaW5nRWZmZWN0c1Jvb3QgPSBudWxsLFxuICBwZW5kaW5nRmluaXNoZWRXb3JrID0gbnVsbCxcbiAgcGVuZGluZ0VmZmVjdHNMYW5lcyA9IDAsXG4gIHBlbmRpbmdFZmZlY3RzUmVtYWluaW5nTGFuZXMgPSAwLFxuICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbCxcbiAgcGVuZGluZ1JlY292ZXJhYmxlRXJyb3JzID0gbnVsbCxcbiAgbmVzdGVkVXBkYXRlQ291bnQgPSAwLFxuICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuZnVuY3Rpb24gcmVxdWVzdFVwZGF0ZUxhbmUoKSB7XG4gIGlmICgwICE9PSAoZXhlY3V0aW9uQ29udGV4dCAmIDIpICYmIDAgIT09IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKVxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIC13b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcztcbiAgaWYgKG51bGwgIT09IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQpIHtcbiAgICB2YXIgYWN0aW9uU2NvcGVMYW5lID0gY3VycmVudEVudGFuZ2xlZExhbmU7XG4gICAgcmV0dXJuIDAgIT09IGFjdGlvblNjb3BlTGFuZSA/IGFjdGlvblNjb3BlTGFuZSA6IHJlcXVlc3RUcmFuc2l0aW9uTGFuZSgpO1xuICB9XG4gIHJldHVybiByZXNvbHZlVXBkYXRlUHJpb3JpdHkoKTtcbn1cbmZ1bmN0aW9uIHJlcXVlc3REZWZlcnJlZExhbmUoKSB7XG4gIDAgPT09IHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lICYmXG4gICAgKHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lID1cbiAgICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIDUzNjg3MDkxMikgfHwgaXNIeWRyYXRpbmdcbiAgICAgICAgPyBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpXG4gICAgICAgIDogNTM2ODcwOTEyKTtcbiAgdmFyIHN1c3BlbnNlSGFuZGxlciA9IHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIG51bGwgIT09IHN1c3BlbnNlSGFuZGxlciAmJiAoc3VzcGVuc2VIYW5kbGVyLmZsYWdzIHw9IDMyKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lO1xufVxuZnVuY3Rpb24gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lKSB7XG4gIGlmIChcbiAgICAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ICYmXG4gICAgICAoMiA9PT0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gfHxcbiAgICAgICAgOSA9PT0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24pKSB8fFxuICAgIG51bGwgIT09IHJvb3QuY2FuY2VsUGVuZGluZ0NvbW1pdFxuICApXG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgMCksXG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZChcbiAgICAgICAgcm9vdCxcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMsXG4gICAgICAgI
1HdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAhMVxuICAgICAgKTtcbiAgbWFya1Jvb3RVcGRhdGVkJDEocm9vdCwgbGFuZSk7XG4gIGlmICgwID09PSAoZXhlY3V0aW9uQ29udGV4dCAmIDIpIHx8IHJvb3QgIT09IHdvcmtJblByb2dyZXNzUm9vdClcbiAgICByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgJiZcbiAgICAgICgwID09PSAoZXhlY3V0aW9uQ29udGV4dCAmIDIpICYmXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyB8PSBsYW5lKSxcbiAgICAgIDQgPT09IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgJiZcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQoXG4gICAgICAgICAgcm9vdCxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZSxcbiAgICAgICAgICAhMVxuICAgICAgICApKSxcbiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290KTtcbn1cbmZ1bmN0aW9uIHBlcmZvcm1Xb3JrT25Sb290KHJvb3QkanNjb21wJDAsIGxhbmVzLCBmb3JjZVN5bmMpIHtcbiAgaWYgKDAgIT09IChleGVjdXRpb25Db250ZXh0ICYgNikpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzI3KSk7XG4gIHZhciBzaG91bGRUaW1lU2xpY2UgPVxuICAgICAgKCFmb3JjZVN5bmMgJiZcbiAgICAgICAgMCA9PT0gKGxhbmVzICYgMTI0KSAmJlxuICAgICAgICAwID09PSAobGFuZXMgJiByb290JGpzY29tcCQwLmV4cGlyZWRMYW5lcykpIHx8XG4gICAgICBjaGVja0lmUm9vdElzUHJlcmVuZGVyaW5nKHJvb3QkanNjb21wJDAsIGxhbmVzKSxcbiAgICBleGl0U3RhdHVzID0gc2hvdWxkVGltZVNsaWNlXG4gICAgICA/IHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QkanNjb21wJDAsIGxhbmVzKVxuICAgICAgOiByZW5kZXJSb290U3luYyhyb290JGpzY29tcCQwLCBsYW5lcywgITApLFxuICAgIHJlbmRlcldhc0NvbmN1cnJlbnQgPSBzaG91bGRUaW1lU2xpY2U7XG4gIGRvIHtcbiAgICBpZiAoMCA9PT0gZXhpdFN0YXR1cykge1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290SXNQcmVyZW5kZXJpbmcgJiZcbiAgICAgICAgIXNob3VsZFRpbWVTbGljZSAmJlxuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChyb290JGpzY29tcCQwLCBsYW5lcywgMCwgITEpO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcmNlU3luYyA9IHJvb3QkanNjb21wJDAuY3VycmVudC5hbHRlcm5hdGU7XG4gICAgICBpZiAoXG4gICAgICAgIHJlbmRlcldhc0NvbmN1cnJlbnQgJiZcbiAgICAgICAgIWlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3Jlcyhmb3JjZVN5bmMpXG4gICAgICApIHtcbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QkanNjb21wJDAsIGxhbmVzLCAhMSk7XG4gICAgICAgIHJlbmRlcldhc0NvbmN1cnJlbnQgPSAhMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoMiA9PT0gZXhpdFN0YXR1cykge1xuICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50ID0gbGFuZXM7XG4gICAgICAgIGlmIChyb290JGpzY29tcCQwLmVycm9yUmVjb3ZlcnlEaXNhYmxlZExhbmVzICYgcmVuZGVyV2FzQ29uY3VycmVudClcbiAgICAgICAgICB2Y
1XIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gMDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSByb290JGpzY29tcCQwLnBlbmRpbmdMYW5lcyAmIC01MzY4NzA5MTMpLFxuICAgICAgICAgICAgKEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9XG4gICAgICAgICAgICAgIDAgIT09IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdFxuICAgICAgICAgICAgICAgID8gSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0XG4gICAgICAgICAgICAgICAgOiBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgJiA1MzY4NzA5MTJcbiAgICAgICAgICAgICAgICAgID8gNTM2ODcwOTEyXG4gICAgICAgICAgICAgICAgICA6IDApO1xuICAgICAgICBpZiAoMCAhPT0gSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0KSB7XG4gICAgICAgICAgbGFuZXMgPSBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQ7XG4gICAgICAgICAgYToge1xuICAgICAgICAgICAgdmFyIHJvb3QgPSByb290JGpzY29tcCQwO1xuICAgICAgICAgICAgZXhpdFN0YXR1cyA9IHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnM7XG4gICAgICAgICAgICB2YXIgd2FzUm9vdERlaHlkcmF0ZWQgPSByb290LmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQ7XG4gICAgICAgICAgICB3YXNSb290RGVoeWRyYXRlZCAmJlxuICAgICAgICAgICAgICAocHJlcGFyZUZyZXNoU3RhY2socm9vdCwgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0KS5mbGFncyB8PSAyNTYpO1xuICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gcmVuZGVyUm9vdFN5bmMoXG4gICAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCxcbiAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoMiAhPT0gSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRBdHRhY2hQaW5nTGlzdGVuZXIgJiZcbiAgICAgICAgICAgICAgICAhd2FzUm9vdERlaHlkcmF0ZWRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcm9vdC5lcnJvclJlY292ZXJ5RGlzYWJsZWRMYW5lcyB8PSByZW5kZXJXYXNDb25jdXJyZW50O1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzIHw9XG4gICAgICAgICAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50O1xuICAgICAgICAgICAgICAgIGV4aXRTdGF0dXMgPSA0O1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVuZGVyV2FzQ29uY3VycmVudCA9IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzO1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGV4aXRTdGF0dXM7XG4gICAgICAgICAgICAgIG51bGwgIT09IHJlbmRlcldhc0NvbmN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgICAobnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnNcbiAgICAgICAgICAgICAgICAgID8gKHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gcmVuZGVyV2FzQ29uY3VycmVudClcbiAgICAgICAgICAgICAgICAgIDogd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMucHVzaC5hcHBseShcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhpdFN0YXR1cyA9IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVuZGVyV2FzQ29uY3VycmVudCA9ICExO1xuICAgICAgICAgIGlmICgyICE9PSBleGl0U3RhdHVzKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKDEgPT09IGV4aXRTdGF0dXMpIHtcbiAgICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCRqc2NvbXAkMCwgMCk7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkKHJvb3QkanNjb21wJDAsIGxhbmVzLCAwLCAhMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYToge1xuICAgICAgICBzaG91bGRUaW1lU2xpY2UgPSByb290JGpzY29tcCQwO1xuICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50ID0gZXhpdFN0YXR1cztcbiAgICAgICAgc3dpdGNoIChyZW5kZXJXYXNDb25jdXJyZW50KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzQ1KSk7XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgaWYgKChsYW5lcyAmIDQxOTQwNDgpICE9PSBsYW5lcykgYnJlYWs7XG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQoXG4gICAgICAgICAgICAgIHNob3VsZFRpbWVTbGljZSxcbiAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgICAhd29ya0luUHJvZ3Jlc3NSb290RGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzI5KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChsYW5lcyAmIDYyOTE0NTYwKSA9PT0gbGFuZXMgJiZcbiAgICAgICAgICAoKGV4aXRTdGF0dXMgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgMzAwIC0gbm93KCkpLFxuICAgICAgICAgIDEwIDwgZXhpdFN0YXR1cylcbiAgICAgICAgKSB7XG4gICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQoXG4gICAgICAgICAgICBzaG91bGRUaW1l
1U2xpY2UsXG4gICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgIXdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5nc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKDAgIT09IGdldE5leHRMYW5lcyhzaG91bGRUaW1lU2xpY2UsIDAsICEwKSkgYnJlYWsgYTtcbiAgICAgICAgICBzaG91bGRUaW1lU2xpY2UudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChcbiAgICAgICAgICAgIGNvbW1pdFJvb3RXaGVuUmVhZHkuYmluZChcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgc2hvdWxkVGltZVNsaWNlLFxuICAgICAgICAgICAgICBmb3JjZVN5bmMsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRJbmNsdWRlUmVjdXJzaXZlUmVuZGVyVXBkYXRlLFxuICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NEZWZlcnJlZExhbmUsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJldHJ5TGFuZXMsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyxcbiAgICAgICAgICAgICAgcmVuZGVyV2FzQ29uY3VycmVudCxcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgLTAsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBleGl0U3RhdHVzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhayBhO1xuICAgICAgICB9XG4gICAgICAgIGNvbW1pdFJvb3RXaGVuUmVhZHkoXG4gICAgICAgICAgc2hvdWxkVGltZVNsaWNlLFxuICAgICAgICAgIGZvcmNlU3luYyxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zLFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZEluY2x1ZGVSZWN1cnNpdmVSZW5kZXJVcGRhdGUsXG4gICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NEZWZlcnJlZExhbmUsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZXRyeUxhbmVzLFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyxcbiAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50LFxuICAgICAgICAgIDAsXG4gICAgICAgICAgLTAsXG4gICAgICAgICAgMFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBicmVhaztcbiAgfSB3aGlsZSAoMSk7XG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290JGpzY29tcCQwKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFJvb3RXaGVuUmVhZHkoXG4gIHJvb3QsXG4gIGZpbmlzaGVkV29yayxcbiAgcmVjb3ZlcmFibGVFcnJvcnMsXG4gIHRyYW5zaXRpb25zLFxuICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUsXG4gIGxhbmVzLFxuICBzcGF3bmVkTGFuZSxcbiAgdXBkYXRlZExhbmVzLFxuICBzdXNwZW5kZWRSZXRyeUxhbmVzLFxuICBkaWRTa2lwU3VzcGVuZGVkU2libGluZ3MsXG4gIGV4aXRTdGF0dXMsXG4gIHN1c3BlbmRlZENvbW1pdFJlYXNvbixcbiAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lLFxuICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lXG4pIHtcbiAgcm9vdC50aW1lb3V0SGFuZGxlID0gLTE7XG4gIHN1c3BlbmRlZENvbW1pdFJlYXNvbiA9IGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3M7XG4gIGlmIChcbiAgICBzdXNwZW5kZWRDb21taXRSZWFzb24gJiA4MTkyIHx8XG4gICAgMTY3ODU0MDggPT09IChzdXNwZW5kZWRDb21taXRSZWFzb24gJiAxNjc4NTQwOClcbiAgKVxuICAgIGlmIChcbiAgICAgICgoc3VzcGVuZGVkU3RhdGUgPSB7IHN0eWxlc2hlZXRzOiBudWxsLCBjb3VudDogMCwgdW5zdXNwZW5kOiBub29wIH0pLFxuICAgICAgYWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdE9uRmliZXIoZmluaXNoZWRXb3JrKSxcbiAgICAgIChzdXNwZW5kZWRDb21taXRSZWFzb24gPSB3YWl0Rm9yQ29tbWl0VG9CZVJlYWR5KCkpLFxuICAgICAgbnVsbCAhPT0gc3VzcGVuZGVkQ29tbWl0UmVhc29uKVxuICAgICkge1xuICAgICAgcm9vdC5jYW5jZWxQZW5kaW5nQ29tbWl0ID0gc3VzcGVuZGVkQ29tbWl0UmVhc29uKFxuICAgICAgICBjb21taXRSb290LmJpbmQoXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICByb290LFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICByZWNvdmVyYWJsZUVycm9ycyxcbiAgICAgICAgICB0cmFuc2l0aW9ucyxcbiAgICAgICAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUsXG4gICAgICAgICAgc3Bhd25lZExhbmUsXG4gICAgICAgICAgdXBkYXRlZExhbmVzLFxuICAgICAgICAgIHN1c3BlbmRlZFJldHJ5TGFuZXMsXG4gICAgICAgICAgZXhpdFN0YXR1cyxcbiAgICAgICAgICAxLFxuICAgICAgICAgIGNvbXBsZXRlZFJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBsYW5lcywgc3Bhd25lZExhbmUsICFkaWRTa2lwU3VzcGVuZGVkU2libGluZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgY29tbWl0Um9vdChcbiAgICByb290LFxuICAgIGZpbmlzaGVkV29yayxcbiAgICBsYW5lcyxcbiAgICByZWNvdmVyYWJsZUVycm9ycyxcbiAgICB0cmFuc2l0aW9ucyxcbiAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUsXG4gICAgc3Bhd25lZExhbmUsXG4gICAgdXBkYXRlZExhbmVzLFxuICAgIHN1c3BlbmRlZFJldHJ5TGFuZXNcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspIHtcbiAgZm9yICh2YXIgbm9kZSA9IGZpbmlzaGVkV29yazsgOyApIHtcbiAgICB2YXIgdGFnID0gbm9kZS50YWc7XG4gICAgaWYgKFxuICAgICAgKDAgPT09IHRhZyB8fCAxMSA9PT0gdGFnIHx8IDE1ID09PSB0YWcpICYmXG4gICAgICBub2Rl
1LmZsYWdzICYgMTYzODQgJiZcbiAgICAgICgodGFnID0gbm9kZS51cGRhdGVRdWV1ZSksXG4gICAgICBudWxsICE9PSB0YWcgJiYgKCh0YWcgPSB0YWcuc3RvcmVzKSwgbnVsbCAhPT0gdGFnKSlcbiAgICApXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhZy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2sgPSB0YWdbaV0sXG4gICAgICAgICAgZ2V0U25hcHNob3QgPSBjaGVjay5nZXRTbmFwc2hvdDtcbiAgICAgICAgY2hlY2sgPSBjaGVjay52YWx1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIW9iamVjdElzKGdldFNuYXBzaG90KCksIGNoZWNrKSkgcmV0dXJuICExO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIHRhZyA9IG5vZGUuY2hpbGQ7XG4gICAgaWYgKG5vZGUuc3VidHJlZUZsYWdzICYgMTYzODQgJiYgbnVsbCAhPT0gdGFnKVxuICAgICAgKHRhZy5yZXR1cm4gPSBub2RlKSwgKG5vZGUgPSB0YWcpO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKG5vZGUgPT09IGZpbmlzaGVkV29yaykgYnJlYWs7XG4gICAgICBmb3IgKDsgbnVsbCA9PT0gbm9kZS5zaWJsaW5nOyApIHtcbiAgICAgICAgaWYgKG51bGwgPT09IG5vZGUucmV0dXJuIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHJldHVybiAhMDtcbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICEwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQoXG4gIHJvb3QsXG4gIHN1c3BlbmRlZExhbmVzLFxuICBzcGF3bmVkTGFuZSxcbiAgZGlkQXR0ZW1wdEVudGlyZVRyZWVcbikge1xuICBzdXNwZW5kZWRMYW5lcyAmPSB+d29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXM7XG4gIHN1c3BlbmRlZExhbmVzICY9IH53b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcztcbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyB8PSBzdXNwZW5kZWRMYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyAmPSB+c3VzcGVuZGVkTGFuZXM7XG4gIGRpZEF0dGVtcHRFbnRpcmVUcmVlICYmIChyb290Lndhcm1MYW5lcyB8PSBzdXNwZW5kZWRMYW5lcyk7XG4gIGRpZEF0dGVtcHRFbnRpcmVUcmVlID0gcm9vdC5leHBpcmF0aW9uVGltZXM7XG4gIGZvciAodmFyIGxhbmVzID0gc3VzcGVuZGVkTGFuZXM7IDAgPCBsYW5lczsgKSB7XG4gICAgdmFyIGluZGV4JDQgPSAzMSAtIGNsejMyKGxhbmVzKSxcbiAgICAgIGxhbmUgPSAxIDw8IGluZGV4JDQ7XG4gICAgZGlkQXR0ZW1wdEVudGlyZVRyZWVbaW5kZXgkNF0gPSAtMTtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxuICAwICE9PSBzcGF3bmVkTGFuZSAmJlxuICAgIG1hcmtTcGF3bmVkRGVmZXJyZWRMYW5lKHJvb3QsIHNwYXduZWRMYW5lLCBzdXNwZW5kZWRMYW5lcyk7XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNXb3JrJDEoKSB7XG4gIHJldHVybiAwID09PSAoZXhlY3V0aW9uQ29udGV4dCAmIDYpXG4gICAgPyAoZmx1c2hTeW5jV29ya0Fjcm9zc1Jvb3RzX2ltcGwoMCwgITEpLCAhMSlcbiAgICA6ICEwO1xufVxuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1N0YWNrKCkge1xuICBpZiAobnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICBpZiAoMCA9PT0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24pXG4gICAgICB2Y
1XIgaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIGVsc2VcbiAgICAgIChpbnRlcnJ1cHRlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgIChsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbCksXG4gICAgICAgIHJlc2V0SG9va3NPblVud2luZChpbnRlcnJ1cHRlZFdvcmspLFxuICAgICAgICAodGhlbmFibGVTdGF0ZSA9IG51bGwpLFxuICAgICAgICAodGhlbmFibGVJbmRleENvdW50ZXIgPSAwKSxcbiAgICAgICAgKGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzKTtcbiAgICBmb3IgKDsgbnVsbCAhPT0gaW50ZXJydXB0ZWRXb3JrOyApXG4gICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoaW50ZXJydXB0ZWRXb3JrLmFsdGVybmF0ZSwgaW50ZXJydXB0ZWRXb3JrKSxcbiAgICAgICAgKGludGVycnVwdGVkV29yayA9IGludGVycnVwdGVkV29yay5yZXR1cm4pO1xuICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpIHtcbiAgdmFyIHRpbWVvdXRIYW5kbGUgPSByb290LnRpbWVvdXRIYW5kbGU7XG4gIC0xICE9PSB0aW1lb3V0SGFuZGxlICYmXG4gICAgKChyb290LnRpbWVvdXRIYW5kbGUgPSAtMSksIGNhbmNlbFRpbWVvdXQodGltZW91dEhhbmRsZSkpO1xuICB0aW1lb3V0SGFuZGxlID0gcm9vdC5jYW5jZWxQZW5kaW5nQ29tbWl0O1xuICBudWxsICE9PSB0aW1lb3V0SGFuZGxlICYmXG4gICAgKChyb290LmNhbmNlbFBlbmRpbmdDb21taXQgPSBudWxsKSwgdGltZW91dEhhbmRsZSgpKTtcbiAgcmVzZXRXb3JrSW5Qcm9ncmVzc1N0YWNrKCk7XG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHdvcmtJblByb2dyZXNzID0gdGltZW91dEhhbmRsZSA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHJvb3QuY3VycmVudCwgbnVsbCk7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gbGFuZXM7XG4gIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gMDtcbiAgd29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyA9ICExO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJc1ByZXJlbmRlcmluZyA9IGNoZWNrSWZSb290SXNQcmVyZW5kZXJpbmcocm9vdCwgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRBdHRhY2hQaW5nTGlzdGVuZXIgPSAhMTtcbiAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZXRyeUxhbmVzID1cbiAgICB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZSA9XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPVxuICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID1cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPVxuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPVxuICAgICAgMDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID1cbiAgICBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRJbmNsdWRlUmVjdXJzaXZlUmVuZGVyVXBkYXRlID0gITE7XG4gIDAgIT09IChsYW5lcyAmIDgpICYmIChsYW5lcyB8PSBsYW5lcyAmIDMyKTtcbiAgdmFyIGFsbEVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcztcbiAgaWYgKDAgIT09IGFsbEVudGFuZ2xlZExhbmVzKVxuICAgIGZvciAoXG4gICAgICByb290ID0gcm9vdC5lbnRhbmdsZW1lbnRzLCBhbGxFbnRhbmdsZWRMYW5lcyAmPSBsYW5lcztcbiAgICAgIDAgPCBhbGxFbnRhbmdsZWRMYW5lcztcblxuICAgICkge1xuICAgICAgdmFyIGluZGV4JDIgPSAzMSAtIGNsejMyKGFsbEVudGFuZ2xlZExhbmVzKSxcbiAgICAgICAgbGFuZSA9IDEgPDwgaW5kZXgkMjtcbiAgICAgIGxhbmVzIHw9IHJvb3RbaW5kZXgkMl07XG4gICAgICBhbGxFbnRhbmdsZWRMYW5lcyAmPSB+bGFuZTtcbiAgICB9XG4gIGVudGFuZ2xlZFJlbmRlckxhbmVzID0gbGFuZXM7XG4gIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKTtcbiAgcmV0dXJuIHRpbWVvdXRIYW5kbGU7XG59XG5mdW5jdGlvbiBoYW5kbGVUaHJvdyhyb290LCB0aHJvd25WYWx1ZSkge1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIHRocm93blZhbHVlID09PSBTdXNwZW5zZUV4Y2VwdGlvbiB8fCB0aHJvd25WYWx1ZSA9PT0gU3VzcGVuc2VBY3Rpb25FeGNlcHRpb25cbiAgICA/ICgodGhyb3duVmFsdWUgPSBnZXRTdXNwZW5kZWRUaGVuYWJsZSgpKSxcbiAgICAgICh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IDMpKVxuICAgIDogdGhyb3duVmFsdWUgPT09IFN1c3BlbnNleUNvbW1pdEV4Y2VwdGlvblxuICAgICAgPyAoKHRocm93blZhbHVlID0gZ2V0U3VzcGVuZGVkVGhlbmFibGUoKSksXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IDQpKVxuICAgICAgOiAod29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPVxuICAgICAgICAgIHRocm93blZhbHVlID09PSBTZWxlY3RpdmVIeWRyYXRpb25FeGNlcHRpb25cbiAgICAgICAgICAgID8gOFxuICAgICAgICAgICAgOiBudWxsICE9PSB0aHJvd25WYWx1ZSAmJlxuICAgICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiB0aHJvd25WYWx1ZSAmJlxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHRocm93blZhbHVlLnRoZW5cbiAgICAgICAgICAgICAgPyA2XG4gICAgICAgICAgICAgIDogMSk7XG4gIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSB0aHJvd25WYWx1ZTtcbiAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3MgJiZcbiAgICAoKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSAxKSxcbiAgICBsb2dVbmNhdWdodEVycm9yKFxuICAgICAgcm9vdCxcbiAgICAgIGNyZWF0ZUNhcH
1R1cmVkVmFsdWVBdEZpYmVyKHRocm93blZhbHVlLCByb290LmN1cnJlbnQpXG4gICAgKSk7XG59XG5mdW5jdGlvbiBwdXNoRGlzcGF0Y2hlcigpIHtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcbiAgcmV0dXJuIG51bGwgPT09IHByZXZEaXNwYXRjaGVyID8gQ29udGV4dE9ubHlEaXNwYXRjaGVyIDogcHJldkRpc3BhdGNoZXI7XG59XG5mdW5jdGlvbiBwdXNoQXN5bmNEaXNwYXRjaGVyKCkge1xuICB2YXIgcHJldkFzeW5jRGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkE7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkEgPSBEZWZhdWx0QXN5bmNEaXNwYXRjaGVyO1xuICByZXR1cm4gcHJldkFzeW5jRGlzcGF0Y2hlcjtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSA0O1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3MgfHxcbiAgICAoKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgNDE5NDA0OCkgIT09XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmJlxuICAgICAgbnVsbCAhPT0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudCkgfHxcbiAgICAod29ya0luUHJvZ3Jlc3NSb290SXNQcmVyZW5kZXJpbmcgPSAhMCk7XG4gICgwID09PSAod29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzICYgMTM0MjE3NzI3KSAmJlxuICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyAmIDEzNDIxNzcyNykpIHx8XG4gICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NSb290IHx8XG4gICAgbWFya1Jvb3RTdXNwZW5kZWQoXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QsXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyxcbiAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgITFcbiAgICApO1xufVxuZnVuY3Rpb24gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMsIHNob3VsZFlpZWxkRm9yUHJlcmVuZGVyaW5nKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gMjtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKSxcbiAgICBwcmV2QXN5bmNEaXNwYXRjaGVyID0gcHVzaEFzeW5jRGlzcGF0Y2hlcigpO1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcylcbiAgICAod29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IG51bGwpLCBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gIGxhbmVzID0gITE7XG4gIHZhciBleGl0U3RhdHVzID0gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbiAgYTogZG9cbiAgICB0cnkge1xuICAgICAgaWYgKDAgIT09IHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uICYmIG51bGwgIT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHZhciB1bml0T2ZXb3JrID0gd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgdGhyb3duVmFsdWUgPSB3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlO1xuICAgICAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uKSB7XG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1N0YWNrKCk7XG4gICAgICAgICAgICBleGl0U3RhdHVzID0gNjtcbiAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgbnVsbCA9PT0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudCAmJiAobGFuZXMgPSAhMCk7XG4gICAgICAgICAgICB2Y
1XIgcmVhc29uID0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb247XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IDA7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRocm93QW5kVW53aW5kV29ya0xvb3Aocm9vdCwgdW5pdE9mV29yaywgdGhyb3duVmFsdWUsIHJlYXNvbik7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHNob3VsZFlpZWxkRm9yUHJlcmVuZGVyaW5nICYmXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdElzUHJlcmVuZGVyaW5nXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZXhpdFN0YXR1cyA9IDA7XG4gICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgKHJlYXNvbiA9IHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uKSxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gMCksXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbCksXG4gICAgICAgICAgICAgIHRocm93QW5kVW53aW5kV29ya0xvb3Aocm9vdCwgdW5pdE9mV29yaywgdGhyb3duVmFsdWUsIHJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgZXhpdFN0YXR1cyA9IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSQxNjcpIHtcbiAgICAgIGhhbmRsZVRocm93KHJvb3QsIHRocm93blZhbHVlJDE2Nyk7XG4gICAgfVxuICB3aGlsZSAoMSk7XG4gIGxhbmVzICYmIHJvb3Quc2hlbGxTdXNwZW5kQ291bnRlcisrO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkEgPSBwcmV2QXN5bmNEaXNwYXRjaGVyO1xuICBudWxsID09PSB3b3JrSW5Qcm9ncmVzcyAmJlxuICAgICgod29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbCksXG4gICAgKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gMCksXG4gICAgZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpKTtcbiAgcmV0dXJuIGV4aXRTdGF0dXM7XG59XG5mdW5jdGlvbiB3b3JrTG9vcFN5bmMoKSB7XG4gIGZvciAoOyBudWxsICE9PSB3b3JrSW5Qcm9ncmVzczsgKSBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG59XG5mdW5jdGlvbiByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IDI7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCksXG4gICAgcHJldkFzeW5jRGlzcGF0Y2hlciA9IHB1c2hBc3luY0Rpc3BhdGNoZXIoKTtcbiAgd29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lc1xuICAgID8gKCh3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gbnVsbCksXG4gICAgICAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IG5vdygpICsgNTAwKSxcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKSlcbiAgICA6ICh3b3JrSW5Qcm9ncmVzc1Jvb3RJc1ByZXJlbmRlcmluZyA9IGNoZWNrSWZSb290SXNQcmVyZW5kZXJpbmcoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIGxhbmVzXG4gICAgICApKTtcbiAgYTogZG9cbiAgICB0cnkge1xuICAgICAgaWYgKDAgIT09IHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uICYmIG51bGwgIT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIGxhbmVzID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIHZhciB0aHJvd25WYWx1ZSA9IHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWU7XG4gICAgICAgIGI6IHN3aXRjaCAod29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24pIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IDA7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRocm93QW5kVW53aW5kV29ya0xvb3Aocm9vdCwgbGFuZXMsIHRocm93blZhbHVlLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBpZiAoaXNUaGVuYWJsZVJlc29sdmVkKHRocm93blZhbHVlKSkge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IDA7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICByZXBsYXlTdXNwZW5kZWRVbml0T2ZXb3JrKGxhbmVzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYW5lcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgKDIgIT09IHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uICYmXG4gICAgICAgICAgICAgICAgOSAhPT0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24pIHx8XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8XG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gNyk7XG4gICAgICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aHJvd25WYWx1ZS50aGVuKGxhbmVzLCBsYW5lcyk7XG4gICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gNztcbiAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPSA1O1xuICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBpc1RoZW5hYmxlUmVzb2x2ZWQodGhyb3duVmFsdWUpXG4gICAgICAgICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IDApLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbCksXG4gICAgICAgICAgICAgICAgcmVwbGF5U3VzcGVuZGVkVW5pdE9mV29yayhsYW5lcykpXG4gICAgICAgICAgICAgIDogKCh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IDApLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbCksXG4gICAgICAgICAgICAgICAgdGhyb3dBbmRVbndpbmRXb3JrTG9vcChyb290LCBsYW5lcywgdGhyb3duVmFsdWUsIDcpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgI
1HZhciByZXNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICAgIHJlc291cmNlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgICAgIHZhciBob3N0RmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgPyBwcmVsb2FkUmVzb3VyY2UocmVzb3VyY2UpIDogMSkge1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPSAwO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB2YXIgc2libGluZyA9IGhvc3RGaWJlci5zaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHNpYmxpbmcpIHdvcmtJblByb2dyZXNzID0gc2libGluZztcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuRmliZXIgPSBob3N0RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSByZXR1cm5GaWJlclxuICAgICAgICAgICAgICAgICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhyZXR1cm5GaWJlcikpXG4gICAgICAgICAgICAgICAgICAgICAgOiAod29ya0luUHJvZ3Jlc3MgPSBudWxsKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrIGI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPSAwO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB0aHJvd0FuZFVud2luZFdvcmtMb29wKHJvb3QsIGxhbmVzLCB0aHJvd25WYWx1ZSwgNSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IDA7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRocm93QW5kVW53aW5kV29ya0xvb3Aocm9vdCwgbGFuZXMsIHRocm93blZhbHVlLCA2KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NTdGFjaygpO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IDY7XG4gICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQ2MikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3b3JrTG9vcENvbmN1cnJlbnRCeVNjaGVkdWxlcigpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUkMTY5KSB7XG4gICAgICBoYW5kbGVUaHJvdyhyb290LCB0aHJvd25WYWx1ZSQxNjkpO1xuICAgIH1cbiAgd2hpbGUgKDEpO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZEaXNwYXRjaGVyO1xuICBSZWFjdFNoYXJlZEludGVybmFscy5BID0gcHJldkFzeW5jRGlzcGF0Y2hlcjtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBpZiAobnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MpIHJldHVybiAwO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IDA7XG4gIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG59XG5mdW5jdGlvbiB3b3JrTG9vcENvbmN1cnJlbnRCeVNjaGVkdWxlcigpIHtcbiAgZm9yICg7IG51bGwgIT09IHdvcmtJblByb2dyZXNzICYmICFzaG91bGRZaWVsZCgpOyApXG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xufVxuZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICB2YXIgbmV4dCA9IGJlZ2luV29yayh1bml0T2ZXb3JrLmFsdGVybmF0ZSwgdW5pdE9mV29yaywgZW50YW5nbGVkUmVuZGVyTGFuZXMpO1xuICB1bml0T2ZXb3JrLm1lbW9pemVkUHJvcHMgPSB1bml0T2ZXb3JrLnBlbmRpbmdQcm9wcztcbiAgbnVsbCA9PT0gbmV4dCA/IGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKSA6ICh3b3JrSW5Qcm9ncmVzcyA9IG5leHQpO1xufVxuZnVuY3Rpb24gcmVwbGF5U3VzcGVuZGVkVW5pdE9mV29yayh1bml0T2ZXb3JrKSB7XG4gIHZhciBuZXh0ID0gdW5pdE9mV29yaztcbiAgdmFyIGN1cnJlbnQgPSBuZXh0LmFsdG
1VybmF0ZTtcbiAgc3dpdGNoIChuZXh0LnRhZykge1xuICAgIGNhc2UgMTU6XG4gICAgY2FzZSAwOlxuICAgICAgbmV4dCA9IHJlcGxheUZ1bmN0aW9uQ29tcG9uZW50KFxuICAgICAgICBjdXJyZW50LFxuICAgICAgICBuZXh0LFxuICAgICAgICBuZXh0LnBlbmRpbmdQcm9wcyxcbiAgICAgICAgbmV4dC50eXBlLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTpcbiAgICAgIG5leHQgPSByZXBsYXlGdW5jdGlvbkNvbXBvbmVudChcbiAgICAgICAgY3VycmVudCxcbiAgICAgICAgbmV4dCxcbiAgICAgICAgbmV4dC5wZW5kaW5nUHJvcHMsXG4gICAgICAgIG5leHQudHlwZS5yZW5kZXIsXG4gICAgICAgIG5leHQucmVmLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc1xuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIHJlc2V0SG9va3NPblVud2luZChuZXh0KTtcbiAgICBkZWZhdWx0OlxuICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIG5leHQpLFxuICAgICAgICAobmV4dCA9IHdvcmtJblByb2dyZXNzID1cbiAgICAgICAgICByZXNldFdvcmtJblByb2dyZXNzKG5leHQsIGVudGFuZ2xlZFJlbmRlckxhbmVzKSksXG4gICAgICAgIChuZXh0ID0gYmVnaW5Xb3JrKGN1cnJlbnQsIG5leHQsIGVudGFuZ2xlZFJlbmRlckxhbmVzKSk7XG4gIH1cbiAgdW5pdE9mV29yay5tZW1vaXplZFByb3BzID0gdW5pdE9mV29yay5wZW5kaW5nUHJvcHM7XG4gIG51bGwgPT09IG5leHQgPyBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykgOiAod29ya0luUHJvZ3Jlc3MgPSBuZXh0KTtcbn1cbmZ1bmN0aW9uIHRocm93QW5kVW53aW5kV29ya0xvb3AoXG4gIHJvb3QsXG4gIHVuaXRPZldvcmssXG4gIHRocm93blZhbHVlLFxuICBzdXNwZW5kZWRSZWFzb25cbikge1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgcmVzZXRIb29rc09uVW53aW5kKHVuaXRPZldvcmspO1xuICB0aGVuYWJsZVN0YXRlID0gbnVsbDtcbiAgdGhlbmFibGVJbmRleENvdW50ZXIgPSAwO1xuICB2YXIgcmV0dXJuRmliZXIgPSB1bml0T2ZXb3JrLnJldHVybjtcbiAgdHJ5IHtcbiAgICBpZiAoXG4gICAgICB0aHJvd0V4Y2VwdGlvbihcbiAgICAgICAgcm9vdCxcbiAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgIHVuaXRPZldvcmssXG4gICAgICAgIHRocm93blZhbHVlLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc1xuICAgICAgKVxuICAgICkge1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IDE7XG4gICAgICBsb2dVbmNhdWdodEVycm9yKFxuICAgICAgICByb290LFxuICAgICAgICBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih0aHJvd25WYWx1ZSwgcm9vdC5jdXJyZW50KVxuICAgICAgKTtcbiAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKG51bGwgIT09IHJldHVybkZpYmVyKSB0aHJvdyAoKHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXIpLCBlcnJvcik7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IDE7XG4gICAgbG9nVW5jYXVnaHRFcnJvcihcbiAgICAgIHJvb3QsXG4gICAgICBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih0aHJvd25WYWx1ZSwgcm9vdC5jdXJyZW50KVxuICAgICk7XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodW5pdE9mV29yay5mbGFncyAmIDMyNzY4KSB7XG4gICAgaWYgKGlzSHlkcmF0aW5nIHx8IDEgPT09IHN1c3BlbmRlZFJlYXNvbikgcm9vdCA9ICEwO1xuICAgIGVsc2UgaWYgKFxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290SXNQcmVyZW5kZXJpbmcgfHxcbiAgICAgIDAgIT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIDUzNjg3MDkxMilcbiAgICApXG4gICAgICByb290ID0gITE7XG4gICAgZWxzZSBpZiAoXG4gICAgICAoKHdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyA9IHJvb3QgPSAhMCksXG4gICAgICAyID09PSBzdXNwZW5kZWRSZWFzb24gfHxcbiAgICAgICAgOSA9PT0gc3VzcGVuZGVkUmVhc29uIHx8XG4gICAgICAgIDMgPT09IHN1c3BlbmRlZFJlYXNvbiB8fFxuICAgICAgICA2ID09PSBzdXNwZW5kZWRSZWFzb24pXG4gICAgKVxuICAgICAgKHN1c3BlbmRlZFJlYXNvbiA9IHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLmN1cnJlbnQpLFxuICAgICAgICBudWxsICE9PSBzdXNwZW5kZWRSZWFzb24gJiZcbiAgICAgICAgICAxMyA9PT0gc3VzcGVuZGVkUmVhc29uLnRhZyAmJlxuICAgICAgICAgIChzdXNwZW5kZWRSZWFzb24uZmxhZ3MgfD0gMTYzODQpO1xuICAgIHVud2luZFVuaXRPZldvcmsodW5pdE9mV29yaywgcm9vdCk7XG4gIH0gZWxzZSBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yayk7XG59XG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICB2YXIgY29tcGxldGVkV29yayA9IHVuaXRPZldvcms7XG4gIGRvIHtcbiAgICBpZiAoMCAhPT0gKGNvbXBsZXRlZFdvcmsuZmxhZ3MgJiAzMjc2OCkpIHtcbiAgICAgIHVud2luZFVuaXRPZldvcmsoXG4gICAgICAgIGNvbXBsZXRlZFdvcmssXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5nc1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdW5pdE9mV29yayA9IGNvbXBsZXRlZFdvcmsucmV0dXJuO1xuICAgIHZhciBuZXh0ID0gY29tcGxldGVXb3JrKFxuICAgICAgY29tcGxldGVkV29yay5hbHRlcm5hdGUsXG4gICAgICBjb21wbGV0ZWRXb3JrLFxuICAgICAgZW50YW5nbGVkUmVuZGVyTGFuZXNcbiAgICApO1xuICAgIGlmIChudWxsICE9PSBuZXh0KSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbXBsZXRlZFdvcmsgPSBjb21wbGV0ZWRXb3JrLnNpYmxpbmc7XG4gICAgaWYgKG51bGwgIT09IGNvbXBsZXRlZFdvcmspIHtcbiAgICAgIHdvcmtJblByb2dyZXNzID0gY29tcGxldGVkV29yaztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjb21wbGV0ZWRXb3JrID0gdW5pdE9mV29yaztcbiAgfSB3aGlsZSAobnVsbCAhPT0gY29tcGxldGVkV29yayk7XG4gIDAgPT09IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgJiYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSA1KTtcbn1cbmZ1bmN0aW9uIHVud2luZFVuaXRPZldvcmsodW5pdE9mV29yaywgc2tpcFNpYmxpbmdzKSB7XG4gIGRvIHtcbiAgICB2YXIgbmV4dCA9IHVud2luZFdvcmsodW5pdE9mV29yay5hbHRlcm5hdGUsIHVuaXRPZldvcmspO1xuICAgIGlmIChudWxsICE9PSBuZXh0KSB7XG4gICAgICBuZXh0LmZsYWdzICY9IDMyNzY3O1xuICAgICAgd29ya0luUHJvZ3Jlc3MgPSBuZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXh0ID0gdW5pdE9mV29yay5yZXR1cm47XG4gICAgbnVsbCAhPT0gbm
1V4dCAmJlxuICAgICAgKChuZXh0LmZsYWdzIHw9IDMyNzY4KSwgKG5leHQuc3VidHJlZUZsYWdzID0gMCksIChuZXh0LmRlbGV0aW9ucyA9IG51bGwpKTtcbiAgICBpZiAoXG4gICAgICAhc2tpcFNpYmxpbmdzICYmXG4gICAgICAoKHVuaXRPZldvcmsgPSB1bml0T2ZXb3JrLnNpYmxpbmcpLCBudWxsICE9PSB1bml0T2ZXb3JrKVxuICAgICkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MgPSB1bml0T2ZXb3JrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IHVuaXRPZldvcmsgPSBuZXh0O1xuICB9IHdoaWxlIChudWxsICE9PSB1bml0T2ZXb3JrKTtcbiAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IDY7XG4gIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNvbW1pdFJvb3QoXG4gIHJvb3QsXG4gIGZpbmlzaGVkV29yayxcbiAgbGFuZXMsXG4gIHJlY292ZXJhYmxlRXJyb3JzLFxuICB0cmFuc2l0aW9ucyxcbiAgZGlkSW5jbHVkZVJlbmRlclBoYXNlVXBkYXRlLFxuICBzcGF3bmVkTGFuZSxcbiAgdXBkYXRlZExhbmVzLFxuICBzdXNwZW5kZWRSZXRyeUxhbmVzXG4pIHtcbiAgcm9vdC5jYW5jZWxQZW5kaW5nQ29tbWl0ID0gbnVsbDtcbiAgZG8gZmx1c2hQZW5kaW5nRWZmZWN0cygpO1xuICB3aGlsZSAoMCAhPT0gcGVuZGluZ0VmZmVjdHNTdGF0dXMpO1xuICBpZiAoMCAhPT0gKGV4ZWN1dGlvbkNvbnRleHQgJiA2KSkgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMjcpKTtcbiAgaWYgKG51bGwgIT09IGZpbmlzaGVkV29yaykge1xuICAgIGlmIChmaW5pc2hlZFdvcmsgPT09IHJvb3QuY3VycmVudCkgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNzcpKTtcbiAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUgPSBmaW5pc2hlZFdvcmsubGFuZXMgfCBmaW5pc2hlZFdvcmsuY2hpbGRMYW5lcztcbiAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUgfD0gY29uY3VycmVudGx5VXBkYXRlZExhbmVzO1xuICAgIG1hcmtSb290RmluaXNoZWQoXG4gICAgICByb290LFxuICAgICAgbGFuZXMsXG4gICAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUsXG4gICAgICBzcGF3bmVkTGFuZSxcbiAgICAgIHVwZGF0ZWRMYW5lcyxcbiAgICAgIHN1c3BlbmRlZFJldHJ5TGFuZXNcbiAgICApO1xuICAgIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCAmJlxuICAgICAgKCh3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGwpLFxuICAgICAgKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gMCkpO1xuICAgIHBlbmRpbmdGaW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgcGVuZGluZ0VmZmVjdHNSb290ID0gcm9vdDtcbiAgICBwZW5kaW5nRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gICAgcGVuZGluZ0VmZmVjdHNSZW1haW5pbmdMYW5lcyA9IGRpZEluY2x1ZGVSZW5kZXJQaGFzZVVwZGF0ZTtcbiAgICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7XG4gICAgcGVuZGluZ1JlY292ZXJhYmxlRXJyb3JzID0gcmVjb3ZlcmFibGVFcnJvcnM7XG4gICAgMCAhPT0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAxMDI1NikgfHxcbiAgICAwICE9PSAoZmluaXNoZWRXb3JrLmZsYWdzICYgMTAyNTYpXG4gICAgICA/ICgocm9vdC5jYWxsYmFja05vZGUgPSBudWxsKSxcbiAgICAgICAgKHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IDApLFxuICAgICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoITApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KSlcbiAgICAgIDogKChyb290LmNhbGxiYWNrTm9kZSA9IG51bGwpLCAocm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gMCkpO1xuICAgIHJlY292ZXJhYmxlRXJyb3JzID0gMCAhPT0gKGZpbmlzaGVkV29yay5mbGFncyAmIDEzODc4KTtcbiAgICBpZiAoMCAhPT0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAxMzg3OCkgfHwgcmVjb3ZlcmFibGVFcnJvcnMpIHtcbiAgICAgIHJlY292ZXJhYmxlRXJyb3JzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBudWxsO1xuICAgICAgdHJhbnNpdGlvbnMgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IDI7XG4gICAgICBzcGF3bmVkTGFuZSA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgICBleGVjdXRpb25Db250ZXh0IHw9IDQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRC
1ZWZvcmVNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAoZXhlY3V0aW9uQ29udGV4dCA9IHNwYXduZWRMYW5lKSxcbiAgICAgICAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHRyYW5zaXRpb25zKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IHJlY292ZXJhYmxlRXJyb3JzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPSAxO1xuICAgIGZsdXNoTXV0YXRpb25FZmZlY3RzKCk7XG4gICAgZmx1c2hMYXlvdXRFZmZlY3RzKCk7XG4gICAgZmx1c2hTcGF3bmVkV29yaygpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaE11dGF0aW9uRWZmZWN0cygpIHtcbiAgaWYgKDEgPT09IHBlbmRpbmdFZmZlY3RzU3RhdHVzKSB7XG4gICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPSAwO1xuICAgIHZhciByb290ID0gcGVuZGluZ0VmZmVjdHNSb290LFxuICAgICAgZmluaXNoZWRXb3JrID0gcGVuZGluZ0ZpbmlzaGVkV29yayxcbiAgICAgIHJvb3RNdXRhdGlvbkhhc0VmZmVjdCA9IDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAxMzg3OCk7XG4gICAgaWYgKDAgIT09IChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgMTM4NzgpIHx8IHJvb3RNdXRhdGlvbkhhc0VmZmVjdCkge1xuICAgICAgcm9vdE11dGF0aW9uSGFzRWZmZWN0ID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBudWxsO1xuICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IDI7XG4gICAgICB2Y
1XIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICAgICAgZXhlY3V0aW9uQ29udGV4dCB8PSA0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QpO1xuICAgICAgICB2YXIgcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbiA9IHNlbGVjdGlvbkluZm9ybWF0aW9uLFxuICAgICAgICAgIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAocm9vdC5jb250YWluZXJJbmZvKSxcbiAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5mb2N1c2VkRWxlbSxcbiAgICAgICAgICBwcmlvclNlbGVjdGlvblJhbmdlID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmXG4gICAgICAgICAgcHJpb3JGb2N1c2VkRWxlbSAmJlxuICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0ub3duZXJEb2N1bWVudCAmJlxuICAgICAgICAgIGNvbnRhaW5zTm9kZShcbiAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBudWxsICE9PSBwcmlvclNlbGVjdGlvblJhbmdlICYmXG4gICAgICAgICAgICBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHByaW9yU2VsZWN0aW9uUmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgICAgIGVuZCA9IHByaW9yU2VsZWN0aW9uUmFuZ2UuZW5kO1xuICAgICAgICAgICAgdm9pZCAwID09PSBlbmQgJiYgKGVuZCA9IHN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChcInNlbGVjdGlvblN0YXJ0XCIgaW4gcHJpb3JGb2N1c2VkRWxlbSlcbiAgICAgICAgICAgICAgKHByaW9yRm9jdXNlZEVsZW0uc2VsZWN0aW9uU3RhcnQgPSBzdGFydCksXG4gICAgICAgICAgICAgICAgKHByaW9yRm9jdXNlZEVsZW0uc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICBlbmQsXG4gICAgICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtLnZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBkb2MgPSBwcmlvckZvY3VzZWRFbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgd2luID0gKGRvYyAmJiBkb2MuZGVmYXVsdFZpZXcpIHx8IHdpbmRvdztcbiAgICAgICAgICAgICAgaWYgKHdpbi5nZXRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB2Y
1XIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpLFxuICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gcHJpb3JGb2N1c2VkRWxlbS50ZXh0Q29udGVudC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICBzdGFydCRqc2NvbXAkMCA9IE1hdGgubWluKHByaW9yU2VsZWN0aW9uUmFuZ2Uuc3RhcnQsIGxlbmd0aCksXG4gICAgICAgICAgICAgICAgICBlbmQkanNjb21wJDAgPVxuICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IHByaW9yU2VsZWN0aW9uUmFuZ2UuZW5kXG4gICAgICAgICAgICAgICAgICAgICAgPyBzdGFydCRqc2NvbXAkMFxuICAgICAgICAgICAgICAgICAgICAgIDogTWF0aC5taW4ocHJpb3JTZWxlY3Rpb25SYW5nZS5lbmQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgIXNlbGVjdGlvbi5leHRlbmQgJiZcbiAgICAgICAgICAgICAgICAgIHN0YXJ0JGpzY29tcCQwID4gZW5kJGpzY29tcCQwICYmXG4gICAgICAgICAgICAgICAgICAoKGN1ckZvY3VzZWRFbGVtID0gZW5kJGpzY29tcCQwKSxcbiAgICAgICAgICAgICAgICAgIChlbmQkanNjb21wJDAgPSBzdGFydCRqc2NvbXAkMCksXG4gICAgICAgICAgICAgICAgICAoc3RhcnQkanNjb21wJDAgPSBjdXJGb2N1c2VkRWxlbSkpO1xuICAgICAgICAgICAgICAgIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQoXG4gICAgICAgICAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0JGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChcbiAgICAgICAgICAgICAgICAgICAgcHJpb3JGb2N1c2VkRWxlbSxcbiAgICAgICAgICAgICAgICAgICAgZW5kJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHN0YXJ0TWFya2VyICYmXG4gICAgICAgICAgICAgICAgICBlbmRNYXJrZXIgJiZcbiAgICAgICAgICAgICAgICAgICgxICE9PSBzZWxlY3Rpb24ucmFuZ2VDb3VudCB8fFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYW5jaG9yTm9kZSAhPT0gc3RhcnRNYXJrZXIubm9kZSB8fFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0ICE9PSBzdGFydE1hcmtlci5vZmZzZXQgfHxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmZvY3VzTm9kZSAhPT0gZW5kTWFya2VyLm5vZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ICE9PSBlbmRNYXJrZXIub2Zmc2V0KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgc3RhcnQkanNjb21wJDAgPiBlbmQkanNjb21wJDBcbiAgICAgICAgICAgICAgICAgICAgPyAoc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKSxcbiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uZXh0ZW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KSlcbiAgICAgICAgICAgICAgICAgICAgOiAocmFuZ2Uuc2V0RW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KSxcbiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZG9jID0gW107XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIHNlbGVjdGlvbiA9IHByaW9yRm9jdXNlZEVsZW07XG4gICAgICAgICAgICAoc2VsZWN0aW9uID0gc2VsZWN0aW9uLnBhcmVudE5vZGUpO1xuXG4gICAgICAgICAgKVxuICAgICAgICAgICAgMSA9PT0gc2VsZWN0aW9uLm5vZGVUeXBlICYmXG4gICAgICAgICAgICAgIGRvYy5wdXNoKHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBzZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgbGVmdDogc2VsZWN0aW9uLnNjcm9sbExlZnQsXG4gICAgICAgICAgICAgICAgdG9wOiBzZWxlY3Rpb24uc2Nyb2xsVG9wXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMgJiZcbiAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMoKTtcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgcHJpb3JGb2N1c2VkRWxlbSA9IDA7XG4gICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtIDwgZG9jLmxlbmd0aDtcbiAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0rK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdmFyIGluZm8gPSBkb2NbcHJpb3JGb2N1c2VkRWxlbV07XG4gICAgICAgICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgICAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxUb3AgPSBpbmZvLnRvcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2VuYWJsZWQgPSAhIWV2ZW50c0VuYWJsZWQ7XG4gICAgICAgIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZXZlbnRzRW5hYmxlZCA9IG51bGw7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAoZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0KSxcbiAgICAgICAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByZXZpb3VzUHJpb3JpdHkpLFxuICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy5UID0gcm9vdE11dGF0aW9uSGFzRWZmZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrO1xuICAgIHBlbmRpbmdFZmZlY3RzU3RhdHVzID0gMjtcbiAgfVxufVxuZnVuY3Rpb24gZmx1c2hMYXlvdXRFZmZlY3RzKCkge1xuICBpZiAoMiA9PT0gcGVuZGluZ0VmZmVjdHNTdGF0dXMpIHtcbiAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IDA7XG4gICAgdmFyIHJvb3QgPSBwZW5kaW5nRWZmZWN0c1Jvb3QsXG4gICAgICBmaW5pc2hlZFdvcmsgPSBwZW5kaW5nRmluaXNoZWRXb3JrLFxuICAgICAgcm9vdEhhc0xheW91dEVmZmVjdCA9IDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiA4NzcyKTtcbiAgICBpZiAoMCAhPT0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiA4NzcyKSB8fCByb290SGFzTGF5b3V0RWZmZWN0KSB7XG4gICAgICByb290SGFzTGF5b3V0RWZmZWN0ID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBudWxsO1xuICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IDI7XG4gICAgICB2Y
1XIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICAgICAgZXhlY3V0aW9uQ29udGV4dCB8PSA0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihyb290LCBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLCBmaW5pc2hlZFdvcmspO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgKGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dCksXG4gICAgICAgICAgKFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBwcmV2aW91c1ByaW9yaXR5KSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IHJvb3RIYXNMYXlvdXRFZmZlY3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IDM7XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoU3Bhd25lZFdvcmsoKSB7XG4gIGlmICg0ID09PSBwZW5kaW5nRWZmZWN0c1N0YXR1cyB8fCAzID09PSBwZW5kaW5nRWZmZWN0c1N0YXR1cykge1xuICAgIHBlbmRpbmdFZmZlY3RzU3RhdHVzID0gMDtcbiAgICByZXF1ZXN0UGFpbnQoKTtcbiAgICB2YXIgcm9vdCA9IHBlbmRpbmdFZmZlY3RzUm9vdCxcbiAgICAgIGZpbmlzaGVkV29yayA9IHBlbmRpbmdGaW5pc2hlZFdvcmssXG4gICAgICBsYW5lcyA9IHBlbmRpbmdFZmZlY3RzTGFuZXMsXG4gICAgICByZWNvdmVyYWJsZUVycm9ycyA9IHBlbmRpbmdSZWNvdmVyYWJsZUVycm9ycztcbiAgICAwICE9PSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIDEwMjU2KSB8fFxuICAgIDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAxMDI1NilcbiAgICAgID8gKHBlbmRpbmdFZmZlY3RzU3RhdHVzID0gNSlcbiAgICAgIDogKChwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IDApLFxuICAgICAgICAocGVuZGluZ0ZpbmlzaGVkV29yayA9IHBlbmRpbmdFZmZlY3RzUm9vdCA9IG51bGwpLFxuICAgICAgICByZWxlYXNlUm9vdFBvb2xlZENhY2hlKHJvb3QsIHJvb3QucGVuZGluZ0xhbmVzKSk7XG4gICAgdmFyIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG4gICAgMCA9PT0gcmVtYWluaW5nTGFuZXMgJiYgKGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbCk7XG4gICAgbGFuZXNUb0V2ZW50UHJpb3JpdHkobGFuZXMpO1xuICAgIGZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgaWYgKGluamVjdGVkSG9vayAmJiBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QpXG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QoXG4gICAgICAgICAgcmVuZGVyZXJJRCxcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgIDEyOCA9PT0gKGZpbmlzaGVkV29yay5jdXJyZW50LmZsYWdzICYgMTI4KVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgIGlmIChudWxsICE9PSByZWNvdmVyYWJsZUVycm9ycykge1xuICAgICAgZmluaXNoZWRXb3JrID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgICAgIHJlbWFpbmluZ0xhbmVzID0gUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucDtcbiAgICAgIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSAyO1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSByb290Lm9uUmVjb3ZlcmFibGVFcnJvciwgaSA9IDA7XG4gICAgICAgICAgaSA8IHJlY292ZXJhYmxlRXJyb3JzLmxlbmd0aDtcbiAgICAgICAgICBpKytcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIHJlY292ZXJhYmxlRXJyb3IgPSByZWNvdmVyYWJsZUVycm9yc1tpXTtcbiAgICAgICAgICBvblJlY292ZXJhYmxlRXJyb3IocmVjb3ZlcmFibGVFcnJvci52YWx1ZSwge1xuICAgICAgICAgICAgY29tcG9uZW50U3RhY2s6IHJlY292ZXJhYmxlRXJyb3Iuc3RhY2tcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBmaW5pc2hlZFdvcmspLFxuICAgICAgICAgIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gcmVtYWluaW5nTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICAwICE9PSAocGVuZGluZ0VmZmVjdHNMYW5lcyAmIDMpICYmIGZsdXNoUGVuZGluZ0VmZmVjdHMoKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCk7XG4gICAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgICAwICE9PSAobGFuZXMgJiA0MTk0MDkwKSAmJiAwICE9PSAocmVtYWluaW5nTGFuZXMgJiA0MilcbiAgICAgID8gcm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzXG4gICAgICAgID8gbmVzdGVkVXBkYXRlQ291bnQrK1xuICAgICAgICA6ICgobmVzdGVkVXBkYXRlQ291bnQgPSAwKSwgKHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IHJvb3QpKVxuICAgICAgOiAobmVzdGVkVXBkYXRlQ291bnQgPSAwKTtcbiAgICBmbHVzaFN5bmNXb3JrQWNyb3NzUm9vdHNfaW1wbCgwLCAhMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbGVhc2VSb290UG9vbGVkQ2FjaGUocm9vdCwgcmVtYWluaW5nTGFuZXMpIHtcbiAgMCA9PT0gKHJvb3QucG9vbGVkQ2FjaGVMYW5lcyAmPSByZW1haW5pbmdMYW5lcykgJiZcbiAgICAoKHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wb29sZWRDYWNoZSksXG4gICAgbnVsbCAhPSByZW1haW5pbmdMYW5lcyAmJlxuICAgICAgKChyb290LnBvb2xlZENhY2hlID0gbnVsbCksIHJlbGVhc2VDYWNoZShyZW1haW5pbmdMYW5lcykpKTtcbn1cbmZ1bmN0aW9uIGZsdXNoUGVuZGluZ0VmZmVjdHMod2FzRGVsYXllZENvbW1pdCkge1xuICBmbHVzaE11dGF0aW9uRWZmZWN0cygpO1xuICBmbHVzaExheW91dEVmZmVjdHMoKTtcbiAgZmx1c2hTcGF3bmVkV29yaygpO1xuICByZXR1cm4gZmx1c2hQYXNzaXZlRWZmZWN0cyh3YXNEZWxheWVkQ29tbWl0KTtcbn1cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKSB7XG4gIGlmICg1ICE9PSBwZW5kaW5nRWZmZWN0c1N0YXR1cykgcmV0dXJuICExO1xuICB2YXIgcm9vdCA9IHBlbmRpbmdFZmZlY3RzUm9vdCxcbiAgICByZW1haW5pbmdMYW5lcyA9IHBlbmRpbmdFZmZlY3RzUmVtYWluaW5nTGFuZXM7XG4gIHBlbmRpbmdFZmZlY3RzUmVtYWluaW5nTGFuZXMgPSAwO1xuICB2YXIgcmVuZGVyUHJpb3JpdHkgPSBsYW5lc1RvRXZlbnRQcmlvcml0eShwZW5kaW5nRWZmZWN0c0xhbmVzKSxcbiAgICBwcmV2VHJhbnNpdGlvbiA9I
1FJlYWN0U2hhcmVkSW50ZXJuYWxzLlQsXG4gICAgcHJldmlvdXNQcmlvcml0eSA9IFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnA7XG4gIHRyeSB7XG4gICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IDMyID4gcmVuZGVyUHJpb3JpdHkgPyAzMiA6IHJlbmRlclByaW9yaXR5O1xuICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBudWxsO1xuICAgIHJlbmRlclByaW9yaXR5ID0gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucztcbiAgICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDtcbiAgICB2YXIgcm9vdCRqc2NvbXAkMCA9IHBlbmRpbmdFZmZlY3RzUm9vdCxcbiAgICAgIGxhbmVzID0gcGVuZGluZ0VmZmVjdHNMYW5lcztcbiAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IDA7XG4gICAgcGVuZGluZ0ZpbmlzaGVkV29yayA9IHBlbmRpbmdFZmZlY3RzUm9vdCA9IG51bGw7XG4gICAgcGVuZGluZ0VmZmVjdHNMYW5lcyA9IDA7XG4gICAgaWYgKDAgIT09IChleGVjdXRpb25Db250ZXh0ICYgNikpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzMxKSk7XG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IDQ7XG4gICAgY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKHJvb3QkanNjb21wJDAuY3VycmVudCk7XG4gICAgY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihcbiAgICAgIHJvb3QkanNjb21wJDAsXG4gICAgICByb290JGpzY29tcCQwLmN1cnJlbnQsXG4gICAgICBsYW5lcyxcbiAgICAgIHJlbmRlclByaW9yaXR5XG4gICAgKTtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgZmx1c2hTeW5jV29ya0Fjcm9zc1Jvb3RzX2ltcGwoMCwgITEpO1xuICAgIGlmIChcbiAgICAgIGluamVjdGVkSG9vayAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdFxuICAgIClcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCRqc2NvbXAkMCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgcmV0dXJuICEwO1xuICB9IGZpbmFsbHkge1xuICAgIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gcHJldmlvdXNQcmlvcml0eSksXG4gICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IHByZXZUcmFuc2l0aW9uKSxcbiAgICAgIHJlbGVhc2VSb290UG9vbGVkQ2FjaGUocm9vdCwgcmVtYWluaW5nTGFuZXMpO1xuICB9XG59XG5mdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChyb290RmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcikge1xuICBzb3VyY2VGaWJlciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gIHNvdXJjZUZpYmVyID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHJvb3RGaWJlci5zdGF0ZU5vZGUsIHNvdXJjZUZpYmVyLCAyKTtcbiAgcm9vdEZpYmVyID0gZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIHNvdXJjZUZpYmVyLCAyKTtcbiAgbnVsbCAhPT0gcm9vdEZpYmVyICYmXG4gICAgKG1hcmtSb290VXBkYXRlZCQxKHJvb3RGaWJlciwgMiksIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290RmliZXIpKTtcbn1cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcikge1xuICBpZiAoMyA9PT0gc291cmNlRmliZXIudGFnKVxuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpO1xuICBlbHNlXG4gICAgZm9yICg7IG51bGwgIT09IG5lYXJlc3RNb3VudGVkQW5jZXN0b3I7ICkge1xuICAgICAgaWYgKDMgPT09IG5lYXJlc3RNb3VudGVkQW5jZXN0b3IudGFnKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KFxuICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgc291cmNlRmliZXIsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKDEgPT09IG5lYXJlc3RNb3VudGVkQW5jZXN0b3IudGFnKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5lYXJlc3RNb3VudGVkQW5jZXN0b3Iuc3RhdGVOb2RlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PVxuICAgICAgICAgICAgdHlwZW9mIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgfHxcbiAgICAgICAgICAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggJiZcbiAgICAgICAgICAgIChudWxsID09PSBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCB8fFxuICAgICAgICAgICAgICAhbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuaGFzKGluc3RhbmNlKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHNvdXJjZUZpYmVyID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IsIHNvdXJjZUZpYmVyKTtcbiAgICAgICAgICBlcnJvciA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUoMik7XG4gICAgICAgICAgaW5zdGFuY2UgPSBlbnF1ZXVlVXBkYXRlKG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yLCAyKTtcbiAgICAgICAgICBudWxsICE9PSBpbnN0YW5jZSAmJlxuICAgICAgICAgICAgKGluaXRpYWxpemVDbGFzc0Vycm9yVXBkYXRlKFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgIHNvdXJjZUZpYmVyXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbWFya1Jvb3RVcGRhdGVkJDEoaW5zdGFuY2UsIDIpLFxuICAgICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKGluc3RhbmNlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgI
1H1cbiAgICAgIH1cbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IgPSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLnJldHVybjtcbiAgICB9XG59XG5mdW5jdGlvbiBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgaWYgKG51bGwgPT09IHBpbmdDYWNoZSkge1xuICAgIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xuICAgIHZhciB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgfSBlbHNlXG4gICAgKHRocmVhZElEcyA9IHBpbmdDYWNoZS5nZXQod2FrZWFibGUpKSxcbiAgICAgIHZvaWQgMCA9PT0gdGhyZWFkSURzICYmXG4gICAgICAgICgodGhyZWFkSURzID0gbmV3IFNldCgpKSwgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKSk7XG4gIHRocmVhZElEcy5oYXMobGFuZXMpIHx8XG4gICAgKCh3b3JrSW5Qcm9ncmVzc1Jvb3REaWRBdHRhY2hQaW5nTGlzdGVuZXIgPSAhMCksXG4gICAgdGhyZWFkSURzLmFkZChsYW5lcyksXG4gICAgKHJvb3QgPSBwaW5nU3VzcGVuZGVkUm9vdC5iaW5kKG51bGwsIHJvb3QsIHdha2VhYmxlLCBsYW5lcykpLFxuICAgIHdha2VhYmxlLnRoZW4ocm9vdCwgcm9vdCkpO1xufVxuZnVuY3Rpb24gcGluZ1N1c3BlbmRlZFJvb3Qocm9vdCwgd2FrZWFibGUsIHBpbmdlZExhbmVzKSB7XG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgbnVsbCAhPT0gcGluZ0NhY2hlICYmIHBpbmdDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICByb290LnBpbmdlZExhbmVzIHw9IHJvb3Quc3VzcGVuZGVkTGFuZXMgJiBwaW5nZWRMYW5lcztcbiAgcm9vdC53YXJtTGFuZXMgJj0gfnBpbmdlZExhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiZcbiAgICAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiBwaW5nZWRMYW5lcykgPT09IHBpbmdlZExhbmVzICYmXG4gICAgKDQgPT09IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgfHxcbiAgICAoMyA9PT0gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAmJlxuICAgICAgKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgNjI5MTQ1NjApID09PVxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmJlxuICAgICAgMzAwID4gbm93KCkgLSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lKVxuICAgICAgPyAwID09PSAoZXhlY3V0aW9uQ29udGV4dCAmIDIpICYmIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIDApXG4gICAgICA6ICh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyB8PSBwaW5nZWRMYW5lcyksXG4gICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZXRyeUxhbmVzID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmJlxuICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyA9IDApKTtcbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QpO1xufVxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAwID09PSByZXRyeUxhbmUgJiYgKHJldHJ5TGFuZSA9IGNsYWltTmV4dFJldHJ5TGFuZSgpKTtcbiAgYm91bmRhcnlGaWJlciA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xuICBudWxsICE9PSBib3VuZGFyeUZpYmVyICYmXG4gICAgKG1hcmtSb290VXBkYXRlZCQxKGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSksXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKGJvdW5kYXJ5RmliZXIpKTtcbn1cbmZ1bmN0aW9uIHJldHJ5RGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoYm91bmRhcnlGaWJlcikge1xuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGJvdW5kYXJ5RmliZXIubWVtb2l6ZWRTdGF0ZSxcbiAgICByZXRyeUxhbmUgPSAwO1xuICBudWxsICE9PSBzdXNwZW5zZVN0YXRlICYmIChyZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSk7XG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgdmFyIHJldHJ5TGFuZSA9IDA7XG4gIHN3aXRjaCAoYm91bmRhcnlGaWJlci50YWcpIHtcbiAgICBjYXNlIDEzOlxuICAgICAgdmFyIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gYm91bmRhcnlGaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgbnVsbCAhPT0gc3VzcGVuc2VTdGF0ZSAmJiAocmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOTpcbiAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjI6XG4gICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGUuX3JldHJ5Q2FjaGU7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMTQpKTtcbiAgfVxuICBudWxsICE9PSByZXRyeUNhY2hlICYmIHJldHJ5Q2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrJDEocHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2skMyhwcmlvcml0eUxldmVsLCBjYWxsYmFjayk7XG59XG52YXIgZmlyc3RTY2hlZHVsZWRSb290ID0gbnVsbCxcbiAgbGFzdFNjaGVkdWxlZFJvb3QgPSBudWxsLFxuICBkaWRTY2hlZHVsZU1pY3JvdGFzayA9ICExLFxuICBtaWdodEhhdmVQZW5kaW5nU3luY1dvcmsgPSAhMSxcbiAgaXNGbHVzaGluZ1dvcmsgPSAhMSxcbiAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSAwO1xuZnVuY3Rpb24gZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QpIHtcbiAgcm9vdCAhPT0gbGFzdFNjaGVkdWxlZFJvb3QgJiZcbiAgICBudWxsID09PSByb290Lm5leHQgJiZcbiAgICAobnVsbCA9PT0gbGFzdFNjaGVkdWxlZFJvb3RcbiAgICAgID8gKGZpcnN0U2NoZWR1bGVkUm9vdCA9IGxhc3RTY2hlZHVsZWRSb290ID0gcm9vdClcbiAgICAgIDogKGxhc3RTY2hlZHVsZWRSb290ID0gbGFzdFNjaGVkdWxlZFJvb3QubmV4dCA9IHJvb3QpKTtcbiAgbWlnaHRIYXZlUGVuZGluZ1N5bmNXb3JrID0gITA7XG4gIGRpZFNjaGVkdWxlTWljcm90YXNrIHx8XG4gICAgKChkaWRTY2hlZHVsZU1pY3JvdGFzayA9ICEwKSwgc2NoZWR1bGVJbW1lZGlhdGVSb290U2NoZWR1bGVUYXNrKCkpO1xufVxuZnVuY3Rpb24gZmx1c2hTeW5jV29ya0Fjcm9zc1Jvb3RzX2ltcGwoc3luY1RyYW5zaXRpb25MYW5lcywgb25seUxlZ2FjeSkge1xuICBpZiAoIWlzRmx1c2hpbmdXb3JrICYmIG1pZ2h0SGF2ZVBlbmRpbmdTeW5jV29yaykge1xuICAgIGlzRmx1c2hpbmdXb3JrID0gITA7XG4gICAgZG8ge1xuICAgICAgdmFyIGRpZFBlcmZvcm1Tb21lV29yayA9ICExO1xuICAgICAgZm9yICh2YXIgcm9vdCQxNzQgPSBmaXJzdFNjaGVkdWxlZFJvb3Q7IG51bGwgIT09IHJvb3QkMTc0OyApIHtcbiAgICAgICAgaWYgKCFvbmx5TGVnYWN5KVxuICAgICAgICAgIGlmICgwICE9PSBzeW5jVHJhbnNpdGlvbkxhbmVzKSB7XG4gICAgICAgICAgICB2Y
1XIgcGVuZGluZ0xhbmVzID0gcm9vdCQxNzQucGVuZGluZ0xhbmVzO1xuICAgICAgICAgICAgaWYgKDAgPT09IHBlbmRpbmdMYW5lcykgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9IDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdCQxNzQuc3VzcGVuZGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgcGluZ2VkTGFuZXMgPSByb290JDE3NC5waW5nZWRMYW5lcztcbiAgICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID1cbiAgICAgICAgICAgICAgICAoMSA8PCAoMzEgLSBjbHozMig0MiB8IHN5bmNUcmFuc2l0aW9uTGFuZXMpICsgMSkpIC0gMTtcbiAgICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ICY9XG4gICAgICAgICAgICAgICAgcGVuZGluZ0xhbmVzICYgfihzdXNwZW5kZWRMYW5lcyAmIH5waW5nZWRMYW5lcyk7XG4gICAgICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9XG4gICAgICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ICYgMjAxMzI2NzQxXG4gICAgICAgICAgICAgICAgICA/IChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgJiAyMDEzMjY3NDEpIHwgMVxuICAgICAgICAgICAgICAgICAgOiBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgPyBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgfCAyXG4gICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDAgIT09IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCAmJlxuICAgICAgICAgICAgICAoKGRpZFBlcmZvcm1Tb21lV29yayA9ICEwKSxcbiAgICAgICAgICAgICAgcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QkMTc0LCBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQpKTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyksXG4gICAgICAgICAgICAgIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSBnZXROZXh0TGFuZXMoXG4gICAgICAgICAgICAgICAgcm9vdCQxNzQsXG4gICAgICAgICAgICAgICAgcm9vdCQxNzQgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA6IDAsXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcm9vdCQxNzQuY2FuY2VsUGVuZGluZ0NvbW1pdCB8fFxuICAgICAgICAgICAgICAgICAgLTEgIT09IHJvb3QkMTc0LnRpbWVvdXRIYW5kbGVcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIDAgPT09IChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgJiAzKSB8fFxuICAgICAgICAgICAgICAgIGNoZWNrSWZSb290SXNQcmVyZW5kZXJpbmcocm9vdCQxNzQsIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCkgfHxcbiAgICAgICAgICAgICAgICAoKGRpZFBlcmZvcm1Tb21lV29yayA9ICEwKSxcbiAgICAgICAgICAgICAgICBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCQxNzQsIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCkpO1xuICAgICAgICByb290JDE3NCA9IHJvb3QkMTc0Lm5leHQ7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoZGlkUGVyZm9ybVNvbWVXb3JrKTtcbiAgICBpc0ZsdXNoaW5nV29yayA9ICExO1xuICB9XG59XG5mdW5jdGlvbiBwcm9jZXNzUm9vdFNjaGVkdWxlSW5JbW1lZGlhdGVUYXNrKCkge1xuICBwcm9jZXNzUm9vdFNjaGVkdWxlSW5NaWNyb3Rhc2soKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NSb290U2NoZWR1bGVJbk1pY3JvdGFzaygpIHtcbiAgbWlnaHRIYXZlUGVuZGluZ1N5bmNXb3JrID0gZGlkU2NoZWR1bGVNaWNyb3Rhc2sgPSAhMTtcbiAgdmFyIHN5bmNUcmFuc2l0aW9uTGFuZXMgPSAwO1xuICAwICE9PSBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSAmJlxuICAgIChzaG91bGRBdHRlbXB0RWFnZXJUcmFuc2l0aW9uKCkgJiZcbiAgICAgIChzeW5jVHJhbnNpdGlvbkxhbmVzID0gY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUpLFxuICAgIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IDApKTtcbiAgZm9yIChcbiAgICB2YXIgY3VycmVudFRpbWUgPSBub3coKSwgcHJldiA9IG51bGwsIHJvb3QgPSBmaXJzdFNjaGVkdWxlZFJvb3Q7XG4gICAgbnVsbCAhPT0gcm9vdDtcblxuICApIHtcbiAgICB2YXIgbmV4dCA9IHJvb3QubmV4dCxcbiAgICAgIG5leHRMYW5lcyA9IHNjaGVkdWxlVGFza0ZvclJvb3REdXJpbmdNaWNyb3Rhc2socm9vdCwgY3VycmVudFRpbWUpO1xuICAgIGlmICgwID09PSBuZXh0TGFuZXMpXG4gICAgICAocm9vdC5uZXh0ID0gbnVsbCksXG4gICAgICAgIG51bGwgPT09IHByZXYgPyAoZmlyc3RTY2hlZHVsZWRSb290ID0gbmV4dCkgOiAocHJldi5uZXh0ID0gbmV4dCksXG4gICAgICAgIG51bGwgPT09IG5leHQgJiYgKGxhc3RTY2hlZHVsZWRSb290ID0gcHJldik7XG4gICAgZWxzZSBpZiAoXG4gICAgICAoKHByZXYgPSByb290KSwgMCAhPT0gc3luY1RyYW5zaXRpb25MYW5lcyB8fCAwICE9PSAobmV4dExhbmVzICYgMykpXG4gICAgKVxuICAgICAgbWlnaHRIYXZlUGVuZGluZ1N5bmNXb3JrID0gITA7XG4gICAgcm9vdCA9IG5leHQ7XG4gIH1cbiAgZmx1c2hTeW5jV29ya0Fjcm9zc1Jvb3RzX2ltcGwoc3luY1RyYW5zaXRpb25MYW5lcywgITEpO1xufVxuZnVuY3Rpb24gc2NoZWR1bGVUYXNrRm9yUm9vdER1cmluZ01pY3JvdGFzayhyb290LCBjdXJyZW50VGltZSkge1xuICBmb3IgKFxuICAgIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXMsXG4gICAgICBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXMsXG4gICAgICBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lcyxcbiAgICAgIGxhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiAtNjI5MTQ1NjE7XG4gICAgMCA8IGxhbmVzO1xuXG4gICkge1xuICAgIHZhciBpbmRleCQzID0gMzEgLSBjbHozMihsYW5lcyksXG4gICAgICBsYW5lID0gMSA8PCBpbmRleCQzLFxuICAgICAgZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZXNbaW5kZXgkM107XG4gICAgaWYgKC0xID09PSBleHBpcmF0aW9uVGltZSkge1xuICAgICAgaWYgKDAgPT09IChsYW5lICYgc3VzcGVuZGVkTGFuZXMpIHx8IDAgIT09IChsYW5lICYgcGluZ2VkTGFuZXMpKVxuICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXgkM10gPSBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpO1xuICAgIH0gZWxzZSBleHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZSAmJiAocm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZSk7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbiAgY3VycmVudFRpbWUgPSB3b3JrSW5Qcm9ncmVzc1Jvb3Q7XG4gIHN1c3BlbmRlZExhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXM7XG4gIHN1c3BlbmRlZExhbmVzID0gZ2V0TmV4dExhbmVzKFxuICAgIHJvb3QsXG4gICAgcm9vdCA9PT0gY3VycmVudFRpbWUgPyBzdXNwZW5kZWRMYW5lcyA6IDAsXG4gICAgbnVsbCAhPT0gcm9vdC5jYW5jZWxQZW5kaW5nQ29tbWl0IHx8IC0xICE9PSByb290LnRpbWVvdXRIYW5kbGVcbiAgKTtcbiAgcGluZ2VkTGFuZXMgPSByb290LmNhbGxiYWNrTm9kZTtcbiAgaWYgKFxuICAgIDAgPT09IHN1c3BlbmRlZExhbmVzIHx8XG4gICAgKHJvb3QgPT09IGN1cnJlbnRUaW1lICYmXG4gICAgICAoMiA9PT0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gfHxcbiAgICAgICAgOSA9PT0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24pKSB8fFxuICAgIG51bGwgIT09IHJvb3QuY2FuY2VsUGVuZGluZ0NvbW1pdFxuICApXG4gICAgcmV0dXJuIChcbiAgICAgIG51bGwgIT09IHBpbmdlZExhbmVzICYmXG4gICAgICAgIG51bGwgIT09IHBpbmdlZExhbmVzICYmXG4gICAgICAgIGNhbmNlbENhbGxiYWNrJDEocGluZ2VkTGFuZXMpLFxuICAgICAgKHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbCksXG4gICAgICAocm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gMClcbiAgICApO
11xuICBpZiAoXG4gICAgMCA9PT0gKHN1c3BlbmRlZExhbmVzICYgMykgfHxcbiAgICBjaGVja0lmUm9vdElzUHJlcmVuZGVyaW5nKHJvb3QsIHN1c3BlbmRlZExhbmVzKVxuICApIHtcbiAgICBjdXJyZW50VGltZSA9IHN1c3BlbmRlZExhbmVzICYgLXN1c3BlbmRlZExhbmVzO1xuICAgIGlmIChjdXJyZW50VGltZSA9PT0gcm9vdC5jYWxsYmFja1ByaW9yaXR5KSByZXR1cm4gY3VycmVudFRpbWU7XG4gICAgbnVsbCAhPT0gcGluZ2VkTGFuZXMgJiYgY2FuY2VsQ2FsbGJhY2skMShwaW5nZWRMYW5lcyk7XG4gICAgc3dpdGNoIChsYW5lc1RvRXZlbnRQcmlvcml0eShzdXNwZW5kZWRMYW5lcykpIHtcbiAgICAgIGNhc2UgMjpcbiAgICAgIGNhc2UgODpcbiAgICAgICAgc3VzcGVuZGVkTGFuZXMgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDMyOlxuICAgICAgICBzdXNwZW5kZWRMYW5lcyA9IE5vcm1hbFByaW9yaXR5JDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNjg0MzU0NTY6XG4gICAgICAgIHN1c3BlbmRlZExhbmVzID0gSWRsZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHN1c3BlbmRlZExhbmVzID0gTm9ybWFsUHJpb3JpdHkkMTtcbiAgICB9XG4gICAgcGluZ2VkTGFuZXMgPSBwZXJmb3JtV29ya09uUm9vdFZpYVNjaGVkdWxlclRhc2suYmluZChudWxsLCByb290KTtcbiAgICBzdXNwZW5kZWRMYW5lcyA9IHNjaGVkdWxlQ2FsbGJhY2skMyhzdXNwZW5kZWRMYW5lcywgcGluZ2VkTGFuZXMpO1xuICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IGN1cnJlbnRUaW1lO1xuICAgIHJvb3QuY2FsbGJhY2tOb2RlID0gc3VzcGVuZGVkTGFuZXM7XG4gICAgcmV0dXJuIGN1cnJlbnRUaW1lO1xuICB9XG4gIG51bGwgIT09IHBpbmdlZExhbmVzICYmIG51bGwgIT09IHBpbmdlZExhbmVzICYmIGNhbmNlbENhbGxiYWNrJDEocGluZ2VkTGFuZXMpO1xuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSAyO1xuICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHJldHVybiAyO1xufVxuZnVuY3Rpb24gcGVyZm9ybVdvcmtPblJvb3RWaWFTY2hlZHVsZXJUYXNrKHJvb3QsIGRpZFRpbWVvdXQpIHtcbiAgaWYgKDAgIT09IHBlbmRpbmdFZmZlY3RzU3RhdHVzICYmIDUgIT09IHBlbmRpbmdFZmZlY3RzU3RhdHVzKVxuICAgIHJldHVybiAocm9vdC5jYWxsYmFja05vZGUgPSBudWxsKSwgKHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IDApLCBudWxsO1xuICB2YXIgb3JpZ2luYWxDYWxsYmFja05vZGUgPSByb290LmNhbGxiYWNrTm9kZTtcbiAgaWYgKGZsdXNoUGVuZGluZ0VmZmVjdHMoITApICYmIHJvb3QuY2FsbGJhY2tOb2RlICE9PSBvcmlnaW5hbENhbGxiYWNrTm9kZSlcbiAgICByZXR1cm4gbnVsbDtcbiAgdmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzJGpzY29tcCQwID0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzJGpzY29tcCQwID0gZ2V0TmV4dExhbmVzKFxuICAgIHJvb3QsXG4gICAgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ID8gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMkanNjb21wJDAgOiAwLFxuICAgIG51bGwgIT09IHJvb3QuY2FuY2VsUGVuZGluZ0NvbW1pdCB8fCAtMSAhPT0gcm9vdC50aW1lb3V0SGFuZGxlXG4gICk7XG4gIGlmICgwID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyRqc2NvbXAkMCkgcmV0dXJuIG51bGw7XG4gIHBlcmZvcm1Xb3JrT25Sb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzJGpzY29tcCQwLCBkaWRUaW1lb3V0KTtcbiAgc2NoZWR1bGVUYXNrRm9yUm9vdER1cmluZ01pY3JvdGFzayhyb290LCBub3coKSk7XG4gIHJldHVybiBudWxsICE9IHJvb3QuY2FsbGJhY2tOb2RlICYmIHJvb3QuY2FsbGJhY2tOb2RlID09PSBvcmlnaW5hbENhbGxiYWNrTm9kZVxuICAgID8gcGVyZm9ybVdvcmtPblJvb3RWaWFTY2hlZHVsZXJUYXNrLmJpbmQobnVsbCwgcm9vdClcbiAgICA6IG51bGw7XG59XG5mdW5jdGlvbiBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCwgbGFuZXMpIHtcbiAgaWYgKGZsdXNoUGVuZGluZ0VmZmVjdHMoKSkgcmV0dXJuIG51bGw7XG4gIHBlcmZvcm1Xb3JrT25Sb290KHJvb3QsIGxhbmVzLCAhMCk7XG59XG5mdW5jdGlvbiBzY2hlZHVsZUltbWVkaWF0ZVJvb3RTY2hlZHVsZVRhc2soKSB7XG4gIHNjaGVkdWxlTWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAwICE9PSAoZXhlY3V0aW9uQ29udGV4dCAmIDYpXG4gICAgICA/IHNjaGVkdWxlQ2FsbGJhY2skMyhcbiAgICAgICAgICBJbW1lZGlhdGVQcmlvcml0eSxcbiAgICAgICAgICBwcm9jZXNzUm9vdFNjaGVkdWxlSW5JbW1lZGlhdGVUYXNrXG4gICAgICAgIClcbiAgICAgIDogcHJvY2Vzc1Jvb3RTY2hlZHVsZUluTWljcm90YXNrKCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gcmVxdWVzdFRyYW5zaXRpb25MYW5lKCkge1xuICAwID09PSBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSAmJlxuICAgIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCkpO1xuICByZXR1cm4gY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmU7XG59XG5mdW5jdGlvbiBjb2VyY2VGb3JtQWN0aW9uUHJvcChhY3Rpb25Qcm9wKSB7XG4gIHJldHVybiBudWxsID09IGFjdGlvblByb3AgfHxcbiAgICBcInN5bWJvbFwiID09PSB0eXBlb2YgYWN0aW9uUHJvcCB8fFxuICAgIFwiYm9vbGVhblwiID09PSB0eXBlb2YgYWN0aW9uUHJvcFxuICAgID8gbnVsbFxuICAgIDogXCJmdW5jdGlvblwiID09PSB0eXBlb2YgYWN0aW9uUHJvcFxuICAgICAgPyBhY3Rpb25Qcm9wXG4gICAgICA6IHNhbml0aXplVVJMKFwiXCIgKyBhY3Rpb25Qcm9wKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZvcm1EYXRhV2l0aFN1Ym1pdHRlcihmb3JtLCBzdWJtaXR0ZXIpIHtcbiAgdmFyIHRlbXAgPSBzdWJtaXR0ZXIub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gIHRlbXAubmFtZSA9IHN1Ym1pdHRlci5uYW1lO1xuICB0ZW1wLnZhbHVlID0gc3VibWl0dGVyLnZhbHVlO1xuICBmb3JtLmlkICYmIHRlbXAuc2V0QXR0cmlidXRlKFwiZm9ybVwiLCBmb3JtLmlkKTtcbiAgc3VibWl0dGVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRlbXAsIHN1Ym1pdHRlcik7XG4gIGZvcm0gPSBuZXcgRm9ybURhdGEoZm9ybSk7XG4gIHRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0ZW1wKTtcbiAgcmV0dXJuIGZvcm07XG59XG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDEoXG4gIGRpc3BhdGNoUXVldWUsXG4gIGRvbUV2ZW50TmFtZSxcbiAgbWF5YmVUYXJnZXRJbnN0LFxuICBuYXRpdmVFdmVudCxcbiAgbmF0aXZlRXZlbnRUYXJnZXRcbikge1xuICBpZiAoXG4gICAgXCJzdWJtaXRcIiA9PT0gZG9tRXZlbnROYW1lICYmXG4gICAgbWF5YmVUYXJnZXRJbnN0ICYmXG4gICAgbWF5YmVUYXJnZXRJbnN0LnN0YXRlTm9kZSA9PT0gbmF0aXZlRXZlbnRUYXJnZXRcbiAgKSB7XG4gICAgdmFyIGFjdGlvbiA9IGNvZXJjZUZvcm1BY3Rpb25Qcm9wKFxuICAgICAgICAobmF0aXZlRXZlbnRUYXJnZXRbaW50ZXJuYWxQcm9wc0tleV0gfHwgbnVsbCkuYWN0aW9uXG4gICAgICApLFxuICAgICAgc3VibWl0dGVyID0gbmF0aXZlRXZlbnQuc3VibWl0dGVyO1xuICAgIHN1Ym1pdHRlciAmJlxuICAgICAgKChkb21FdmVudE5hbWUgPSAoZG9tRXZlbnROYW1lID0gc3VibWl0dGVyW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGwpXG4gICAgICAgID8gY29lcmNlRm9ybUFjdGlvblByb3AoZG9tRXZlbnROYW1lLmZvcm1BY3Rpb24pXG4gICAgICAgIDogc3VibWl0dGVyLmdldEF0dHJpYnV0ZShcImZvcm1BY3Rpb25cIikpLFxuICAgICAgbnVsbCAhPT0gZG9tRXZlbnROYW1lICYmICgoYWN0aW9uID0gZG9tRXZlbnROYW1lKSwgKHN1Ym1pdHRlciA9IG51bGwpKSk7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KFxuICAgICAgXCJhY3Rpb25cIixcbiAgICAgIFwiYWN0aW9uXCIsXG4gICAgICBudWxsLFxuICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgaW5zdGFuY2U6IG51bGwsXG4gICAgICAgICAgbGlzdGVuZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgIGlmICgwICE9PSBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSkge1xuICAgICAgICAgICAgICAgI
1HZhciBmb3JtRGF0YSA9IHN1Ym1pdHRlclxuICAgICAgICAgICAgICAgICAgPyBjcmVhdGVGb3JtRGF0YVdpdGhTdWJtaXR0ZXIobmF0aXZlRXZlbnRUYXJnZXQsIHN1Ym1pdHRlcilcbiAgICAgICAgICAgICAgICAgIDogbmV3IEZvcm1EYXRhKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBzdGFydEhvc3RUcmFuc2l0aW9uKFxuICAgICAgICAgICAgICAgICAgbWF5YmVUYXJnZXRJbnN0LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nOiAhMCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbmF0aXZlRXZlbnRUYXJnZXQubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IGFjdGlvblxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICBmb3JtRGF0YVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBhY3Rpb24gJiZcbiAgICAgICAgICAgICAgICAoZXZlbnQucHJldmVudERlZmF1bHQoKSxcbiAgICAgICAgICAgICAgICAoZm9ybURhdGEgPSBzdWJtaXR0ZXJcbiAgICAgICAgICAgICAgICAgID8gY3JlYXRlRm9ybURhdGFXaXRoU3VibWl0dGVyKG5hdGl2ZUV2ZW50VGFyZ2V0LCBzdWJtaXR0ZXIpXG4gICAgICAgICAgICAgICAgICA6IG5ldyBGb3JtRGF0YShuYXRpdmVFdmVudFRhcmdldCkpLFxuICAgICAgICAgICAgICAgIHN0YXJ0SG9zdFRyYW5zaXRpb24oXG4gICAgICAgICAgICAgICAgICBtYXliZVRhcmdldEluc3QsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmc6ICEwLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmb3JtRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBuYXRpdmVFdmVudFRhcmdldC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgZm9ybURhdGFcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGN1cnJlbnRUYXJnZXQ6IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgfVxufVxuZm9yIChcbiAgdmFyIGkkanNjb21wJGlubGluZV8xNTI4ID0gMDtcbiAgaSRqc2NvbXAkaW5saW5lXzE1MjggPCBzaW1wbGVFdmVudFBsdWdpbkV2ZW50cy5sZW5ndGg7XG4gIGkkanNjb21wJGlubGluZV8xNTI4Kytcbikge1xuICB2YXIgZXZlbnROYW1lJGpzY29tcCRpbmxpbmVfMTUyOSA9XG4gICAgICBzaW1wbGVFdmVudFBsdWdpbkV2ZW50c1tpJGpzY29tcCRpbmxpbmVfMTUyOF0sXG4gICAgZG9tRXZlbnROYW1lJGpzY29tcCRpbmxpbmVfMTUzMCA9XG4gICAgICBldmVudE5hbWUkanNjb21wJGlubGluZV8xNTI5LnRvTG93ZXJDYXNlKCksXG4gICAgY2FwaXRhbGl6ZWRFdmVudCRqc2NvbXAkaW5saW5lXzE1MzEgPVxuICAgICAgZXZlbnROYW1lJGpzY29tcCRpbmxpbmVfMTUyOVswXS50b1VwcGVyQ2FzZSgpICtcbiAgICAgIGV2ZW50TmFtZSRqc2NvbXAkaW5saW5lXzE1Mjkuc2xpY2UoMSk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoXG4gICAgZG9tRXZlbnROYW1lJGpzY29tcCRpbmxpbmVfMTUzMCxcbiAgICBcIm9uXCIgKyBjYXBpdGFsaXplZEV2ZW50JGpzY29tcCRpbmxpbmVfMTUzMVxuICApO1xufVxucmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fRU5ELCBcIm9uQW5pbWF0aW9uRW5kXCIpO1xucmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fSVRFUkFUSU9OLCBcIm9uQW5pbWF0aW9uSXRlcmF0aW9uXCIpO1xucmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fU1RBUlQsIFwib25BbmltYXRpb25TdGFydFwiKTtcbnJlZ2lzdGVyU2ltcGxlRXZlbnQoXCJkYmxjbGlja1wiLCBcIm9uRG91YmxlQ2xpY2tcIik7XG5yZWdpc3RlclNpbXBsZUV2ZW50KFwiZm9jdXNpblwiLCBcIm9uRm9jdXNcIik7XG5yZWdpc3RlclNpbXBsZUV2ZW50KFwiZm9jdXNvdXRcIiwgXCJvbkJsdXJcIik7XG5yZWdpc3RlclNpbXBsZUV2ZW50KFRSQU5TSVRJT05fUlVOLCBcIm9uVHJhbnNpdGlvblJ1blwiKTtcbnJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9TVEFSVCwgXCJvblRyYW5zaXRpb25TdGFydFwiKTtcbnJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9DQU5DRUwsIFwib25UcmFuc2l0aW9uQ2FuY2VsXCIpO1xucmVnaXN0ZXJTaW1wbGVFdmVudChUUkFOU0lUSU9OX0VORCwgXCJvblRyYW5zaXRpb25FbmRcIik7XG5yZWdpc3RlckRpcmVjdEV2ZW50KFwib25Nb3VzZUVudGVyXCIsIFtcIm1vdXNlb3V0XCIsIFwibW91c2VvdmVyXCJdKTtcbnJlZ2lzdGVyRGlyZWN0RXZlbnQoXCJvbk1vdXNlTGVhdmVcIiwgW1wibW91c2VvdXRcIiwgXCJtb3VzZW92ZXJcIl0pO1xucmVnaXN0ZXJEaXJlY3RFdmVudChcIm9uUG9pbnRlckVudGVyXCIsIFtcInBvaW50ZXJvdXRcIiwgXCJwb2ludGVyb3ZlclwiXSk7XG5yZWdpc3RlckRpcmVjdEV2ZW50KFwib25Qb2ludGVyTGVhdmVcIiwgW1wicG9pbnRlcm91dFwiLCBcInBvaW50ZXJvdmVyXCJdKTtcbnJlZ2lzdGVyVHdvUGhhc2VFdmVudChcbiAgXCJvbkNoYW5nZVwiLFxuICBcImNoYW5nZSBjbGljayBmb2N1c2luIGZvY3Vzb3V0IGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXCIgXCIpXG4pO1xucmVnaXN0ZXJUd29QaGFzZUV2ZW50KFxuICBcIm9uU2VsZWN0XCIsXG4gIFwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXG4gICAgXCIgXCJcbiAgKVxuKTtcbnJlZ2lzdGVyVHdvUGhhc2VFdmVudChcIm9uQmVmb3JlSW5wdXRcIiwgW1xuICBcImNvbXBvc2l0aW9uZW5kXCIsXG4gIFwia2V5cHJlc3NcIixcbiAgXCJ0ZXh0SW5wdXRcIixcbiAgXCJwYXN0ZVwiXG5dKTtcbnJlZ2lzdGVyVHdvUGhhc2VFdmVudChcbiAgXCJvbkNvbXBvc2l0aW9uRW5kXCIsXG4gIFwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIilcbik7XG5yZWdpc3RlclR3b1BoYXNlRXZlbnQoXG4gIFwib25Db21wb3NpdGlvblN0YXJ0XCIsXG4gIFwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKVxuKTtcbnJlZ2lzdGVyVHdvUGhhc2VFdmVudChcbiAgXCJvbkNvbXBvc2l0aW9uVXBkYXRlXCIsXG4gIFwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIilcbik7XG52YXIgbWVkaWFFdmVudFR5cGVzID1cbiAgICBcImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2Ug
1cGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nXCIuc3BsaXQoXG4gICAgICBcIiBcIlxuICAgICksXG4gIG5vbkRlbGVnYXRlZEV2ZW50cyA9IG5ldyBTZXQoXG4gICAgXCJiZWZvcmV0b2dnbGUgY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgc2Nyb2xsZW5kIHRvZ2dsZVwiXG4gICAgICAuc3BsaXQoXCIgXCIpXG4gICAgICAuY29uY2F0KG1lZGlhRXZlbnRUeXBlcylcbiAgKTtcbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgZXZlbnRTeXN0ZW1GbGFncyA9IDAgIT09IChldmVudFN5c3RlbUZsYWdzICYgNCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hRdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZGlzcGF0Y2hRdWV1ZSRpID0gZGlzcGF0Y2hRdWV1ZVtpXSxcbiAgICAgIGV2ZW50ID0gX2Rpc3BhdGNoUXVldWUkaS5ldmVudDtcbiAgICBfZGlzcGF0Y2hRdWV1ZSRpID0gX2Rpc3BhdGNoUXVldWUkaS5saXN0ZW5lcnM7XG4gICAgYToge1xuICAgICAgdmFyIHByZXZpb3VzSW5zdGFuY2UgPSB2b2lkIDA7XG4gICAgICBpZiAoZXZlbnRTeXN0ZW1GbGFncylcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB2YXIgaSRqc2NvbXAkMCA9IF9kaXNwYXRjaFF1ZXVlJGkubGVuZ3RoIC0gMTtcbiAgICAgICAgICAwIDw9IGkkanNjb21wJDA7XG4gICAgICAgICAgaSRqc2NvbXAkMC0tXG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IF9kaXNwYXRjaFF1ZXVlJGlbaSRqc2NvbXAkMF0sXG4gICAgICAgICAgICBpbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmluc3RhbmNlLFxuICAgICAgICAgICAgY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgICAgX2Rpc3BhdGNoTGlzdGVuZXJzJGkgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5saXN0ZW5lcjtcbiAgICAgICAgICBpZiAoaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlcbiAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpO1xuICAgICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcmV2aW91c0luc3RhbmNlKGV2ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVwb3J0R2xvYmFsRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgICBwcmV2aW91c0luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBpJGpzY29tcCQwID0gMDtcbiAgICAgICAgICBpJGpzY29tcCQwIDwgX2Rpc3BhdGNoUXVldWUkaS5sZW5ndGg7XG4gICAgICAgICAgaSRqc2NvbXAkMCsrXG4gICAgICAgICkge1xuICAgICAgICAgIF9kaXNwYXRjaExpc3RlbmVycyRpID0gX2Rpc3BhdGNoUXVldWUkaVtpJGpzY29tcCQwXTtcbiAgICAgICAgICBpbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmluc3RhbmNlO1xuICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgIF9kaXNwYXRjaExpc3RlbmVycyRpID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkubGlzdGVuZXI7XG4gICAgICAgICAgaWYgKGluc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpXG4gICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaTtcbiAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJldmlvdXNJbnN0YW5jZShldmVudCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlcG9ydEdsb2JhbEVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG4gICAgICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0RWxlbWVudCkge1xuICB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gdGFyZ2V0RWxlbWVudFtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldO1xuICB2b2lkIDAgPT09IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCAmJlxuICAgIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSB0YXJnZXRFbGVtZW50W2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPVxuICAgICAgbmV3IFNldCgpKTtcbiAgdmFyIGxpc3RlbmVyU2V0S2V5ID0gZG9tRXZlbnROYW1lICsgXCJfX2J1YmJsZVwiO1xuICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQuaGFzKGxpc3RlbmVyU2V0S2V5KSB8fFxuICAgIChhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBkb21FdmVudE5hbWUsIDIsICExKSxcbiAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQuYWRkKGxpc3RlbmVyU2V0S2V5KSk7XG59XG5mdW5jdGlvbiBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgdGFyZ2V0KSB7XG4gIHZhciBldmVudFN5c3RlbUZsYWdzID0gMDtcbiAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciAmJiAoZXZlbnRTeXN0ZW1GbGFncyB8PSA0KTtcbiAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIoXG4gICAgdGFyZ2V0LFxuICAgIGRvbUV2ZW50TmFtZSxcbiAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXJcbiAgKTtcbn1cbnZhciBsaXN0ZW5pbmdNYXJrZXIgPSBcIl9yZWFjdExpc3RlbmluZ1wiICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG5mdW5jdGlvbiBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCkge1xuICBpZiAoIXJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0pIHtcbiAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gITA7XG4gICAgYWxsTmF0aXZlRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGRvbUV2ZW50TmFtZSkge1xuICAgICAgXCJzZWxlY3Rpb25jaGFuZ2VcIiAhPT0gZG9tRXZlbnROYW1lICYmXG4gICAgICAgIChub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkgfHxcbiAgICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgITEsIHJvb3RDb250YWluZXJFbGVtZW50KSxcbiAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsICEwLCByb290Q29udGFpbmVyRWxlbWVudCkpO1xuICAgIH0pO1xuICAgIHZhciBvd25lckRvY3VtZW50ID1cbiAgICAgIDkgPT09IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlXG4gICAgICAgID8gcm9vdENvbnRhaW5lckVsZW1lbnRcbiAgICAgICAgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgIG51bGwgPT09IG93bmVyRG9jdW1lbnQgfHxcbiAgICAgIG93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSB8fFxuICAgICAgKChvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0gPSAhMCksXG4gICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KFwic2VsZWN0aW9uY2hhbmdlXCIsICExLCBvd25lckRvY3VtZW50KSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKFxuICB0YXJnZXRDb250YWluZXIsXG4gIGRvbUV2ZW50TmFtZSxcbiAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lclxuKSB7XG4gIHN3aXRjaCAo
1Z2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpKSB7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoQ29udGludW91c0V2ZW50O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRXZlbnQ7XG4gIH1cbiAgZXZlbnRTeXN0ZW1GbGFncyA9IGxpc3RlbmVyV3JhcHBlci5iaW5kKFxuICAgIG51bGwsXG4gICAgZG9tRXZlbnROYW1lLFxuICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgdGFyZ2V0Q29udGFpbmVyXG4gICk7XG4gIGxpc3RlbmVyV3JhcHBlciA9IHZvaWQgMDtcbiAgIXBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkIHx8XG4gICAgKFwidG91Y2hzdGFydFwiICE9PSBkb21FdmVudE5hbWUgJiZcbiAgICAgIFwidG91Y2htb3ZlXCIgIT09IGRvbUV2ZW50TmFtZSAmJlxuICAgICAgXCJ3aGVlbFwiICE9PSBkb21FdmVudE5hbWUpIHx8XG4gICAgKGxpc3RlbmVyV3JhcHBlciA9ICEwKTtcbiAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lclxuICAgID8gdm9pZCAwICE9PSBsaXN0ZW5lcldyYXBwZXJcbiAgICAgID8gdGFyZ2V0Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB7XG4gICAgICAgICAgY2FwdHVyZTogITAsXG4gICAgICAgICAgcGFzc2l2ZTogbGlzdGVuZXJXcmFwcGVyXG4gICAgICAgIH0pXG4gICAgICA6IHRhcmdldENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgITApXG4gICAgOiB2b2lkIDAgIT09IGxpc3RlbmVyV3JhcHBlclxuICAgICAgPyB0YXJnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHtcbiAgICAgICAgICBwYXNzaXZlOiBsaXN0ZW5lcldyYXBwZXJcbiAgICAgICAgfSlcbiAgICAgIDogdGFyZ2V0Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCAhMSk7XG59XG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oXG4gIGRvbUV2ZW50TmFtZSxcbiAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgbmF0aXZlRXZlbnQsXG4gIHRhcmdldEluc3QkanNjb21wJDAsXG4gIHRhcmdldENvbnRhaW5lclxuKSB7XG4gIHZhciBhbmNlc3Rvckluc3QgPSB0YXJnZXRJbnN0JGpzY29tcCQwO1xuICBpZiAoXG4gICAgMCA9PT0gKGV2ZW50U3lzdGVtRmxhZ3MgJiAxKSAmJlxuICAgIDAgPT09IChldmVudFN5c3RlbUZsYWdzICYgMikgJiZcbiAgICBudWxsICE9PSB0YXJnZXRJbnN0JGpzY29tcCQwXG4gIClcbiAgICBhOiBmb3IgKDs7KSB7XG4gICAgICBpZiAobnVsbCA9PT0gdGFyZ2V0SW5zdCRqc2NvbXAkMCkgcmV0dXJuO1xuICAgICAgdmFyIG5vZGVUYWcgPSB0YXJnZXRJbnN0JGpzY29tcCQwLnRhZztcbiAgICAgIGlmICgzID09PSBub2RlVGFnIHx8IDQgPT09IG5vZGVUYWcpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRhcmdldEluc3QkanNjb21wJDAuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgIGlmIChjb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lcikgYnJlYWs7XG4gICAgICAgIGlmICg0ID09PSBub2RlVGFnKVxuICAgICAgICAgIGZvciAobm9kZVRhZyA9IHRhcmdldEluc3QkanNjb21wJDAucmV0dXJuOyBudWxsICE9PSBub2RlVGFnOyApIHtcbiAgICAgICAgICAgIHZhciBncmFuZFRhZyA9IG5vZGVUYWcudGFnO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAoMyA9PT0gZ3JhbmRUYWcgfHwgNCA9PT0gZ3JhbmRUYWcpICYmXG4gICAgICAgICAgICAgIG5vZGVUYWcuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gPT09IHRhcmdldENvbnRhaW5lclxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBub2RlVGFnID0gbm9kZVRhZy5yZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICBmb3IgKDsgbnVsbCAhPT0gY29udGFpbmVyOyApIHtcbiAgICAgICAgICBub2RlVGFnID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gbm9kZVRhZykgcmV0dXJuO1xuICAgICAgICAgIGdyYW5kVGFnID0gbm9kZVRhZy50YWc7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgNSA9PT0gZ3JhbmRUYWcgfHxcbiAgICAgICAgICAgIDYgPT09IGdyYW5kVGFnIHx8XG4gICAgICAgICAgICAyNiA9PT0gZ3JhbmRUYWcgfHxcbiAgICAgICAgICAgIDI3ID09PSBncmFuZFRhZ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGFyZ2V0SW5zdCRqc2NvbXAkMCA9IGFuY2VzdG9ySW5zdCA9IG5vZGVUYWc7XG4gICAgICAgICAgICBjb250aW51ZSBhO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGFyZ2V0SW5zdCRqc2NvbXAkMCA9IHRhcmdldEluc3QkanNjb21wJDAucmV0dXJuO1xuICAgIH1cbiAgYmF0Y2hlZFVwZGF0ZXMkMShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRhcmdldEluc3QgPSBhbmNlc3Rvckluc3QsXG4gICAgICBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSxcbiAgICAgIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgICBhOiB7XG4gICAgICB2Y
1XIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7XG4gICAgICBpZiAodm9pZCAwICE9PSByZWFjdE5hbWUpIHtcbiAgICAgICAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0V2ZW50LFxuICAgICAgICAgIHJlYWN0RXZlbnRUeXBlID0gZG9tRXZlbnROYW1lO1xuICAgICAgICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgICAgICAgIGNhc2UgXCJrZXlwcmVzc1wiOlxuICAgICAgICAgICAgaWYgKDAgPT09IGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpKSBicmVhayBhO1xuICAgICAgICAgIGNhc2UgXCJrZXlkb3duXCI6XG4gICAgICAgICAgY2FzZSBcImtleXVwXCI6XG4gICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImZvY3VzaW5cIjpcbiAgICAgICAgICAgIHJlYWN0RXZlbnRUeXBlID0gXCJmb2N1c1wiO1xuICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJmb2N1c291dFwiOlxuICAgICAgICAgICAgcmVhY3RFdmVudFR5cGUgPSBcImJsdXJcIjtcbiAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiYmVmb3JlYmx1clwiOlxuICAgICAgICAgIGNhc2UgXCJhZnRlcmJsdXJcIjpcbiAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiY2xpY2tcIjpcbiAgICAgICAgICAgIGlmICgyID09PSBuYXRpdmVFdmVudC5idXR0b24pIGJyZWFrIGE7XG4gICAgICAgICAgY2FzZSBcImF1eGNsaWNrXCI6XG4gICAgICAgICAgY2FzZSBcImRibGNsaWNrXCI6XG4gICAgICAgICAgY2FzZSBcIm1vdXNlZG93blwiOlxuICAgICAgICAgIGNhc2UgXCJtb3VzZW1vdmVcIjpcbiAgICAgICAgICBjYXNlIFwibW91c2V1cFwiOlxuICAgICAgICAgIGNhc2UgXCJtb3VzZW91dFwiOlxuICAgICAgICAgIGNhc2UgXCJtb3VzZW92ZXJcIjpcbiAgICAgICAgICBjYXNlIFwiY29udGV4dG1lbnVcIjpcbiAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZHJhZ1wiOlxuICAgICAgICAgIGNhc2UgXCJkcmFnZW5kXCI6XG4gICAgICAgICAgY2FzZSBcImRyYWdlbnRlclwiOlxuICAgICAgICAgIGNhc2UgXCJkcmFnZXhpdFwiOlxuICAgICAgICAgIGNhc2UgXCJkcmFnbGVhdmVcIjpcbiAgICAgICAgICBjYXNlIFwiZHJhZ292ZXJcIjpcbiAgICAgICAgICBjYXNlIFwiZHJhZ3N0YXJ0XCI6XG4gICAgICAgICAgY2FzZSBcImRyb3BcIjpcbiAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0RyYWdFdmVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ0b3VjaGNhbmNlbFwiOlxuICAgICAgICAgIGNhc2UgXCJ0b3VjaGVuZFwiOlxuICAgICAgICAgIGNhc2UgXCJ0b3VjaG1vdmVcIjpcbiAgICAgICAgICBjYXNlIFwidG91Y2hzdGFydFwiOlxuICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX0VORDpcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6XG4gICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgVFJBTlNJVElPTl9FTkQ6XG4gICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic2Nyb2xsXCI6XG4gICAgICAgICAgY2FzZSBcInNjcm9sbGVuZFwiOlxuICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVUlFdmVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ3aGVlbFwiOlxuICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljV2hlZWxFdmVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjb3B5XCI6XG4gICAgICAgICAgY2FzZSBcImN1dFwiOlxuICAgICAgICAgIGNhc2UgXCJwYXN0ZVwiOlxuICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpcbiAgICAgICAgICBjYXNlIFwibG9zdHBvaW50ZXJjYXB0dXJlXCI6XG4gICAgICAgICAgY2FzZSBcInBvaW50ZXJjYW5jZWxcIjpcbiAgICAgICAgICBjYXNlIFwicG9pbnRlcmRvd25cIjpcbiAgICAgICAgICBjYXNlIFwicG9pbnRlcm1vdmVcIjpcbiAgICAgICAgICBjYXNlIFwicG9pbnRlcm91dFwiOlxuICAgICAgICAgIGNhc2UgXCJwb2ludGVyb3ZlclwiOlxuICAgICAgICAgIGNhc2UgXCJwb2ludGVydXBcIjpcbiAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ0b2dnbGVcIjpcbiAgICAgICAgICBjYXNlIFwiYmVmb3JldG9nZ2xlXCI6XG4gICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUb2dnbGVFdmVudDtcbiAgICAgICAgfVxuICAgICAgICB2Y
1XIgaW5DYXB0dXJlUGhhc2UgPSAwICE9PSAoZXZlbnRTeXN0ZW1GbGFncyAmIDQpLFxuICAgICAgICAgIGFjY3VtdWxhdGVUYXJnZXRPbmx5ID1cbiAgICAgICAgICAgICFpbkNhcHR1cmVQaGFzZSAmJlxuICAgICAgICAgICAgKFwic2Nyb2xsXCIgPT09IGRvbUV2ZW50TmFtZSB8fCBcInNjcm9sbGVuZFwiID09PSBkb21FdmVudE5hbWUpLFxuICAgICAgICAgIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2VcbiAgICAgICAgICAgID8gbnVsbCAhPT0gcmVhY3ROYW1lXG4gICAgICAgICAgICAgID8gcmVhY3ROYW1lICsgXCJDYXB0dXJlXCJcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICA6IHJlYWN0TmFtZTtcbiAgICAgICAgaW5DYXB0dXJlUGhhc2UgPSBbXTtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRJbnN0LCBsYXN0SG9zdENvbXBvbmVudDtcbiAgICAgICAgICBudWxsICE9PSBpbnN0YW5jZTtcblxuICAgICAgICApIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgICAgbGFzdEhvc3RDb21wb25lbnQgPSBfaW5zdGFuY2Uuc3RhdGVOb2RlO1xuICAgICAgICAgIF9pbnN0YW5jZSA9IF9pbnN0YW5jZS50YWc7XG4gICAgICAgICAgKDUgIT09IF9pbnN0YW5jZSAmJiAyNiAhPT0gX2luc3RhbmNlICYmIDI3ICE9PSBfaW5zdGFuY2UpIHx8XG4gICAgICAgICAgICBudWxsID09PSBsYXN0SG9zdENvbXBvbmVudCB8fFxuICAgICAgICAgICAgbnVsbCA9PT0gcmVhY3RFdmVudE5hbWUgfHxcbiAgICAgICAgICAgICgoX2luc3RhbmNlID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0RXZlbnROYW1lKSksXG4gICAgICAgICAgICBudWxsICE9IF9pbnN0YW5jZSAmJlxuICAgICAgICAgICAgICBpbkNhcHR1cmVQaGFzZS5wdXNoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIF9pbnN0YW5jZSwgbGFzdEhvc3RDb21wb25lbnQpXG4gICAgICAgICAgICAgICkpO1xuICAgICAgICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkgYnJlYWs7XG4gICAgICAgICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgMCA8IGluQ2FwdHVyZVBoYXNlLmxlbmd0aCAmJlxuICAgICAgICAgICgocmVhY3ROYW1lID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihcbiAgICAgICAgICAgIHJlYWN0TmFtZSxcbiAgICAgICAgICAgIHJlYWN0RXZlbnRUeXBlLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgICApKSxcbiAgICAgICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goeyBldmVudDogcmVhY3ROYW1lLCBsaXN0ZW5lcnM6IGluQ2FwdHVyZVBoYXNlIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKDAgPT09IChldmVudFN5c3RlbUZsYWdzICYgNykpIHtcbiAgICAgIGE6IHtcbiAgICAgICAgcmVhY3ROYW1lID1cbiAgICAgICAgICBcIm1vdXNlb3ZlclwiID09PSBkb21FdmVudE5hbWUgfHwgXCJwb2ludGVyb3ZlclwiID09PSBkb21FdmVudE5hbWU7XG4gICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9XG4gICAgICAgICAgXCJtb3VzZW91dFwiID09PSBkb21FdmVudE5hbWUgfHwgXCJwb2ludGVyb3V0XCIgPT09IGRvbUV2ZW50TmFtZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlYWN0TmFtZSAmJlxuICAgICAgICAgIG5hdGl2ZUV2ZW50ICE9PSBjdXJyZW50UmVwbGF5aW5nRXZlbnQgJiZcbiAgICAgICAgICAocmVhY3RFdmVudFR5cGUgPVxuICAgICAgICAgICAgbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC5mcm9tRWxlbWVudCkgJiZcbiAgICAgICAgICAoZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVhY3RFdmVudFR5cGUpIHx8XG4gICAgICAgICAgICByZWFjdEV2ZW50VHlwZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSlcbiAgICAgICAgKVxuICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgIGlmIChTeW50aGV0aWNFdmVudEN0b3IgfHwgcmVhY3ROYW1lKSB7XG4gICAgICAgICAgcmVhY3ROYW1lID1cbiAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgICAgICAgPyBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgICAgICAgICA6IChyZWFjdE5hbWUgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50KVxuICAgICAgICAgICAgICAgID8gcmVhY3ROYW1lLmRlZmF1bHRWaWV3IHx8IHJlYWN0TmFtZS5wYXJlbnRXaW5kb3dcbiAgICAgICAgICAgICAgICA6IHdpbmRvdztcbiAgICAgICAgICBpZiAoU3ludGhldGljRXZlbnRDdG9yKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICgocmVhY3R
1FdmVudFR5cGUgPVxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50KSxcbiAgICAgICAgICAgICAgKFN5bnRoZXRpY0V2ZW50Q3RvciA9IHRhcmdldEluc3QpLFxuICAgICAgICAgICAgICAocmVhY3RFdmVudFR5cGUgPSByZWFjdEV2ZW50VHlwZVxuICAgICAgICAgICAgICAgID8gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVhY3RFdmVudFR5cGUpXG4gICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gcmVhY3RFdmVudFR5cGUgJiZcbiAgICAgICAgICAgICAgICAoKGFjY3VtdWxhdGVUYXJnZXRPbmx5ID1cbiAgICAgICAgICAgICAgICAgIGdldE5lYXJlc3RNb3VudGVkRmliZXIocmVhY3RFdmVudFR5cGUpKSxcbiAgICAgICAgICAgICAgICAoaW5DYXB0dXJlUGhhc2UgPSByZWFjdEV2ZW50VHlwZS50YWcpLFxuICAgICAgICAgICAgICAgIHJlYWN0RXZlbnRUeXBlICE9PSBhY2N1bXVsYXRlVGFyZ2V0T25seSB8fFxuICAgICAgICAgICAgICAgICAgKDUgIT09IGluQ2FwdHVyZVBoYXNlICYmXG4gICAgICAgICAgICAgICAgICAgIDI3ICE9PSBpbkNhcHR1cmVQaGFzZSAmJlxuICAgICAgICAgICAgICAgICAgICA2ICE9PSBpbkNhcHR1cmVQaGFzZSkpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZWFjdEV2ZW50VHlwZSA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIChTeW50aGV0aWNFdmVudEN0b3IgPSBudWxsKSwgKHJlYWN0RXZlbnRUeXBlID0gdGFyZ2V0SW5zdCk7XG4gICAgICAgICAgaWYgKFN5bnRoZXRpY0V2ZW50Q3RvciAhPT0gcmVhY3RFdmVudFR5cGUpIHtcbiAgICAgICAgICAgIGluQ2FwdHVyZVBoYXNlID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgICAgICAgIF9pbnN0YW5jZSA9IFwib25Nb3VzZUxlYXZlXCI7XG4gICAgICAgICAgICByZWFjdEV2ZW50TmFtZSA9IFwib25Nb3VzZUVudGVyXCI7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IFwibW91c2VcIjtcbiAgICAgICAgICAgIGlmIChcInBvaW50ZXJvdXRcIiA9PT0gZG9tRXZlbnROYW1lIHx8IFwicG9pbnRlcm92ZXJcIiA9PT0gZG9tRXZlbnROYW1lKVxuICAgICAgICAgICAgICAoaW5DYXB0dXJlUGhhc2UgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQpLFxuICAgICAgICAgICAgICAgIChfaW5zdGFuY2UgPSBcIm9uUG9pbnRlckxlYXZlXCIpLFxuICAgICAgICAgICAgICAgIChyZWFjdEV2ZW50TmFtZSA9IFwib25Qb2ludGVyRW50ZXJcIiksXG4gICAgICAgICAgICAgICAgKGluc3RhbmNlID0gXCJwb2ludGVyXCIpO1xuICAgICAgICAgICAgYWNjdW11bGF0ZVRhcmdldE9ubHkgPVxuICAgICAgICAgICAgICBudWxsID09IFN5bnRoZXRpY0V2ZW50Q3RvclxuICAgICAgICAgICAgICAgID8gcmVhY3ROYW1lXG4gICAgICAgICAgICAgICAgOiBnZXROb2RlRnJvbUluc3RhbmNlKFN5bnRoZXRpY0V2ZW50Q3Rvcik7XG4gICAgICAgICAgICBsYXN0SG9zdENvbXBvbmVudCA9XG4gICAgICAgICAgICAgIG51bGwgPT0gcmVhY3RFdmVudFR5cGVcbiAgICAgICAgICAgICAgICA/IHJlYWN0TmFtZVxuICAgICAgICAgICAgICAgIDogZ2V0Tm9kZUZyb21JbnN0YW5jZShyZWFjdEV2ZW50VHlwZSk7XG4gICAgICAgICAgICByZWFjdE5hbWUgPSBuZXcgaW5DYXB0dXJlUGhhc2UoXG4gICAgICAgICAgICAgIF9pbnN0YW5jZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UgKyBcImxlYXZlXCIsXG4gICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvcixcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVhY3ROYW1lLnRhcmdldCA9IGFjY3VtdWxhdGVUYXJnZXRPbmx5O1xuICAgICAgICAgICAgcmVhY3ROYW1lLnJlbGF0ZWRUYXJnZXQgPSBsYXN0SG9zdENvbXBvbmVudDtcbiAgICAgICAgICAgIF9pbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCkgPT09IHRhcmdldEluc3QgJiZcbiAgICAgICAgICAgICAgKChpbkNhcHR1cmVQaGFzZSA9IG5ldyBpbkNhcHR1cmVQaGFzZShcbiAgICAgICAgICAgICAgICByZWFjdEV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZSArIFwiZW50ZXJcIixcbiAgICAgICAgICAgICAgICByZWFjdEV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudCxcbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgKGluQ2FwdHVyZVBoYXNlLnRhcmdldCA9IGxhc3RIb3N0Q29tcG9uZW50KSxcbiAgICAgICAgICAgICAgKGluQ2FwdHVyZVBoYXNlLnJlbGF0ZWRUYXJnZXQgPSBhY2N1bXVsYXRlVGFyZ2V0T25seSksXG4gICAgICAgICAgICAgIChfaW5zdGFuY2UgPSBpbkNhcHR1cmVQaGFzZSkpO1xuICAgICAgICAgICAgYWNjdW11bGF0ZVRhcmdldE9ubHkgPSBfaW5zdGFuY2U7XG4gICAgICAgICAgICBpZiAoU3ludGhldGljRXZlbnRDdG9yICYmIHJlYWN0RXZlbnRUeXBlKVxuICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgaW5DYXB0dXJlUGhhc2UgPSBTeW50aGV0aWNFdmVudEN0b3I7XG4gICAgICAgICAgICAgICAgcmVhY3RFdmVudE5hbWUgPSByZWFjdEV2ZW50VHlwZTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgIGxhc3RIb3N0Q29tcG9uZW50ID0gaW5DYXB0dXJlUGhhc2U7XG4gICAgICAgICAgICAgICAgICBsYXN0SG9zdENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgIGxhc3RIb3N0Q29tcG9uZW50ID0gZ2V0UGFyZW50KGxhc3RIb3N0Q29tcG9uZW50KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlKys7XG4gICAgICAgICAgICAgICAgbGFzdEhvc3RDb21wb25lbnQgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSByZWFjdEV2ZW50TmFtZTtcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZTtcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFBhcmVudChfaW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgbGFzdEhvc3RDb21wb25lbnQrKztcbiAgICAgICAgICAgICAgICBmb3IgKDsgMCA8IGluc3RhbmNlIC0gbGFzdEhvc3RDb21wb25lbnQ7IClcbiAgICAgICAgICAgICAgICAgIChpbkNhcHR1cmVQaGFzZSA9IGdldFBhcmVudChpbkNhcHR1cmVQaGFzZSkpLCBpbnN0YW5jZS0tO1xuICAgICAgICAgICAgICAgIGZvciAoOyAwIDwgbGFzdEhvc3RDb21wb25lbnQgLSBpbnN0YW5jZTsgKVxuICAgICAgICAgICAgICAgICAgKHJlYWN0RXZlbnROYW1lID0gZ2V0UGFyZW50KHJlYWN0RXZlbnROYW1lKSksXG4gICAgICAgICAgICAgICAgICAgIGxhc3RIb3N0Q29tcG9uZW50LS07XG4gICAgICAgICAgICAgICAgZm9yICg7IGluc3RhbmNlLS07ICkge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBpbkNhcHR1cmVQaGFzZSA9PT0gcmVhY3RFdmVudE5hbWUgfHxcbiAgICAgICAgICAgICAgICAgICAgKG51bGwgIT09IHJlYWN0RXZlbnROYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgaW5DYXB0dXJlUGhhc2UgPT09IHJlYWN0RXZlbnROYW1lLmFsdGVybmF0ZSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYjtcbiAgICAgICAgICAgICAgICAgIGluQ2FwdHVyZVBoYXNlID0gZ2V0UGFyZW50KGluQ2FwdHVyZVBoYXNlKTtcbiAgICAgICAgICAgICAgICAgI
1HJlYWN0RXZlbnROYW1lID0gZ2V0UGFyZW50KHJlYWN0RXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5DYXB0dXJlUGhhc2UgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGluQ2FwdHVyZVBoYXNlID0gbnVsbDtcbiAgICAgICAgICAgIG51bGwgIT09IFN5bnRoZXRpY0V2ZW50Q3RvciAmJlxuICAgICAgICAgICAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KFxuICAgICAgICAgICAgICAgIGRpc3BhdGNoUXVldWUsXG4gICAgICAgICAgICAgICAgcmVhY3ROYW1lLFxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvcixcbiAgICAgICAgICAgICAgICBpbkNhcHR1cmVQaGFzZSxcbiAgICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgbnVsbCAhPT0gcmVhY3RFdmVudFR5cGUgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gYWNjdW11bGF0ZVRhcmdldE9ubHkgJiZcbiAgICAgICAgICAgICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChcbiAgICAgICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVUYXJnZXRPbmx5LFxuICAgICAgICAgICAgICAgIHJlYWN0RXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGluQ2FwdHVyZVBoYXNlLFxuICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhOiB7XG4gICAgICAgIHJlYWN0TmFtZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPVxuICAgICAgICAgIHJlYWN0TmFtZS5ub2RlTmFtZSAmJiByZWFjdE5hbWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFwic2VsZWN0XCIgPT09IFN5bnRoZXRpY0V2ZW50Q3RvciB8fFxuICAgICAgICAgIChcImlucHV0XCIgPT09IFN5bnRoZXRpY0V2ZW50Q3RvciAmJiBcImZpbGVcIiA9PT0gcmVhY3ROYW1lLnR5cGUpXG4gICAgICAgIClcbiAgICAgICAgICB2Y
1XIgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQ7XG4gICAgICAgIGVsc2UgaWYgKGlzVGV4dElucHV0RWxlbWVudChyZWFjdE5hbWUpKVxuICAgICAgICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpXG4gICAgICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICAgICAgICB2YXIgaGFuZGxlRXZlbnRGdW5jID0gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIChTeW50aGV0aWNFdmVudEN0b3IgPSByZWFjdE5hbWUubm9kZU5hbWUpLFxuICAgICAgICAgICAgIVN5bnRoZXRpY0V2ZW50Q3RvciB8fFxuICAgICAgICAgICAgXCJpbnB1dFwiICE9PSBTeW50aGV0aWNFdmVudEN0b3IudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICAgICAgKFwiY2hlY2tib3hcIiAhPT0gcmVhY3ROYW1lLnR5cGUgJiYgXCJyYWRpb1wiICE9PSByZWFjdE5hbWUudHlwZSlcbiAgICAgICAgICAgICAgPyB0YXJnZXRJbnN0ICYmXG4gICAgICAgICAgICAgICAgaXNDdXN0b21FbGVtZW50KHRhcmdldEluc3QuZWxlbWVudFR5cGUpICYmXG4gICAgICAgICAgICAgICAgKGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KVxuICAgICAgICAgICAgICA6IChnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdldFRhcmdldEluc3RGdW5jICYmXG4gICAgICAgICAgKGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KFxuICAgICAgICAgICAgZGlzcGF0Y2hRdWV1ZSxcbiAgICAgICAgICAgIGdldFRhcmdldEluc3RGdW5jLFxuICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVFdmVudEZ1bmMgJiYgaGFuZGxlRXZlbnRGdW5jKGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lLCB0YXJnZXRJbnN0KTtcbiAgICAgICAgXCJmb2N1c291dFwiID09PSBkb21FdmVudE5hbWUgJiZcbiAgICAgICAgICB0YXJnZXRJbnN0ICYmXG4gICAgICAgICAgXCJudW1iZXJcIiA9PT0gcmVhY3ROYW1lLnR5cGUgJiZcbiAgICAgICAgICBudWxsICE9IHRhcmdldEluc3QubWVtb2l6ZWRQcm9wcy52YWx1ZSAmJlxuICAgICAgICAgIHNldERlZmF1bHRWYWx1ZShyZWFjdE5hbWUsIFwibnVtYmVyXCIsIHJlYWN0TmFtZS52YWx1ZSk7XG4gICAgICB9XG4gICAgICBoYW5kbGVFdmVudEZ1bmMgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcbiAgICAgIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgICAgIGNhc2UgXCJmb2N1c2luXCI6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNUZXh0SW5wdXRFbGVtZW50KGhhbmRsZUV2ZW50RnVuYykgfHxcbiAgICAgICAgICAgIFwidHJ1ZVwiID09PSBoYW5kbGVFdmVudEZ1bmMuY29udGVudEVkaXRhYmxlXG4gICAgICAgICAgKVxuICAgICAgICAgICAgKGFjdGl2ZUVsZW1lbnQgPSBoYW5kbGVFdmVudEZ1bmMpLFxuICAgICAgICAgICAgICAoYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0KSxcbiAgICAgICAgICAgICAgKGxhc3RTZWxlY3Rpb24gPSBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImZvY3Vzb3V0XCI6XG4gICAgICAgICAgbGFzdFNlbGVjdGlvbiA9IGFjdGl2ZUVsZW1lbnRJbnN0ID0gYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJtb3VzZWRvd25cIjpcbiAgICAgICAgICBtb3VzZURvd24gPSAhMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImNvbnRleHRtZW51XCI6XG4gICAgICAgIGNhc2UgXCJtb3VzZXVwXCI6XG4gICAgICAgIGNhc2UgXCJkcmFnZW5kXCI6XG4gICAgICAgICAgbW91c2VEb3duID0gITE7XG4gICAgICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInNlbGVjdGlvbmNoYW5nZVwiOlxuICAgICAgICAgIGlmIChza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQpIGJyZWFrO1xuICAgICAgICBjYXNlIFwia2V5ZG93blwiOlxuICAgICAgICBjYXNlIFwia2V5dXBcIjpcbiAgICAgICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgfVxuICAgICAgdmFyIGZhbGxiYWNrRGF0YTtcbiAgICAgIGlmIChjYW5Vc2VDb21wb3NpdGlvbkV2ZW50KVxuICAgICAgICBiOiB7XG4gICAgICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJjb21wb3NpdGlvbnN0YXJ0XCI6XG4gICAgICAgICAgICAgIHZhciBldmVudFR5cGUgPSBcIm9uQ29tcG9zaXRpb25TdGFydFwiO1xuICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgY2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6XG4gICAgICAgICAgICAgIGV2ZW50VHlwZSA9IFwib25Db21wb3NpdGlvbkVuZFwiO1xuICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgY2FzZSBcImNvbXBvc2l0aW9udXBkYXRlXCI6XG4gICAgICAgICAgICAgIGV2ZW50VHlwZSA9IFwib25Db21wb3NpdGlvblVwZGF0ZVwiO1xuICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBldmVudFR5cGUgPSB2b2lkIDA7XG4gICAgICAgI
1H1cbiAgICAgIGVsc2VcbiAgICAgICAgaXNDb21wb3NpbmdcbiAgICAgICAgICA/IGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSAmJlxuICAgICAgICAgICAgKGV2ZW50VHlwZSA9IFwib25Db21wb3NpdGlvbkVuZFwiKVxuICAgICAgICAgIDogXCJrZXlkb3duXCIgPT09IGRvbUV2ZW50TmFtZSAmJlxuICAgICAgICAgICAgMjI5ID09PSBuYXRpdmVFdmVudC5rZXlDb2RlICYmXG4gICAgICAgICAgICAoZXZlbnRUeXBlID0gXCJvbkNvbXBvc2l0aW9uU3RhcnRcIik7XG4gICAgICBldmVudFR5cGUgJiZcbiAgICAgICAgKHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmXG4gICAgICAgICAgXCJrb1wiICE9PSBuYXRpdmVFdmVudC5sb2NhbGUgJiZcbiAgICAgICAgICAoaXNDb21wb3NpbmcgfHwgXCJvbkNvbXBvc2l0aW9uU3RhcnRcIiAhPT0gZXZlbnRUeXBlXG4gICAgICAgICAgICA/IFwib25Db21wb3NpdGlvbkVuZFwiID09PSBldmVudFR5cGUgJiZcbiAgICAgICAgICAgICAgaXNDb21wb3NpbmcgJiZcbiAgICAgICAgICAgICAgKGZhbGxiYWNrRGF0YSA9IGdldERhdGEoKSlcbiAgICAgICAgICAgIDogKChyb290ID0gbmF0aXZlRXZlbnRUYXJnZXQpLFxuICAgICAgICAgICAgICAoc3RhcnRUZXh0ID0gXCJ2YWx1ZVwiIGluIHJvb3QgPyByb290LnZhbHVlIDogcm9vdC50ZXh0Q29udGVudCksXG4gICAgICAgICAgICAgIChpc0NvbXBvc2luZyA9ICEwKSkpLFxuICAgICAgICAoaGFuZGxlRXZlbnRGdW5jID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIGV2ZW50VHlwZSkpLFxuICAgICAgICAwIDwgaGFuZGxlRXZlbnRGdW5jLmxlbmd0aCAmJlxuICAgICAgICAgICgoZXZlbnRUeXBlID0gbmV3IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoXG4gICAgICAgICAgICBldmVudFR5cGUsXG4gICAgICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgICAgICkpLFxuICAgICAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7IGV2ZW50OiBldmVudFR5cGUsIGxpc3RlbmVyczogaGFuZGxlRXZlbnRGdW5jIH0pLFxuICAgICAgICAgIGZhbGxiYWNrRGF0YVxuICAgICAgICAgICAgPyAoZXZlbnRUeXBlLmRhdGEgPSBmYWxsYmFja0RhdGEpXG4gICAgICAgICAgICA6ICgoZmFsbGJhY2tEYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCkpLFxuICAgICAgICAgICAgICBudWxsICE9PSBmYWxsYmFja0RhdGEgJiYgKGV2ZW50VHlwZS5kYXRhID0gZmFsbGJhY2tEYXRhKSkpKTtcbiAgICAgIGlmIChcbiAgICAgICAgKGZhbGxiYWNrRGF0YSA9IGNhblVzZVRleHRJbnB1dEV2ZW50XG4gICAgICAgICAgPyBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpXG4gICAgICAgICAgOiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpXG4gICAgICApXG4gICAgICAgIChldmVudFR5cGUgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgXCJvbkJlZm9yZUlucHV0XCIpKSxcbiAgICAgICAgICAwIDwgZXZlbnRUeXBlLmxlbmd0aCAmJlxuICAgICAgICAgICAgKChoYW5kbGVFdmVudEZ1bmMgPSBuZXcgU3ludGhldGljQ29tcG9zaXRpb25FdmVudChcbiAgICAgICAgICAgICAgXCJvbkJlZm9yZUlucHV0XCIsXG4gICAgICAgICAgICAgIFwiYmVmb3JlaW5wdXRcIixcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgIGV2ZW50OiBoYW5kbGVFdmVudEZ1bmMsXG4gICAgICAgICAgICAgIGxpc3RlbmVyczogZXZlbnRUeXBlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIChoYW5kbGVFdmVudEZ1bmMuZGF0YSA9IGZhbGxiYWNrRGF0YSkpO1xuICAgICAgZXh0cmFjdEV2ZW50cyQxKFxuICAgICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgIHRhcmdldEluc3QsXG4gICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgKTtcbiAgICB9XG4gICAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgIGN1cnJlbnRUYXJnZXQ6IGN1cnJlbnRUYXJnZXRcbiAgfTtcbn1cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRGaWJlciwgcmVhY3ROYW1lKSB7XG4gIGZvciAoXG4gICAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgXCJDYXB0dXJlXCIsIGxpc3RlbmVycyA9IFtdO1xuICAgIG51bGwgIT09IHRhcmdldEZpYmVyO1xuXG4gICkge1xuICAgIHZhciBfaW5zdGFuY2UyID0gdGFyZ2V0RmliZXIsXG4gICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UyLnN0YXRlTm9kZTtcbiAgICBfaW5zdGFuY2UyID0gX2luc3RhbmNlMi50YWc7XG4gICAgKDUgIT09IF9pbnN0YW5jZTIgJiYgMjYgIT09IF9pbnN0YW5jZTIgJiYgMjcgIT09IF9pbnN0YW5jZTIpIHx8XG4gICAgICBudWxsID09PSBzdGF0ZU5vZGUgfHxcbiAgICAgICgoX2luc3RhbmNlMiA9IGdldExpc3RlbmVyKHRhcmdldEZpYmVyLCBjYXB0dXJlTmFtZSkpLFxuICAgICAgbnVsbCAhPSBfaW5zdGFuY2UyICYmXG4gICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KFxuICAgICAgICAgIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIodGFyZ2V0RmliZXIsIF9pbnN0YW5jZTIsIHN0YXRlTm9kZSlcbiAgICAgICAgKSxcbiAgICAgIChfaW5zdGFuY2UyID0gZ2V0TGlzdGVuZXIodGFyZ2V0RmliZXIsIHJlYWN0TmFtZSkpLFxuICAgICAgbnVsbCAhPSBfaW5zdGFuY2UyICYmXG4gICAgICAgIGxpc3RlbmVycy5wdXNoKFxuICAgICAgICAgIGNyZWF0ZURpc3Bh
1dGNoTGlzdGVuZXIodGFyZ2V0RmliZXIsIF9pbnN0YW5jZTIsIHN0YXRlTm9kZSlcbiAgICAgICAgKSk7XG4gICAgaWYgKDMgPT09IHRhcmdldEZpYmVyLnRhZykgcmV0dXJuIGxpc3RlbmVycztcbiAgICB0YXJnZXRGaWJlciA9IHRhcmdldEZpYmVyLnJldHVybjtcbiAgfVxuICByZXR1cm4gW107XG59XG5mdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICBpZiAobnVsbCA9PT0gaW5zdCkgcmV0dXJuIG51bGw7XG4gIGRvIGluc3QgPSBpbnN0LnJldHVybjtcbiAgd2hpbGUgKGluc3QgJiYgNSAhPT0gaW5zdC50YWcgJiYgMjcgIT09IGluc3QudGFnKTtcbiAgcmV0dXJuIGluc3QgPyBpbnN0IDogbnVsbDtcbn1cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoXG4gIGRpc3BhdGNoUXVldWUsXG4gIGV2ZW50LFxuICB0YXJnZXQsXG4gIGNvbW1vbixcbiAgaW5DYXB0dXJlUGhhc2Vcbikge1xuICBmb3IgKFxuICAgIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuX3JlYWN0TmFtZSwgbGlzdGVuZXJzID0gW107XG4gICAgbnVsbCAhPT0gdGFyZ2V0ICYmIHRhcmdldCAhPT0gY29tbW9uO1xuXG4gICkge1xuICAgIHZhciBfaW5zdGFuY2UzID0gdGFyZ2V0LFxuICAgICAgYWx0ZXJuYXRlID0gX2luc3RhbmNlMy5hbHRlcm5hdGUsXG4gICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UzLnN0YXRlTm9kZTtcbiAgICBfaW5zdGFuY2UzID0gX2luc3RhbmNlMy50YWc7XG4gICAgaWYgKG51bGwgIT09IGFsdGVybmF0ZSAmJiBhbHRlcm5hdGUgPT09IGNvbW1vbikgYnJlYWs7XG4gICAgKDUgIT09IF9pbnN0YW5jZTMgJiYgMjYgIT09IF9pbnN0YW5jZTMgJiYgMjcgIT09IF9pbnN0YW5jZTMpIHx8XG4gICAgICBudWxsID09PSBzdGF0ZU5vZGUgfHxcbiAgICAgICgoYWx0ZXJuYXRlID0gc3RhdGVOb2RlKSxcbiAgICAgIGluQ2FwdHVyZVBoYXNlXG4gICAgICAgID8gKChzdGF0ZU5vZGUgPSBnZXRMaXN0ZW5lcih0YXJnZXQsIHJlZ2lzdHJhdGlvbk5hbWUpKSxcbiAgICAgICAgICBudWxsICE9IHN0YXRlTm9kZSAmJlxuICAgICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoXG4gICAgICAgICAgICAgIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIodGFyZ2V0LCBzdGF0ZU5vZGUsIGFsdGVybmF0ZSlcbiAgICAgICAgICAgICkpXG4gICAgICAgIDogaW5DYXB0dXJlUGhhc2UgfHxcbiAgICAgICAgICAoKHN0YXRlTm9kZSA9IGdldExpc3RlbmVyKHRhcmdldCwgcmVnaXN0cmF0aW9uTmFtZSkpLFxuICAgICAgICAgIG51bGwgIT0gc3RhdGVOb2RlICYmXG4gICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChcbiAgICAgICAgICAgICAgY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcih0YXJnZXQsIHN0YXRlTm9kZSwgYWx0ZXJuYXRlKVxuICAgICAgICAgICAgKSkpO1xuICAgIHRhcmdldCA9IHRhcmdldC5yZXR1cm47XG4gIH1cbiAgMCAhPT0gbGlzdGVuZXJzLmxlbmd0aCAmJlxuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7IGV2ZW50OiBldmVudCwgbGlzdGVuZXJzOiBsaXN0ZW5lcnMgfSk7XG59XG52YXIgTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYID0gL1xcclxcbj8vZyxcbiAgTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYID0gL1xcdTAwMDB8XFx1RkZGRC9nO1xuZnVuY3Rpb24gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKG1hcmt1cCkge1xuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHR5cGVvZiBtYXJrdXAgPyBtYXJrdXAgOiBcIlwiICsgbWFya3VwKVxuICAgIC5yZXBsYWNlKE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCwgXCJcXG5cIilcbiAgICAucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsIFwiXCIpO1xufVxuZnVuY3Rpb24gY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHNlcnZlclRleHQsIGNsaWVudFRleHQpIHtcbiAgY2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJUZXh0KSA9PT0gY2xpZW50VGV4dCA/ICEwIDogITE7XG59XG5mdW5jdGlvbiBub29wJDEoKSB7fVxuZnVuY3Rpb24gc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIGtleSwgdmFsdWUsIHByb3BzLCBwcmV2VmFsdWUpIHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICA/IFwiYm9keVwiID09PSB0YWcgfHxcbiAgICAgICAgICAoXCJ0ZXh0YXJlYVwiID09PSB0YWcgJiYgXCJcIiA9PT0gdmFsdWUpIHx8XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgdmFsdWUpXG4gICAgICAgIDogKFwibnVtYmVyXCIgPT09IHR5cGVvZiB2YWx1ZSB8fCBcImJpZ2ludFwiID09PSB0eXBlb2YgdmFsdWUpICYmXG4gICAgICAgICAgXCJib2R5XCIgIT09IHRhZyAmJlxuICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIFwiXCIgKyB2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY2xhc3NOYW1lXCI6XG4gICAgICBzZXRWYWx1ZUZvcktub3duQXR0cmlidXRlKGRvbUVsZW1lbnQsIFwiY2xhc3NcIiwgdmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRhYkluZGV4XCI6XG4gICAgICBzZXRWYWx1ZUZvcktub3duQXR0cmlidXRlKGRvbUVsZW1lbnQsIFwidGFiaW5kZXhcIiwgdmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImRpclwiOlxuICAgIGNhc2UgXCJyb2xlXCI6XG4gICAgY2FzZSBcInZpZXdCb3hcIjpcbiAgICBjYXNlIFwid2lkdGhcIjpcbiAgICBjYXNlIFwiaGVpZ2h0XCI6XG4gICAgICBzZXRWYWx1ZUZvcktub3duQXR0cmlidXRlKGRvbUVsZW1lbnQsIGtleSwgdmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCB2YWx1ZSwgcHJldlZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJkYXRhXCI6XG4gICAgICBpZiAoXCJvYmplY3RcIiAhPT0gdGFnKSB7XG4gICAgICAgI
1HNldFZhbHVlRm9yS25vd25BdHRyaWJ1dGUoZG9tRWxlbWVudCwgXCJkYXRhXCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBcInNyY1wiOlxuICAgIGNhc2UgXCJocmVmXCI6XG4gICAgICBpZiAoXCJcIiA9PT0gdmFsdWUgJiYgKFwiYVwiICE9PSB0YWcgfHwgXCJocmVmXCIgIT09IGtleSkpIHtcbiAgICAgICAgZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgPT0gdmFsdWUgfHxcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgXCJzeW1ib2xcIiA9PT0gdHlwZW9mIHZhbHVlIHx8XG4gICAgICAgIFwiYm9vbGVhblwiID09PSB0eXBlb2YgdmFsdWVcbiAgICAgICkge1xuICAgICAgICBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gc2FuaXRpemVVUkwoXCJcIiArIHZhbHVlKTtcbiAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImFjdGlvblwiOlxuICAgIGNhc2UgXCJmb3JtQWN0aW9uXCI6XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIFwiamF2YXNjcmlwdDp0aHJvdyBuZXcgRXJyb3IoJ0EgUmVhY3QgZm9ybSB3YXMgdW5leHBlY3RlZGx5IHN1Ym1pdHRlZC4gSWYgeW91IGNhbGxlZCBmb3JtLnN1Ym1pdCgpIG1hbnVhbGx5LCBjb25zaWRlciB1c2luZyBmb3JtLnJlcXVlc3RTdWJtaXQoKSBpbnN0ZWFkLiBJZiB5b3VcXFxcJ3JlIHRyeWluZyB0byB1c2UgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgaW4gYSBzdWJtaXQgZXZlbnQgaGFuZGxlciwgY29uc2lkZXIgYWxzbyBjYWxsaW5nIGV2ZW50LnByZXZlbnREZWZhdWx0KCkuJylcIlxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBwcmV2VmFsdWUgJiZcbiAgICAgICAgICAoXCJmb3JtQWN0aW9uXCIgPT09IGtleVxuICAgICAgICAgICAgPyAoXCJpbnB1dFwiICE9PSB0YWcgJiZcbiAgICAgICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgXCJuYW1lXCIsIHByb3BzLm5hbWUsIHByb3BzLCBudWxsKSxcbiAgICAgICAgICAgICAgc2V0UHJvcChcbiAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICBcImZvcm1FbmNUeXBlXCIsXG4gICAgICAgICAgICAgICAgcHJvcHMuZm9ybUVuY1R5cGUsXG4gICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgIFwiZm9ybU1ldGhvZFwiLFxuICAgICAgICAgICAgICAgIHByb3BzLmZvcm1NZXRob2QsXG4gICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgIFwiZm9ybVRhcmdldFwiLFxuICAgICAgICAgICAgICAgIHByb3BzLmZvcm1UYXJnZXQsXG4gICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgOiAoc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIFwiZW5jVHlwZVwiLCBwcm9wcy5lbmNUeXBlLCBwcm9wcywgbnVsbCksXG4gICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBcIm1ldGhvZFwiLCBwcm9wcy5tZXRob2QsIHByb3BzLCBudWxsKSxcbiAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIFwidGFyZ2V0XCIsIHByb3BzLnRhcmdldCwgcHJvcHMsIG51bGwpKSk7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgPT0gdmFsdWUgfHxcbiAgICAgICAgXCJzeW1ib2xcIiA9PT0gdHlwZW9mIHZhbHVlIHx8XG4gICAgICAgIFwiYm9vbGVhblwiID09PSB0eXBlb2YgdmFsdWVcbiAgICAgICkge1xuICAgICAgICBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gc2FuaXRpemVVUkwoXCJcIiArIHZhbHVlKTtcbiAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm9uQ2xpY2tcIjpcbiAgICAgIG51bGwgIT0gdmFsdWUgJiYgKGRvbUVsZW1lbnQub25jbGljayA9IG5vb3AkMSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwib25TY3JvbGxcIjpcbiAgICAgIG51bGwgIT0gdmFsdWUgJiYgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcInNjcm9sbFwiLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJvblNjcm9sbEVuZFwiOlxuICAgICAgbnVsbCAhPSB2YWx1ZSAmJiBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwic2Nyb2xsZW5kXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI6XG4gICAgICBpZiAobnVsbCAhPSB2YWx1ZSkge1xuICAgICAgICBpZiAoXCJvYmplY3RcIiAhPT0gdHlwZW9mIHZhbHVlIHx8ICEoXCJfX2h0bWxcIiBpbiB2YWx1ZSkpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg2MSkpO1xuICAgICAgICBrZXkgPSB2YWx1ZS5fX2h0bWw7XG4gICAgICAgIGlmIChudWxsICE9IGtleSkge1xuICAgICAgICAgIGlmIChudWxsICE9IHByb3BzLmNoaWxkcmVuKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYwKSk7XG4gICAgICAgICAgZG9tRWxlbWVudC5pbm5lckhUTUwgPSBrZXk7XG4gICAgICAgI
1H1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJtdWx0aXBsZVwiOlxuICAgICAgZG9tRWxlbWVudC5tdWx0aXBsZSA9XG4gICAgICAgIHZhbHVlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmIFwic3ltYm9sXCIgIT09IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJtdXRlZFwiOlxuICAgICAgZG9tRWxlbWVudC5tdXRlZCA9XG4gICAgICAgIHZhbHVlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmIFwic3ltYm9sXCIgIT09IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIjpcbiAgICBjYXNlIFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCI6XG4gICAgY2FzZSBcImRlZmF1bHRWYWx1ZVwiOlxuICAgIGNhc2UgXCJkZWZhdWx0Q2hlY2tlZFwiOlxuICAgIGNhc2UgXCJpbm5lckhUTUxcIjpcbiAgICBjYXNlIFwicmVmXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYXV0b0ZvY3VzXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwieGxpbmtIcmVmXCI6XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgPT0gdmFsdWUgfHxcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiB2YWx1ZSB8fFxuICAgICAgICBcInN5bWJvbFwiID09PSB0eXBlb2YgdmFsdWVcbiAgICAgICkge1xuICAgICAgICBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInhsaW5rOmhyZWZcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAga2V5ID0gc2FuaXRpemVVUkwoXCJcIiArIHZhbHVlKTtcbiAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlTlMoXG4gICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICAgICAgICBcInhsaW5rOmhyZWZcIixcbiAgICAgICAga2V5XG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImNvbnRlbnRFZGl0YWJsZVwiOlxuICAgIGNhc2UgXCJzcGVsbENoZWNrXCI6XG4gICAgY2FzZSBcImRyYWdnYWJsZVwiOlxuICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgIGNhc2UgXCJhdXRvUmV2ZXJzZVwiOlxuICAgIGNhc2UgXCJleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXCI6XG4gICAgY2FzZSBcImZvY3VzYWJsZVwiOlxuICAgIGNhc2UgXCJwcmVzZXJ2ZUFscGhhXCI6XG4gICAgICBudWxsICE9IHZhbHVlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmIFwic3ltYm9sXCIgIT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICA/IGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgXCJcIiArIHZhbHVlKVxuICAgICAgICA6IGRvbUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiaW5lcnRcIjpcbiAgICBjYXNlIFwiYWxsb3dGdWxsU2NyZWVuXCI6XG4gICAgY2FzZSBcImFzeW5jXCI6XG4gICAgY2FzZSBcImF1dG9QbGF5XCI6XG4gICAgY2FzZSBcImNvbnRyb2xzXCI6XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICBjYXNlIFwiZGVmZXJcIjpcbiAgICBjYXNlIFwiZGlzYWJsZWRcIjpcbiAgICBjYXNlIFwiZGlzYWJsZVBpY3R1cmVJblBpY3R1cmVcIjpcbiAgICBjYXNlIFwiZGlzYWJsZVJlbW90ZVBsYXliYWNrXCI6XG4gICAgY2FzZSBcImZvcm1Ob1ZhbGlkYXRlXCI6XG4gICAgY2FzZSBcImhpZGRlblwiOlxuICAgIGNhc2UgXCJsb29wXCI6XG4gICAgY2FzZSBcIm5vTW9kdWxlXCI6XG4gICAgY2FzZSBcIm5vVmFsaWRhdGVcIjpcbiAgICBjYXNlIFwib3BlblwiOlxuICAgIGNhc2UgXCJwbGF5c0lubGluZVwiOlxuICAgIGNhc2UgXCJyZWFkT25seVwiOlxuICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgIGNhc2UgXCJyZXZlcnNlZFwiOlxuICAgIGNhc2UgXCJzY29wZWRcIjpcbiAgICBjYXNlIFwic2VhbWxlc3NcIjpcbiAgICBjYXNlIFwiaXRlbVNjb3BlXCI6XG4gICAgICB2YWx1ZSAmJiBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJiBcInN5bWJvbFwiICE9PSB0eXBlb2YgdmFsdWVcbiAgICAgICAgPyBkb21FbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFwiXCIpXG4gICAgICAgIDogZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjYXB0dXJlXCI6XG4gICAgY2FzZSBcImRvd25sb2FkXCI6XG4gICAgICAhMCA9PT0gdmFsdWVcbiAgICAgICAgPyBkb21FbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFwiXCIpXG4gICAgICAgIDogITEgIT09IHZhbHVlICYmXG4gICAgICAgICAgICBudWxsICE9IHZhbHVlICYmXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHZhbHVlXG4gICAgICAgICAgPyBkb21FbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKVxuICAgICAgICAgIDogZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjb2xzXCI6XG4gICAgY2FzZSBcInJvd3NcIjpcbiAgICBjYXNlIFwic2l6ZVwiOlxuICAgIGNhc2UgXCJzcGFuXCI6XG4gICAgICBudWxsICE9IHZhbHVlICYmXG4gICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAhaXNOYU4odmFsdWUpICYmXG4gICAgICAxIDw9IHZhbHVlXG4gICAgICAgID8gZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSlcbiAgICAgICAgOiBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInJvd1NwYW5cIjpcbiAgICBjYXNlIFwic3RhcnRcIjpcbiAgICAgIG51bGwgPT0gdmFsdWUgfHxcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHZhbHVlIHx8XG4gICAgICBcInN5bWJvbFwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgIGlzTmFOKHZhbHVlKVxuICAgICAgICA/IGRvbUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGtleSlcbiAgICAgICAgOiBkb21FbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJwb3BvdmVyXCI6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwiYmVmb3JldG9nZ2xlXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcInRvZ2dsZVwiLCBkb21FbGVtZW50KTtcbiAgICAgIHNldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIFwicG9wb3ZlclwiLCB2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwieGxpbmtBY3R1YXRlXCI6XG4gICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICAgICAgICBcInhsaW5rOmFjdHVhdGVcIixcbiAgICAgICAgdmFsdWVcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwieGxpbmtBcmNyb2xlXCI6XG4gICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICAgICAgICBcInhsaW5rOmFyY3JvbGVcIixcbiAgICAgICAgdmFsdWVcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwieGxpbmtSb2xlXCI6XG4gICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICAgICAgICBcInhsaW5rOnJvbGVcIixcbiAgICAgICAgdmFsdWVcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwieGxpbmtTaG93XCI6XG4gICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICAgICAgICBcInhsaW5rOnNob3dcIixcbiAgICAgICAgdmFsdWVcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwieGxpbmtUaXRsZVwiOlxuICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgICAgICAgXCJ4bGluazp0aXRsZVwiLFxuICAgICAgICB2YWx1ZVxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ4bGlua1R5cGVcIjpcbiAgICAgIHNldFZhbHVlRm9yTmFtZXNwYWNlZEF0dHJpYnV0ZShcbiAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXG4gICAgICAgIFwieGxpbms6dHlwZVwiLFxuICAgICAgICB2YWx1ZVxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ4bWxCYXNlXCI6XG4gICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gICAgICAgIFwieG1sOmJhc2VcIixcbiAgICAgICAgdmFsdWVcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwieG1sTGFuZ1wiOlxuICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICAgICAgICBcInhtbDpsYW5nXCIsXG4gICAgICAgI
1HZhbHVlXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInhtbFNwYWNlXCI6XG4gICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gICAgICAgIFwieG1sOnNwYWNlXCIsXG4gICAgICAgIHZhbHVlXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImlzXCI6XG4gICAgICBzZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBcImlzXCIsIHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJpbm5lclRleHRcIjpcbiAgICBjYXNlIFwidGV4dENvbnRlbnRcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoXG4gICAgICAgICEoMiA8IGtleS5sZW5ndGgpIHx8XG4gICAgICAgIChcIm9cIiAhPT0ga2V5WzBdICYmIFwiT1wiICE9PSBrZXlbMF0pIHx8XG4gICAgICAgIChcIm5cIiAhPT0ga2V5WzFdICYmIFwiTlwiICE9PSBrZXlbMV0pXG4gICAgICApXG4gICAgICAgIChrZXkgPSBhbGlhc2VzLmdldChrZXkpIHx8IGtleSksXG4gICAgICAgICAgc2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFByb3BPbkN1c3RvbUVsZW1lbnQoZG9tRWxlbWVudCwgdGFnLCBrZXksIHZhbHVlLCBwcm9wcywgcHJldlZhbHVlKSB7XG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCB2YWx1ZSwgcHJldlZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgaWYgKG51bGwgIT0gdmFsdWUpIHtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgIT09IHR5cGVvZiB2YWx1ZSB8fCAhKFwiX19odG1sXCIgaW4gdmFsdWUpKVxuICAgICAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNjEpKTtcbiAgICAgICAga2V5ID0gdmFsdWUuX19odG1sO1xuICAgICAgICBpZiAobnVsbCAhPSBrZXkpIHtcbiAgICAgICAgICBpZiAobnVsbCAhPSBwcm9wcy5jaGlsZHJlbikgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg2MCkpO1xuICAgICAgICAgIGRvbUVsZW1lbnQuaW5uZXJIVE1MID0ga2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICA/IHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIHZhbHVlKVxuICAgICAgICA6IChcIm51bWJlclwiID09PSB0eXBlb2YgdmFsdWUgfHwgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIHZhbHVlKSAmJlxuICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIFwiXCIgKyB2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwib25TY3JvbGxcIjpcbiAgICAgIG51bGwgIT0gdmFsdWUgJiYgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcInNjcm9sbFwiLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJvblNjcm9sbEVuZFwiOlxuICAgICAgbnVsbCAhPSB2YWx1ZSAmJiBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwic2Nyb2xsZW5kXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm9uQ2xpY2tcIjpcbiAgICAgIG51bGwgIT0gdmFsdWUgJiYgKGRvbUVsZW1lbnQub25jbGljayA9IG5vb3AkMSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCI6XG4gICAgY2FzZSBcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiOlxuICAgIGNhc2UgXCJpbm5lckhUTUxcIjpcbiAgICBjYXNlIFwicmVmXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiaW5uZXJUZXh0XCI6XG4gICAgY2FzZSBcInRleHRDb250ZW50XCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKCFyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KGtleSkpXG4gICAgICAgIGE6IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBcIm9cIiA9PT0ga2V5WzBdICYmXG4gICAgICAgICAgICBcIm5cIiA9PT0ga2V5WzFdICYmXG4gICAgICAgICAgICAoKHByb3BzID0ga2V5LmVuZHNXaXRoKFwiQ2FwdHVyZVwiKSksXG4gICAgICAgICAgICAodGFnID0ga2V5LnNsaWNlKDIsIHByb3BzID8ga2V5Lmxlbmd0aCAtIDcgOiB2b2lkIDApKSxcbiAgICAgICAgICAgIChwcmV2VmFsdWUgPSBkb21FbGVtZW50W2ludGVybmFsUHJvcHNLZXldIHx8IG51bGwpLFxuICAgICAgICAgICAgKHByZXZWYWx1ZSA9IG51bGwgIT0gcHJldlZhbHVlID8gcHJldlZhbHVlW2tleV0gOiBudWxsKSxcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHByZXZWYWx1ZSAmJlxuICAgICAgICAgICAgICBkb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGFnLCBwcmV2VmFsdWUsIHByb3BzKSxcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHZhbHVlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgcHJldlZhbHVlICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IHByZXZWYWx1ZSAmJlxuICAgICAgICAgICAgICAoa2V5IGluIGRvbUVsZW1lbnRcbiAgICAgICAgICAgICAgICA/IChkb21FbGVtZW50W2tleV0gPSBudWxsKVxuICAgICAgICAgICAgICAgIDogZG9tRWxlbWVudC5oYXNBdHRyaWJ1dGUoa2V5KSAmJlxuICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoa2V5KSk7XG4gICAgICAgICAgICBkb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGFnLCB2YWx1ZSwgcHJvcHMpO1xuICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICB9XG4gICAgICAgICAga2V5IGluIGRvbUVsZW1lbnRcbiAgICAgICAgICAgID8gKGRvbUVsZW1lbnRba2V5XSA9IHZhbHVlKVxuICAgICAgICAgICAgOiAhMCA9PT0gdmFsdWVcbiAgICAgICAgICAgICAgPyBkb21FbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFwiXCIpXG4gICAgICAgICAgICAgIDogc2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwga2V5LCB2YWx1ZSk7XG4gICAgICAgI
1H1cbiAgfVxufVxuZnVuY3Rpb24gc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBwcm9wcykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgXCJkaXZcIjpcbiAgICBjYXNlIFwic3BhblwiOlxuICAgIGNhc2UgXCJzdmdcIjpcbiAgICBjYXNlIFwicGF0aFwiOlxuICAgIGNhc2UgXCJhXCI6XG4gICAgY2FzZSBcImdcIjpcbiAgICBjYXNlIFwicFwiOlxuICAgIGNhc2UgXCJsaVwiOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImltZ1wiOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImVycm9yXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImxvYWRcIiwgZG9tRWxlbWVudCk7XG4gICAgICB2YXIgaGFzU3JjID0gITEsXG4gICAgICAgIGhhc1NyY1NldCA9ICExLFxuICAgICAgICBwcm9wS2V5O1xuICAgICAgZm9yIChwcm9wS2V5IGluIHByb3BzKVxuICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcEtleV07XG4gICAgICAgICAgaWYgKG51bGwgIT0gcHJvcFZhbHVlKVxuICAgICAgICAgICAgc3dpdGNoIChwcm9wS2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJzcmNcIjpcbiAgICAgICAgICAgICAgICBoYXNTcmMgPSAhMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcInNyY1NldFwiOlxuICAgICAgICAgICAgICAgIGhhc1NyY1NldCA9ICEwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI6XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMzcsIHRhZykpO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBwcm9wS2V5LCBwcm9wVmFsdWUsIHByb3BzLCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgaGFzU3JjU2V0ICYmXG4gICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBcInNyY1NldFwiLCBwcm9wcy5zcmNTZXQsIHByb3BzLCBudWxsKTtcbiAgICAgIGhhc1NyYyAmJiBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgXCJzcmNcIiwgcHJvcHMuc3JjLCBwcm9wcywgbnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSBcImlucHV0XCI6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwiaW52YWxpZFwiLCBkb21FbGVtZW50KTtcbiAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSAocHJvcEtleSA9IHByb3BWYWx1ZSA9IGhhc1NyY1NldCA9IG51bGwpLFxuICAgICAgICBjaGVja2VkID0gbnVsbCxcbiAgICAgICAgZGVmYXVsdENoZWNrZWQgPSBudWxsO1xuICAgICAgZm9yIChoYXNTcmMgaW4gcHJvcHMpXG4gICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShoYXNTcmMpKSB7XG4gICAgICAgICAgdmFyIHByb3BWYWx1ZSQxODggPSBwcm9wc1toYXNTcmNdO1xuICAgICAgICAgIGlmIChudWxsICE9IHByb3BWYWx1ZSQxODgpXG4gICAgICAgICAgICBzd2l0Y2ggKGhhc1NyYykge1xuICAgICAgICAgICAgICBjYXNlIFwibmFtZVwiOlxuICAgICAgICAgICAgICAgIGhhc1NyY1NldCA9IHByb3BWYWx1ZSQxODg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJ0eXBlXCI6XG4gICAgICAgICAgICAgICAgcHJvcFZhbHVlID0gcHJvcFZhbHVlJDE4ODtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgICAgICBjaGVja2VkID0gcHJvcFZhbHVlJDE4ODtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRDaGVja2VkXCI6XG4gICAgICAgICAgICAgICAgZGVmYXVsdENoZWNrZWQgPSBwcm9wVmFsdWUkMTg4O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwidmFsdWVcIjpcbiAgICAgICAgICAgICAgICBwcm9wS2V5ID0gcHJvcFZhbHVlJDE4ODtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRWYWx1ZVwiOlxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BWYWx1ZSQxODg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJjaGlsZHJlblwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBwcm9wVmFsdWUkMTg4KVxuICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMzcsIHRhZykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBoYXNTcmMsIHByb3BWYWx1ZSQxODgsIHByb3BzLCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgaW5pdElucHV0KFxuICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICBwcm9wS2V5LFxuICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIGNoZWNrZWQsXG4gICAgICAgIGRlZmF1bHRDaGVja2VkLFxuICAgICAgICBwcm9wVmFsdWUsXG4gICAgICAgIGhhc1NyY1NldCxcbiAgICAgICAgITFcbiAgICAgICk7XG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwiaW52YWxpZFwiLCBkb21FbGVtZW50KTtcbiAgICAgIGhhc1NyYyA9IHByb3BWYWx1ZSA9IHByb3BLZXkgPSBudWxsO1xuICAgICAgZm9yIChoYXNTcmNTZXQgaW4gcHJvcHMpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wcy5oYXNPd25Qcm9wZXJ0eShoYXNTcmNTZXQpICYmXG4gICAgICAgICAgKChkZWZhdWx0VmFsdWUgPSBwcm9wc1toYXNTcmNTZXRdKSwgbnVsbCAhPSBkZWZhdWx0VmFsdWUpXG4gICAgICAgIClcbiAgICAgICAgICBzd2l0Y2ggKGhhc1NyY1NldCkge1xuICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgI
1HByb3BLZXkgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRWYWx1ZVwiOlxuICAgICAgICAgICAgICBwcm9wVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm11bHRpcGxlXCI6XG4gICAgICAgICAgICAgIGhhc1NyYyA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBoYXNTcmNTZXQsIGRlZmF1bHRWYWx1ZSwgcHJvcHMsIG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgIHRhZyA9IHByb3BLZXk7XG4gICAgICBwcm9wcyA9IHByb3BWYWx1ZTtcbiAgICAgIGRvbUVsZW1lbnQubXVsdGlwbGUgPSAhIWhhc1NyYztcbiAgICAgIG51bGwgIT0gdGFnXG4gICAgICAgID8gdXBkYXRlT3B0aW9ucyhkb21FbGVtZW50LCAhIWhhc1NyYywgdGFnLCAhMSlcbiAgICAgICAgOiBudWxsICE9IHByb3BzICYmIHVwZGF0ZU9wdGlvbnMoZG9tRWxlbWVudCwgISFoYXNTcmMsIHByb3BzLCAhMCk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSBcInRleHRhcmVhXCI6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwiaW52YWxpZFwiLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BLZXkgPSBoYXNTcmNTZXQgPSBoYXNTcmMgPSBudWxsO1xuICAgICAgZm9yIChwcm9wVmFsdWUgaW4gcHJvcHMpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wVmFsdWUpICYmXG4gICAgICAgICAgKChkZWZhdWx0VmFsdWUgPSBwcm9wc1twcm9wVmFsdWVdKSwgbnVsbCAhPSBkZWZhdWx0VmFsdWUpXG4gICAgICAgIClcbiAgICAgICAgICBzd2l0Y2ggKHByb3BWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgIGhhc1NyYyA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgIGhhc1NyY1NldCA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICAgICAgcHJvcEtleSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZGVmYXVsdFZhbHVlKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkxKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIHByb3BWYWx1ZSwgZGVmYXVsdFZhbHVlLCBwcm9wcywgbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgaW5pdFRleHRhcmVhKGRvbUVsZW1lbnQsIGhhc1NyYywgaGFzU3JjU2V0LCBwcm9wS2V5KTtcbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgXCJvcHRpb25cIjpcbiAgICAgIGZvciAoY2hlY2tlZCBpbiBwcm9wcylcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3BzLmhhc093blByb3BlcnR5KGNoZWNrZWQpICYmXG4gICAgICAgICAgKChoYXNTcmMgPSBwcm9wc1tjaGVja2VkXSksIG51bGwgIT0gaGFzU3JjKVxuICAgICAgICApXG4gICAgICAgICAgc3dpdGNoIChjaGVja2VkKSB7XG4gICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgICAgZG9tRWxlbWVudC5zZWxlY3RlZCA9XG4gICAgICAgICAgICAgICAgaGFzU3JjICYmXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgaGFzU3JjICYmXG4gICAgICAgICAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIGhhc1NyYztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgY2hlY2tlZCwgaGFzU3JjLCBwcm9wcywgbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgXCJkaWFsb2dcIjpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJiZWZvcmV0b2dnbGVcIiwgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwidG9nZ2xlXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImNhbmNlbFwiLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJjbG9zZVwiLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJpZnJhbWVcIjpcbiAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwibG9hZFwiLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ2aWRlb1wiOlxuICAgIGNhc2UgXCJhdWRpb1wiOlxuICAgICAgZm9yIChoYXNTcmMgPSAwOyBoYXNTcmMgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBoYXNTcmMrKylcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaGFzU3JjXSwgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJlcnJvclwiLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJsb2FkXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImRldGFpbHNcIjpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJ0b2dnbGVcIiwgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiZW1iZWRcIjpcbiAgICBjYXNlIFwic291cmNlXCI6XG4gICAgY2FzZSBcImxpbmtcIjpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJlcnJvclwiLCBkb21FbGVtZW50KSxcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImxvYWRcIiwgZG9tRWxlbWVudCk7XG4gICAgY2FzZSBcImFyZWFcIjpcbiAgICBjYXNlIFwiYmFzZVwiOlxuICAgIGNhc2UgXCJiclwiOlxuICAgIGNhc2UgXCJjb2xcIjpcbiAgICBjYXNlIFwiaHJcIjpcbiAgICBjYXNlIFwia2V5Z2VuXCI6XG4gICAgY2FzZSBcIm1ldGFcIjpcbiAgICBjYXNlIFwicGFyYW1cIjpcbiAgICBjYXNlIFwidHJhY2tcIjpcbiAgICBjYXNlIFwid2JyXCI6XG4gICAgY2FzZSBcIm1lbnVpdGVtXCI6XG4gICAgICBmb3IgKGRlZmF1bHRDaGVja2VkIGluIHByb3BzKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJvcHMuaGFzT3duUHJvcGVydHkoZGVmYXVsdENoZWNrZWQpICYmXG4gICAgICAgICAgKChoYXNTcmMgPSBwcm9wc1tkZWZhdWx0Q2hlY2tlZF0pLCBudWxsICE9IGhhc1NyYylcbiAgICAgICAgKVxuICAgICAgICAgI
1HN3aXRjaCAoZGVmYXVsdENoZWNrZWQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJjaGlsZHJlblwiOlxuICAgICAgICAgICAgY2FzZSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI6XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTM3LCB0YWcpKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBkZWZhdWx0Q2hlY2tlZCwgaGFzU3JjLCBwcm9wcywgbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoaXNDdXN0b21FbGVtZW50KHRhZykpIHtcbiAgICAgICAgZm9yIChwcm9wVmFsdWUkMTg4IGluIHByb3BzKVxuICAgICAgICAgIHByb3BzLmhhc093blByb3BlcnR5KHByb3BWYWx1ZSQxODgpICYmXG4gICAgICAgICAgICAoKGhhc1NyYyA9IHByb3BzW3Byb3BWYWx1ZSQxODhdKSxcbiAgICAgICAgICAgIHZvaWQgMCAhPT0gaGFzU3JjICYmXG4gICAgICAgICAgICAgIHNldFByb3BPbkN1c3RvbUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgcHJvcFZhbHVlJDE4OCxcbiAgICAgICAgICAgICAgICBoYXNTcmMsXG4gICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgdm9pZCAwXG4gICAgICAgICAgICAgICkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbiAgZm9yIChkZWZhdWx0VmFsdWUgaW4gcHJvcHMpXG4gICAgcHJvcHMuaGFzT3duUHJvcGVydHkoZGVmYXVsdFZhbHVlKSAmJlxuICAgICAgKChoYXNTcmMgPSBwcm9wc1tkZWZhdWx0VmFsdWVdKSxcbiAgICAgIG51bGwgIT0gaGFzU3JjICYmXG4gICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBkZWZhdWx0VmFsdWUsIGhhc1NyYywgcHJvcHMsIG51bGwpKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UHJvcHMsIG5leHRQcm9wcykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgXCJkaXZcIjpcbiAgICBjYXNlIFwic3BhblwiOlxuICAgIGNhc2UgXCJzdmdcIjpcbiAgICBjYXNlIFwicGF0aFwiOlxuICAgIGNhc2UgXCJhXCI6XG4gICAgY2FzZSBcImdcIjpcbiAgICBjYXNlIFwicFwiOlxuICAgIGNhc2UgXCJsaVwiOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImlucHV0XCI6XG4gICAgICB2Y
1XIgbmFtZSA9IG51bGwsXG4gICAgICAgIHR5cGUgPSBudWxsLFxuICAgICAgICB2YWx1ZSA9IG51bGwsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGwsXG4gICAgICAgIGxhc3REZWZhdWx0VmFsdWUgPSBudWxsLFxuICAgICAgICBjaGVja2VkID0gbnVsbCxcbiAgICAgICAgZGVmYXVsdENoZWNrZWQgPSBudWxsO1xuICAgICAgZm9yIChwcm9wS2V5IGluIGxhc3RQcm9wcykge1xuICAgICAgICB2YXIgbGFzdFByb3AgPSBsYXN0UHJvcHNbcHJvcEtleV07XG4gICAgICAgIGlmIChsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgJiYgbnVsbCAhPSBsYXN0UHJvcClcbiAgICAgICAgICBzd2l0Y2ggKHByb3BLZXkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJjaGVja2VkXCI6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRWYWx1ZVwiOlxuICAgICAgICAgICAgICBsYXN0RGVmYXVsdFZhbHVlID0gbGFzdFByb3A7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHxcbiAgICAgICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgcHJvcEtleSwgbnVsbCwgbmV4dFByb3BzLCBsYXN0UHJvcCk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yICh2YXIgcHJvcEtleSQyMDUgaW4gbmV4dFByb3BzKSB7XG4gICAgICAgIHZhciBwcm9wS2V5ID0gbmV4dFByb3BzW3Byb3BLZXkkMjA1XTtcbiAgICAgICAgbGFzdFByb3AgPSBsYXN0UHJvcHNbcHJvcEtleSQyMDVdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkkMjA1KSAmJlxuICAgICAgICAgIChudWxsICE9IHByb3BLZXkgfHwgbnVsbCAhPSBsYXN0UHJvcClcbiAgICAgICAgKVxuICAgICAgICAgIHN3aXRjaCAocHJvcEtleSQyMDUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0eXBlXCI6XG4gICAgICAgICAgICAgIHR5cGUgPSBwcm9wS2V5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJuYW1lXCI6XG4gICAgICAgICAgICAgIG5hbWUgPSBwcm9wS2V5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjaGVja2VkXCI6XG4gICAgICAgICAgICAgIGNoZWNrZWQgPSBwcm9wS2V5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkZWZhdWx0Q2hlY2tlZFwiOlxuICAgICAgICAgICAgICBkZWZhdWx0Q2hlY2tlZCA9IHByb3BLZXk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgIHZhbHVlID0gcHJvcEtleTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BLZXk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcHJvcEtleSlcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzNywgdGFnKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiZcbiAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgIHByb3BLZXkkMjA1LFxuICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICAgIGxhc3RQcm9wXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICB1cGRhdGVJbnB1dChcbiAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgbGFzdERlZmF1bHRWYWx1ZSxcbiAgICAgICAgY2hlY2tlZCxcbiAgICAgICAgZGVmYXVsdENoZWNrZWQsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIG5hbWVcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgcHJvcEtleSA9IHZhbHVlID0gZGVmYXVsdFZhbHVlID0gcHJvcEtleSQyMDUgPSBudWxsO1xuICAgICAgZm9yICh0eXBlIGluIGxhc3RQcm9wcylcbiAgICAgICAgaWYgKFxuICAgICAgICAgICgobGFzdERlZmF1bHRWYWx1ZSA9IGxhc3RQcm9wc1t0eXBlXSksXG4gICAgICAgICAgbGFzdFByb3BzLmhhc093blByb3BlcnR5KHR5cGUpICYmIG51bGwgIT0gbGFzdERlZmF1bHRWYWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm11bHRpcGxlXCI6XG4gICAgICAgICAgICAgIHByb3BLZXkgPSBsYXN0RGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgbmV4dFByb3BzLmhhc093blByb3BlcnR5KHR5cGUpIHx8XG4gICAgICAgICAgICAgICAgc2V0UHJvcChcbiAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICAgIGxhc3REZWZhdWx0VmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgIGZvciAobmFtZSBpbiBuZXh0UHJvcHMpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKHR5cGUgPSBuZXh0UHJvcHNbbmFtZV0pLFxuICAgICAgICAgIChsYXN0RGVmYXVsdFZhbHVlID0gbGFzdFByb3BzW25hbWVdKSxcbiAgICAgICAgICBuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkobmFtZSkgJiZcbiAgICAgICAgICAgIChudWxsICE9IHR5cGUgfHwgbnVsbCAhPSBsYXN0RGVmYXVsdFZhbHVlKSlcbiAgICAgICAgKVxuICAgICAgICAgI
1HN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgIHByb3BLZXkkMjA1ID0gdHlwZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHR5cGU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm11bHRpcGxlXCI6XG4gICAgICAgICAgICAgIHZhbHVlID0gdHlwZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHR5cGUgIT09IGxhc3REZWZhdWx0VmFsdWUgJiZcbiAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAgICAgbGFzdERlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgdGFnID0gZGVmYXVsdFZhbHVlO1xuICAgICAgbGFzdFByb3BzID0gdmFsdWU7XG4gICAgICBuZXh0UHJvcHMgPSBwcm9wS2V5O1xuICAgICAgbnVsbCAhPSBwcm9wS2V5JDIwNVxuICAgICAgICA/IHVwZGF0ZU9wdGlvbnMoZG9tRWxlbWVudCwgISFsYXN0UHJvcHMsIHByb3BLZXkkMjA1LCAhMSlcbiAgICAgICAgOiAhIW5leHRQcm9wcyAhPT0gISFsYXN0UHJvcHMgJiZcbiAgICAgICAgICAobnVsbCAhPSB0YWdcbiAgICAgICAgICAgID8gdXBkYXRlT3B0aW9ucyhkb21FbGVtZW50LCAhIWxhc3RQcm9wcywgdGFnLCAhMClcbiAgICAgICAgICAgIDogdXBkYXRlT3B0aW9ucyhkb21FbGVtZW50LCAhIWxhc3RQcm9wcywgbGFzdFByb3BzID8gW10gOiBcIlwiLCAhMSkpO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgcHJvcEtleSA9IHByb3BLZXkkMjA1ID0gbnVsbDtcbiAgICAgIGZvciAoZGVmYXVsdFZhbHVlIGluIGxhc3RQcm9wcylcbiAgICAgICAgaWYgKFxuICAgICAgICAgICgobmFtZSA9IGxhc3RQcm9wc1tkZWZhdWx0VmFsdWVdKSxcbiAgICAgICAgICBsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkoZGVmYXVsdFZhbHVlKSAmJlxuICAgICAgICAgICAgbnVsbCAhPSBuYW1lICYmXG4gICAgICAgICAgICAhbmV4dFByb3BzLmhhc093blByb3BlcnR5KGRlZmF1bHRWYWx1ZSkpXG4gICAgICAgIClcbiAgICAgICAgICBzd2l0Y2ggKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIGRlZmF1bHRWYWx1ZSwgbnVsbCwgbmV4dFByb3BzLCBuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICBmb3IgKHZhbHVlIGluIG5leHRQcm9wcylcbiAgICAgICAgaWYgKFxuICAgICAgICAgICgobmFtZSA9IG5leHRQcm9wc1t2YWx1ZV0pLFxuICAgICAgICAgICh0eXBlID0gbGFzdFByb3BzW3ZhbHVlXSksXG4gICAgICAgICAgbmV4dFByb3BzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiAobnVsbCAhPSBuYW1lIHx8IG51bGwgIT0gdHlwZSkpXG4gICAgICAgIClcbiAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwidmFsdWVcIjpcbiAgICAgICAgICAgICAgcHJvcEtleSQyMDUgPSBuYW1lO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkZWZhdWx0VmFsdWVcIjpcbiAgICAgICAgICAgICAgcHJvcEtleSA9IG5hbWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI6XG4gICAgICAgICAgICAgIGlmIChudWxsICE9IG5hbWUpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOTEpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBuYW1lICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIHZhbHVlLCBuYW1lLCBuZXh0UHJvcHMsIHR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgIHVwZGF0ZVRleHRhcmVhKGRvbUVsZW1lbnQsIHByb3BLZXkkMjA1LCBwcm9wS2V5KTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlIFwib3B0aW9uXCI6XG4gICAgICBmb3IgKHZhciBwcm9wS2V5JDIyMSBpbiBsYXN0UHJvcHMpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKHByb3BLZXkkMjA1ID0gbGFzdFByb3BzW3Byb3BLZXkkMjIxXSksXG4gICAgICAgICAgbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkkMjIxKSAmJlxuICAgICAgICAgICAgbnVsbCAhPSBwcm9wS2V5JDIwNSAmJlxuICAgICAgICAgICAgIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5JDIyMSkpXG4gICAgICAgIClcbiAgICAgICAgICBzd2l0Y2ggKHByb3BLZXkkMjIxKSB7XG4gICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgICAgZG9tRWxlbWVudC5zZWxlY3RlZCA9ICExO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgcHJvcEtleSQyMjEsXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgcHJvcEtleSQyMDVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICBmb3IgKGxhc3REZWZhdWx0VmFsdWUgaW4gbmV4dFByb3BzKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKChwcm9wS2V5JDIwNSA9IG5leHRQcm9wc1tsYXN0RGVmYXVsdFZhbHVlXSksXG4gICAgICAgICAgKHByb3BLZXkgPSBsYXN0UHJvcHNbbGFzdERlZmF1bHRWYWx1ZV0pLFxuICAgICAgICAgIG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShsYXN0RGVmYXVsdFZhbHVlKSAmJlxuICAgICAgICAgICAgcHJvcEtleSQyMDUgIT09IHByb3BLZXkgJiZcbiAgICAgICAgICAgIChudWxsICE9IHByb3BLZXkkMjA1IHx8IG51bGwgIT0gcHJv
1cEtleSkpXG4gICAgICAgIClcbiAgICAgICAgICBzd2l0Y2ggKGxhc3REZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RlZFwiOlxuICAgICAgICAgICAgICBkb21FbGVtZW50LnNlbGVjdGVkID1cbiAgICAgICAgICAgICAgICBwcm9wS2V5JDIwNSAmJlxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHByb3BLZXkkMjA1ICYmXG4gICAgICAgICAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHByb3BLZXkkMjA1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgbGFzdERlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICBwcm9wS2V5JDIwNSxcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgcHJvcEtleVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICBjYXNlIFwiaW1nXCI6XG4gICAgY2FzZSBcImxpbmtcIjpcbiAgICBjYXNlIFwiYXJlYVwiOlxuICAgIGNhc2UgXCJiYXNlXCI6XG4gICAgY2FzZSBcImJyXCI6XG4gICAgY2FzZSBcImNvbFwiOlxuICAgIGNhc2UgXCJlbWJlZFwiOlxuICAgIGNhc2UgXCJoclwiOlxuICAgIGNhc2UgXCJrZXlnZW5cIjpcbiAgICBjYXNlIFwibWV0YVwiOlxuICAgIGNhc2UgXCJwYXJhbVwiOlxuICAgIGNhc2UgXCJzb3VyY2VcIjpcbiAgICBjYXNlIFwidHJhY2tcIjpcbiAgICBjYXNlIFwid2JyXCI6XG4gICAgY2FzZSBcIm1lbnVpdGVtXCI6XG4gICAgICBmb3IgKHZhciBwcm9wS2V5JDIyNiBpbiBsYXN0UHJvcHMpXG4gICAgICAgIChwcm9wS2V5JDIwNSA9IGxhc3RQcm9wc1twcm9wS2V5JDIyNl0pLFxuICAgICAgICAgIGxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5JDIyNikgJiZcbiAgICAgICAgICAgIG51bGwgIT0gcHJvcEtleSQyMDUgJiZcbiAgICAgICAgICAgICFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSQyMjYpICYmXG4gICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgcHJvcEtleSQyMjYsIG51bGwsIG5leHRQcm9wcywgcHJvcEtleSQyMDUpO1xuICAgICAgZm9yIChjaGVja2VkIGluIG5leHRQcm9wcylcbiAgICAgICAgaWYgKFxuICAgICAgICAgICgocHJvcEtleSQyMDUgPSBuZXh0UHJvcHNbY2hlY2tlZF0pLFxuICAgICAgICAgIChwcm9wS2V5ID0gbGFzdFByb3BzW2NoZWNrZWRdKSxcbiAgICAgICAgICBuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkoY2hlY2tlZCkgJiZcbiAgICAgICAgICAgIHByb3BLZXkkMjA1ICE9PSBwcm9wS2V5ICYmXG4gICAgICAgICAgICAobnVsbCAhPSBwcm9wS2V5JDIwNSB8fCBudWxsICE9IHByb3BLZXkpKVxuICAgICAgICApXG4gICAgICAgICAgc3dpdGNoIChjaGVja2VkKSB7XG4gICAgICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgICAgICBpZiAobnVsbCAhPSBwcm9wS2V5JDIwNSlcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzNywgdGFnKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgc2V0UHJvcChcbiAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICBjaGVja2VkLFxuICAgICAgICAgICAgICAgIHByb3BLZXkkMjA1LFxuICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICBwcm9wS2V5XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoaXNDdXN0b21FbGVtZW50KHRhZykpIHtcbiAgICAgICAgZm9yICh2YXIgcHJvcEtleSQyMzEgaW4gbGFzdFByb3BzKVxuICAgICAgICAgIChwcm9wS2V5JDIwNSA9IGxhc3RQcm9wc1twcm9wS2V5JDIzMV0pLFxuICAgICAgICAgICAgbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkkMjMxKSAmJlxuICAgICAgICAgICAgICB2b2lkIDAgIT09IHByb3BLZXkkMjA1ICYmXG4gICAgICAgICAgICAgICFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSQyMzEpICYmXG4gICAgICAgICAgICAgIHNldFByb3BPbkN1c3RvbUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgcHJvcEtleSQyMzEsXG4gICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICBwcm9wS2V5JDIwNVxuICAgICAgICAgICAgICApO1xuICAgICAgICBmb3IgKGRlZmF1bHRDaGVja2VkIGluIG5leHRQcm9wcylcbiAgICAgICAgICAocHJvcEtleSQyMDUgPSBuZXh0UHJvcHNbZGVmYXVsdENoZWNrZWRdKSxcbiAgICAgICAgICAgIChwcm9wS2V5ID0gbGFzdFByb3BzW2RlZmF1bHRDaGVja2VkXSksXG4gICAgICAgICAgICAhbmV4dFByb3BzLmhhc093blByb3BlcnR5KGRlZmF1bHRDaGVja2VkKSB8fFxuICAgICAgICAgICAgICBwcm9wS2V5JDIwNSA9PT0gcHJvcEtleSB8fFxuICAgICAgICAgICAgICAodm9pZCAwID09PSBwcm9wS2V5JDIwNSAmJiB2b2lkIDAgPT09IHByb3BLZXkpIHx8XG4gICAgICAgICAgICAgIHNldFByb3BPbkN1c3RvbUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgZGVmYXVsdENoZWNrZWQsXG4gICAgICAgICAgICAgICAgcHJvcEtleSQyMDUsXG4gICAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAgIHByb3BLZXlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG4gIGZvciAodmFyIHByb3BLZXkkMjM2IGluIGxhc3RQcm9wcylcbiAgICAocHJvcEtleSQyMDUgPSBsYXN0UHJvcHNbcHJvcEtleSQyMzZdKSxcbiAgICAgIGxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5JDIzNikgJiZcbiAgICAgICAgbnVsbCAhPSBwcm9wS2V5JDIwNSAmJlxuICAgICAgICAhbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkkMjM2KSAmJlxuICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgcHJvcEtleSQyMzYsIG51bGwsIG5leHRQcm9wcywgcHJvcEtleSQyMDUpO1xuICBmb3IgKGxhc3RQcm9wIGluIG5leHRQcm9wcylcbiAgICAocHJvcEtleSQyMDUgPSBuZXh0UHJvcHNbbGFzdFByb3BdKSxcbiAgICAgIChwcm9wS2V5ID0gbGFzdFByb3BzW2xhc3RQcm9wXSksXG4gICAgICAhbmV4dFByb3BzLmhhc093blByb3BlcnR5KGxhc3RQcm9wKSB8fFxuICAgICAgICBwcm9wS2V5JDIwNSA9PT0gcHJvcEtleSB8fFxuICAgICAgICAobnVsbCA9PSBwcm9wS2V5JDIwNSAmJiBudWxsID09IHByb3BLZXkpIHx8XG4gICAgICAgI
1HNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBsYXN0UHJvcCwgcHJvcEtleSQyMDUsIG5leHRQcm9wcywgcHJvcEtleSk7XG59XG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGwsXG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gbnVsbDtcbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gOSA9PT0gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGVcbiAgICA/IHJvb3RDb250YWluZXJFbGVtZW50XG4gICAgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xufVxuZnVuY3Rpb24gZ2V0T3duSG9zdENvbnRleHQobmFtZXNwYWNlVVJJKSB7XG4gIHN3aXRjaCAobmFtZXNwYWNlVVJJKSB7XG4gICAgY2FzZSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI6XG4gICAgICByZXR1cm4gMTtcbiAgICBjYXNlIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiOlxuICAgICAgcmV0dXJuIDI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAwO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZEhvc3RDb250ZXh0UHJvZChwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgaWYgKDAgPT09IHBhcmVudE5hbWVzcGFjZSlcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJzdmdcIjpcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICBjYXNlIFwibWF0aFwiOlxuICAgICAgICByZXR1cm4gMjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgcmV0dXJuIDEgPT09IHBhcmVudE5hbWVzcGFjZSAmJiBcImZvcmVpZ25PYmplY3RcIiA9PT0gdHlwZVxuICAgID8gMFxuICAgIDogcGFyZW50TmFtZXNwYWNlO1xufVxuZnVuY3Rpb24gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJvcHMpIHtcbiAgcmV0dXJuIChcbiAgICBcInRleHRhcmVhXCIgPT09IHR5cGUgfHxcbiAgICBcIm5vc2NyaXB0XCIgPT09IHR5cGUgfHxcbiAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gfHxcbiAgICBcIm51bWJlclwiID09PSB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gfHxcbiAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gfHxcbiAgICAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmXG4gICAgICBudWxsICE9PSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAmJlxuICAgICAgbnVsbCAhPSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwpXG4gICk7XG59XG52YXIgY3VycmVudFBvcHN0YXRlVHJhbnNpdGlvbkV2ZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHNob3VsZEF0dGVtcHRFYWdlclRyYW5zaXRpb24oKSB7XG4gIHZhciBldmVudCA9IHdpbmRvdy5ldmVudDtcbiAgaWYgKGV2ZW50ICYmIFwicG9wc3RhdGVcIiA9PT0gZXZlbnQudHlwZSkge1xuICAgIGlmIChldmVudCA9PT0gY3VycmVudFBvcHN0YXRlVHJhbnNpdGlvbkV2ZW50KSByZXR1cm4gITE7XG4gICAgY3VycmVudFBvcHN0YXRlVHJhbnNpdGlvbkV2ZW50ID0gZXZlbnQ7XG4gICAgcmV0dXJuICEwO1xuICB9XG4gIGN1cnJlbnRQb3BzdGF0ZVRyYW5zaXRpb25FdmVudCA9IG51bGw7XG4gIHJldHVybiAhMTtcbn1cbnZhciBzY2hlZHVsZVRpbWVvdXQgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBzZXRUaW
11lb3V0ID8gc2V0VGltZW91dCA6IHZvaWQgMCxcbiAgY2FuY2VsVGltZW91dCA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGNsZWFyVGltZW91dCA/IGNsZWFyVGltZW91dCA6IHZvaWQgMCxcbiAgbG9jYWxQcm9taXNlID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgUHJvbWlzZSA/IFByb21pc2UgOiB2b2lkIDAsXG4gIHNjaGVkdWxlTWljcm90YXNrID1cbiAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBxdWV1ZU1pY3JvdGFza1xuICAgICAgPyBxdWV1ZU1pY3JvdGFza1xuICAgICAgOiBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgbG9jYWxQcm9taXNlXG4gICAgICAgID8gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxQcm9taXNlXG4gICAgICAgICAgICAgIC5yZXNvbHZlKG51bGwpXG4gICAgICAgICAgICAgIC50aGVuKGNhbGxiYWNrKVxuICAgICAgICAgICAgICAuY2F0Y2goaGFuZGxlRXJyb3JJbk5leHRUaWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogc2NoZWR1bGVUaW1lb3V0O1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JJbk5leHRUaWNrKGVycm9yKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGlzU2luZ2xldG9uU2NvcGUodHlwZSkge1xuICByZXR1cm4gXCJoZWFkXCIgPT09IHR5cGU7XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnkocGFyZW50SW5zdGFuY2UsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlLFxuICAgIHBvc3NpYmxlUHJlYW1ibGVDb250cmlidXRpb24gPSAwLFxuICAgIGRlcHRoID0gMDtcbiAgZG8ge1xuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgaWYgKG5leHROb2RlICYmIDggPT09IG5leHROb2RlLm5vZGVUeXBlKVxuICAgICAgaWYgKCgobm9kZSA9IG5leHROb2RlLmRhdGEpLCBcIi8kXCIgPT09IG5vZGUpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAwIDwgcG9zc2libGVQcmVhbWJsZUNvbnRyaWJ1dGlvbiAmJlxuICAgICAgICAgIDggPiBwb3NzaWJsZVByZWFtYmxlQ29udHJpYnV0aW9uXG4gICAgICAgICkge1xuICAgICAgICAgIG5vZGUgPSBwb3NzaWJsZVByZWFtYmxlQ29udHJpYnV0aW9uO1xuICAgICAgICAgIHZhciBvd25lckRvY3VtZW50ID0gcGFyZW50SW5zdGFuY2Uub3duZXJEb2N1bWVudDtcbiAgICAgICAgICBub2RlICYgMSAmJiByZWxlYXNlU2luZ2xldG9uSW5zdGFuY2Uob3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgIG5vZGUgJiAyICYmIHJlbGVhc2VTaW5nbGV0b25JbnN0YW5jZShvd25lckRvY3VtZW50LmJvZHkpO1xuICAgICAgICAgIGlmIChub2RlICYgNClcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIG5vZGUgPSBvd25lckRvY3VtZW50LmhlYWQsXG4gICAgICAgICAgICAgICAgcmVsZWFzZVNpbmdsZXRvbkluc3RhbmNlKG5vZGUpLFxuICAgICAgICAgICAgICAgIG93bmVyRG9jdW1lbnQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgIG93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2Y
1XIgbmV4dE5vZGUkanNjb21wJDAgPSBvd25lckRvY3VtZW50Lm5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gb3duZXJEb2N1bWVudC5ub2RlTmFtZTtcbiAgICAgICAgICAgICAgb3duZXJEb2N1bWVudFtpbnRlcm5hbEhvaXN0YWJsZU1hcmtlcl0gfHxcbiAgICAgICAgICAgICAgICBcIlNDUklQVFwiID09PSBub2RlTmFtZSB8fFxuICAgICAgICAgICAgICAgIFwiU1RZTEVcIiA9PT0gbm9kZU5hbWUgfHxcbiAgICAgICAgICAgICAgICAoXCJMSU5LXCIgPT09IG5vZGVOYW1lICYmXG4gICAgICAgICAgICAgICAgICBcInN0eWxlc2hlZXRcIiA9PT0gb3duZXJEb2N1bWVudC5yZWwudG9Mb3dlckNhc2UoKSkgfHxcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG93bmVyRG9jdW1lbnQpO1xuICAgICAgICAgICAgICBvd25lckRvY3VtZW50ID0gbmV4dE5vZGUkanNjb21wJDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKDAgPT09IGRlcHRoKSB7XG4gICAgICAgICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobmV4dE5vZGUpO1xuICAgICAgICAgIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlcHRoLS07XG4gICAgICB9IGVsc2VcbiAgICAgICAgXCIkXCIgPT09IG5vZGUgfHwgXCIkP1wiID09PSBub2RlIHx8IFwiJCFcIiA9PT0gbm9kZVxuICAgICAgICAgID8gZGVwdGgrK1xuICAgICAgICAgIDogKHBvc3NpYmxlUHJlYW1ibGVDb250cmlidXRpb24gPSBub2RlLmNoYXJDb2RlQXQoMCkgLSA0OCk7XG4gICAgZWxzZSBwb3NzaWJsZVByZWFtYmxlQ29udHJpYnV0aW9uID0gMDtcbiAgICBub2RlID0gbmV4dE5vZGU7XG4gIH0gd2hpbGUgKG5vZGUpO1xuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gY2xlYXJDb250YWluZXJTcGFyaW5nbHkoY29udGFpbmVyKSB7XG4gIHZhciBuZXh0Tm9kZSA9IGNvbnRhaW5lci5maXJzdENoaWxkO1xuICBuZXh0Tm9kZSAmJiAxMCA9PT0gbmV4dE5vZGUubm9kZVR5cGUgJiYgKG5leHROb2RlID0gbmV4dE5vZGUubmV4dFNpYmxpbmcpO1xuICBmb3IgKDsgbmV4dE5vZGU7ICkge1xuICAgIHZhciBub2RlID0gbmV4dE5vZGU7XG4gICAgbmV4dE5vZGUgPSBuZXh0Tm9kZS5uZXh0U2libGluZztcbiAgICBzd2l0Y2ggKG5vZGUubm9kZU5hbWUpIHtcbiAgICAgIGNhc2UgXCJIVE1MXCI6XG4gICAgICBjYXNlIFwiSEVBRFwiOlxuICAgICAgY2FzZSBcIkJPRFlcIjpcbiAgICAgICAgY2xlYXJDb250YWluZXJTcGFyaW5nbHkobm9kZSk7XG4gICAgICAgIGRldGFjaERlbGV0ZWRJbnN0YW5jZShub2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXNlIFwiU0NSSVBUXCI6XG4gICAgICBjYXNlIFwiU1RZTEVcIjpcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXNlIFwiTElOS1wiOlxuICAgICAgICBpZiAoXCJzdHlsZXNoZWV0XCIgPT09IG5vZGUucmVsLnRvTG93ZXJDYXNlKCkpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQobm9kZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIGluUm9vdE9yU2luZ2xldG9uKSB7XG4gIGZvciAoOyAxID09PSBpbnN0YW5jZS5ub2RlVHlwZTsgKSB7XG4gICAgdmFyIGFueVByb3BzID0gcHJvcHM7XG4gICAgaWYgKGluc3RhbmNlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IHR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhaW5Sb290T3JTaW5nbGV0b24gJiZcbiAgICAgICAgKFwiSU5QVVRcIiAhPT0gaW5zdGFuY2Uubm9kZU5hbWUgfHwgXCJoaWRkZW5cIiAhPT0gaW5zdGFuY2UudHlwZSlcbiAgICAgIClcbiAgICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICghaW5Sb290T3JTaW5nbGV0b24pXG4gICAgICBpZiAoXCJpbnB1dFwiID09PSB0eXBlICYmIFwiaGlkZGVuXCIgPT09IGluc3RhbmNlLnR5cGUpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBudWxsID09IGFueVByb3BzLm5hbWUgPyBudWxsIDogXCJcIiArIGFueVByb3BzLm5hbWU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcImhpZGRlblwiID09PSBhbnlQcm9wcy50eXBlICYmXG4gICAgICAgICAgaW5zdGFuY2UuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSA9PT0gbmFtZVxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfSBlbHNlIHJldHVybiBpbnN0YW5jZTtcbiAgICBlbHNlIGlmICghaW5zdGFuY2VbaW50ZXJuYWxIb2lzdGFibGVNYXJrZXJdKVxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgICAgaWYgKCFpbnN0YW5jZS5oYXNBdHRyaWJ1dGUoXCJpdGVtcHJvcFwiKSkgYnJlYWs7XG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICBjYXNlIFwibGlua1wiOlxuICAgICAgICAgIG5hbWUgPSBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJyZWxcIik7XG4gICAgICAgICAgaWYgKFwic3R5bGVzaGVldFwiID09PSBuYW1lICYmIGluc3RhbmNlLmhhc0F0dHJpYnV0ZShcImRhdGEtcHJlY2VkZW5jZVwiKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgbmFtZSAhPT0gYW55UHJvcHMucmVsIHx8XG4gICAgICAgICAgICBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpICE9PVxuICAgICAgICAgICAgICAobnVsbCA9PSBhbnlQcm9wcy5ocmVmIHx8IFwiXCIgPT09IGFueVByb3BzLmhyZWZcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IGFueVByb3BzLmhyZWYpIHx8XG4gICAgICAgICAgICBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJjcm9zc29yaWdpblwiKSAhPT1cbiAgICAgICAgICAgICAgKG51bGwgPT0gYW55UHJvcHMuY3Jvc3NPcmlnaW4gPyBudWxsIDogYW55UHJvcHMuY3Jvc3NPcmlnaW4pIHx8XG4gICAgICAgICAgICBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSAhPT1cbiAgICAgICAgICAgICAgKG51bGwgPT0gYW55UHJvcHMudGl0bGUgPyBudWxsIDogYW55UHJvcHMudGl0bGUpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICBpZiAoaW5zdGFuY2UuaGFzQXR0cmlidXRlKFwiZGF0YS1wcmVjZWRlbmNlXCIpKSBicmVhaztcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgICBuYW1lID0gaW5zdGFuY2UuZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChuYW1lICE9PSAobnVsbCA9PSBhbnlQcm9wcy5zcmMgPyBudWxsIDogYW55UHJvcHMuc3JjKSB8fFxuICAgICAgICAgICAgICBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpICE9PVxuICAgICAgICAgICAgICAgIChudWxsID09IGFueVByb3BzLnR5cGUgPyBudWxsIDogYW55UHJvcHMudHlwZSkgfHxcbiAgICAgICAgICAgICAgaW5zdGFuY2UuZ2V0QXR0cmlidXRlKFwiY3Jvc3NvcmlnaW5cIikgIT09XG4gICAgICAgICAgICAgICAgKG51bGwgPT0gYW55UHJvcHMuY3Jvc3
1NPcmlnaW4gPyBudWxsIDogYW55UHJvcHMuY3Jvc3NPcmlnaW4pKSAmJlxuICAgICAgICAgICAgbmFtZSAmJlxuICAgICAgICAgICAgaW5zdGFuY2UuaGFzQXR0cmlidXRlKFwiYXN5bmNcIikgJiZcbiAgICAgICAgICAgICFpbnN0YW5jZS5oYXNBdHRyaWJ1dGUoXCJpdGVtcHJvcFwiKVxuICAgICAgICAgIClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9XG4gICAgaW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZShpbnN0YW5jZS5uZXh0U2libGluZyk7XG4gICAgaWYgKG51bGwgPT09IGluc3RhbmNlKSBicmVhaztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UoaW5zdGFuY2UsIHRleHQsIGluUm9vdE9yU2luZ2xldG9uKSB7XG4gIGlmIChcIlwiID09PSB0ZXh0KSByZXR1cm4gbnVsbDtcbiAgZm9yICg7IDMgIT09IGluc3RhbmNlLm5vZGVUeXBlOyApIHtcbiAgICBpZiAoXG4gICAgICAoMSAhPT0gaW5zdGFuY2Uubm9kZVR5cGUgfHxcbiAgICAgICAgXCJJTlBVVFwiICE9PSBpbnN0YW5jZS5ub2RlTmFtZSB8fFxuICAgICAgICBcImhpZGRlblwiICE9PSBpbnN0YW5jZS50eXBlKSAmJlxuICAgICAgIWluUm9vdE9yU2luZ2xldG9uXG4gICAgKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZShpbnN0YW5jZS5uZXh0U2libGluZyk7XG4gICAgaWYgKG51bGwgPT09IGluc3RhbmNlKSByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhpbnN0YW5jZSkge1xuICByZXR1cm4gKFxuICAgIFwiJCFcIiA9PT0gaW5zdGFuY2UuZGF0YSB8fFxuICAgIChcIiQ/XCIgPT09IGluc3RhbmNlLmRhdGEgJiYgXCJjb21wbGV0ZVwiID09PSBpbnN0YW5jZS5vd25lckRvY3VtZW50LnJlYWR5U3RhdGUpXG4gICk7XG59XG5mdW5jdGlvbiByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShpbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBpbnN0YW5jZS5vd25lckRvY3VtZW50O1xuICBpZiAoXCIkP1wiICE9PSBpbnN0YW5jZS5kYXRhIHx8IFwiY29tcGxldGVcIiA9PT0gb3duZXJEb2N1bWVudC5yZWFkeVN0YXRlKVxuICAgIGNhbGxiYWNrKCk7XG4gIGVsc2Uge1xuICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgICBvd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIG93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgbGlzdGVuZXIpO1xuICAgIGluc3RhbmNlLl9yZWFjdFJldHJ5ID0gbGlzdGVuZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHtcbiAgZm9yICg7IG51bGwgIT0gbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgIGlmICgxID09PSBub2RlVHlwZSB8fCAzID09PSBub2RlVHlwZSkgYnJlYWs7XG4gICAgaWYgKDggPT09IG5vZGVUeXBlKSB7XG4gICAgICBub2RlVHlwZSA9IG5vZGUuZGF0YTtcbiAgICAgIGlmIChcbiAgICAgICAgXCIkXCIgPT09IG5vZGVUeXBlIHx8XG4gICAgICAgIFwiJCFcIiA9PT0gbm9kZVR5cGUgfHxcbiAgICAgICAgXCIkP1wiID09PSBub2RlVHlwZSB8fFxuICAgICAgICBcIkYhXCIgPT09IG5vZGVUeXBlIHx8XG4gICAgICAgIFwiRlwiID09PSBub2RlVHlwZVxuICAgICAgKVxuICAgICAgICBicmVhaztcbiAgICAgIGlmIChcIi8kXCIgPT09IG5vZGVUeXBlKSByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG52YXIgcHJldmlvdXNIeWRyYXRhYmxlT25FbnRlcmluZ1Njb3BlZFNpbmdsZXRvbiA9IG51bGw7XG5mdW5jdGlvbiBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldEluc3RhbmNlKSB7XG4gIHRhcmdldEluc3RhbmNlID0gdGFyZ2V0SW5zdGFuY2UucHJldmlvdXNTaWJsaW5nO1xuICBmb3IgKHZhciBkZXB0aCA9IDA7IHRhcmdldEluc3RhbmNlOyApIHtcbiAgICBpZiAoOCA9PT0gdGFyZ2V0SW5zdGFuY2Uubm9kZVR5cGUpIHtcbiAgICAgIHZhciBkYXRhID0gdGFyZ2V0SW5zdGFuY2UuZGF0YTtcbiAgICAgIGlmIChcIiRcIiA9PT0gZGF0YSB8fCBcIiQhXCIgPT09IGRhdGEgfHwgXCIkP1wiID09PSBkYXRhKSB7XG4gICAgICAgIGlmICgwID09PSBkZXB0aCkgcmV0dXJuIHRhcmdldEluc3RhbmNlO1xuICAgICAgICBkZXB0aC0tO1xuICAgICAgfSBlbHNlIFwiLyRcIiA9PT0gZGF0YSAmJiBkZXB0aCsrO1xuICAgIH1cbiAgICB0YXJnZXRJbnN0YW5jZSA9IHRhcmdldEluc3RhbmNlLnByZXZpb3VzU2libGluZztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVTaW5nbGV0b25JbnN0YW5jZSh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHByb3BzID0gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJodG1sXCI6XG4gICAgICB0eXBlID0gcHJvcHMuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgaWYgKCF0eXBlKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQ1MikpO1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgY2FzZSBcImhlYWRcIjpcbiAgICAgIHR5cGUgPSBwcm9wcy5oZWFkO1xuICAgICAgaWYgKCF0eXBlKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQ1MykpO1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgY2FzZSBcImJvZHlcIjpcbiAgICAgIHR5cGUgPSBwcm9wcy5ib2R5O1xuICAgICAgaWYgKCF0eXBlKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQ1NCkpO1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNDUxKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbGVhc2VTaW5nbGV0b25JbnN0YW5jZShpbnN0YW5jZSkge1xuICBmb3IgKHZhciBhdHRyaWJ1dGVzID0gaW5zdGFuY2UuYXR0cmlidXRlczsgYXR0cmlidXRlcy5sZW5ndGg7IClcbiAgICBpbnN0YW5jZS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZXNbMF0pO1xuICBkZXRhY2hEZWxldGVkSW5zdGFuY2UoaW5zdGFuY2UpO1xufVxudmFyIHByZWxvYWRQcm9wc01hcCA9IG5ldyBNYXAoKSxcbiAgcHJlY29ubmVjdHNTZXQgPSBuZXcgU2V0KCk7XG5mdW5jdGlvbiBnZXRIb2lzdGFibGVSb290KGNvbnRhaW5lcikge1xuICByZXR1cm4gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGFpbmVyLmdldFJvb3ROb2RlXG4gICAgPyBjb250YWluZXIuZ2V0Um9vdE5vZGUoKVxuICAgIDogOSA9PT0gY29udGFpbmVyLm5vZGVUeXBlXG4gICAgICA/IGNvbnRhaW5lclxuICAgICAgOiBjb250YWluZXIub3duZXJEb2N1bWVudDtcbn1cbnZhciBwcmV2aW91c0Rpc3Bh
1dGNoZXIgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5kO1xuUmVhY3RET01TaGFyZWRJbnRlcm5hbHMuZCA9IHtcbiAgZjogZmx1c2hTeW5jV29yayxcbiAgcjogcmVxdWVzdEZvcm1SZXNldCxcbiAgRDogcHJlZmV0Y2hETlMsXG4gIEM6IHByZWNvbm5lY3QsXG4gIEw6IHByZWxvYWQsXG4gIG06IHByZWxvYWRNb2R1bGUsXG4gIFg6IHByZWluaXRTY3JpcHQsXG4gIFM6IHByZWluaXRTdHlsZSxcbiAgTTogcHJlaW5pdE1vZHVsZVNjcmlwdFxufTtcbmZ1bmN0aW9uIGZsdXNoU3luY1dvcmsoKSB7XG4gIHZhciBwcmV2aW91c1dhc1JlbmRlcmluZyA9IHByZXZpb3VzRGlzcGF0Y2hlci5mKCksXG4gICAgd2FzUmVuZGVyaW5nID0gZmx1c2hTeW5jV29yayQxKCk7XG4gIHJldHVybiBwcmV2aW91c1dhc1JlbmRlcmluZyB8fCB3YXNSZW5kZXJpbmc7XG59XG5mdW5jdGlvbiByZXF1ZXN0Rm9ybVJlc2V0KGZvcm0pIHtcbiAgdmFyIGZvcm1JbnN0ID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShmb3JtKTtcbiAgbnVsbCAhPT0gZm9ybUluc3QgJiYgNSA9PT0gZm9ybUluc3QudGFnICYmIFwiZm9ybVwiID09PSBmb3JtSW5zdC50eXBlXG4gICAgPyByZXF1ZXN0Rm9ybVJlc2V0JDEoZm9ybUluc3QpXG4gICAgOiBwcmV2aW91c0Rpc3BhdGNoZXIucihmb3JtKTtcbn1cbnZhciBnbG9iYWxEb2N1bWVudCA9IFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiBkb2N1bWVudCA/IG51bGwgOiBkb2N1bWVudDtcbmZ1bmN0aW9uIHByZWNvbm5lY3RBcyhyZWwsIGhyZWYsIGNyb3NzT3JpZ2luKSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gZ2xvYmFsRG9jdW1lbnQ7XG4gIGlmIChvd25lckRvY3VtZW50ICYmIFwic3RyaW5nXCIgPT09IHR5cGVvZiBocmVmICYmIGhyZWYpIHtcbiAgICB2YXIgbGltaXRlZEVzY2FwZWRIcmVmID1cbiAgICAgIGVzY2FwZVNlbGVjdG9yQXR0cmlidXRlVmFsdWVJbnNpZGVEb3VibGVRdW90ZXMoaHJlZik7XG4gICAgbGltaXRlZEVzY2FwZWRIcmVmID1cbiAgICAgICdsaW5rW3JlbD1cIicgKyByZWwgKyAnXCJdW2hyZWY9XCInICsgbGltaXRlZEVzY2FwZWRIcmVmICsgJ1wiXSc7XG4gICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGNyb3NzT3JpZ2luICYmXG4gICAgICAobGltaXRlZEVzY2FwZWRIcmVmICs9ICdbY3Jvc3NvcmlnaW49XCInICsgY3Jvc3NPcmlnaW4gKyAnXCJdJyk7XG4gICAgcHJlY29ubmVjdHNTZXQuaGFzKGxpbWl0ZWRFc2NhcGVkSHJlZikgfHxcbiAgICAgIChwcmVjb25uZWN0c1NldC5hZGQobGltaXRlZEVzY2FwZWRIcmVmKSxcbiAgICAgIChyZWwgPSB7IHJlbDogcmVsLCBjcm9zc09yaWdpbjogY3Jvc3NPcmlnaW4sIGhyZWY6IGhyZWYgfSksXG4gICAgICBudWxsID09PSBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobGltaXRlZEVzY2FwZWRIcmVmKSAmJlxuICAgICAgICAoKGhyZWYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpKSxcbiAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoaHJlZiwgXCJsaW5rXCIsIHJlbCksXG4gICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoaHJlZiksXG4gICAgICAgIG93bmVyRG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChocmVmKSkpO1xuICB9XG59XG5mdW5jdGlvbiBwcmVmZXRjaEROUyhocmVm
1KSB7XG4gIHByZXZpb3VzRGlzcGF0Y2hlci5EKGhyZWYpO1xuICBwcmVjb25uZWN0QXMoXCJkbnMtcHJlZmV0Y2hcIiwgaHJlZiwgbnVsbCk7XG59XG5mdW5jdGlvbiBwcmVjb25uZWN0KGhyZWYsIGNyb3NzT3JpZ2luKSB7XG4gIHByZXZpb3VzRGlzcGF0Y2hlci5DKGhyZWYsIGNyb3NzT3JpZ2luKTtcbiAgcHJlY29ubmVjdEFzKFwicHJlY29ubmVjdFwiLCBocmVmLCBjcm9zc09yaWdpbik7XG59XG5mdW5jdGlvbiBwcmVsb2FkKGhyZWYsIGFzLCBvcHRpb25zKSB7XG4gIHByZXZpb3VzRGlzcGF0Y2hlci5MKGhyZWYsIGFzLCBvcHRpb25zKTtcbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxEb2N1bWVudDtcbiAgaWYgKG93bmVyRG9jdW1lbnQgJiYgaHJlZiAmJiBhcykge1xuICAgIHZhciBwcmVsb2FkU2VsZWN0b3IgPVxuICAgICAgJ2xpbmtbcmVsPVwicHJlbG9hZFwiXVthcz1cIicgK1xuICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhhcykgK1xuICAgICAgJ1wiXSc7XG4gICAgXCJpbWFnZVwiID09PSBhc1xuICAgICAgPyBvcHRpb25zICYmIG9wdGlvbnMuaW1hZ2VTcmNTZXRcbiAgICAgICAgPyAoKHByZWxvYWRTZWxlY3RvciArPVxuICAgICAgICAgICAgJ1tpbWFnZXNyY3NldD1cIicgK1xuICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhcbiAgICAgICAgICAgICAgb3B0aW9ucy5pbWFnZVNyY1NldFxuICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAnXCJdJyksXG4gICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG9wdGlvbnMuaW1hZ2VTaXplcyAmJlxuICAgICAgICAgICAgKHByZWxvYWRTZWxlY3RvciArPVxuICAgICAgICAgICAgICAnW2ltYWdlc2l6ZXM9XCInICtcbiAgICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhcbiAgICAgICAgICAgICAgICBvcHRpb25zLmltYWdlU2l6ZXNcbiAgICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAgICdcIl0nKSlcbiAgICAgICAgOiAocHJlbG9hZFNlbGVjdG9yICs9XG4gICAgICAgICAgICAnW2hyZWY9XCInICtcbiAgICAgICAgICAgIGVzY2FwZVNlbGVjdG9yQXR0cmlidXRlVmFsdWVJbnNpZGVEb3VibGVRdW90ZXMoaHJlZikgK1xuICAgICAgICAgICAgJ1wiXScpXG4gICAgICA6IChwcmVsb2FkU2VsZWN0b3IgKz1cbiAgICAgICAgICAnW2hyZWY9XCInICtcbiAgICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKGhyZWYpICtcbiAgICAgICAgICAnXCJdJyk7XG4gICAgdmFyIGtleSA9IHByZWxvYWRTZWxlY3RvcjtcbiAgICBzd2l0Y2ggKGFzKSB7XG4gICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAga2V5ID0gZ2V0U3R5bGVLZXkoaHJlZik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNjcmlwdFwiOlxuICAgICAgICBrZXkgPSBnZXRTY3JpcHRLZXkoaHJlZik7XG4gICAgfVxuICAgIHByZWxvYWRQcm9wc01hcC5oYXMoa2V5KSB8fFxuICAgICAgKChocmVmID0gYXNzaWduKFxuICAgICAgICB7XG4gICAgICAgICAgcmVsOiBcInByZWxvYWRcIixcbiAgICAgICAgICBocmVmOlxuICAgICAgICAgICAgXCJpbWFnZVwiID09PSBhcyAmJiBvcHRpb25zICYmIG9wdGlvbnMuaW1hZ2VTcmNTZXQgPyB2b2lkIDAgOiBocmVmLFxuICAgICAgICAgIGFzOiBhc1xuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zXG4gICAgICApKSxcbiAgICAgIHByZWxvYWRQcm9wc01hcC5zZXQoa2V5LCBocmVmKSxcbiAgICAgIG51bGwgIT09IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihwcmVsb2FkU2VsZWN0b3IpIHx8XG4gICAgICAgIChcInN0eWxlXCIgPT09IGFzICYmXG4gICAgICAgICAgb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGdldFN0eWxlc2hlZXRTZWxlY3RvckZyb21LZXkoa2V5KSkpIHx8XG4gICAgICAgIChcInNjcmlwdFwiID09PSBhcyAmJlxuICAgICAgICAgIG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihnZXRTY3JpcHRTZWxlY3RvckZyb21LZXkoa2V5KSkpIHx8XG4gICAgICAgICgoYXMgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpKSxcbiAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoYXMsIFwibGlua1wiLCBocmVmKSxcbiAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShhcyksXG4gICAgICAgIG93bmVyRG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhcykpKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlbG9hZE1vZHVsZShocmVmLCBvcHRpb25zKSB7XG4gIHByZXZpb3VzRGlzcGF0Y2hlci5tKGhyZWYsIG9wdGlvbnMpO1xuICB2YXIgb3duZXJEb2N1bWVudCA9IGdsb2JhbERvY3VtZW50O1xuICBpZiAob3duZXJEb2N1bWVudCAmJiBocmVmKSB7XG4gICAgdmFyIGFzID0gb3B0aW9ucyAmJiBcInN0cmluZ1wiID09PSB0eXBlb2Ygb3B0aW9ucy5hcyA/IG9wdGlvbnMuYXMgOiBcInNjcmlwdFwiLFxuICAgICAgcHJlbG9hZFNlbGVjdG9yID1cbiAgICAgICAgJ2xpbmtbcmVsPVwibW9kdWxlcHJlbG9hZFwiXVthcz1cIicgK1xuICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKGFzKSArXG4gICAgICAgICdcIl1baHJlZj1cIicgK1xuICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKGhyZWYpICtcbiAgICAgICAgJ1wiXScsXG4gICAgICBrZXkgPSBwcmVsb2FkU2VsZWN0b3I7XG4gICAgc3dpdGNoIChhcykge1xuICAgICAgY2FzZSBcImF1ZGlvd29ya2xldFwiOlxuICAgICAgY2FzZSBcInBhaW50d29ya2xldFwiOlxuICAgICAgY2FzZSBcInNlcnZpY2V3b3JrZXJcIjpcbiAgICAgIGNhc2UgXCJzaGFyZWR3b3JrZXJcIjpcbiAgICAgIGNhc2UgXCJ3b3JrZXJcIjpcbiAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAga2V5ID0gZ2V0U2NyaXB0S2V5KGhyZWYpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhcHJlbG9hZFByb3BzTWFwLmhhcyhrZXkpICYmXG4gICAgICAoKGhyZWYgPSBhc3NpZ24oeyByZWw6IFwibW9kdWxlcHJlbG9hZFwiLCBocmVmOiBocmVmIH0sIG9wdGlvbnMpKSxcbiAgICAgIHByZWxvYWRQcm9wc01hcC5zZXQoa2V5LCBocmVmKSxcbiAgICAgIG51bGwgPT09IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihwcmVsb2FkU2VsZWN0b3IpKVxuICAgICkge1xuICAgICAgc3dpdGNoIChhcykge1xuICAgICAgICBjYXNlIFwiYXVkaW93b3JrbGV0XCI6XG4gICAgICAgIGNhc2UgXCJwYWludHdvcmtsZXRcIjpcbiAgICAgICAgY2FzZSBcInNlcnZpY2V3b3JrZXJcIjpcbiAgICAgICAgY2FzZSBcInNoYXJlZHdvcmtlclwiOlxuICAgICAgICBjYXNlIFwid29ya2VyXCI6XG4gICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgICBpZiAob3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGdldFNjcmlwdFNlbGVjdG9yRnJvbUtleShrZXkpKSlcbiAgICAgICAgICAgI
1HJldHVybjtcbiAgICAgIH1cbiAgICAgIGFzID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcbiAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGFzLCBcImxpbmtcIiwgaHJlZik7XG4gICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKGFzKTtcbiAgICAgIG93bmVyRG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwcmVpbml0U3R5bGUoaHJlZiwgcHJlY2VkZW5jZSwgb3B0aW9ucykge1xuICBwcmV2aW91c0Rpc3BhdGNoZXIuUyhocmVmLCBwcmVjZWRlbmNlLCBvcHRpb25zKTtcbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxEb2N1bWVudDtcbiAgaWYgKG93bmVyRG9jdW1lbnQgJiYgaHJlZikge1xuICAgIHZhciBzdHlsZXMgPSBnZXRSZXNvdXJjZXNGcm9tUm9vdChvd25lckRvY3VtZW50KS5ob2lzdGFibGVTdHlsZXMsXG4gICAgICBrZXkgPSBnZXRTdHlsZUtleShocmVmKTtcbiAgICBwcmVjZWRlbmNlID0gcHJlY2VkZW5jZSB8fCBcImRlZmF1bHRcIjtcbiAgICB2YXIgcmVzb3VyY2UgPSBzdHlsZXMuZ2V0KGtleSk7XG4gICAgaWYgKCFyZXNvdXJjZSkge1xuICAgICAgdmFyIHN0YXRlID0geyBsb2FkaW5nOiAwLCBwcmVsb2FkOiBudWxsIH07XG4gICAgICBpZiAoXG4gICAgICAgIChyZXNvdXJjZSA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBnZXRTdHlsZXNoZWV0U2VsZWN0b3JGcm9tS2V5KGtleSlcbiAgICAgICAgKSlcbiAgICAgIClcbiAgICAgICAgc3RhdGUubG9hZGluZyA9IDU7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaHJlZiA9IGFzc2lnbihcbiAgICAgICAgICB7IHJlbDogXCJzdHlsZXNoZWV0XCIsIGhyZWY6IGhyZWYsIFwiZGF0YS1wcmVjZWRlbmNlXCI6IHByZWNlZGVuY2UgfSxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIChvcHRpb25zID0gcHJlbG9hZFByb3BzTWFwLmdldChrZXkpKSAmJlxuICAgICAgICAgIGFkb3B0UHJlbG9hZFByb3BzRm9yU3R5bGVzaGVldChocmVmLCBvcHRpb25zKTtcbiAgICAgICAgdmFyIGxpbmsgPSAocmVzb3VyY2UgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpKTtcbiAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShsaW5rKTtcbiAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMobGluaywgXCJsaW5rXCIsIGhyZWYpO1xuICAgICAgICBsaW5rLl9wID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGxpbmsub25sb2FkID0gcmVzb2x2ZTtcbiAgICAgICAgICBsaW5rLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzdGF0ZS5sb2FkaW5nIHw9IDE7XG4gICAgICAgIH0pO1xuICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RhdGUubG9hZGluZyB8PSAyO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RhdGUubG9hZGluZyB8PSA0O1xuICAgICAgICBpbnNlcnRTdHlsZXNoZWV0KHJlc291cmNlLCBwcmVjZWRlbmNlLCBvd25lckRvY3VtZW50KTtcbiAgICAgIH1cbiAgICAgIHJlc291cmNlID0ge1xuICAgICAgICB0eXBlOiBcInN0eWxlc2hlZXRcIixcbiAgICAgICAgaW5zdGFuY2U6IHJlc291cmNlLFxuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgc3RhdGU6IHN0YXRlXG4gICAgICB9O1xuICAgICAgc3R5bGVzLnNldChrZXksIHJlc291cmNlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByZWluaXRTY3JpcHQoc3JjLCBvcHRpb25zKSB7XG4gIHByZXZpb3VzRGlzcGF0Y2hlci5YKHNyYywgb3B0aW9ucyk7XG4gIHZhciBvd25lckRvY3VtZW50ID0gZ2xvYmFsRG9jdW1lbnQ7XG4gIGlmIChvd25lckRvY3VtZW50ICYmIHNyYykge1xuICAgIHZhciBzY3JpcHRzID0gZ2V0UmVzb3VyY2VzRnJvbVJvb3Qob3duZXJEb2N1bWVudCkuaG9pc3RhYmxlU2NyaXB0cyxcbiAgICAgIGtleSA9IGdldFNjcmlwdEtleShzcmMpLFxuICAgICAgcmVzb3VyY2UgPSBzY3JpcHRzLmdldChrZXkpO1xuICAgIHJlc291cmNlIHx8XG4gICAgICAoKHJlc291cmNlID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGdldFNjcmlwdFNlbGVjdG9yRnJvbUtleShrZXkpKSksXG4gICAgICByZXNvdXJjZSB8fFxuICAgICAgICAoKHNyYyA9IGFzc2lnbih7IHNyYzogc3JjLCBhc3luYzogITAgfSwgb3B0aW9ucykpLFxuICAgICAgICAob3B0aW9ucyA9IHByZWxvYWRQcm9wc01hcC5nZXQoa2V5KSkgJiZcbiAgICAgICAgICBhZG9wdFByZWxvYWRQcm9wc0ZvclNjcmlwdChzcmMsIG9wdGlvbnMpLFxuICAgICAgICAocmVzb3VyY2UgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpLFxuICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKHJlc291cmNlKSxcbiAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMocmVzb3VyY2UsIFwibGlua1wiLCBzcmMpLFxuICAgICAgICBvd25lckRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocmVzb3VyY2UpKSxcbiAgICAgIChyZXNvdXJjZSA9IHtcbiAgICAgICAgdHlwZTogXCJzY3JpcHRcIixcbiAgICAgICAgaW5zdGFuY2U6IHJlc291cmNlLFxuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgc3RhdGU6IG51bGxcbiAgICAgIH0pLFxuICAgICAgc2NyaXB0cy5zZXQoa2V5LCByZXNvdXJjZSkpO1xuICB9XG59XG5mdW5jdGlvbiBwcmVpbml0TW9kdWxlU2NyaXB0KHNyYywgb3B0aW9ucykge1xuICBwcmV2aW91c0Rpc3BhdGNoZXIuTShzcmMsIG9wdGlvbnMpO1xuICB2YXIgb3duZXJEb2N1bWVudCA9IGdsb2JhbERvY3VtZW50O1xuICBpZiAob3duZXJEb2N1bWVudCAmJiBzcmMpIHtcbiAgICB2YXIgc2NyaXB0cyA9IGdldFJlc291cmNlc0Zyb21Sb290KG93bmVyRG9jdW1lbnQpLmhvaXN0YWJsZVNjcmlwdHMsXG4gICAgICBrZXkgPSBnZXRTY3JpcHRLZXkoc3JjKSxcbiAgICAgIHJlc291cmNlID0gc2NyaXB0cy5nZXQoa2V5KTtcbiAgICByZXNvdXJjZSB8fFxuICAgICAgKChyZXNvdXJjZSA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihnZXRTY3JpcHRTZWxlY3RvckZyb21LZXkoa2V5KSkpLFxuICAgICAgcmVzb3VyY2UgfHxcbiAgICAgICAgKChzcmMgPSBhc3NpZ24oeyBzcmM6IHNyYywgYXN5bmM6ICEwLCB0eXBlOiBcIm1vZHVsZVwiIH0sIG9wdGlvbnMpKSxcbiAgICAgICAgKG9wdGlvbnMgPSBwcmVsb2FkUHJvcHNNYXAuZ2V0KGtleSkpICYmXG4gICAgICAgICAgYWRvcHRQcmVsb2FkUHJvcHNGb3JTY3JpcHQoc3JjLCBvcHRpb25zKSxcbiAgICAgICAgKHJlc291cmNlID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSxcbiAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShyZXNvdXJjZSksXG4gICAgICAgI
1HNldEluaXRpYWxQcm9wZXJ0aWVzKHJlc291cmNlLCBcImxpbmtcIiwgc3JjKSxcbiAgICAgICAgb3duZXJEb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJlc291cmNlKSksXG4gICAgICAocmVzb3VyY2UgPSB7XG4gICAgICAgIHR5cGU6IFwic2NyaXB0XCIsXG4gICAgICAgIGluc3RhbmNlOiByZXNvdXJjZSxcbiAgICAgICAgY291bnQ6IDEsXG4gICAgICAgIHN0YXRlOiBudWxsXG4gICAgICB9KSxcbiAgICAgIHNjcmlwdHMuc2V0KGtleSwgcmVzb3VyY2UpKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0UmVzb3VyY2UodHlwZSwgY3VycmVudFByb3BzLCBwZW5kaW5nUHJvcHMsIGN1cnJlbnRSZXNvdXJjZSkge1xuICB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gKEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9XG4gICAgcm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudClcbiAgICA/IGdldEhvaXN0YWJsZVJvb3QoSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0KVxuICAgIDogbnVsbDtcbiAgaWYgKCFKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNDQ2KSk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgY2FzZSBcInRpdGxlXCI6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1wiID09PSB0eXBlb2YgcGVuZGluZ1Byb3BzLnByZWNlZGVuY2UgJiZcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHBlbmRpbmdQcm9wcy5ocmVmXG4gICAgICAgID8gKChjdXJyZW50UHJvcHMgPSBnZXRTdHlsZUtleShwZW5kaW5nUHJvcHMuaHJlZikpLFxuICAgICAgICAgIChwZW5kaW5nUHJvcHMgPSBnZXRSZXNvdXJjZXNGcm9tUm9vdChcbiAgICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdFxuICAgICAgICAgICkuaG9pc3RhYmxlU3R5bGVzKSxcbiAgICAgICAgICAoY3VycmVudFJlc291cmNlID0gcGVuZGluZ1Byb3BzLmdldChjdXJyZW50UHJvcHMpKSxcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2UgfHxcbiAgICAgICAgICAgICgoY3VycmVudFJlc291cmNlID0ge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0eWxlXCIsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICBjb3VudDogMCxcbiAgICAgICAgICAgICAgc3RhdGU6IG51bGxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcGVuZGluZ1Byb3BzLnNldChjdXJyZW50UHJvcHMsIGN1cnJlbnRSZXNvdXJjZSkpLFxuICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZSlcbiAgICAgICAgOiB7IHR5cGU6IFwidm9pZFwiLCBpbnN0YW5jZTogbnVsbCwgY291bnQ6IDAsIHN0YXRlOiBudWxsIH07XG4gICAgY2FzZSBcImxpbmtcIjpcbiAgICAgIGlmIChcbiAgICAgICAgXCJzdHlsZXNoZWV0XCIgPT09IHBlbmRpbmdQcm9wcy5yZWwgJiZcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHBlbmRpbmdQcm9wcy5ocmVmICYmXG4gICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBwZW5kaW5nUHJvcHMucHJlY2VkZW5jZVxuICAgICAgKSB7XG4gICAgICAgIHR5cGUgPSBnZXRTdHlsZUtleShwZW5kaW5nUHJvcHMuaHJlZik7XG4gICAgICAgIHZhciBzdHlsZXMkMjQ0ID0gZ2V0UmVzb3VyY2VzRnJvbVJvb3QoXG4gICAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHRcbiAgICAgICAgICApLmhvaXN0YWJsZVN0eWxlcyxcbiAgICAgICAgICByZXNvdXJjZSQyNDUgPSBzdHlsZXMkMjQ0LmdldCh0eXBlKTtcbiAgICAgICAgcmVzb3VyY2UkMjQ1IHx8XG4gICAgICAgICAgKChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPVxuICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0Lm93bmVyRG9jdW1lbnQgfHwgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0KSxcbiAgICAgICAgICAocmVzb3VyY2UkMjQ1ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJzdHlsZXNoZWV0XCIsXG4gICAgICAgICAgICBpbnN0YW5jZTogbnVsbCxcbiAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgc3RhdGU6IHsgbG9hZGluZzogMCwgcHJlbG9hZDogbnVsbCB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3R5bGVzJDI0NC5zZXQodHlwZSwgcmVzb3VyY2UkMjQ1KSxcbiAgICAgICAgICAoc3R5bGVzJDI0NCA9IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgZ2V0U3R5bGVzaGVldFNlbGVjdG9yRnJvbUtleSh0eXBlKVxuICAgICAgICAgICkpICYmXG4gICAgICAgICAgICAhc3R5bGVzJDI0NC5fcCAmJlxuICAgICAgICAgICAgKChyZXNvdXJjZSQyNDUuaW5zdGFuY2UgPSBzdHlsZXMkMjQ0KSxcbiAgICAgICAgICAgIChyZXNvdXJjZSQyNDUuc3RhdGUubG9hZGluZyA9IDUpKSxcbiAgICAgICAgICBwcmVsb2FkUHJvcHNNYXAuaGFzKHR5cGUpIHx8XG4gICAgICAgICAgICAoKHBlbmRpbmdQcm9wcyA9IHtcbiAgICAgICAgICAgICAgcmVsOiBcInByZWxvYWRcIixcbiAgICAgICAgICAgICAgYXM6IFwic3R5bGVcIixcbiAgICAgICAgICAgICAgaHJlZjogcGVuZGluZ1Byb3BzLmhyZWYsXG4gICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiBwZW5kaW5nUHJvcHMuY3Jvc3NPcmlnaW4sXG4gICAgICAgICAgICAgIGludGVncml0eTogcGVuZGluZ1Byb3BzLmludGVncml0eSxcbiAgICAgICAgICAgICAgbWVkaWE6IHBlbmRpbmdQcm9wcy5tZWRpYSxcbiAgICAgICAgICAgICAgaHJlZkxhbmc6IHBlbmRpbmdQcm9wcy5ocmVmTGFuZyxcbiAgICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6IHBlbmRpbmdQcm9wcy5yZWZlcnJlclBvbGljeVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcmVsb2FkUHJvcHNNYXAuc2V0KHR5cGUsIHBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgICBzdHlsZXMkMjQ0IHx8XG4gICAgICAgICAgICAgIHByZWxvYWRTdHlsZXNoZWV0KFxuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCxcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgI
1HBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgICAgICByZXNvdXJjZSQyNDUuc3RhdGVcbiAgICAgICAgICAgICAgKSkpO1xuICAgICAgICBpZiAoY3VycmVudFByb3BzICYmIG51bGwgPT09IGN1cnJlbnRSZXNvdXJjZSlcbiAgICAgICAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUyOCwgXCJcIikpO1xuICAgICAgICByZXR1cm4gcmVzb3VyY2UkMjQ1O1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRQcm9wcyAmJiBudWxsICE9PSBjdXJyZW50UmVzb3VyY2UpXG4gICAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNTI5LCBcIlwiKSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlIFwic2NyaXB0XCI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY3VycmVudFByb3BzID0gcGVuZGluZ1Byb3BzLmFzeW5jKSxcbiAgICAgICAgKHBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wcy5zcmMpLFxuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcGVuZGluZ1Byb3BzICYmXG4gICAgICAgIGN1cnJlbnRQcm9wcyAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjdXJyZW50UHJvcHMgJiZcbiAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIGN1cnJlbnRQcm9wc1xuICAgICAgICAgID8gKChjdXJyZW50UHJvcHMgPSBnZXRTY3JpcHRLZXkocGVuZGluZ1Byb3BzKSksXG4gICAgICAgICAgICAocGVuZGluZ1Byb3BzID0gZ2V0UmVzb3VyY2VzRnJvbVJvb3QoXG4gICAgICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdFxuICAgICAgICAgICAgKS5ob2lzdGFibGVTY3JpcHRzKSxcbiAgICAgICAgICAgIChjdXJyZW50UmVzb3VyY2UgPSBwZW5kaW5nUHJvcHMuZ2V0KGN1cnJlbnRQcm9wcykpLFxuICAgICAgICAgICAgY3VycmVudFJlc291cmNlIHx8XG4gICAgICAgICAgICAgICgoY3VycmVudFJlc291cmNlID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwic2NyaXB0XCIsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2U6IG51bGwsXG4gICAgICAgICAgICAgICAgY291bnQ6IDAsXG4gICAgICAgICAgICAgICAgc3RhdGU6IG51bGxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHBlbmRpbmdQcm9wcy5zZXQoY3VycmVudFByb3BzLCBjdXJyZW50UmVzb3VyY2UpKSxcbiAgICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZSlcbiAgICAgICAgICA6IHsgdHlwZTogXCJ2b2lkXCIsIGluc3RhbmNlOiBudWxsLCBjb3VudDogMCwgc3RhdGU6IG51bGwgfVxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0NDQsIHR5cGUpKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3R5bGVLZXkoaHJlZikge1xuICByZXR1cm4gJ2hyZWY9XCInICsgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhocmVmKSArICdcIic7XG59XG5mdW5jdGlvbiBnZXRTdHlsZXNoZWV0U2VsZWN0b3JGcm9tS2V5KGtleSkge1xuICByZXR1cm4gJ2xpbmtbcmVsPVwic3R5bGVzaGVldFwiXVsnICsga2V5ICsgXCJdXCI7XG59XG5mdW5jdGlvbiBzdHlsZXNoZWV0UHJvcHNGcm9tUmF3UHJvcHMocmF3UHJvcHMpIHtcbiAgcmV0dXJuIGFzc2lnbih7fSwgcmF3UHJvcHMsIHtcbiAgICBcImRhdGEtcHJlY2VkZW5jZVwiOiByYXdQcm9wcy5wcmVjZWRlbmNlLFxuICAgIHByZWNlZGVuY2U6IG51bGxcbiAgfSk7XG59XG5mdW5jdGlvbiBwcmVsb2FkU3R5bGVzaGVldChvd25lckRvY3VtZW50LCBrZXksIHByZWxvYWRQcm9wcywgc3RhdGUpIHtcbiAgb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cInByZWxvYWRcIl1bYXM9XCJzdHlsZVwiXVsnICsga2V5ICsgXCJdXCIpXG4gICAgPyAoc3RhdGUubG9hZGluZyA9IDEpXG4gICAgOiAoKGtleSA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIikpLFxuICAgICAgKHN0YXRlLnByZWxvYWQgPSBrZXkpLFxuICAgICAga2V5LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChzdGF0ZS5sb2FkaW5nIHw9IDEpO1xuICAgICAgfSksXG4gICAgICBrZXkuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChzdGF0ZS5sb2FkaW5nIHw9IDIpO1xuICAgICAgfSksXG4gICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhrZXksIFwibGlua1wiLCBwcmVsb2FkUHJvcHMpLFxuICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShrZXkpLFxuICAgICAgb3duZXJEb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGtleSkpO1xufVxuZnVuY3Rpb24gZ2V0U2NyaXB0S2V5KHNyYykge1xuICByZXR1cm4gJ1tzcmM9XCInICsgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhzcmMpICsgJ1wiXSc7XG59XG5mdW5jdGlvbiBnZXRTY3JpcHRTZWxlY3RvckZyb21LZXkoa2V5KSB7XG4gIHJldHVybiBcInNjcmlwdFthc3luY11cIiArIGtleTtcbn1cbmZ1bmN0aW9uIGFjcXVpcmVSZXNvdXJjZShob2lzdGFibGVSb290LCByZXNvdXJjZSwgcHJvcHMpIHtcbiAgcmVzb3VyY2UuY291bnQrKztcbiAgaWYgKG51bGwgPT09IHJlc291cmNlLmluc3RhbmNlKVxuICAgIHN3aXRjaCAocmVzb3VyY2UudHlwZSkge1xuICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGhvaXN0YWJsZVJvb3QucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAnc3R5bGVbZGF0YS1ocmVmfj1cIicgK1xuICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3Rlcyhwcm9wcy5ocmVmKSArXG4gICAgICAgICAgICAnXCJdJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoaW5zdGFuY2UpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChyZXNvdXJjZS5pbnN0YW5jZSA9IGluc3RhbmNlKSxcbiAgICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoaW5zdGFuY2UpLFxuICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICApO1xuICAgICAgICB2Y
1XIgc3R5bGVQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICBcImRhdGEtaHJlZlwiOiBwcm9wcy5ocmVmLFxuICAgICAgICAgIFwiZGF0YS1wcmVjZWRlbmNlXCI6IHByb3BzLnByZWNlZGVuY2UsXG4gICAgICAgICAgaHJlZjogbnVsbCxcbiAgICAgICAgICBwcmVjZWRlbmNlOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgICBpbnN0YW5jZSA9IChob2lzdGFibGVSb290Lm93bmVyRG9jdW1lbnQgfHwgaG9pc3RhYmxlUm9vdCkuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBcInN0eWxlXCJcbiAgICAgICAgKTtcbiAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShpbnN0YW5jZSk7XG4gICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGluc3RhbmNlLCBcInN0eWxlXCIsIHN0eWxlUHJvcHMpO1xuICAgICAgICBpbnNlcnRTdHlsZXNoZWV0KGluc3RhbmNlLCBwcm9wcy5wcmVjZWRlbmNlLCBob2lzdGFibGVSb290KTtcbiAgICAgICAgcmV0dXJuIChyZXNvdXJjZS5pbnN0YW5jZSA9IGluc3RhbmNlKTtcbiAgICAgIGNhc2UgXCJzdHlsZXNoZWV0XCI6XG4gICAgICAgIHN0eWxlUHJvcHMgPSBnZXRTdHlsZUtleShwcm9wcy5ocmVmKTtcbiAgICAgICAgdmFyIGluc3RhbmNlJDI1MCA9IGhvaXN0YWJsZVJvb3QucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBnZXRTdHlsZXNoZWV0U2VsZWN0b3JGcm9tS2V5KHN0eWxlUHJvcHMpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnN0YW5jZSQyNTApXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nIHw9IDQpLFxuICAgICAgICAgICAgKHJlc291cmNlLmluc3RhbmNlID0gaW5zdGFuY2UkMjUwKSxcbiAgICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoaW5zdGFuY2UkMjUwKSxcbiAgICAgICAgICAgIGluc3RhbmNlJDI1MFxuICAgICAgICAgICk7XG4gICAgICAgIGluc3RhbmNlID0gc3R5bGVzaGVldFByb3BzRnJvbVJhd1Byb3BzKHByb3BzKTtcbiAgICAgICAgKHN0eWxlUHJvcHMgPSBwcmVsb2FkUHJvcHNNYXAuZ2V0KHN0eWxlUHJvcHMpKSAmJlxuICAgICAgICAgIGFkb3B0UHJlbG9hZFByb3BzRm9yU3R5bGVzaGVldChpbnN0YW5jZSwgc3R5bGVQcm9wcyk7XG4gICAgICAgIGluc3RhbmNlJDI1MCA9IChcbiAgICAgICAgICBob2lzdGFibGVSb290Lm93bmVyRG9jdW1lbnQgfHwgaG9pc3RhYmxlUm9vdFxuICAgICAgICApLmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xuICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKGluc3RhbmNlJDI1MCk7XG4gICAgICAgIHZhciBsaW5rSW5zdGFuY2UgPSBpbnN0YW5jZSQyNTA7XG4gICAgICAgIGxpbmtJbnN0YW5jZS5fcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBsaW5rSW5zdGFuY2Uub25sb2FkID0gcmVzb2x2ZTtcbiAgICAgICAgICBsaW5rSW5zdGFuY2Uub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGluc3RhbmNlJDI1MCwgXCJsaW5rXCIsIGluc3RhbmNlKTtcbiAgICAgICAgcmVzb3VyY2Uuc3RhdGUubG9hZGluZyB8PSA0O1xuICAgICAgICBpbnNlcnRTdHlsZXNoZWV0KGluc3RhbmNlJDI1MCwgcHJvcHMucHJlY2VkZW5jZSwgaG9pc3RhYmxlUm9vdCk7XG4gICAgICAgIHJldHVybiAocmVzb3VyY2UuaW5zdGFuY2UgPSBpbnN0YW5jZSQyNTApO1xuICAgICAgY2FzZSBcInNjcmlwdFwiOlxuICAgICAgICBpbnN0YW5jZSQyNTAgPSBnZXRTY3JpcHRLZXkocHJvcHMuc3JjKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChzdHlsZVByb3BzID0gaG9pc3RhYmxlUm9vdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgZ2V0U2NyaXB0U2VsZWN0b3JGcm9tS2V5KGluc3RhbmNlJDI1MClcbiAgICAgICAgICApKVxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChyZXNvdXJjZS5pbnN0YW5jZSA9IHN0eWxlUHJvcHMpLFxuICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShzdHlsZVByb3BzKSxcbiAgICAgICAgICAgIHN0eWxlUHJvcHNcbiAgICAgICAgICApO1xuICAgICAgICBpbnN0YW5jZSA9IHByb3BzO1xuICAgICAgICBpZiAoKHN0eWxlUHJvcHMgPSBwcmVsb2FkUHJvcHNNYXAuZ2V0KGluc3RhbmNlJDI1MCkpKVxuICAgICAgICAgIChpbnN0YW5jZSA9IGFzc2lnbih7fSwgcHJvcHMpKSxcbiAgICAgICAgICAgIGFkb3B0UHJlbG9hZFByb3BzRm9yU2NyaXB0KGluc3RhbmNlLCBzdHlsZVByb3BzKTtcbiAgICAgICAgaG9pc3RhYmxlUm9vdCA9IGhvaXN0YWJsZVJvb3Qub3duZXJEb2N1bWVudCB8fCBob2lzdGFibGVSb290O1xuICAgICAgICBzdHlsZVByb3BzID0gaG9pc3RhYmxlUm9vdC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKHN0eWxlUHJvcHMpO1xuICAgICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhzdHlsZVByb3BzLCBcImxpbmtcIiwgaW5zdGFuY2UpO1xuICAgICAgICBob2lzdGFibGVSb290LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVQcm9wcyk7XG4gICAgICAgIHJldHVybiAocmVzb3VyY2UuaW5zdGFuY2UgPSBzdHlsZVByb3BzKTtcbiAgICAgIGNhc2UgXCJ2b2lkXCI6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0NDMsIHJlc291cmNlLnR5cGUpKTtcbiAgICB9XG4gIGVsc2VcbiAgICBcInN0eWxlc2hlZXRcIiA9PT0gcmVzb3VyY2UudHlwZSAmJlxuICAgICAgMCA9PT0gKHJlc291cmNlLnN0YXRlLmxvYWRpbmcgJiA0KSAmJlxuICAgICAgKChpbnN0YW5jZSA9IHJlc291cmNlLmluc3RhbmNlKSxcbiAgICAgIChyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nIHw9IDQpLFxuICAgICAgaW5zZXJ0U3R5bGVzaGVldChpbnN0YW5jZSwgcHJvcHMucHJlY2VkZW5jZSwgaG9pc3RhYmxlUm9vdCkpO1xuICByZXR1cm4gcmVzb3VyY2UuaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBpbnNlcnRTdHlsZXNoZWV0KGluc3RhbmNlLCBwcmVjZWRlbmNlLCByb290KSB7XG4gIGZvciAoXG4gICAgdmFyIG5vZGVzID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAnbGlua1tyZWw9XCJzdHlsZXNoZWV0XCJdW2RhdGEtcHJlY2VkZW5jZV0sc3R5bGVbZGF0YS1wcmVjZWRlbmNlXSdcbiAgICAgICksXG4gICAgICBsYXN0ID0gbm9kZXMubGVuZ3RoID8gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV0gOiBudWxsLFxuICAgICAgcHJpb3IgPSBsYXN0LFxuICAgICAgaSA9IDA7XG4gICAgaSA8IG5vZGVzLmxlbmd0aDtcbiAgICBpKytcbiAgKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICBpZiAobm9kZS5kYXRhc2V0LnByZWNlZGVuY2UgPT09IHByZWNlZGVuY2UpIHByaW9yID0gbm9kZTtcbiAgICBlbHNlIGlmIChwcmlvciAhPT0gbGFzdCkgYnJlYWs7XG4gIH1cbiAgcHJpb3JcbiAgICA/IHByaW9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGluc3RhbmNlLCBwcmlvci5uZXh0U2libGluZylcbiAgICA6ICgocHJlY2VkZW5jZSA9IDkgPT09IHJvb3Qubm9kZVR5cGUgPyByb290LmhlYWQgOiByb290KSxcbiAgICAgIHByZWNlZGVuY2UuaW5zZXJ0QmVmb3JlKGluc3RhbmNlLCBwcmVjZWRlbmNlLmZpcnN0Q2hpbGQpKTtcbn1cbmZ1bmN0aW9uIGFkb3B0UHJlbG9hZFByb3BzRm9yU3R5bGVzaGVldChzdHlsZXNoZWV0UHJvcHMsIHByZWxvYWRQcm9wcykge1xuICBudWxsID09IHN0eWxlc2hlZXRQcm9wcy5jcm9zc09yaWdpbiAmJlxuICAgIChzdHlsZXNoZWV0UHJvcHMuY3Jvc3
1NPcmlnaW4gPSBwcmVsb2FkUHJvcHMuY3Jvc3NPcmlnaW4pO1xuICBudWxsID09IHN0eWxlc2hlZXRQcm9wcy5yZWZlcnJlclBvbGljeSAmJlxuICAgIChzdHlsZXNoZWV0UHJvcHMucmVmZXJyZXJQb2xpY3kgPSBwcmVsb2FkUHJvcHMucmVmZXJyZXJQb2xpY3kpO1xuICBudWxsID09IHN0eWxlc2hlZXRQcm9wcy50aXRsZSAmJiAoc3R5bGVzaGVldFByb3BzLnRpdGxlID0gcHJlbG9hZFByb3BzLnRpdGxlKTtcbn1cbmZ1bmN0aW9uIGFkb3B0UHJlbG9hZFByb3BzRm9yU2NyaXB0KHNjcmlwdFByb3BzLCBwcmVsb2FkUHJvcHMpIHtcbiAgbnVsbCA9PSBzY3JpcHRQcm9wcy5jcm9zc09yaWdpbiAmJlxuICAgIChzY3JpcHRQcm9wcy5jcm9zc09yaWdpbiA9IHByZWxvYWRQcm9wcy5jcm9zc09yaWdpbik7XG4gIG51bGwgPT0gc2NyaXB0UHJvcHMucmVmZXJyZXJQb2xpY3kgJiZcbiAgICAoc2NyaXB0UHJvcHMucmVmZXJyZXJQb2xpY3kgPSBwcmVsb2FkUHJvcHMucmVmZXJyZXJQb2xpY3kpO1xuICBudWxsID09IHNjcmlwdFByb3BzLmludGVncml0eSAmJlxuICAgIChzY3JpcHRQcm9wcy5pbnRlZ3JpdHkgPSBwcmVsb2FkUHJvcHMuaW50ZWdyaXR5KTtcbn1cbnZhciB0YWdDYWNoZXMgPSBudWxsO1xuZnVuY3Rpb24gZ2V0SHlkcmF0YWJsZUhvaXN0YWJsZUNhY2hlKHR5cGUsIGtleUF0dHJpYnV0ZSwgb3duZXJEb2N1bWVudCkge1xuICBpZiAobnVsbCA9PT0gdGFnQ2FjaGVzKSB7XG4gICAgdmFyIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHZhciBjYWNoZXMgPSAodGFnQ2FjaGVzID0gbmV3IE1hcCgpKTtcbiAgICBjYWNoZXMuc2V0KG93bmVyRG9jdW1lbnQsIGNhY2hlKTtcbiAgfSBlbHNlXG4gICAgKGNhY2hlcyA9IHRhZ0NhY2hlcyksXG4gICAgICAoY2FjaGUgPSBjYWNoZXMuZ2V0KG93bmVyRG9jdW1lbnQpKSxcbiAgICAgIGNhY2hlIHx8ICgoY2FjaGUgPSBuZXcgTWFwKCkpLCBjYWNoZXMuc2V0KG93bmVyRG9jdW1lbnQsIGNhY2hlKSk7XG4gIGlmIChjYWNoZS5oYXModHlwZSkpIHJldHVybiBjYWNoZTtcbiAgY2FjaGUuc2V0KHR5cGUsIG51bGwpO1xuICBvd25lckRvY3VtZW50ID0gb3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0eXBlKTtcbiAgZm9yIChjYWNoZXMgPSAwOyBjYWNoZXMgPCBvd25lckRvY3VtZW50Lmxlbmd0aDsgY2FjaGVzKyspIHtcbiAgICB2YXIgbm9kZSA9IG93bmVyRG9jdW1lbnRbY2FjaGVzXTtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICBub2RlW2ludGVybmFsSG9pc3RhYmxlTWFya2VyXSB8fFxuICAgICAgICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8XG4gICAgICAgIChcImxpbmtcIiA9PT0gdHlwZSAmJiBcInN0eWxlc2hlZXRcIiA9PT0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJyZWxcIikpXG4gICAgICApICYmXG4gICAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgIT09IG5vZGUubmFtZXNwYWNlVVJJXG4gICAgKSB7XG4gICAgICB2Y
1XIgbm9kZUtleSA9IG5vZGUuZ2V0QXR0cmlidXRlKGtleUF0dHJpYnV0ZSkgfHwgXCJcIjtcbiAgICAgIG5vZGVLZXkgPSB0eXBlICsgbm9kZUtleTtcbiAgICAgIHZhciBleGlzdGluZyA9IGNhY2hlLmdldChub2RlS2V5KTtcbiAgICAgIGV4aXN0aW5nID8gZXhpc3RpbmcucHVzaChub2RlKSA6IGNhY2hlLnNldChub2RlS2V5LCBbbm9kZV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2FjaGU7XG59XG5mdW5jdGlvbiBtb3VudEhvaXN0YWJsZShob2lzdGFibGVSb290LCB0eXBlLCBpbnN0YW5jZSkge1xuICBob2lzdGFibGVSb290ID0gaG9pc3RhYmxlUm9vdC5vd25lckRvY3VtZW50IHx8IGhvaXN0YWJsZVJvb3Q7XG4gIGhvaXN0YWJsZVJvb3QuaGVhZC5pbnNlcnRCZWZvcmUoXG4gICAgaW5zdGFuY2UsXG4gICAgXCJ0aXRsZVwiID09PSB0eXBlID8gaG9pc3RhYmxlUm9vdC5xdWVyeVNlbGVjdG9yKFwiaGVhZCA+IHRpdGxlXCIpIDogbnVsbFxuICApO1xufVxuZnVuY3Rpb24gaXNIb3N0SG9pc3RhYmxlVHlwZSh0eXBlLCBwcm9wcywgaG9zdENvbnRleHQpIHtcbiAgaWYgKDEgPT09IGhvc3RDb250ZXh0IHx8IG51bGwgIT0gcHJvcHMuaXRlbVByb3ApIHJldHVybiAhMTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIm1ldGFcIjpcbiAgICBjYXNlIFwidGl0bGVcIjpcbiAgICAgIHJldHVybiAhMDtcbiAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgIGlmIChcbiAgICAgICAgXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHByb3BzLnByZWNlZGVuY2UgfHxcbiAgICAgICAgXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHByb3BzLmhyZWYgfHxcbiAgICAgICAgXCJcIiA9PT0gcHJvcHMuaHJlZlxuICAgICAgKVxuICAgICAgICBicmVhaztcbiAgICAgIHJldHVybiAhMDtcbiAgICBjYXNlIFwibGlua1wiOlxuICAgICAgaWYgKFxuICAgICAgICBcInN0cmluZ1wiICE9PSB0eXBlb2YgcHJvcHMucmVsIHx8XG4gICAgICAgIFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5ocmVmIHx8XG4gICAgICAgIFwiXCIgPT09IHByb3BzLmhyZWYgfHxcbiAgICAgICAgcHJvcHMub25Mb2FkIHx8XG4gICAgICAgIHByb3BzLm9uRXJyb3JcbiAgICAgIClcbiAgICAgICAgYnJlYWs7XG4gICAgICBzd2l0Y2ggKHByb3BzLnJlbCkge1xuICAgICAgICBjYXNlIFwic3R5bGVzaGVldFwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodHlwZSA9IHByb3BzLmRpc2FibGVkKSxcbiAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBwcm9wcy5wcmVjZWRlbmNlICYmIG51bGwgPT0gdHlwZVxuICAgICAgICAgICk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfVxuICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMuYXN5bmMgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgcHJvcHMuYXN5bmMgJiZcbiAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHByb3BzLmFzeW5jICYmXG4gICAgICAgICFwcm9wcy5vbkxvYWQgJiZcbiAgICAgICAgIXByb3BzLm9uRXJyb3IgJiZcbiAgICAgICAgcHJvcHMuc3JjICYmXG4gICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBwcm9wcy5zcmNcbiAgICAgIClcbiAgICAgICAgcmV0dXJuICEwO1xuICB9XG4gIHJldHVybiAhMTtcbn1cbmZ1bmN0aW9uIHByZWxvYWRSZXNvdXJjZShyZXNvdXJjZSkge1xuICByZXR1cm4gXCJzdHlsZXNoZWV0XCIgPT09IHJlc291cmNlLnR5cGUgJiYgMCA9PT0gKHJlc291cmNlLnN0YXRlLmxvYWRpbmcgJiAzKVxuICAgID8gITFcbiAgICA6ICEwO1xufVxudmFyIHN1c3BlbmRlZFN0YXRlID0gbnVsbDtcbmZ1bmN0aW9uIG5vb3AoKSB7fVxuZnVuY3Rpb24gc3VzcGVuZFJlc291cmNlKGhvaXN0YWJsZVJvb3QsIHJlc291cmNlLCBwcm9wcykge1xuICBpZiAobnVsbCA9PT0gc3VzcGVuZGVkU3RhdGUpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNDc1KSk7XG4gIHZhciBzdGF0ZSA9IHN1c3BlbmRlZFN0YXRlO1xuICBpZiAoXG4gICAgXCJzdHlsZXNoZWV0XCIgPT09IHJlc291cmNlLnR5cGUgJiZcbiAgICAoXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHByb3BzLm1lZGlhIHx8XG4gICAgICAhMSAhPT0gbWF0Y2hNZWRpYShwcm9wcy5tZWRpYSkubWF0Y2hlcykgJiZcbiAgICAwID09PSAocmVzb3VyY2Uuc3RhdGUubG9hZGluZyAmIDQpXG4gICkge1xuICAgIGlmIChudWxsID09PSByZXNvdXJjZS5pbnN0YW5jZSkge1xuICAgICAgdmFyIGtleSA9IGdldFN0eWxlS2V5KHByb3BzLmhyZWYpLFxuICAgICAgICBpbnN0YW5jZSA9IGhvaXN0YWJsZVJvb3QucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBnZXRTdHlsZXNoZWV0U2VsZWN0b3JGcm9tS2V5KGtleSlcbiAgICAgICAgKTtcbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICBob2lzdGFibGVSb290ID0gaW5zdGFuY2UuX3A7XG4gICAgICAgIG51bGwgIT09IGhvaXN0YWJsZVJvb3QgJiZcbiAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgaG9pc3RhYmxlUm9vdCAmJlxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGhvaXN0YWJsZVJvb3QudGhlbiAmJlxuICAgICAgICAgIChzdGF0ZS5jb3VudCsrLFxuICAgICAgICAgIChzdGF0ZSA9IG9uVW5zdXNwZW5kLmJpbmQoc3RhdGUpKSxcbiAgICAgICAgICBob2lzdGFibGVSb290LnRoZW4oc3RhdGUsIHN0YXRlKSk7XG4gICAgICAgIHJlc291cmNlLnN0YXRlLmxvYWRpbmcgfD0gNDtcbiAgICAgICAgcmVzb3VyY2UuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShpbnN0YW5jZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluc3RhbmNlID0gaG9pc3RhYmxlUm9vdC5vd25lckRvY3VtZW50IHx8IGhvaXN0YWJsZVJvb3Q7XG4gICAgICBwcm9wcyA9IHN0eWxlc2hlZXRQcm9wc0Zyb21SYXdQcm9wcyhwcm9wcyk7XG4gICAgICAoa2V5ID0gcHJlbG9hZFByb3BzTWFwLmdldChrZXkpKSAmJlxuICAgICAgICBhZG9wdFByZWxvYWRQcm9wc0ZvclN0eWxlc2hlZXQocHJvcHMsIGtleSk7XG4gICAgICBpbnN0YW5jZSA9IGluc3RhbmNlLmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xuICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShpbnN0YW5jZSk7XG4gICAgICB2Y
1XIgbGlua0luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICBsaW5rSW5zdGFuY2UuX3AgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGxpbmtJbnN0YW5jZS5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICBsaW5rSW5zdGFuY2Uub25lcnJvciA9IHJlamVjdDtcbiAgICAgIH0pO1xuICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoaW5zdGFuY2UsIFwibGlua1wiLCBwcm9wcyk7XG4gICAgICByZXNvdXJjZS5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICBudWxsID09PSBzdGF0ZS5zdHlsZXNoZWV0cyAmJiAoc3RhdGUuc3R5bGVzaGVldHMgPSBuZXcgTWFwKCkpO1xuICAgIHN0YXRlLnN0eWxlc2hlZXRzLnNldChyZXNvdXJjZSwgaG9pc3RhYmxlUm9vdCk7XG4gICAgKGhvaXN0YWJsZVJvb3QgPSByZXNvdXJjZS5zdGF0ZS5wcmVsb2FkKSAmJlxuICAgICAgMCA9PT0gKHJlc291cmNlLnN0YXRlLmxvYWRpbmcgJiAzKSAmJlxuICAgICAgKHN0YXRlLmNvdW50KyssXG4gICAgICAocmVzb3VyY2UgPSBvblVuc3VzcGVuZC5iaW5kKHN0YXRlKSksXG4gICAgICBob2lzdGFibGVSb290LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIHJlc291cmNlKSxcbiAgICAgIGhvaXN0YWJsZVJvb3QuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHJlc291cmNlKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhaXRGb3JDb21taXRUb0JlUmVhZHkoKSB7XG4gIGlmIChudWxsID09PSBzdXNwZW5kZWRTdGF0ZSkgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0NzUpKTtcbiAgdmFyIHN0YXRlID0gc3VzcGVuZGVkU3RhdGU7XG4gIHN0YXRlLnN0eWxlc2hlZXRzICYmXG4gICAgMCA9PT0gc3RhdGUuY291bnQgJiZcbiAgICBpbnNlcnRTdXNwZW5kZWRTdHlsZXNoZWV0cyhzdGF0ZSwgc3RhdGUuc3R5bGVzaGVldHMpO1xuICByZXR1cm4gMCA8IHN0YXRlLmNvdW50XG4gICAgPyBmdW5jdGlvbiAoY29tbWl0KSB7XG4gICAgICAgIHZhciBzdHlsZXNoZWV0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzdGF0ZS5zdHlsZXNoZWV0cyAmJlxuICAgICAgICAgICAgaW5zZXJ0U3VzcGVuZGVkU3R5bGVzaGVldHMoc3RhdGUsIHN0YXRlLnN0eWxlc2hlZXRzKTtcbiAgICAgICAgICBpZiAoc3RhdGUudW5zdXNwZW5kKSB7XG4gICAgICAgICAgICB2Y
1XIgdW5zdXNwZW5kID0gc3RhdGUudW5zdXNwZW5kO1xuICAgICAgICAgICAgc3RhdGUudW5zdXNwZW5kID0gbnVsbDtcbiAgICAgICAgICAgIHVuc3VzcGVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgNmU0KTtcbiAgICAgICAgc3RhdGUudW5zdXNwZW5kID0gY29tbWl0O1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHN0YXRlLnVuc3VzcGVuZCA9IG51bGw7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHN0eWxlc2hlZXRUaW1lcik7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgOiBudWxsO1xufVxuZnVuY3Rpb24gb25VbnN1c3BlbmQoKSB7XG4gIHRoaXMuY291bnQtLTtcbiAgaWYgKDAgPT09IHRoaXMuY291bnQpXG4gICAgaWYgKHRoaXMuc3R5bGVzaGVldHMpIGluc2VydFN1c3BlbmRlZFN0eWxlc2hlZXRzKHRoaXMsIHRoaXMuc3R5bGVzaGVldHMpO1xuICAgIGVsc2UgaWYgKHRoaXMudW5zdXNwZW5kKSB7XG4gICAgICB2YXIgdW5zdXNwZW5kID0gdGhpcy51bnN1c3BlbmQ7XG4gICAgICB0aGlzLnVuc3VzcGVuZCA9IG51bGw7XG4gICAgICB1bnN1c3BlbmQoKTtcbiAgICB9XG59XG52YXIgcHJlY2VkZW5jZXNCeVJvb3QgPSBudWxsO1xuZnVuY3Rpb24gaW5zZXJ0U3VzcGVuZGVkU3R5bGVzaGVldHMoc3RhdGUsIHJlc291cmNlcykge1xuICBzdGF0ZS5zdHlsZXNoZWV0cyA9IG51bGw7XG4gIG51bGwgIT09IHN0YXRlLnVuc3VzcGVuZCAmJlxuICAgIChzdGF0ZS5jb3VudCsrLFxuICAgIChwcmVjZWRlbmNlc0J5Um9vdCA9IG5ldyBNYXAoKSksXG4gICAgcmVzb3VyY2VzLmZvckVhY2goaW5zZXJ0U3R5bGVzaGVldEludG9Sb290LCBzdGF0ZSksXG4gICAgKHByZWNlZGVuY2VzQnlSb290ID0gbnVsbCksXG4gICAgb25VbnN1c3BlbmQuY2FsbChzdGF0ZSkpO1xufVxuZnVuY3Rpb24gaW5zZXJ0U3R5bGVzaGVldEludG9Sb290KHJvb3QsIHJlc291cmNlKSB7XG4gIGlmICghKHJlc291cmNlLnN0YXRlLmxvYWRpbmcgJiA0KSkge1xuICAgIHZhciBwcmVjZWRlbmNlcyA9IHByZWNlZGVuY2VzQnlSb290LmdldChyb290KTtcbiAgICBpZiAocHJlY2VkZW5jZXMpIHZhciBsYXN0ID0gcHJlY2VkZW5jZXMuZ2V0KG51bGwpO1xuICAgIGVsc2Uge1xuICAgICAgcHJlY2VkZW5jZXMgPSBuZXcgTWFwKCk7XG4gICAgICBwcmVjZWRlbmNlc0J5Um9vdC5zZXQocm9vdCwgcHJlY2VkZW5jZXMpO1xuICAgICAgZm9yIChcbiAgICAgICAgdmFyIG5vZGVzID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgXCJsaW5rW2RhdGEtcHJlY2VkZW5jZV0sc3R5bGVbZGF0YS1wcmVjZWRlbmNlXVwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgaSA8IG5vZGVzLmxlbmd0aDtcbiAgICAgICAgaSsrXG4gICAgICApIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFwiTElOS1wiID09PSBub2RlLm5vZGVOYW1lIHx8XG4gICAgICAgICAgXCJub3QgYWxsXCIgIT09IG5vZGUuZ2V0QXR0cmlidXRlKFwibWVkaWFcIilcbiAgICAgICAgKVxuICAgICAgICAgIHByZWNlZGVuY2VzLnNldChub2RlLmRhdGFzZXQucHJlY2VkZW5jZSwgbm9kZSksIChsYXN0ID0gbm9kZSk7XG4gICAgICB9XG4gICAgICBsYXN0ICYmIHByZWNlZGVuY2VzLnNldChudWxsLCBsYXN0KTtcbiAgICB9XG4gICAgbm9kZXMgPSByZXNvdXJjZS5pbnN0YW5jZTtcbiAgICBub2RlID0gbm9kZXMuZ2V0QXR0cmlidXRlKFwiZGF0YS1wcmVjZWRlbmNlXCIpO1xuICAgIGkgPSBwcmVjZWRlbmNlcy5nZXQobm9kZSkgfHwgbGFzdDtcbiAgICBpID09PSBsYXN0ICYmIHByZWNlZGVuY2VzLnNldChudWxsLCBub2Rlcyk7XG4gICAgcHJlY2VkZW5jZXMuc2V0KG5vZGUsIG5vZGVzKTtcbiAgICB0aGlzLmNvdW50Kys7XG4gICAgbGFzdCA9IG9uVW5zdXNwZW5kLmJpbmQodGhpcyk7XG4gICAgbm9kZXMuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgbGFzdCk7XG4gICAgbm9kZXMuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIGxhc3QpO1xuICAgIGlcbiAgICAgID8gaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlcywgaS5uZXh0U2libGluZylcbiAgICAgIDogKChyb290ID0gOSA9PT0gcm9vdC5ub2RlVHlwZSA/IHJvb3QuaGVhZCA6IHJvb3QpLFxuICAgICAgICByb290Lmluc2VydEJlZm9yZShub2Rlcywgcm9vdC5maXJzdENoaWxkKSk7XG4gICAgcmVzb3VyY2Uuc3RhdGUubG9hZGluZyB8PSA0O1xuICB9XG59XG52YXIgSG9zdFRyYW5zaXRpb25Db250ZXh0ID0ge1xuICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICBQcm92aWRlcjogbnVsbCxcbiAgQ29uc3VtZXI6IG51bGwsXG4gIF9jdXJyZW50VmFsdWU6IHNoYXJlZE5vdFBlbmRpbmdPYmplY3QsXG4gIF9jdXJyZW50VmFsdWUyOiBzaGFyZWROb3RQZW5kaW5nT2JqZWN0LFxuICBfdGhyZWFkQ291bnQ6IDBcbn07XG5mdW5jdGlvbiBGaWJlclJvb3ROb2RlKFxuICBjb250YWluZXJJbmZvLFxuICB0YWcsXG4gIGh5ZHJhdGUsXG4gIGlkZW50aWZpZXJQcmVmaXgsXG4gIG9uVW5jYXVnaHRFcnJvcixcbiAgb25DYXVnaHRFcnJvcixcbiAgb25SZWNvdmVyYWJsZUVycm9yLFxuICBmb3JtU3RhdGVcbikge1xuICB0aGlzLnRhZyA9IDE7XG4gIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gIHRoaXMucGluZ0NhY2hlID0gdGhpcy5jdXJyZW50ID0gdGhpcy5wZW5kaW5nQ2hpbGRyZW4gPSBudWxsO1xuICB0aGlzLnRpbWVvdXRIYW5kbGUgPSAtMTtcbiAgdGhpcy5jYWxsYmFja05vZGUgPVxuICAgIHRoaXMubmV4dCA9XG4gICAgdGhpcy5wZW5kaW5nQ29udGV4dCA9XG4gICAgdGhpcy5jb250ZXh0ID1cbiAgICB0aGlzLmNhbmNlbFBlbmRpbmdDb21taXQgPVxuICAgICAgbnVsbDtcbiAgdGhpcy5jYWxsYmFja1ByaW9yaXR5ID0gMDtcbiAgdGhpcy5leHBpcmF0aW9uVGltZXMgPSBjcmVhdGVMYW5lTWFwKC0xKTtcbiAgdGhpcy5lbnRhbmdsZWRMYW5lcyA9XG4gICAgdGhpcy5zaGVsbFN1c3BlbmRDb3VudGVyID1cbiAgICB0aGlzLmVycm9yUmVjb3ZlcnlEaXNhYmxlZExhbmVzID1cbiAgICB0aGlzLmV4cGlyZWRMYW5lcyA9XG4gICAgdGhpcy53YXJtTGFuZXMgPVxuICAgIHRoaXMucGluZ2VkTGFuZXMgPVxuICAgIHRoaXMuc3VzcGVuZGVkTGFuZXMgPVxuICAgIHRoaXMucGVuZGluZ0xhbmVzID1cbiAgICAgIDA7XG4gIHRoaXMuZW50YW5nbGVtZW50cyA9IGNyZWF0ZUxhbmVNYXAoMCk7XG4gIHRoaXMuaGlkZGVuVXBkYXRlcyA9IGNyZWF0ZUxhbmVNYXAobnVsbCk7XG4gIHRoaXMuaWRlbnRpZmllclByZWZpeCA9IGlkZW50aWZpZXJQcmVmaXg7XG4gIHRoaXMub25VbmNhdWdodEVycm9yID0gb25VbmNhdWdodEVycm9yO1xuICB0aGlzLm9uQ2F1Z2h0RXJyb3IgPSBvbkNhdWdodEVycm9yO1xuICB0aGlzLm9uUmVjb3ZlcmFibGVFcnJvciA9IG9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgdGhpcy5wb29sZWRDYWNoZSA9IG51bGw7XG4gIHRoaXMucG9vbGVkQ2FjaGVMYW5lcyA9IDA7XG4gIHRoaXMuZm9ybVN0YXRlID0gZm9ybVN0YXRlO1xuICB0aGlzLmluY29tcGxldGVUcmFuc2l0aW9ucyA9IG5ldyBNYXAoKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyUm9vdChcbiAgY29udGFpbmVySW5mbyxcbiAgdGFnLFxuICBoeWRyYXRlLFxuICBpbml0aWFsQ2hpbGRyZW4sXG4gIGh5ZHJhdGlvbkNhbGxiYWNrcyxcbiAgaXNTdHJpY3RNb2RlLFxuICBpZGVudGlmaWVyUHJlZml4LFxuICBvblVuY2F1Z2h0RXJyb3IsXG4gIG9uQ2F1Z2h0RXJyb3IsXG4gIG9uUmVjb3ZlcmFibGVFcnJvcixcbiAgdHJhbnNpdGlvbkNhbGxiYWNrcyxcbiAgZm9ybVN0YXRlXG4pIHtcbiAgY29udGFpbmVySW5mbyA9IG5ldyBGaWJlclJvb3ROb2RlKFxuICAgIGNvbnRhaW5lckluZm8sXG4gICAgdGFnLFxuICAgIGh5ZHJhdGUsXG4gICAgaWRlbnRpZmllclByZWZpeCxcbiAgICBvblVuY2F1Z2h0RXJyb3IsXG4gICAgb25DYXVnaHRFcnJvcixcbiAgICBvblJlY292ZXJhYmxlRXJyb3IsXG4gICAgZm9ybVN0YXRlXG4gICk7XG4gIHRhZyA9IDE7XG4gICEwID09PSBpc1N0cmljdE1vZGUgJiYgKHRhZyB8PSAyNCk7XG4gIGlzU3RyaWN0TW9kZSA9IGNyZWF0ZUZpYmVySW1wbENsYXNzKDMsIG51bGwsIG51bGwsIHRhZyk7XG4gIGNvbnRhaW5lckluZm8uY3VycmVudCA9IGlzU3RyaWN0TW9kZTtcbiAgaXNTdHJpY3RNb2RlLnN0YXRlTm9kZSA9IGNvbnRhaW5lckluZm87XG4gIHRhZyA9IGNyZWF0ZUNhY2hlKCk7XG4gIHRhZy5yZWZDb3VudCsrO1xuICBjb250YWluZXJJbmZvLnBvb2xlZENhY2hlID0gdGFnO1xuICB0YWcucmVmQ291bnQrKztcbiAgaXNTdHJpY3RNb2RlLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgZWxlbWVudDogaW5pdGlhbENoaWxkcmVuLFxuICAgIGlzRGVoeWRyYXRlZDogaHlkcmF0ZSxcbiAgICBjYWNoZTogdGFnXG4gIH07XG4gIGluaXRpYWxpemVVcGRhdGV
1RdWV1ZShpc1N0cmljdE1vZGUpO1xuICByZXR1cm4gY29udGFpbmVySW5mbztcbn1cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgcGFyZW50Q29tcG9uZW50ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICByZXR1cm4gcGFyZW50Q29tcG9uZW50O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVySW1wbChcbiAgcm9vdEZpYmVyLFxuICBsYW5lLFxuICBlbGVtZW50LFxuICBjb250YWluZXIsXG4gIHBhcmVudENvbXBvbmVudCxcbiAgY2FsbGJhY2tcbikge1xuICBwYXJlbnRDb21wb25lbnQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpO1xuICBudWxsID09PSBjb250YWluZXIuY29udGV4dFxuICAgID8gKGNvbnRhaW5lci5jb250ZXh0ID0gcGFyZW50Q29tcG9uZW50KVxuICAgIDogKGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IHBhcmVudENvbXBvbmVudCk7XG4gIGNvbnRhaW5lciA9IGNyZWF0ZVVwZGF0ZShsYW5lKTtcbiAgY29udGFpbmVyLnBheWxvYWQgPSB7IGVsZW1lbnQ6IGVsZW1lbnQgfTtcbiAgY2FsbGJhY2sgPSB2b2lkIDAgPT09IGNhbGxiYWNrID8gbnVsbCA6IGNhbGxiYWNrO1xuICBudWxsICE9PSBjYWxsYmFjayAmJiAoY29udGFpbmVyLmNhbGxiYWNrID0gY2FsbGJhY2spO1xuICBlbGVtZW50ID0gZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIGNvbnRhaW5lciwgbGFuZSk7XG4gIG51bGwgIT09IGVsZW1lbnQgJiZcbiAgICAoc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGVsZW1lbnQsIHJvb3RGaWJlciwgbGFuZSksXG4gICAgZW50YW5nbGVUcmFuc2l0aW9ucyhlbGVtZW50LCByb290RmliZXIsIGxhbmUpKTtcbn1cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgZmliZXIgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICBpZiAobnVsbCAhPT0gZmliZXIgJiYgbnVsbCAhPT0gZmliZXIuZGVoeWRyYXRlZCkge1xuICAgIHZhciBhID0gZmliZXIucmV0cnlMYW5lO1xuICAgIGZpYmVyLnJldHJ5TGFuZSA9IDAgIT09IGEgJiYgYSA8IHJldHJ5TGFuZSA/IGEgOiByZXRyeUxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSk7XG4gIChmaWJlciA9IGZpYmVyLmFsdGVybmF0ZSkgJiYgbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSk7XG59XG5mdW5jdGlvbiBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihmaWJlcikge1xuICBpZiAoMTMgPT09IGZpYmVyLnRhZykge1xuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCA2NzEwODg2NCk7XG4gICAgbnVsbCAhPT0gcm9vdCAmJiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIDY3MTA4ODY0KTtcbiAgICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgNjcxMDg4NjQpO1xuICB9XG59XG52YXIgX2VuYWJsZWQgPSAhMDtcbmZ1bmN0aW9uIGRpc3BhdGNoRGlzY3JldGVFdmVudChcbiAgZG9tRXZlbnROYW1lLFxuICBldmVudFN5c3RlbUZsYWdzLFxuICBjb250YWluZXIsXG4gIG5hdGl2ZUV2ZW50XG4pIHtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IG51bGw7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucDtcbiAgdHJ5IHtcbiAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IDIpLFxuICAgICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gcHJldmlvdXNQcmlvcml0eSksXG4gICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IHByZXZUcmFuc2l0aW9uKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQoXG4gIGRvbUV2ZW50TmFtZSxcbiAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgY29udGFpbmVyLFxuICBuYXRpdmVFdmVudFxuKSB7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQ7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBudWxsO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnA7XG4gIHRyeSB7XG4gICAgKFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSA4KSxcbiAgICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfSBmaW5hbGx5IHtcbiAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByZXZpb3VzUHJpb3JpdHkpLFxuICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoXG4gIGRvbUV2ZW50TmFtZSxcbiAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgdGFyZ2V0Q29udGFpbmVyLFxuICBuYXRpdmVFdmVudFxuKSB7XG4gIGlmIChfZW5hYmxlZCkge1xuICAgIHZhciBibG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICBpZiAobnVsbCA9PT0gYmxvY2tlZE9uKVxuICAgICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKFxuICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICByZXR1cm5fdGFyZ2V0SW5zdCxcbiAgICAgICAgdGFyZ2V0Q29udGFpbmVyXG4gICAgICApLFxuICAgICAgICBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICAgIGVsc2UgaWYgKFxuICAgICAgcXVldWVJZkNvbnRpbnVvdXNFdmVudChcbiAgICAgICAgYmxvY2tlZE9uLFxuICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgI
1HRhcmdldENvbnRhaW5lcixcbiAgICAgICAgbmF0aXZlRXZlbnRcbiAgICAgIClcbiAgICApXG4gICAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlbHNlIGlmIChcbiAgICAgIChjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpLFxuICAgICAgZXZlbnRTeXN0ZW1GbGFncyAmIDQgJiZcbiAgICAgICAgLTEgPCBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMuaW5kZXhPZihkb21FdmVudE5hbWUpKVxuICAgICkge1xuICAgICAgZm9yICg7IG51bGwgIT09IGJsb2NrZWRPbjsgKSB7XG4gICAgICAgIHZhciBmaWJlciA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcbiAgICAgICAgaWYgKG51bGwgIT09IGZpYmVyKVxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGZpYmVyID0gZmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICBpZiAoZmliZXIuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgICAgICAgICAgICAgIHZhciBsYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGZpYmVyLnBlbmRpbmdMYW5lcyk7XG4gICAgICAgICAgICAgICAgaWYgKDAgIT09IGxhbmVzKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IGZpYmVyO1xuICAgICAgICAgICAgICAgICAgcm9vdC5wZW5kaW5nTGFuZXMgfD0gMjtcbiAgICAgICAgICAgICAgICAgIGZvciAocm9vdC5lbnRhbmdsZWRMYW5lcyB8PSAyOyBsYW5lczsgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsYW5lID0gMSA8PCAoMzEgLSBjbHozMihsYW5lcykpO1xuICAgICAgICAgICAgICAgICAgICByb290LmVudGFuZ2xlbWVudHNbMV0gfD0gbGFuZTtcbiAgICAgICAgICAgICAgICAgICAgbGFuZXMgJj0gfmxhbmU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQoZmliZXIpO1xuICAgICAgICAgICAgICAgICAgMCA9PT0gKGV4ZWN1dGlvbkNvbnRleHQgJiA2KSAmJlxuICAgICAgICAgICAgICAgICAgICAoKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBub3coKSArIDUwMCksXG4gICAgICAgICAgICAgICAgICAgIGZsdXNoU3luY1dvcmtBY3Jvc3NSb290c19pbXBsKDAsICExKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgKHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIDIpKSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSByb290ICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgMiksXG4gICAgICAgICAgICAgICAgZmx1c2hTeW5jV29yayQxKCksXG4gICAgICAgICAgICAgICAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIDIpO1xuICAgICAgICAgIH1cbiAgICAgICAgZmliZXIgPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgbnVsbCA9PT0gZmliZXIgJiZcbiAgICAgICAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oXG4gICAgICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICByZXR1cm5fdGFyZ2V0SW5zdCxcbiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lclxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChmaWJlciA9PT0gYmxvY2tlZE9uKSBicmVhaztcbiAgICAgICAgYmxvY2tlZE9uID0gZmliZXI7XG4gICAgICB9XG4gICAgICBudWxsICE9PSBibG9ja2VkT24gJiYgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSBlbHNlXG4gICAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oXG4gICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRhcmdldENvbnRhaW5lclxuICAgICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChuYXRpdmVFdmVudCkge1xuICBuYXRpdmVFdmVudCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgcmV0dXJuIGZpbmRJbnN0YW5jZUJsb2NraW5nVGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbn1cbnZhciByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7XG5mdW5jdGlvbiBmaW5kSW5zdGFuY2VCbG9ja2luZ1RhcmdldCh0YXJnZXROb2RlKSB7XG4gIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDtcbiAgdGFyZ2V0Tm9kZSA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHRhcmdldE5vZGUpO1xuICBpZiAobnVsbCAhPT0gdGFyZ2V0Tm9kZSkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0Tm9kZSk7XG4gICAgaWYgKG51bGwgPT09IG5lYXJlc3RNb3VudGVkKSB0YXJnZXROb2RlID0gbnVsbDtcbiAgICBlbHNlIHtcbiAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7XG4gICAgICBpZiAoMTMgPT09IHRhZykge1xuICAgICAgICB0YXJnZXROb2RlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgIGlmIChudWxsICE9PSB0YXJnZXROb2RlKSByZXR1cm4gdGFyZ2V0Tm9kZTtcbiAgICAgICAgdGFyZ2V0Tm9kZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKDMgPT09IHRhZykge1xuICAgICAgICBpZiAobmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpXG4gICAgICAgICAgcmV0dXJuIDMgPT09IG5lYXJlc3RNb3VudGVkLnRhZ1xuICAgICAgICAgICAgPyBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mb1xuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB0YXJnZXROb2RlID0gbnVsbDtcbiAgICAgIH0gZWxzZSBuZWFyZXN0TW91bnRlZCAhPT0gdGFyZ2V0Tm9kZSAmJiAodGFyZ2V0Tm9kZSA9IG51bGwpO1xuICAgIH1cbiAgfVxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IHRhcmdldE5vZGU7XG4gIHJldHVybi
1BudWxsO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlIFwiYmVmb3JldG9nZ2xlXCI6XG4gICAgY2FzZSBcImNhbmNlbFwiOlxuICAgIGNhc2UgXCJjbGlja1wiOlxuICAgIGNhc2UgXCJjbG9zZVwiOlxuICAgIGNhc2UgXCJjb250ZXh0bWVudVwiOlxuICAgIGNhc2UgXCJjb3B5XCI6XG4gICAgY2FzZSBcImN1dFwiOlxuICAgIGNhc2UgXCJhdXhjbGlja1wiOlxuICAgIGNhc2UgXCJkYmxjbGlja1wiOlxuICAgIGNhc2UgXCJkcmFnZW5kXCI6XG4gICAgY2FzZSBcImRyYWdzdGFydFwiOlxuICAgIGNhc2UgXCJkcm9wXCI6XG4gICAgY2FzZSBcImZvY3VzaW5cIjpcbiAgICBjYXNlIFwiZm9jdXNvdXRcIjpcbiAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICBjYXNlIFwiaW52YWxpZFwiOlxuICAgIGNhc2UgXCJrZXlkb3duXCI6XG4gICAgY2FzZSBcImtleXByZXNzXCI6XG4gICAgY2FzZSBcImtleXVwXCI6XG4gICAgY2FzZSBcIm1vdXNlZG93blwiOlxuICAgIGNhc2UgXCJtb3VzZXVwXCI6XG4gICAgY2FzZSBcInBhc3RlXCI6XG4gICAgY2FzZSBcInBhdXNlXCI6XG4gICAgY2FzZSBcInBsYXlcIjpcbiAgICBjYXNlIFwicG9pbnRlcmNhbmNlbFwiOlxuICAgIGNhc2UgXCJwb2ludGVyZG93blwiOlxuICAgIGNhc2UgXCJwb2ludGVydXBcIjpcbiAgICBjYXNlIFwicmF0ZWNoYW5nZVwiOlxuICAgIGNhc2UgXCJyZXNldFwiOlxuICAgIGNhc2UgXCJyZXNpemVcIjpcbiAgICBjYXNlIFwic2Vla2VkXCI6XG4gICAgY2FzZSBcInN1Ym1pdFwiOlxuICAgIGNhc2UgXCJ0b2dnbGVcIjpcbiAgICBjYXNlIFwidG91Y2hjYW5jZWxcIjpcbiAgICBjYXNlIFwidG91Y2hlbmRcIjpcbiAgICBjYXNlIFwidG91Y2hzdGFydFwiOlxuICAgIGNhc2UgXCJ2b2x1bWVjaGFuZ2VcIjpcbiAgICBjYXNlIFwiY2hhbmdlXCI6XG4gICAgY2FzZSBcInNlbGVjdGlvbmNoYW5nZVwiOlxuICAgIGNhc2UgXCJ0ZXh0SW5wdXRcIjpcbiAgICBjYXNlIFwiY29tcG9zaXRpb25zdGFydFwiOlxuICAgIGNhc2UgXCJjb21wb3NpdGlvbmVuZFwiOlxuICAgIGNhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOlxuICAgIGNhc2UgXCJiZWZvcmVibHVyXCI6XG4gICAgY2FzZSBcImFmdGVyYmx1clwiOlxuICAgIGNhc2UgXCJiZWZvcmVpbnB1dFwiOlxuICAgIGNhc2UgXCJibHVyXCI6XG4gICAgY2FzZSBcImZ1bGxzY3JlZW5jaGFuZ2VcIjpcbiAgICBjYXNlIFwiZm9jdXNcIjpcbiAgICBjYXNlIFwiaGFzaGNoYW5nZVwiOlxuICAgIGNhc2UgXCJwb3BzdGF0ZVwiOlxuICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICBjYXNlIFwic2VsZWN0c3RhcnRcIjpcbiAgICAgIHJldHVybiAyO1xuICAgIGNhc2UgXCJkcmFnXCI6XG4gICAgY2FzZSBcImRyYWdlbnRlclwiOlxuICAgIGNhc2UgXCJkcmFnZXhpdFwiOlxuICAgIGNhc2UgXCJkcmFnbGVhdmVcIjpcbiAgICBjYXNlIFwiZHJhZ292ZXJcIjpcbiAgICBjYXNlIFwibW91c2Vtb3ZlXCI6XG4gICAgY2FzZSBcIm1vdXNlb3V0XCI6XG4gICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgIGNhc2UgXCJwb2ludGVybW92ZVwiOlxuICAgIGNhc2UgXCJwb2ludGVyb3V0XCI6XG4gICAgY2FzZSBcInBvaW50ZXJvdmVyXCI6XG4gICAgY2FzZSBcInNjcm9sbFwiOlxuICAgIGNhc2UgXCJ0b3VjaG1vdmVcIjpcbiAgICBjYXNlIFwid2hlZWxcIjpcbiAgICBjYXNlIFwibW91c2VlbnRlclwiOlxuICAgIGNhc2UgXCJtb3VzZWxlYXZlXCI6XG4gICAgY2FzZSBcInBvaW50ZXJlbnRlclwiOlxuICAgIGNhc2UgXCJwb2ludGVybGVhdmVcIjpcbiAgICAgIHJldHVybiA4O1xuICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICBzd2l0Y2ggKGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkpIHtcbiAgICAgICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgICAgICByZXR1cm4gODtcbiAgICAgICAgY2FzZSBOb3JtYWxQcmlvcml0eSQxOlxuICAgICAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgICAgIHJldHVybiAzMjtcbiAgICAgICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICAgICAgcmV0dXJuIDI2ODQzNTQ1NjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gMzI7XG4gICAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAzMjtcbiAgfVxufVxudmFyIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSAhMSxcbiAgcXVldWVkRm9jdXMgPSBudWxsLFxuICBxdWV1ZWREcmFnID0gbnVsbCxcbiAgcXVldWVkTW91c2UgPSBudWxsLFxuICBxdWV1ZWRQb2ludGVycyA9IG5ldyBNYXAoKSxcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzID0gbmV3IE1hcCgpLFxuICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXSxcbiAgZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzID1cbiAgICBcIm1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldFwiLnNwbGl0KFxuICAgICAgXCIgXCJcbiAgICApO1xuZnVuY3Rpb24gY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSBcImZvY3VzaW5cIjpcbiAgICBjYXNlIFwiZm9jdXNvdXRcIjpcbiAgICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJkcmFnZW50ZXJcIjpcbiAgICBjYXNlIFwiZHJhZ2xlYXZlXCI6XG4gICAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJtb3VzZW92ZXJcIjpcbiAgICBjYXNlIFwibW91c2VvdXRcIjpcbiAgICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJwb2ludGVyb3ZlclwiOlxuICAgIGNhc2UgXCJwb2ludGVyb3V0XCI6XG4gICAgICBxdWV1ZWRQb2ludGVycy5kZWxldGUobmF0aXZlRXZlbnQucG9pbnRlcklkKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOlxuICAgIGNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpcbiAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUobmF0aXZlRXZlbnQucG9pbnRlcklkKTtcbiAgfVxufVxuZnVuY3Rpb24gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChcbiAgZXhpc3RpbmdRdWV1ZWR
1FdmVudCxcbiAgYmxvY2tlZE9uLFxuICBkb21FdmVudE5hbWUsXG4gIGV2ZW50U3lzdGVtRmxhZ3MsXG4gIHRhcmdldENvbnRhaW5lcixcbiAgbmF0aXZlRXZlbnRcbikge1xuICBpZiAoXG4gICAgbnVsbCA9PT0gZXhpc3RpbmdRdWV1ZWRFdmVudCB8fFxuICAgIGV4aXN0aW5nUXVldWVkRXZlbnQubmF0aXZlRXZlbnQgIT09IG5hdGl2ZUV2ZW50XG4gIClcbiAgICByZXR1cm4gKFxuICAgICAgKGV4aXN0aW5nUXVldWVkRXZlbnQgPSB7XG4gICAgICAgIGJsb2NrZWRPbjogYmxvY2tlZE9uLFxuICAgICAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICAgICAgZXZlbnRTeXN0ZW1GbGFnczogZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50LFxuICAgICAgICB0YXJnZXRDb250YWluZXJzOiBbdGFyZ2V0Q29udGFpbmVyXVxuICAgICAgfSksXG4gICAgICBudWxsICE9PSBibG9ja2VkT24gJiZcbiAgICAgICAgKChibG9ja2VkT24gPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbikpLFxuICAgICAgICBudWxsICE9PSBibG9ja2VkT24gJiYgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oYmxvY2tlZE9uKSksXG4gICAgICBleGlzdGluZ1F1ZXVlZEV2ZW50XG4gICAgKTtcbiAgZXhpc3RpbmdRdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzIHw9IGV2ZW50U3lzdGVtRmxhZ3M7XG4gIGJsb2NrZWRPbiA9IGV4aXN0aW5nUXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcbiAgbnVsbCAhPT0gdGFyZ2V0Q29udGFpbmVyICYmXG4gICAgLTEgPT09IGJsb2NrZWRPbi5pbmRleE9mKHRhcmdldENvbnRhaW5lcikgJiZcbiAgICBibG9ja2VkT24ucHVzaCh0YXJnZXRDb250YWluZXIpO1xuICByZXR1cm4gZXhpc3RpbmdRdWV1ZWRFdmVudDtcbn1cbmZ1bmN0aW9uIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoXG4gIGJsb2NrZWRPbixcbiAgZG9tRXZlbnROYW1lLFxuICBldmVudFN5c3RlbUZsYWdzLFxuICB0YXJnZXRDb250YWluZXIsXG4gIG5hdGl2ZUV2ZW50XG4pIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlIFwiZm9jdXNpblwiOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHF1ZXVlZEZvY3VzID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChcbiAgICAgICAgICBxdWV1ZWRGb2N1cyxcbiAgICAgICAgICBibG9ja2VkT24sXG4gICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLFxuICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgICkpLFxuICAgICAgICAhMFxuICAgICAgKTtcbiAgICBjYXNlIFwiZHJhZ2VudGVyXCI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoXG4gICAgICAgICAgcXVldWVkRHJhZyxcbiAgICAgICAgICBibG9ja2VkT24sXG4gICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLFxuICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgICkpLFxuICAgICAgICAhMFxuICAgICAgKTtcbiAgICBjYXNlIFwibW91c2VvdmVyXCI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocXVldWVkTW91c2UgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KFxuICAgICAgICAgIHF1ZXVlZE1vdXNlLFxuICAgICAgICAgIGJsb2NrZWRPbixcbiAgICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICAgICAgbmF0aXZlRXZlbnRcbiAgICAgICAgKSksXG4gICAgICAgICEwXG4gICAgICApO1xuICAgIGNhc2UgXCJwb2ludGVyb3ZlclwiOlxuICAgICAgdmFyIHBvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZDtcbiAgICAgIHF1ZXVlZFBvaW50ZXJzLnNldChcbiAgICAgICAgcG9pbnRlcklkLFxuICAgICAgICBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KFxuICAgICAgICAgIHF1ZXVlZFBvaW50ZXJzLmdldChwb2ludGVySWQpIHx8IG51bGwsXG4gICAgICAgICAgYmxvY2tlZE9uLFxuICAgICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgICAgICBuYXRpdmVFdmVudFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuICEwO1xuICAgIGNhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHBvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZCksXG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5zZXQoXG4gICAgICAgICAgcG9pbnRlcklkLFxuICAgICAgICAgIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoXG4gICAgICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZ2V0KHBvaW50ZXJJZCkgfHwgbnVsbCxcbiAgICAgICAgICAgIGJsb2NrZWRPbixcbiAgICAgICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICAgICAgICBuYXRpdmVFdmVudFxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgITBcbiAgICAgICk7XG4gIH1cbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCkge1xuICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHF1ZXVlZFRhcmdldC50YXJnZXQpO1xuICBpZiAobnVsbCAhPT0gdGFyZ2V0SW5zdCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG4gICAgaWYgKG51bGwgIT09IG5lYXJlc3RNb3VudGVkKVxuICAgICAgaWYgKCgodGFyZ2V0SW5zdCA9IG5lYXJlc3RNb3VudGVkLnRhZyksI
1DEzID09PSB0YXJnZXRJbnN0KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKCh0YXJnZXRJbnN0ID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCkpLFxuICAgICAgICAgIG51bGwgIT09IHRhcmdldEluc3QpXG4gICAgICAgICkge1xuICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSB0YXJnZXRJbnN0O1xuICAgICAgICAgIHJ1bldpdGhQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICgxMyA9PT0gbmVhcmVzdE1vdW50ZWQudGFnKSB7XG4gICAgICAgICAgICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoKTtcbiAgICAgICAgICAgICAgbGFuZSA9IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb25CeUxhbmUobGFuZSk7XG4gICAgICAgICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKG5lYXJlc3RNb3VudGVkLCBsYW5lKTtcbiAgICAgICAgICAgICAgbnVsbCAhPT0gcm9vdCAmJlxuICAgICAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBuZWFyZXN0TW91bnRlZCwgbGFuZSk7XG4gICAgICAgICAgICAgIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKG5lYXJlc3RNb3VudGVkLCBsYW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIDMgPT09IHRhcmdldEluc3QgJiZcbiAgICAgICAgbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWRcbiAgICAgICkge1xuICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID1cbiAgICAgICAgICAzID09PSBuZWFyZXN0TW91bnRlZC50YWdcbiAgICAgICAgICAgID8gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm9cbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG4gIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xufVxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkge1xuICBpZiAobnVsbCAhPT0gcXVldWVkRXZlbnQuYmxvY2tlZE9uKSByZXR1cm4gITE7XG4gIGZvciAoXG4gICAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBxdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuICAgIDAgPCB0YXJnZXRDb250YWluZXJzLmxlbmd0aDtcblxuICApIHtcbiAgICB2YXIgbmV4dEJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQocXVldWVkRXZlbnQubmF0aXZlRXZlbnQpO1xuICAgIGlmIChudWxsID09PSBuZXh0QmxvY2tlZE9uKSB7XG4gICAgICBuZXh0QmxvY2tlZE9uID0gcXVldWVkRXZlbnQubmF0aXZlRXZlbnQ7XG4gICAgICB2Y
1XIgbmF0aXZlRXZlbnRDbG9uZSA9IG5ldyBuZXh0QmxvY2tlZE9uLmNvbnN0cnVjdG9yKFxuICAgICAgICBuZXh0QmxvY2tlZE9uLnR5cGUsXG4gICAgICAgIG5leHRCbG9ja2VkT25cbiAgICAgICk7XG4gICAgICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBuYXRpdmVFdmVudENsb25lO1xuICAgICAgbmV4dEJsb2NrZWRPbi50YXJnZXQuZGlzcGF0Y2hFdmVudChuYXRpdmVFdmVudENsb25lKTtcbiAgICAgIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGFyZ2V0Q29udGFpbmVycyA9IGdldEluc3RhbmNlRnJvbU5vZGUobmV4dEJsb2NrZWRPbikpLFxuICAgICAgICBudWxsICE9PSB0YXJnZXRDb250YWluZXJzICYmXG4gICAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24odGFyZ2V0Q29udGFpbmVycyksXG4gICAgICAgIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uKSxcbiAgICAgICAgITFcbiAgICAgICk7XG4gICAgdGFyZ2V0Q29udGFpbmVycy5zaGlmdCgpO1xuICB9XG4gIHJldHVybiAhMDtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcChxdWV1ZWRFdmVudCwga2V5LCBtYXApIHtcbiAgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkgJiYgbWFwLmRlbGV0ZShrZXkpO1xufVxuZnVuY3Rpb24gcmVwbGF5VW5ibG9ja2VkRXZlbnRzKCkge1xuICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gITE7XG4gIG51bGwgIT09IHF1ZXVlZEZvY3VzICYmXG4gICAgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRGb2N1cykgJiZcbiAgICAocXVldWVkRm9jdXMgPSBudWxsKTtcbiAgbnVsbCAhPT0gcXVldWVkRHJhZyAmJlxuICAgIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykgJiZcbiAgICAocXVldWVkRHJhZyA9IG51bGwpO1xuICBudWxsICE9PSBxdWV1ZWRNb3VzZSAmJlxuICAgIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkTW91c2UpICYmXG4gICAgKHF1ZXVlZE1vdXNlID0gbnVsbCk7XG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbn1cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKSB7XG4gIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkICYmXG4gICAgKChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsKSxcbiAgICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0IHx8XG4gICAgICAoKGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSAhMCksXG4gICAgICBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhcbiAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFxuICAgICAgICByZXBsYXlVbmJsb2NrZWRFdmVudHNcbiAgICAgICkpKTtcbn1cbnZhciBsYXN0U2NoZWR1bGVkUmVwbGF5UXVldWUgPSBudWxsO1xuZnVuY3Rpb24gc2NoZWR1bGVSZXBsYXlRdWV1ZUlmTmVlZGVkKGZvcm1SZXBsYXlpbmdRdWV1ZSkge1xuICBsYXN0U2NoZWR1bGVkUmVwbGF5UXVldWUgIT09IGZvcm1SZXBsYXlpbmdRdWV1ZSAmJlxuICAgICgobGFzdFNjaGVkdWxlZFJlcGxheVF1ZXVlID0gZm9ybVJlcGxheWluZ1F1ZXVlKSxcbiAgICBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhcbiAgICAgIFNjaGVkdWxlci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGFzdFNjaGVkdWxlZFJlcGxheVF1ZXVlID09PSBmb3JtUmVwbGF5aW5nUXVldWUgJiZcbiAgICAgICAgICAobGFzdFNjaGVkdWxlZFJlcGxheVF1ZXVlID0gbnVsbCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybVJlcGxheWluZ1F1ZXVlLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgdmFyIGZvcm0gPSBmb3JtUmVwbGF5aW5nUXVldWVbaV0sXG4gICAgICAgICAgICBzdWJtaXR0ZXJPckFjdGlvbiA9IGZvcm1SZXBsYXlpbmdRdWV1ZVtpICsgMV0sXG4gICAgICAgICAgICBmb3JtRGF0YSA9IGZvcm1SZXBsYXlpbmdRdWV1ZVtpICsgMl07XG4gICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHN1Ym1pdHRlck9yQWN0aW9uKVxuICAgICAgICAgICAgaWYgKG51bGwgPT09IGZpbmRJbnN0YW5jZUJsb2NraW5nVGFyZ2V0KHN1Ym1pdHRlck9yQWN0aW9uIHx8IGZvcm0pKVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGVsc2UgYnJlYWs7XG4gICAgICAgICAgdmFyIGZvcm1JbnN0ID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShmb3JtKTtcbiAgICAgICAgICBudWxsICE9PSBmb3JtSW5zdCAmJlxuICAgICAgICAgICAgKGZvcm1SZXBsYXlpbmdRdWV1ZS5zcGxpY2UoaSwgMyksXG4gICAgICAgICAgICAoaSAtPSAzKSxcbiAgICAgICAgICAgIHN0YXJ0SG9zdFRyYW5zaXRpb24oXG4gICAgICAgICAgICAgIGZvcm1JbnN0LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGVuZGluZzogITAsXG4gICAgICAgICAgICAgICAgZGF0YTogZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBmb3JtLm1ldGhvZCxcbiAgICAgICAgICAgICAgICBhY3Rpb246IHN1Ym1pdHRlck9yQWN0aW9uXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHN1Ym1pdHRlck9yQWN0aW9uLFxuICAgICAgICAgICAgICBmb3JtRGF0YVxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApKTtcbn1cbmZ1bmN0aW9uIHJldHJ5SWZCbG9ja2VkT24odW5ibG9ja2VkKSB7XG4gIGZ1bmN0aW9uIHVuYmxvY2socXVldWVkRXZlbnQpIHtcbiAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpO1xuICB9XG4gIG51bGwgIT09IHF1ZXVlZEZvY3VzICYmIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgbnVsbCAhPT0gcXVldWVkRHJhZyAmJiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRHJhZywgdW5ibG9ja2VkKTtcbiAgbnVsbCAhPT0gcXVldWVkTW91c2UgJiYgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZE1vdXNlLCB1bmJsb2NrZWQpO1xuICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKHVuYmxvY2spO1xuICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZm9yRWFjaCh1bmJsb2NrKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZWR
1FeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW2ldO1xuICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCAmJiAocXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IG51bGwpO1xuICB9XG4gIGZvciAoXG4gICAgO1xuICAgIDAgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoICYmXG4gICAgKChpID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzWzBdKSwgbnVsbCA9PT0gaS5ibG9ja2VkT24pO1xuXG4gIClcbiAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQoaSksXG4gICAgICBudWxsID09PSBpLmJsb2NrZWRPbiAmJiBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgaSA9ICh1bmJsb2NrZWQub3duZXJEb2N1bWVudCB8fCB1bmJsb2NrZWQpLiQkcmVhY3RGb3JtUmVwbGF5O1xuICBpZiAobnVsbCAhPSBpKVxuICAgIGZvciAocXVldWVkVGFyZ2V0ID0gMDsgcXVldWVkVGFyZ2V0IDwgaS5sZW5ndGg7IHF1ZXVlZFRhcmdldCArPSAzKSB7XG4gICAgICB2YXIgZm9ybSA9IGlbcXVldWVkVGFyZ2V0XSxcbiAgICAgICAgc3VibWl0dGVyT3JBY3Rpb24gPSBpW3F1ZXVlZFRhcmdldCArIDFdLFxuICAgICAgICBmb3JtUHJvcHMgPSBmb3JtW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygc3VibWl0dGVyT3JBY3Rpb24pXG4gICAgICAgIGZvcm1Qcm9wcyB8fCBzY2hlZHVsZVJlcGxheVF1ZXVlSWZOZWVkZWQoaSk7XG4gICAgICBlbHNlIGlmIChmb3JtUHJvcHMpIHtcbiAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7XG4gICAgICAgIGlmIChzdWJtaXR0ZXJPckFjdGlvbiAmJiBzdWJtaXR0ZXJPckFjdGlvbi5oYXNBdHRyaWJ1dGUoXCJmb3JtQWN0aW9uXCIpKVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICgoZm9ybSA9IHN1Ym1pdHRlck9yQWN0aW9uKSxcbiAgICAgICAgICAgIChmb3JtUHJvcHMgP
1SBzdWJtaXR0ZXJPckFjdGlvbltpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsKSlcbiAgICAgICAgICApXG4gICAgICAgICAgICBhY3Rpb24gPSBmb3JtUHJvcHMuZm9ybUFjdGlvbjtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChudWxsICE9PSBmaW5kSW5zdGFuY2VCbG9ja2luZ1RhcmdldChmb3JtKSkgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICBlbHNlIGFjdGlvbiA9IGZvcm1Qcm9wcy5hY3Rpb247XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFjdGlvblxuICAgICAgICAgID8gKGlbcXVldWVkVGFyZ2V0ICsgMV0gPSBhY3Rpb24pXG4gICAgICAgICAgOiAoaS5zcGxpY2UocXVldWVkVGFyZ2V0LCAzKSwgKHF1ZXVlZFRhcmdldCAtPSAzKSk7XG4gICAgICAgIHNjaGVkdWxlUmVwbGF5UXVldWVJZk5lZWRlZChpKTtcbiAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBSZWFjdERPTVJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUucmVuZGVyID0gUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPVxuICBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcbiAgICBpZiAobnVsbCA9PT0gcm9vdCkgdGhyb3cgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0MDkpKTtcbiAgICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudCxcbiAgICAgIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZSgpO1xuICAgIHVwZGF0ZUNvbnRhaW5lckltcGwoY3VycmVudCwgbGFuZSwgY2hpbGRyZW4sIHJvb3QsIG51bGwsIG51bGwpO1xuICB9O1xuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID1cbiAgZnVuY3Rpb24gKCkge1xuICAgIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuICAgIGlmIChudWxsICE9PSByb290KSB7XG4gICAgICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBudWxsO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcbiAgICAgIHVwZGF0ZUNvbnRhaW5lckltcGwocm9vdC5jdXJyZW50LCAyLCBudWxsLCByb290LCBudWxsLCBudWxsKTtcbiAgICAgIGZsdXNoU3luY1dvcmskMSgpO1xuICAgICAgY29udGFpbmVyW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gbnVsbDtcbiAgICB9XG4gIH07XG5mdW5jdGlvbiBSZWFjdERPTUh5ZHJhdGlvblJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICB2YXIgdXBkYXRlUHJpb3JpdHkgPSByZXNvbHZlVXBkYXRlUHJpb3JpdHkoKTtcbiAgICB0YXJnZXQgPSB7IGJsb2NrZWRPbjogbnVsbCwgdGFyZ2V0OiB0YXJnZXQsIHByaW9yaXR5OiB1cGRhdGVQcmlvcml0eSB9O1xuICAgIGZvciAoXG4gICAgICB2Y
1XIgaSA9IDA7XG4gICAgICBpIDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aCAmJlxuICAgICAgMCAhPT0gdXBkYXRlUHJpb3JpdHkgJiZcbiAgICAgIHVwZGF0ZVByaW9yaXR5IDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW2ldLnByaW9yaXR5O1xuICAgICAgaSsrXG4gICAgKTtcbiAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc3BsaWNlKGksIDAsIHRhcmdldCk7XG4gICAgMCA9PT0gaSAmJiBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQodGFyZ2V0KTtcbiAgfVxufTtcbnZhciBpc29tb3JwaGljUmVhY3RQYWNrYWdlVmVyc2lvbiRqc2NvbXAkaW5saW5lXzE3ODUgPSBSZWFjdC52ZXJzaW9uO1xuaWYgKFxuICBcIjE5LjEuMFwiICE9PVxuICBpc29tb3JwaGljUmVhY3RQYWNrYWdlVmVyc2lvbiRqc2NvbXAkaW5saW5lXzE3ODVcbilcbiAgdGhyb3cgRXJyb3IoXG4gICAgZm9ybWF0UHJvZEVycm9yTWVzc2FnZShcbiAgICAgIDUyNyxcbiAgICAgIGlzb21vcnBoaWNSZWFjdFBhY2thZ2VWZXJzaW9uJGpzY29tcCRpbmxpbmVfMTc4NSxcbiAgICAgIFwiMTkuMS4wXCJcbiAgICApXG4gICk7XG5SZWFjdERPTVNoYXJlZEludGVybmFscy5maW5kRE9NTm9kZSA9IGZ1bmN0aW9uIChjb21wb25lbnRPckVsZW1lbnQpIHtcbiAgdmFyIGZpYmVyID0gY29tcG9uZW50T3JFbGVtZW50Ll9yZWFjdEludGVybmFscztcbiAgaWYgKHZvaWQgMCA9PT0gZmliZXIpIHtcbiAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29tcG9uZW50T3JFbGVtZW50LnJlbmRlcilcbiAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTg4KSk7XG4gICAgY29tcG9uZW50T3JFbGVtZW50ID0gT2JqZWN0LmtleXMoY29tcG9uZW50T3JFbGVtZW50KS5qb2luKFwiLFwiKTtcbiAgICB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI2OCwgY29tcG9uZW50T3JFbGVtZW50KSk7XG4gIH1cbiAgY29tcG9uZW50T3JFbGVtZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpO1xuICBjb21wb25lbnRPckVsZW1lbnQgPVxuICAgIG51bGwgIT09IGNvbXBvbmVudE9yRWxlbWVudFxuICAgICAgPyBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY29tcG9uZW50T3JFbGVtZW50KVxuICAgICAgOiBudWxsO1xuICBjb21wb25lbnRPckVsZW1lbnQgPVxuICAgIG51bGwgPT09IGNvbXBvbmVudE9yRWxlbWVudCA/IG51bGwgOiBjb21wb25lbnRPckVsZW1lbnQuc3RhdGVOb2RlO1xuICByZXR1cm4gY29tcG9uZW50T3JFbGVtZW50O1xufTtcbnZhciBpbnRlcm5hbHMkanNjb21wJGlubGluZV8yMjU2ID0ge1xuICBidW5kbGVUeXBlOiAwLFxuICB2ZXJzaW9uOiBcIjE5LjEuMFwiLFxuICByZW5kZXJlclBhY2thZ2VOYW1lOiBcInJlYWN0LWRvbVwiLFxuICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RTaGFyZWRJbnRlcm5hbHMsXG4gIHJlY29uY2lsZXJWZXJzaW9uOiBcIjE5LjEuMFwiXG59O1xuaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pIHtcbiAgdmFyIGhvb2skanNjb21wJGlubGluZV8yMjU3ID0gX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuICBpZiAoXG4gICAgIWhvb2skanNjb21wJGlubGluZV8yMjU3LmlzRGlzYWJsZWQgJiZcbiAgICBob29rJGpzY29tcCRpbmxpbmVfMjI1Ny5zdXBwb3J0c0ZpYmVyXG4gIClcbiAgICB0cnkge1xuICAgICAgKHJlbmRlcmVySUQgPSBob29rJGpzY29tcCRpbmxpbmVfMjI1Ny5pbmplY3QoXG4gICAgICAgIGludGVybmFscyRqc2NvbXAkaW5saW5lXzIyNTZcbiAgICAgICkpLFxuICAgICAgICAoaW5qZWN0ZWRIb29rID0gaG9vayRqc2NvbXAkaW5saW5lXzIyNTcpO1xuICAgIH0gY2F0Y2ggKGVycikge31cbn1cbmV4cG9ydHMuY3JlYXRlUm9vdCA9IGZ1bmN0aW9uIChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjk5KSk7XG4gIHZhciBpc1N0cmljdE1vZGUgPSAhMSxcbiAgICBpZGVudGlmaWVyUHJlZml4ID0gXCJcIixcbiAgICBvblVuY2F1Z2h0RXJyb3IgPSBkZWZhdWx0T25VbmNhdWdodEVycm9yLFxuICAgIG9uQ2F1Z2h0RXJyb3IgPSBkZWZhdWx0T25DYXVnaHRFcnJvcixcbiAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yLFxuICAgIHRyYW5zaXRpb25DYWxsYmFja3MgPSBudWxsO1xuICBudWxsICE9PSBvcHRpb25zICYmXG4gICAgdm9pZCAwICE9PSBvcHRpb25zICYmXG4gICAgKCEwID09PSBvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgJiYgKGlzU3RyaWN0TW9kZSA9ICEwKSxcbiAgICB2b2lkIDAgIT09IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAmJlxuICAgICAgKGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXgpLFxuICAgIHZvaWQgMCAhPT0gb3B0aW9ucy5vblVuY2F1Z2h0RXJyb3IgJiZcbiAgICAgIChvblVuY2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uVW5jYXVnaHRFcnJvciksXG4gICAgdm9pZCAwICE9PSBvcHRpb25zLm9uQ2F1Z2h0RXJyb3IgJiYgKG9uQ2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uQ2F1Z2h0RXJyb3IpLFxuICAgIHZvaWQgMCAhPT0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3IgJiZcbiAgICAgIChvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciksXG4gICAgdm9pZCAwICE9PSBvcHRpb25zLnVuc3RhYmxlX3RyYW5zaXRpb25DYWxsYmFja3MgJiZcbiAgICAgICh0cmFuc2l0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucy51bnN0YWJsZV90cmFuc2l0aW9uQ2FsbGJhY2tzKSk7XG4gIG9wdGlvbnMgPSBjcmVhdGVGaWJlclJvb3QoXG4gICAgY29udGFpbmVyLFxuICAgIDEsXG4gICAgITEsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIGlzU3RyaWN0TW9kZSxcbiAgICBpZGVudGlmaWVyUHJlZml4LFxuICAgIG9uVW5jYXVnaHRFcnJvcixcbiAgICBvbkNhdWdodEVycm9yLFxuICAgIG9uUmVjb3ZlcmFibGVFcnJvcixcbiAgICB0cmFuc2l0aW9uQ2FsbGJhY2tzLF
1xuICAgIG51bGxcbiAgKTtcbiAgY29udGFpbmVyW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gb3B0aW9ucy5jdXJyZW50O1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhjb250YWluZXIpO1xuICByZXR1cm4gbmV3IFJlYWN0RE9NUm9vdChvcHRpb25zKTtcbn07XG5leHBvcnRzLmh5ZHJhdGVSb290ID0gZnVuY3Rpb24gKGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB0aHJvdyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI5OSkpO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gITEsXG4gICAgaWRlbnRpZmllclByZWZpeCA9IFwiXCIsXG4gICAgb25VbmNhdWdodEVycm9yID0gZGVmYXVsdE9uVW5jYXVnaHRFcnJvcixcbiAgICBvbkNhdWdodEVycm9yID0gZGVmYXVsdE9uQ2F1Z2h0RXJyb3IsXG4gICAgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcixcbiAgICB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gbnVsbCxcbiAgICBmb3JtU3RhdGUgPSBudWxsO1xuICBudWxsICE9PSBvcHRpb25zICYmXG4gICAgdm9pZCAwICE9PSBvcHRpb25zICYmXG4gICAgKCEwID09PSBvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgJiYgKGlzU3RyaWN0TW9kZSA9ICEwKSxcbiAgICB2b2lkIDAgIT09IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAmJlxuICAgICAgKGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXgpLFxuICAgIHZvaWQgMCAhPT0gb3B0aW9ucy5vblVuY2F1Z2h0RXJyb3IgJiZcbiAgICAgIChvblVuY2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uVW5jYXVnaHRFcnJvciksXG4gICAgdm9pZCAwICE9PSBvcHRpb25zLm9uQ2F1Z2h0RXJyb3IgJiYgKG9uQ2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uQ2F1Z2h0RXJyb3IpLFxuICAgIHZvaWQgMCAhPT0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3IgJiZcbiAgICAgIChvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciksXG4gICAgdm9pZCAwICE9PSBvcHRpb25zLnVuc3RhYmxlX3RyYW5zaXRpb25DYWxsYmFja3MgJiZcbiAgICAgICh0cmFuc2l0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucy51bnN0YWJsZV90cmFuc2l0aW9uQ2FsbGJhY2tzKSxcbiAgICB2b2lkIDAgIT09IG9wdGlvbnMuZm9ybVN0YXRlICYmIChmb3JtU3RhdGUgPSBvcHRpb25zLmZvcm1TdGF0ZSkpO1xuICBpbml0aWFsQ2hpbGRyZW4gPSBjcmVhdGVGaWJlclJvb3QoXG4gICAgY29udGFpbmVyLFxuICAgIDEsXG4gICAgITAsXG4gICAgaW5pdGlhbENoaWxkcmVuLFxuICAgIG51bGwgIT0gb3B0aW9ucyA/IG9wdGlvbnMgOiBudWxsLFxuICAgIGlzU3RyaWN0TW9kZSxcbiAgICBpZGVudGlmaWVyUHJlZml4LFxuICAgIG9uVW5jYXVnaHRFcnJvcixcbiAgICBvbkNhdWdodEVycm9yLFxuICAgIG9uUmVjb3ZlcmFibGVFcnJvcixcbiAgICB0cmFuc2l0aW9uQ2FsbGJhY2tzLFxuICAgIGZvcm1TdGF0ZVxuICApO1xuICBpbml0aWFsQ2hpbGRyZW4uY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKG51bGwpO1xuICBvcHRpb25zID0gaW5pdGlhbENoaWxkcmVuLmN1cnJlbnQ7XG4gIGlzU3RyaWN0TW9kZSA9IHJlcXVlc3RVcGRhdGVMYW5lKCk7XG4gIGlzU3RyaWN0TW9kZSA9IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb25CeUxhbmUoaXNTdHJpY3RNb2RlKTtcbiAgaWRlbnRpZmllclByZWZpeCA9IGNyZWF0ZVVwZGF0ZShpc1N0cmljdE1vZGUpO1xuICBpZGVudGlmaWVyUHJlZml4LmNhbGxiYWNrID0gbnVsbDtcbiAgZW5xdWV1ZVVwZGF0ZShvcHRpb25zLCBpZGVudGlmaWVyUHJlZml4LCBpc1N0cmljdE1vZGUpO1xuICBvcHRpb25zID0gaXNTdHJpY3RNb2RlO1xuICBpbml0aWFsQ2hpbGRyZW4uY3VycmVudC5sYW5lcyA9IG9wdGlvbnM7XG4gIG1hcmtSb290VXBkYXRlZCQxKGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucyk7XG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChpbml0aWFsQ2hpbGRyZW4pO1xuICBjb250YWluZXJbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBpbml0aWFsQ2hpbGRyZW4uY3VycmVudDtcbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoY29udGFpbmVyKTtcbiAgcmV0dXJuIG5ldyBSZWFjdERPTUh5ZHJhdGlvblJvb3QoaW5pdGlhbENoaWxkcmVuKTtcbn07XG5leHBvcnRzLnZlcnNpb24gPSBcIjE5LjEuMFwiO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4279\n'))},4655:(__unused_webpack_module,exports,__webpack_require__)=>{eval(__webpack_require__.ts('/**\n * @license React\n * react-dom.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\nvar React = __webpack_require__(4232);\nfunction formatProdErrorMessage(code) {\n  var url = "https://react.dev/errors/" + code;\n  if (1 < arguments.length) {\n    url += "?args[]=" + encodeURIComponent(arguments[1]);\n    for (var i = 2; i < arguments.length; i++)\n      url += "&args[]=" + encodeURIComponent(arguments[i]);\n  }\n  return (\n    "Minified React error #" +\n    code +\n    "; visit " +\n    url +\n    " for the full message or use the non-minified dev environment for full errors and additional helpful warnings."\n  );\n}\nfunction noop() {}\nvar Internals = {\n    d: {\n      f: noop,\n      r: function () {\n        throw Error(formatProdErrorMessage(522));\n      },\n      D: noop,\n      C: noop,\n      L: noop,\n      m: noop,\n      X: noop,\n      S: noop,\n      M: noop\n    },\n    p: 0,\n    findDOMNode: null\n  },\n  REACT_PORTAL_TYPE = Symbol.for("react.portal");\nfunction createPortal$1(children, containerInfo, implementation) {\n  var key =\n    3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;\n  return {\n    $$typeof: REACT_PORTAL_TYPE,\n    key: null == key ? null : "" + key,\n    children: children,\n    containerInfo: containerInfo,\n    implementation: implementation\n  };\n}\nvar ReactSharedInternals =\n  React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;\nfunction getCrossOriginStringAs(as, input) {\n  if ("font" === as) return "";\n  if ("string" === typeof input)\n    return "use-credentials" === input ? input : "";\n}\nexports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n  Internals;\nexports.createPortal = function (children, container) {\n  var key =\n    2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;\n  if (\n    !container ||\n    (1 !== container.nodeType &&\n      9 !== container.nodeType &&\n      11 !== container.nodeType)\n  )\n    throw Error(formatProdErrorMessage(299));\n  return createPortal$1(children, container, null, key);\n};\nexports.flushSync = function (fn) {\n  var previousTransition = ReactSharedInternals.T,\n    previousUpdatePriority = Internals.p;\n  try {\n    if (((ReactSharedInternals.T = null), (Internals.p = 2), fn)) return fn();\n  } finally {\n    (ReactSharedInternals.T = previousTransition),\n      (Internals.p = previousUpdatePriority),\n      Internals.d.f();\n  }\n};\nexports.preconnect = function (href, options) {\n  "string" === typeof href &&\n    (options\n      ? ((options = options.crossOrigin),\n        (options =\n          "string" === typeof options\n            ? "use-credentials" === options\n              ? options\n              : ""\n            : void 0))\n      : (options = null),\n    Internals.d.C(href, options));\n};\nexports.prefetchDNS = function (href) {\n  "string" === typeof href && Internals.d.D(href);\n};\nexports.preinit = function (href, options) {\n  if ("string" === typeof href && options && "string" === typeof options.as) {\n    var as = options.as,\n      crossOrigin = getCrossOriginStringAs(as, options.crossOrigin),\n      integrity =\n        "string" === typeof options.integrity ? options.integrity : void 0,\n      fetchPriority =\n        "string" === typeof options.fetchPriority\n          ? options.fetchPriority\n          : void 0;\n    "style" === as\n      ? Internals.d.S(\n          href,\n          "string" === typeof options.precedence ? options.precedence : void 0,\n          {\n            crossOrigin: crossOrigin,\n            integrity: integrity,\n            fetchPriority: fetchPriority\n          }\n        )\n      : "script" === as &&\n        Internals.d.X(href, {\n          crossOrigin: crossOrigin,\n          integrity: integrity,\n          fetchPriority: fetchPriority,\n          nonce: "string" === typeof options.nonce ? options.nonce : void 0\n        });\n  }\n};\nexports.preinitModule = function (href, options) {\n  if ("string" === typeof href)\n    if ("object" === typeof options && null !== options) {\n      if (null == options.as || "script" === options.as) {\n        var crossOrigin = getCrossOriginStringAs(\n          options.as,\n          options.crossOrigin\n        );\n        Internals.d.M(href, {\n          crossOrigin: crossOrigin,\n          integrity:\n            "string" === typeof options.integrity ? options.integrity : void 0,\n          nonce: "string" === typeof options.nonce ? options.nonce : void 0\n        });\n      }\n    } else null == options && Internals.d.M(href);\n};\nexports.preload = function (href, options) {\n  if (\n    "string" === typeof href &&\n    "object" === typeof options &&\n    null !== options &&\n    "string" === typeof options.as\n  ) {\n    var as = options.as,\n      crossOrigin = getCrossOriginStringAs(as, options.crossOrigin);\n    Internals.d.L(href, as, {\n      crossOrigin: crossOrigin,\n      integrity:\n        "string" === typeof options.integrity ? options.integrity : void 0,\n      nonce: "string" === typeof options.nonce ? options.nonce : void 0,\n      type: "string" === typeof options.type ? options.type : void 0,\n      fetchPriority:\n        "string" === typeof options.fetchPriority\n          ? options.fetchPriority\n          : void 0,\n      referrerPolicy:\n        "string" === typeof options.referrerPolicy\n          ? options.referrerPolicy\n          : void 0,\n      imageSrcSet:\n        "string" === typeof options.imageSrcSet ? options.imageSrcSet : void 0,\n      imageSizes:\n        "string" === typeof options.imageSizes ? options.imageSizes : void 0,\n      media: "string" === typeof options.media ? options.media : void 0\n    });\n  }\n};\nexports.preloadModule = function (href, options) {\n  if ("string" === typeof href)\n    if (options) {\n      var crossOrigin = getCrossOriginStringAs(options.as, options.crossOrigin);\n      Internals.d.m(href, {\n        as:\n          "string" === typeof options.as && "script" !== options.as\n            ? options.as\n            : void 0,\n        crossOrigin: crossOrigin,\n        integrity:\n          "string" === typeof options.integrity ? options.integrity : void 0\n      });\n    } else Internals.d.m(href);\n};\nexports.requestFormReset = function (form) {\n  Internals.d.r(form);\n};\nexports.unstable_batchedUpdates = function (fn, a) {\n  return fn(a);\n};\nexports.useFormState = function (action, initialState, permalink) {\n  return ReactSharedInternals.H.useFormState(action, initialState, permalink);\n};\nexports.useFormStatus = function () {\n  return ReactSharedInternals.H.useHostTransitionStatus();\n};\nexports.version = "19.1.0";\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY1NS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
1BRWE7QUFDYixZQUFZLG1CQUFPLENBQUMsSUFBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE1BQU07QUFDTjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBLHdCQUF3QjtB
1QUN4QjtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsZUFBZSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5qcz9iNmU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBSZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcbmZ1bmN0aW9uIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoY29kZSkge1xuICB2YXIgdXJsID0gXCJodHRwczovL3JlYWN0LmRldi9lcnJvcnMvXCIgKyBjb2RlO1xuICBpZiAoMSA8IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICB1cmwgKz0gXCI/YXJnc1tdPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1sxXSk7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICB1cmwgKz0gXCImYXJnc1tdPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tpXSk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBcIk1pbmlmaWVkIFJlYWN0IGVycm9yICNcIiArXG4gICAgY29kZSArXG4gICAgXCI7IHZpc2l0IFwiICtcbiAgICB1cmwgK1xuICAgIFwiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5cIlxuICApO1xufVxuZnVuY3Rpb24gbm9vcCgpIHt9XG52YXIgSW50ZXJuYWxzID0ge1xuICAgIGQ6IHtcbiAgICAgIGY6IG5vb3AsXG4gICAgICByOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNTIyKSk7XG4gICAgICB9LFxuICAgICAgRDogbm9vcCxcbiAgICAgIEM6IG5vb3AsXG4gICAgICBMOiBub29wLFxuICAgICAgbTogbm9vcCxcbiAgICAgIFg6IG5vb3AsXG4gICAgICBTOiBub29wLFxuICAgICAgTTogbm9vcFxuICAgIH0sXG4gICAgcDogMCxcbiAgICBmaW5kRE9NTm9kZTogbnVsbFxuICB9LFxuICBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIik7XG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkMShjaGlsZHJlbiwgY29udGFpbmVySW5mbywgaW1wbGVtZW50YXRpb24pIHtcbiAgdmFyIGtleSA9XG4gICAgMyA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10gPyBhcmd1bWVudHNbM10gOiBudWxsO1xuICByZXR1cm4ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IG51bGwgPT0ga2V5ID8gbnVsbCA6IFwiXCIgKyBrZXksXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgIGNvbnRhaW5lckluZm86IGNvbnRhaW5lckluZm8sXG4gICAgaW1wbGVtZW50YXRpb246IGltcGxlbWVudGF0aW9uXG4gIH07XG59XG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPVxuICBSZWFjdC5fX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREU7XG5mdW5jdGlvbiBnZXRDcm9zc09yaWdpblN0cmluZ0FzKGFzLCBpbnB1dCkge1xuICBpZiAoXCJmb250XCIgPT09IGFzKSByZXR1cm4gXCJcIjtcbiAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBpbnB1dClcbiAgICByZXR1cm4gXCJ1c2UtY3JlZGVudGlhbHNcIiA9PT0gaW5wdXQgPyBpbnB1dCA6IFwiXCI7XG59XG5leHBvcnRzLl9fRE9NX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1dBUk5fVVNFUlNfVEhFWV9DQU5OT1RfVVBHUkFERSA9XG4gIEludGVybmFscztcbmV4cG9ydHMuY3JlYXRlUG9ydGFsID0gZnVuY3Rpb24gKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9XG4gICAgMiA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICBpZiAoXG4gICAgIWNvbnRhaW5lciB8fFxuICAgICgxICE9PSBjb250YWluZXIubm9kZVR5cGUgJiZcbiAgICAgIDkgIT09IGNvbnRhaW5lci5ub2RlVHlwZSAmJlxuICAgICAgMTEgIT09IGNvbnRhaW5lci5ub2RlVHlwZSlcbiAgKVxuICAgIHRocm93IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjk5KSk7XG4gIHJldHVybiBjcmVhdGVQb3J0YWwkMShjaGlsZHJlbiwgY29udGFpbmVyLCBudWxsLCBrZXkpO1xufTtcbmV4cG9ydHMuZmx1c2hTeW5jID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBwcmV2aW91c1RyYW5zaXRpb24gPSBSZWFjdFNoYXJlZEludGVybmFscy5ULFxuICAgIHByZXZpb3VzVXBkYXRlUHJpb3JpdHkgPSBJbnRlcm5hbHMucDtcbiAgdHJ5IHtcbiAgICBpZiAoKChSZWFjdFNoYXJlZEludGVybmFscy5UID0gbnVsbCksIChJbnRlcm5hbHMucCA9IDIpLCBmbikpIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIChSZWFjdFNoYXJlZEludGVybmFscy5UID0gcHJldmlvdXNUcmFuc2l0aW9uKSxcbiAgICAgIChJbnRlcm5hbHMucCA9IHByZXZpb3VzVXBkYXRlUHJpb3JpdHkpLFxuICAgICAgSW50ZXJuYWxzLmQuZigpO1xuICB9XG59O1xuZXhwb3J0cy5wcmVjb25uZWN0ID0gZnVuY3Rpb24gKGhyZWYsIG9wdGlvbnMpIHtcbiAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGhyZWYgJiZcbiAgICAob3B0aW9uc1xuICAgICAgPyAoKG9wdGlvbnMgPSBvcHRpb25zLmNyb3NzT3JpZ2luKSxcbiAgICAgICAgKG9wdGlvbnMgPVxuICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBvcHRpb25zXG4gICAgICAgICAgICA/IFwidXNlLWNyZWRlbnRpYWxzXCIgPT09IG9wdGlvbnNcbiAgICAgICAgICAgICAgPyBvcHRpb25zXG4gICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgOiB2b2lkIDApKVxuICAgICAgOiAob3B0aW9ucyA9IG51bGwpLFxuICAgIEludGVybmFscy5kLkMoaHJlZiwgb3B0aW9ucykpO1xufTtcbmV4cG9ydHMucHJlZmV0Y2hETlMgPSBmdW5jdGlvbiAoaHJlZikge1xuICBcInN0cmluZ1wiID09PSB0eXBlb2YgaHJlZiAmJi
1BJbnRlcm5hbHMuZC5EKGhyZWYpO1xufTtcbmV4cG9ydHMucHJlaW5pdCA9IGZ1bmN0aW9uIChocmVmLCBvcHRpb25zKSB7XG4gIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgaHJlZiAmJiBvcHRpb25zICYmIFwic3RyaW5nXCIgPT09IHR5cGVvZiBvcHRpb25zLmFzKSB7XG4gICAgdmFyIGFzID0gb3B0aW9ucy5hcyxcbiAgICAgIGNyb3NzT3JpZ2luID0gZ2V0Q3Jvc3NPcmlnaW5TdHJpbmdBcyhhcywgb3B0aW9ucy5jcm9zc09yaWdpbiksXG4gICAgICBpbnRlZ3JpdHkgPVxuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2Ygb3B0aW9ucy5pbnRlZ3JpdHkgPyBvcHRpb25zLmludGVncml0eSA6IHZvaWQgMCxcbiAgICAgIGZldGNoUHJpb3JpdHkgPVxuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2Ygb3B0aW9ucy5mZXRjaFByaW9yaXR5XG4gICAgICAgICAgPyBvcHRpb25zLmZldGNoUHJpb3JpdHlcbiAgICAgICAgICA6IHZvaWQgMDtcbiAgICBcInN0eWxlXCIgPT09IGFzXG4gICAgICA/IEludGVybmFscy5kLlMoXG4gICAgICAgICAgaHJlZixcbiAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2Ygb3B0aW9ucy5wcmVjZWRlbmNlID8gb3B0aW9ucy5wcmVjZWRlbmNlIDogdm9pZCAwLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNyb3NzT3JpZ2luOiBjcm9zc09yaWdpbixcbiAgICAgICAgICAgIGludGVncml0eTogaW50ZWdyaXR5LFxuICAgICAgICAgICAgZmV0Y2hQcmlvcml0eTogZmV0Y2hQcmlvcml0eVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgOiBcInNjcmlwdFwiID09PSBhcyAmJlxuICAgICAgICBJbnRlcm5hbHMuZC5YKGhyZWYsIHtcbiAgICAgICAgICBjcm9zc09yaWdpbjogY3Jvc3NPcmlnaW4sXG4gICAgICAgICAgaW50ZWdyaXR5OiBpbnRlZ3JpdHksXG4gICAgICAgICAgZmV0Y2hQcmlvcml0eTogZmV0Y2hQcmlvcml0eSxcbiAgICAgICAgICBub25jZTogXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG9wdGlvbnMubm9uY2UgPyBvcHRpb25zLm5vbmNlIDogdm9pZCAwXG4gICAgICAgIH0pO1xuICB9XG59O1xuZXhwb3J0cy5wcmVpbml0TW9kdWxlID0gZnVuY3Rpb24gKGhyZWYsIG9wdGlvbnMpIHtcbiAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBocmVmKVxuICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2Ygb3B0aW9ucyAmJiBudWxsICE9PSBvcHRpb25zKSB7XG4gICAgICBpZiAobnVsbCA9PSBvcHRpb25zLmFzIHx8IFwic2NyaXB0XCIgPT09IG9wdGlvbnMuYXMpIHtcbiAgICAgICAgdmFyIGNyb3NzT3JpZ2luID0gZ2V0Q3Jvc3NPcmlnaW5TdHJpbmdBcyhcbiAgICAgICAgICBvcHRpb25zLmFzLFxuICAgICAgICAgIG9wdGlvbnMuY3Jvc3NPcmlnaW5cbiAgICAgICAgKTtcbiAgICAgICAgSW50ZXJuYWxzLmQuTShocmVmLCB7XG4gICAgICAgICAgY3Jvc3NPcmlnaW46IGNyb3NzT3JpZ2luLFxuICAgICAgICAgIGludGVncml0eTpcbiAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBvcHRpb25zLmludGVncml0eSA/IG9wdGlvbnMuaW50ZWdyaXR5IDogdm9pZCAwLFxuICAgICAgICAgIG5vbmNlOiBcInN0cmluZ1wiID09PSB0eXBlb2Ygb3B0aW9ucy5ub25jZSA/IG9wdGlvbnMubm9uY2UgOiB2b2lkIDBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIG51bGwgPT0gb3B0aW9ucyAmJiBJbnRlcm5hbHMuZC5NKGhyZWYpO1xufTtcbmV4cG9ydHMucHJlbG9hZCA9IGZ1bmN0aW9uIChocmVmLCBvcHRpb25zKSB7XG4gIGlmIChcbiAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgaHJlZiAmJlxuICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBvcHRpb25zICYmXG4gICAgbnVsbCAhPT0gb3B0aW9ucyAmJlxuICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBvcHRpb25zLmFzXG4gICkge1xuICAgIHZhciBhcyA9IG9wdGlvbnMuYXMsXG4gICAgICBjcm9zc09yaWdpbiA9IGdldENyb3NzT3JpZ2luU3RyaW5nQXMoYXMsIG9wdGlvbnMuY3Jvc3NPcmlnaW4pO1xuICAgIEludGVybmFscy5kLkwoaHJlZiwgYXMsIHtcbiAgICAgIGNyb3NzT3JpZ2luOiBjcm9zc09yaWdpbixcbiAgICAgIGludGVncml0eTpcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG9wdGlvbnMuaW50ZWdyaXR5ID8gb3B0aW9ucy5pbnRlZ3JpdHkgOiB2b2lkIDAsXG4gICAgICBub25jZTogXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG9wdGlvbnMubm9uY2UgPyBvcHRpb25zLm5vbmNlIDogdm9pZCAwLFxuICAgICAgdHlwZTogXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG9wdGlvbnMudHlwZSA/IG9wdGlvbnMudHlwZSA6IHZvaWQgMCxcbiAgICAgIGZldGNoUHJpb3JpdHk6XG4gICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBvcHRpb25zLmZldGNoUHJpb3JpdHlcbiAgICAgICAgICA/IG9wdGlvbnMuZmV0Y2hQcmlvcml0eVxuICAgICAgICAgIDogdm9pZCAwLFxuICAgICAgcmVmZXJyZXJQb2xpY3k6XG4gICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBvcHRpb25zLnJlZmVycmVyUG9saWN5XG4gICAgICAgICAgPyBvcHRpb25zLnJlZmVycmVyUG9saWN5XG4gICAgICAgICAgOiB2b2lkIDAsXG4gICAgICBpbWFnZVNyY1NldDpcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG9wdGlvbnMuaW1hZ2VTcmNTZXQgPyBvcHRpb25zLmltYWdlU3JjU2V0IDogdm9pZCAwLFxuICAgICAgaW1hZ2VTaXplczpcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG9wdGlvbnMuaW1hZ2VTaXplcyA/IG9wdGlvbnMuaW1hZ2VTaXplcyA6IHZvaWQgMCxcbiAgICAgIG1lZGlhOiBcInN0cmluZ1wiID09PSB0eXBlb2Ygb3B0aW9ucy5tZWRpYSA/IG9wdGlvbnMubWVkaWEgOiB2b2lkIDBcbiAgICB9KTtcbiAgfVxufTtcbmV4cG9ydHMucHJlbG9hZE1vZHVsZSA9IGZ1bmN0aW9uIChocmVmLCBvcHRpb25zKSB7XG4gIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgaHJlZilcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgdmFyIGNyb3NzT3JpZ2luID0gZ2V0Q3Jvc3NPcmlnaW5TdHJpbmdBcyhvcHRpb25zLmFzLCBvcHRpb25zLmNyb3NzT3JpZ2luKTtcbiAgICAgIEludGVybmFscy5kLm0oaHJlZiwge1xuICAgICAgICBhczpcbiAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2Ygb3B0aW9ucy5hcyAmJiBcInNjcmlwdFwiICE9PSBvcHRpb25zLmFzXG4gICAgICAgICAgICA/IG9wdGlvbnMuYXNcbiAgICAgICAgICAgIDogdm9pZCAwLFxuICAgICAgICBjcm9zc09yaWdpbjogY3Jvc3NPcmlnaW4sXG4gICAgICAgIGludGVncml0eTpcbiAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2Ygb3B0aW9ucy5pbnRlZ3JpdHkgPyBvcHRpb25zLmludGVncml0eSA6IHZvaWQgMFxuICAgICAgfSk7XG4gICAgfSBlbHNlIEludGVybmFscy5kLm0oaHJlZik7XG59O1xuZXhwb3J0cy5yZXF1ZXN0Rm9ybVJlc2V0ID0gZnVuY3Rpb24gKGZvcm0pIHtcbiAgSW50ZXJuYWxzLmQucihmb3JtKTtcbn07XG5leHBvcnRzLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID0gZnVuY3Rpb24gKGZuLCBhKSB7XG4gIHJldHVybi
1BmbihhKTtcbn07XG5leHBvcnRzLnVzZUZvcm1TdGF0ZSA9IGZ1bmN0aW9uIChhY3Rpb24sIGluaXRpYWxTdGF0ZSwgcGVybWFsaW5rKSB7XG4gIHJldHVybiBSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZUZvcm1TdGF0ZShhY3Rpb24sIGluaXRpYWxTdGF0ZSwgcGVybWFsaW5rKTtcbn07XG5leHBvcnRzLnVzZUZvcm1TdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBSZWFjdFNoYXJlZEludGVybmFscy5ILnVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzKCk7XG59O1xuZXhwb3J0cy52ZXJzaW9uID0gXCIxOS4xLjBcIjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4655\n'))},5919:(__unused_webpack_module,exports,__webpack_require__)=>{eval(__webpack_require__.ts('/**\n * @license React\n * scheduler.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\nfunction push(heap, node) {\n  var index = heap.length;\n  heap.push(node);\n  a: for (; 0 < index; ) {\n    var parentIndex = (index - 1) >>> 1,\n      parent = heap[parentIndex];\n    if (0 < compare(parent, node))\n      (heap[parentIndex] = node), (heap[index] = parent), (index = parentIndex);\n    else break a;\n  }\n}\nfunction peek(heap) {\n  return 0 === heap.length ? null : heap[0];\n}\nfunction pop(heap) {\n  if (0 === heap.length) return null;\n  var first = heap[0],\n    last = heap.pop();\n  if (last !== first) {\n    heap[0] = last;\n    a: for (\n      var index = 0, length = heap.length, halfLength = length >>> 1;\n      index < halfLength;\n\n    ) {\n      var leftIndex = 2 * (index + 1) - 1,\n        left = heap[leftIndex],\n        rightIndex = leftIndex + 1,\n        right = heap[rightIndex];\n      if (0 > compare(left, last))\n        rightIndex < length && 0 > compare(right, left)\n          ? ((heap[index] = right),\n            (heap[rightIndex] = last),\n            (index = rightIndex))\n          : ((heap[index] = left),\n            (heap[leftIndex] = last),\n            (index = leftIndex));\n      else if (rightIndex < length && 0 > compare(right, last))\n        (heap[index] = right), (heap[rightIndex] = last), (index = rightIndex);\n      else break a;\n    }\n  }\n  return first;\n}\nfunction compare(a, b) {\n  var diff = a.sortIndex - b.sortIndex;\n  return 0 !== diff ? diff : a.id - b.id;\n}\nexports.unstable_now = void 0;\nif ("object" === typeof performance && "function" === typeof performance.now) {\n  var localPerformance = performance;\n  exports.unstable_now = function () {\n    return localPerformance.now();\n  };\n} else {\n  var localDate = Date,\n    initialTime = localDate.now();\n  exports.unstable_now = function () {\n    return localDate.now() - initialTime;\n  };\n}\nvar taskQueue = [],\n  timerQueue = [],\n  taskIdCounter = 1,\n  currentTask = null,\n  currentPriorityLevel = 3,\n  isPerformingWork = !1,\n  isHostCallbackScheduled = !1,\n  isHostTimeoutScheduled = !1,\n  needsPaint = !1,\n  localSetTimeout = "function" === typeof setTimeout ? setTimeout : null,\n  localClearTimeout = "function" === typeof clearTimeout ? clearTimeout : null,\n  localSetImmediate = "undefined" !== typeof setImmediate ? setImmediate : null;\nfunction advanceTimers(currentTime) {\n  for (var timer = peek(timerQueue); null !== timer; ) {\n    if (null === timer.callback) pop(timerQueue);\n    else if (timer.startTime <= currentTime)\n      pop(timerQueue),\n        (timer.sortIndex = timer.expirationTime),\n        push(taskQueue, timer);\n    else break;\n    timer = peek(timerQueue);\n  }\n}\nfunction handleTimeout(currentTime) {\n  isHostTimeoutScheduled = !1;\n  advanceTimers(currentTime);\n  if (!isHostCallbackScheduled)\n    if (null !== peek(taskQueue))\n      (isHostCallbackScheduled = !0),\n        isMessageLoopRunning ||\n          ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline());\n    else {\n      var firstTimer = peek(timerQueue);\n      null !== firstTimer &&\n        requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n    }\n}\nvar isMessageLoopRunning = !1,\n  taskTimeoutID = -1,\n  frameInterval = 5,\n  startTime = -1;\nfunction shouldYieldToHost() {\n  return needsPaint\n    ? !0\n    : exports.unstable_now() - startTime < frameInterval\n      ? !1\n      : !0;\n}\nfunction performWorkUntilDeadline() {\n  needsPaint = !1;\n  if (isMessageLoopRunning) {\n    var currentTime = exports.unstable_now();\n    startTime = currentTime;\n    var hasMoreWork = !0;\n    try {\n      a: {\n        isHostCallbackScheduled = !1;\n        isHostTimeoutScheduled &&\n          ((isHostTimeoutScheduled = !1),\n          localClearTimeout(taskTimeoutID),\n          (taskTimeoutID = -1));\n        isPerformingWork = !0;\n        var previousPriorityLevel = currentPriorityLevel;\n        try {\n          b: {\n            advanceTimers(currentTime);\n            for (\n              currentTask = peek(taskQueue);\n              null !== currentTask &&\n              !(\n                currentTask.expirationTime > currentTime && shouldYieldToHost()\n              );\n\n            ) {\n              var callback = currentTask.callback;\n              if ("function" === typeof callback) {\n                currentTask.callback = null;\n                currentPriorityLevel = currentTask.priorityLevel;\n                var continuationCallback = callback(\n                  currentTask.expirationTime <= currentTime\n                );\n                currentTime = exports.unstable_now();\n                if ("function" === typeof continuationCallback) {\n                  currentTask.callback = continuationCallback;\n                  advanceTimers(currentTime);\n                  hasMoreWork = !0;\n                  break b;\n                }\n                currentTask === peek(taskQueue) && pop(taskQueue);\n                advanceTimers(currentTime);\n              } else pop(taskQueue);\n              currentTask = peek(taskQueue);\n            }\n            if (null !== currentTask) hasMoreWork = !0;\n            else {\n              var firstTimer = peek(timerQueue);\n              null !== firstTimer &&\n                requestHostTimeout(\n                  handleTimeout,\n                  firstTimer.startTime - currentTime\n                );\n              hasMoreWork = !1;\n            }\n          }\n          break a;\n        } finally {\n          (currentTask = null),\n            (currentPriorityLevel = previousPriorityLevel),\n            (isPerformingWork = !1);\n        }\n        hasMoreWork = void 0;\n      }\n    } finally {\n      hasMoreWork\n        ? schedulePerformWorkUntilDeadline()\n        : (isMessageLoopRunning = !1);\n    }\n  }\n}\nvar schedulePerformWorkUntilDeadline;\nif ("function" === typeof localSetImmediate)\n  schedulePerformWorkUntilDeadline = function () {\n    localSetImmediate(performWorkUntilDeadline);\n  };\nelse if ("undefined" !== typeof MessageChannel) {\n  var channel = new MessageChannel(),\n    port = channel.port2;
1\n  channel.port1.onmessage = performWorkUntilDeadline;\n  schedulePerformWorkUntilDeadline = function () {\n    port.postMessage(null);\n  };\n} else\n  schedulePerformWorkUntilDeadline = function () {\n    localSetTimeout(performWorkUntilDeadline, 0);\n  };\nfunction requestHostTimeout(callback, ms) {\n  taskTimeoutID = localSetTimeout(function () {\n    callback(exports.unstable_now());\n  }, ms);\n}\nexports.unstable_IdlePriority = 5;\nexports.unstable_ImmediatePriority = 1;\nexports.unstable_LowPriority = 4;\nexports.unstable_NormalPriority = 3;\nexports.unstable_Profiling = null;\nexports.unstable_UserBlockingPriority = 2;\nexports.unstable_cancelCallback = function (task) {\n  task.callback = null;\n};\nexports.unstable_forceFrameRate = function (fps) {\n  0 > fps || 125 < fps\n    ? console.error(\n        "forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"\n      )\n    : (frameInterval = 0 < fps ? Math.floor(1e3 / fps) : 5);\n};\nexports.unstable_getCurrentPriorityLevel = function () {\n  return currentPriorityLevel;\n};\nexports.unstable_next = function (eventHandler) {\n  switch (currentPriorityLevel) {\n    case 1:\n    case 2:\n    case 3:\n      var priorityLevel = 3;\n      break;\n    default:\n      priorityLevel = currentPriorityLevel;\n  }\n  var previousPriorityLevel = currentPriorityLevel;\n  currentPriorityLevel = priorityLevel;\n  try {\n    return eventHandler();\n  } finally {\n    currentPriorityLevel = previousPriorityLevel;\n  }\n};\nexports.unstable_requestPaint = function () {\n  needsPaint = !0;\n};\nexports.unstable_runWithPriority = function (priorityLevel, eventHandler) {\n  switch (priorityLevel) {\n    case 1:\n    case 2:\n    case 3:\n    case 4:\n    case 5:\n      break;\n    default:\n      priorityLevel = 3;\n  }\n  var previousPriorityLevel = currentPriorityLevel;\n  currentPriorityLevel = priorityLevel;\n  try {\n    return eventHandler();\n  } finally {\n    currentPriorityLevel = previousPriorityLevel;\n  }\n};\nexports.unstable_scheduleCallback = function (\n  priorityLevel,\n  callback,\n  options\n) {\n  var currentTime = exports.unstable_now();\n  "object" === typeof options && null !== options\n    ? ((options = options.delay),\n      (options =\n        "number" === typeof options && 0 < options\n          ? currentTime + options\n          : currentTime))\n    : (options = currentTime);\n  switch (priorityLevel) {\n    case 1:\n      var timeout = -1;\n      break;\n    case 2:\n      timeout = 250;\n      break;\n    case 5:\n      timeout = 1073741823;\n      break;\n    case 4:\n      timeout = 1e4;\n      break;\n    default:\n      timeout = 5e3;\n  }\n  timeout = options + timeout;\n  priorityLevel = {\n    id: taskIdCounter++,\n    callback: callback,\n    priorityLevel: priorityLevel,\n    startTime: options,\n    expirationTime: timeout,\n    sortIndex: -1\n  };\n  options > currentTime\n    ? ((priorityLevel.sortIndex = options),\n      push(timerQueue, priorityLevel),\n      null === peek(taskQueue) &&\n        priorityLevel === peek(timerQueue) &&\n        (isHostTimeoutScheduled\n          ? (localClearTimeout(taskTimeoutID), (taskTimeoutID = -1))\n          : (isHostTimeoutScheduled = !0),\n        requestHostTimeout(handleTimeout, options - currentTime)))\n    : ((priorityLevel.sortIndex = timeout),\n      push(taskQueue, priorityLevel),\n      isHostCallbackScheduled ||\n        isPerformingWork ||\n        ((isHostCallbackScheduled = !0),\n        isMessageLoopRunning ||\n          ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline())));\n  return priorityLevel;\n};\nexports.unstable_shouldYield = shouldYieldToHost;\nexports.unstable_wrapCallback = function (callback) {\n  var parentPriorityLevel = currentPriorityLevel;\n  return function () {\n    var previousPriorityLevel = currentPriorityLevel;\n    currentPriorityLevel = parentPriorityLevel;\n    try {\n      return callback.apply(this, arguments);\n    } finally {\n      currentPriorityLevel = previousPriorityLevel;\n    }\n  };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkxOS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
1BRWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxZQUFZLFdBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQSxFQUFFLG9CQUFvQjtBQUN0QjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFLG9CQUFvQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxnQkFBZ0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsNkJBQTZCO0FBQzdCLGtDQUFrQztBQUNsQyw0QkFBNEI7QUFDNUIsK0JBQStCO0FBQy9CLDBCQUEwQjtBQUMxQixxQ0FBcUM7QUFDckMsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUIsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5qcz85ZjVkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbmZ1bmN0aW9uIHB1c2goaGVhcCwgbm9kZSkge1xuICB2YXIgaW5kZXggPSBoZWFwLmxlbmd0aDtcbiAgaGVhcC5wdXNoKG5vZGUpO1xuICBhOiBmb3IgKDsgMCA8IGluZGV4OyApIHtcbiAgICB2YXIgcGFyZW50SW5kZXggPSAoaW5kZXggLSAxKSA+Pj4gMSxcbiAgICAgIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuICAgIGlmICgwIDwgY29tcGFyZShwYXJlbnQsIG5vZGUpKVxuICAgICAgKGhlYXBbcGFyZW50SW5kZXhdID0gbm9kZSksIChoZWFwW2luZGV4XSA9IHBhcmVudCksIChpbmRleCA9IHBhcmVudEluZGV4KTtcbiAgICBlbHNlIGJyZWFrIGE7XG4gIH1cbn1cbmZ1bmN0aW9uIHBlZWsoaGVhcCkge1xuICByZXR1cm4gMCA9PT0gaGVhcC5sZW5ndGggPyBudWxsIDogaGVhcFswXTtcbn1cbmZ1bmN0aW9uIHBvcChoZWFwKSB7XG4gIGlmICgwID09PSBoZWFwLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gIHZhciBmaXJzdCA9IGhlYXBbMF0sXG4gICAgbGFzdCA9IGhlYXAucG9wKCk7XG4gIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgIGhlYXBbMF0gPSBsYXN0O1xuICAgIGE6IGZvciAoXG4gICAgICB2Y
1XIgaW5kZXggPSAwLCBsZW5ndGggPSBoZWFwLmxlbmd0aCwgaGFsZkxlbmd0aCA9IGxlbmd0aCA+Pj4gMTtcbiAgICAgIGluZGV4IDwgaGFsZkxlbmd0aDtcblxuICAgICkge1xuICAgICAgdmFyIGxlZnRJbmRleCA9IDIgKiAoaW5kZXggKyAxKSAtIDEsXG4gICAgICAgIGxlZnQgPSBoZWFwW2xlZnRJbmRleF0sXG4gICAgICAgIHJpZ2h0SW5kZXggPSBsZWZ0SW5kZXggKyAxLFxuICAgICAgICByaWdodCA9IGhlYXBbcmlnaHRJbmRleF07XG4gICAgICBpZiAoMCA+IGNvbXBhcmUobGVmdCwgbGFzdCkpXG4gICAgICAgIHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgMCA+IGNvbXBhcmUocmlnaHQsIGxlZnQpXG4gICAgICAgICAgPyAoKGhlYXBbaW5kZXhdID0gcmlnaHQpLFxuICAgICAgICAgICAgKGhlYXBbcmlnaHRJbmRleF0gPSBsYXN0KSxcbiAgICAgICAgICAgIChpbmRleCA9IHJpZ2h0SW5kZXgpKVxuICAgICAgICAgIDogKChoZWFwW2luZGV4XSA9IGxlZnQpLFxuICAgICAgICAgICAgKGhlYXBbbGVmdEluZGV4XSA9IGxhc3QpLFxuICAgICAgICAgICAgKGluZGV4ID0gbGVmdEluZGV4KSk7XG4gICAgICBlbHNlIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIDAgPiBjb21wYXJlKHJpZ2h0LCBsYXN0KSlcbiAgICAgICAgKGhlYXBbaW5kZXhdID0gcmlnaHQpLCAoaGVhcFtyaWdodEluZGV4XSA9IGxhc3QpLCAoaW5kZXggPSByaWdodEluZGV4KTtcbiAgICAgIGVsc2UgYnJlYWsgYTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpcnN0O1xufVxuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIHZhciBkaWZmID0gYS5zb3J0SW5kZXggLSBiLnNvcnRJbmRleDtcbiAgcmV0dXJuIDAgIT09IGRpZmYgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG59XG5leHBvcnRzLnVuc3RhYmxlX25vdyA9IHZvaWQgMDtcbmlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgcGVyZm9ybWFuY2UgJiYgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcGVyZm9ybWFuY2Uubm93KSB7XG4gIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbFBlcmZvcm1hbmNlLm5vdygpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIGxvY2FsRGF0ZSA9IERhdGUsXG4gICAgaW5pdGlhbFRpbWUgPSBsb2NhbERhdGUubm93KCk7XG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCkgLSBpbml0aWFsVGltZTtcbiAgfTtcbn1cbnZhciB0YXNrUXVldWUgPSBbXSxcbiAgdGltZXJRdWV1ZSA9IFtdLFxuICB0YXNrSWRDb3VudGVyID0gMSxcbiAgY3VycmVudFRhc2sgPSBudWxsLFxuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IDMsXG4gIGlzUGVyZm9ybWluZ1dvcmsgPSAhMSxcbiAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSAhMSxcbiAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9ICExLFxuICBuZWVkc1BhaW50ID0gITEsXG4gIGxvY2FsU2V0VGltZW91dCA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHNldFRpbWVvdXQgPyBzZXRUaW1lb3V0IDogbnVsbCxcbiAgbG9jYWxDbGVhclRpbWVvdXQgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjbGVhclRpbWVvdXQgPyBjbGVhclRpbWVvdXQgOiBudWxsLFxuICBsb2NhbFNldEltbWVkaWF0ZSA9IFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBzZXRJbW1lZGlhdGUgPyBzZXRJbW1lZGlhdGUgOiBudWxsO1xuZnVuY3Rpb24gYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSkge1xuICBmb3IgKHZhciB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7IG51bGwgIT09IHRpbWVyOyApIHtcbiAgICBpZiAobnVsbCA9PT0gdGltZXIuY2FsbGJhY2spIHBvcCh0aW1lclF1ZXVlKTtcbiAgICBlbHNlIGlmICh0aW1lci5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUpXG4gICAgICBwb3AodGltZXJRdWV1ZSksXG4gICAgICAgICh0aW1lci5zb3J0SW5kZXggPSB0aW1lci5leHBpcmF0aW9uVGltZSksXG4gICAgICAgIHB1c2godGFza1F1ZXVlLCB0aW1lcik7XG4gICAgZWxzZSBicmVhaztcbiAgICB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoY3VycmVudFRpbWUpIHtcbiAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9ICExO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZClcbiAgICBpZiAobnVsbCAhPT0gcGVlayh0YXNrUXVldWUpKVxuICAgICAgKGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gITApLFxuICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyB8fFxuICAgICAgICAgICgoaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSAhMCksIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCkpO1xuICAgIGVsc2Uge1xuICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuICAgICAgbnVsbCAhPT0gZmlyc3RUaW1lciAmJlxuICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxufVxudmFyIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gITEsXG4gIHRhc2tUaW1lb3V0SUQgPSAtMSxcbiAgZnJhbWVJbnRlcnZhbCA9IDUsXG4gIHN0YXJ0VGltZSA9IC0xO1xuZnVuY3Rpb24gc2hvdWxkWWllbGRUb0hvc3QoKSB7XG4gIHJldHVybiBuZWVkc1BhaW50XG4gICAgPyAhMFxuICAgIDogZXhwb3J0cy51bnN0YWJsZV9ub3coKSAtIHN0YXJ0VGltZSA8IGZyYW1lSW50ZXJ2YWxcbiAgICAgID8gITFcbiAgICAgIDogITA7XG59XG5mdW5jdGlvbiBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUoKSB7XG4gIG5lZWRzUGFpbnQgPSAhMTtcbiAgaWYgKGlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB2YXIgaGFzTW9yZVdvcmsgPSAhMDtcbiAgICB0cnkge1xuICAgICAgYToge1xuICAgICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9ICExO1xuICAgICAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkICYmXG4gICAgICAgICAgKChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gITEpLFxuICAgICAgICAgIGxvY2FsQ2xlYXJUaW1lb3V0KHRhc2tUaW1lb3V0SUQpLFxuICAgICAgICAgICh0YXNrVGltZW91dEl
1EID0gLTEpKTtcbiAgICAgICAgaXNQZXJmb3JtaW5nV29yayA9ICEwO1xuICAgICAgICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYjoge1xuICAgICAgICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudFRhc2sgJiZcbiAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA+IGN1cnJlbnRUaW1lICYmIHNob3VsZFlpZWxkVG9Ib3N0KClcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRUYXNrLmNhbGxiYWNrO1xuICAgICAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IG51bGw7XG4gICAgICAgICAgICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsO1xuICAgICAgICAgICAgICAgIHZhciBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gY29udGludWF0aW9uQ2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgIGhhc01vcmVXb3JrID0gITA7XG4gICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50VGFzayA9PT0gcGVlayh0YXNrUXVldWUpICYmIHBvcCh0YXNrUXVldWUpO1xuICAgICAgICAgICAgICAgIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICB9IGVsc2UgcG9wKHRhc2tRdWV1ZSk7XG4gICAgICAgICAgICAgIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnRUYXNrKSBoYXNNb3JlV29yayA9ICEwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcbiAgICAgICAgICAgICAgbnVsbCAhPT0gZmlyc3RUaW1lciAmJlxuICAgICAgICAgICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChcbiAgICAgICAgICAgICAgICAgIGhhbmRsZVRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaGFzTW9yZVdvcmsgPSAhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAoY3VycmVudFRhc2sgPSBudWxsKSxcbiAgICAgICAgICAgIChjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbCksXG4gICAgICAgICAgICAoaXNQZXJmb3JtaW5nV29yayA9ICExKTtcbiAgICAgICAgfVxuICAgICAgICBoYXNNb3JlV29yayA9IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGFzTW9yZVdvcmtcbiAgICAgICAgPyBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpXG4gICAgICAgIDogKGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gITEpO1xuICAgIH1cbiAgfVxufVxudmFyIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGxvY2FsU2V0SW1tZWRpYXRlKVxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldEltbWVkaWF0ZShwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUpO1xuICB9O1xuZWxzZSBpZiAoXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIE1lc3NhZ2VDaGFubmVsKSB7XG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCksXG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBwb3J0LnBvc3RNZXNzYWdlKG51bGwpO1xuICB9O1xufSBlbHNlXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0VGltZW91dChwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUsIDApO1xuICB9O1xuZnVuY3Rpb24gcmVxdWVzdEhvc3RUaW1lb3V0KGNhbGxiYWNrLCBtcykge1xuICB0YXNrVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayhleHBvcnRzLnVuc3RhYmxlX25vdygpKTtcbiAgfSwgbXMpO1xufVxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSA1O1xuZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSA9IDE7XG5leHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5ID0gNDtcbmV4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHkgPSAzO1xuZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmcgPSBudWxsO1xuZXhwb3J0cy51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG5leHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgdGFzay5jYWxsYmFjayA9IG51bGw7XG59O1xuZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZSA9IGZ1bmN0aW9uIChmcHMpIHtcbiAgMCA+IGZwcyB8fCAxMjUgPCBmcHNcbiAgICA/IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkXCJcbiAgICAgIClcbiAgICA6IChmcmFtZUludGVydmFsID0gMCA8IGZwcyA/IE1hdGguZmxvb3IoMWUzIC8gZnBzKSA6IDUpO1xufTtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybi
1BjdXJyZW50UHJpb3JpdHlMZXZlbDtcbn07XG5leHBvcnRzLnVuc3RhYmxlX25leHQgPSBmdW5jdGlvbiAoZXZlbnRIYW5kbGVyKSB7XG4gIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIDE6XG4gICAgY2FzZSAyOlxuICAgIGNhc2UgMzpcbiAgICAgIHZhciBwcmlvcml0eUxldmVsID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBwcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIH1cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59O1xuZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSBmdW5jdGlvbiAoKSB7XG4gIG5lZWRzUGFpbnQgPSAhMDtcbn07XG5leHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSA9IGZ1bmN0aW9uIChwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSAxOlxuICAgIGNhc2UgMjpcbiAgICBjYXNlIDM6XG4gICAgY2FzZSA0OlxuICAgIGNhc2UgNTpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBwcmlvcml0eUxldmVsID0gMztcbiAgfVxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn07XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoXG4gIHByaW9yaXR5TGV2ZWwsXG4gIGNhbGxiYWNrLFxuICBvcHRpb25zXG4pIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9wdGlvbnMgJiYgbnVsbCAhPT0gb3B0aW9uc1xuICAgID8gKChvcHRpb25zID0gb3B0aW9ucy5kZWxheSksXG4gICAgICAob3B0aW9ucyA9XG4gICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBvcHRpb25zICYmIDAgPCBvcHRpb25zXG4gICAgICAgICAgPyBjdXJyZW50VGltZSArIG9wdGlvbnNcbiAgICAgICAgICA6IGN1cnJlbnRUaW1lKSlcbiAgICA6IChvcHRpb25zID0gY3VycmVudFRpbWUpO1xuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2Y
1XIgdGltZW91dCA9IC0xO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdGltZW91dCA9IDI1MDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIHRpbWVvdXQgPSAxMDczNzQxODIzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgdGltZW91dCA9IDFlNDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aW1lb3V0ID0gNWUzO1xuICB9XG4gIHRpbWVvdXQgPSBvcHRpb25zICsgdGltZW91dDtcbiAgcHJpb3JpdHlMZXZlbCA9IHtcbiAgICBpZDogdGFza0lkQ291bnRlcisrLFxuICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICBwcmlvcml0eUxldmVsOiBwcmlvcml0eUxldmVsLFxuICAgIHN0YXJ0VGltZTogb3B0aW9ucyxcbiAgICBleHBpcmF0aW9uVGltZTogdGltZW91dCxcbiAgICBzb3J0SW5kZXg6IC0xXG4gIH07XG4gIG9wdGlvbnMgPiBjdXJyZW50VGltZVxuICAgID8gKChwcmlvcml0eUxldmVsLnNvcnRJbmRleCA9IG9wdGlvbnMpLFxuICAgICAgcHVzaCh0aW1lclF1ZXVlLCBwcmlvcml0eUxldmVsKSxcbiAgICAgIG51bGwgPT09IHBlZWsodGFza1F1ZXVlKSAmJlxuICAgICAgICBwcmlvcml0eUxldmVsID09PSBwZWVrKHRpbWVyUXVldWUpICYmXG4gICAgICAgIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkXG4gICAgICAgICAgPyAobG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCksICh0YXNrVGltZW91dElEID0gLTEpKVxuICAgICAgICAgIDogKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSAhMCksXG4gICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBvcHRpb25zIC0gY3VycmVudFRpbWUpKSlcbiAgICA6ICgocHJpb3JpdHlMZXZlbC5zb3J0SW5kZXggPSB0aW1lb3V0KSxcbiAgICAgIHB1c2godGFza1F1ZXVlLCBwcmlvcml0eUxldmVsKSxcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkIHx8XG4gICAgICAgIGlzUGVyZm9ybWluZ1dvcmsgfHxcbiAgICAgICAgKChpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9ICEwKSxcbiAgICAgICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgfHxcbiAgICAgICAgICAoKGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gITApLCBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpKSkpO1xuICByZXR1cm4gcHJpb3JpdHlMZXZlbDtcbn07XG5leHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkID0gc2hvdWxkWWllbGRUb0hvc3Q7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgcGFyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICB9XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5919\n'))},7876:(module,__unused_webpack_exports,__webpack_require__)=>{eval(__webpack_require__.ts("\n\nif (true) {\n  module.exports = __webpack_require__(8228);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzg3Ni5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDLEVBQUUsMENBQWlFO0FBQ25FLEVBQUUsS0FBSyxFQUVOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC9qc3gtcnVudGltZS5qcz8yYTIyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7876\n"))},8228:(__unused_webpack_module,exports,__webpack_require__)=>{eval(__webpack_require__.ts('/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\nvar REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"),\n  REACT_FRAGMENT_TYPE = Symbol.for("react.fragment");\nfunction jsxProd(type, config, maybeKey) {\n  var key = null;\n  void 0 !== maybeKey && (key = "" + maybeKey);\n  void 0 !== config.key && (key = "" + config.key);\n  if ("key" in config) {\n    maybeKey = {};\n    for (var propName in config)\n      "key" !== propName && (maybeKey[propName] = config[propName]);\n  } else maybeKey = config;\n  config = maybeKey.ref;\n  return {\n    $$typeof: REACT_ELEMENT_TYPE,\n    type: type,\n    key: key,\n    ref: void 0 !== config ? config : null,\n    props: maybeKey\n  };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIyOC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
1BRWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsV0FBVztBQUNYLFlBQVkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLmpzP2M0YjkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50XCIpLFxuICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpO1xuZnVuY3Rpb24ganN4UHJvZCh0eXBlLCBjb25maWcsIG1heWJlS2V5KSB7XG4gIHZhciBrZXkgPSBudWxsO1xuICB2b2lkIDAgIT09IG1heWJlS2V5ICYmIChrZXkgPSBcIlwiICsgbWF5YmVLZXkpO1xuICB2b2lkIDAgIT09IGNvbmZpZy5rZXkgJiYgKGtleSA9IFwiXCIgKyBjb25maWcua2V5KTtcbiAgaWYgKFwia2V5XCIgaW4gY29uZmlnKSB7XG4gICAgbWF5YmVLZXkgPSB7fTtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBjb25maWcpXG4gICAgICBcImtleVwiICE9PSBwcm9wTmFtZSAmJiAobWF5YmVLZXlbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXSk7XG4gIH0gZWxzZSBtYXliZUtleSA9IGNvbmZpZztcbiAgY29uZmlnID0gbWF5YmVLZXkucmVmO1xuICByZXR1cm4ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHZvaWQgMCAhPT0gY29uZmlnID8gY29uZmlnIDogbnVsbCxcbiAgICBwcm9wczogbWF5YmVLZXlcbiAgfTtcbn1cbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5qc3ggPSBqc3hQcm9kO1xuZXhwb3J0cy5qc3hzID0ganN4UHJvZDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8228\n'))},8477:(module,__unused_webpack_exports,__webpack_require__)=>{eval(__webpack_require__.ts("\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (false) {}\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (true) {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = __webpack_require__(4655);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQ3Ny5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQyxFQUFFLEVBUzFDO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxJQUFxQztBQUN6QztBQUNBO0FBQ0E7QUFDQSxFQUFFLDBDQUF5RDtBQUMzRCxFQUFFLEtBQUssRUFFTiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzPzRmM2UiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBjaGVja0RDRSgpIHtcbiAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuICBpZiAoXG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIFRoaXMgYnJhbmNoIGlzIHVucmVhY2hhYmxlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZFxuICAgIC8vIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgY29uZGl0aW9uIGlzIHRydWUgb25seSBpbiBkZXZlbG9wbWVudC5cbiAgICAvLyBUaGVyZWZvcmUgaWYgdGhlIGJyYW5jaCBpcyBzdGlsbCB
1oZXJlLCBkZWFkIGNvZGUgZWxpbWluYXRpb24gd2Fzbid0XG4gICAgLy8gcHJvcGVybHkgYXBwbGllZC5cbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIG1lc3NhZ2UuIFJlYWN0IERldlRvb2xzIHJlbGllcyBvbiBpdC4gQWxzbyBtYWtlIHN1cmVcbiAgICAvLyB0aGlzIG1lc3NhZ2UgZG9lc24ndCBvY2N1ciBlbHNld2hlcmUgaW4gdGhpcyBmdW5jdGlvbiwgb3IgaXQgd2lsbCBjYXVzZVxuICAgIC8vIGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdeX14nKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb2RlIGFib3ZlIGhhcyBiZWVuIGRlYWQgY29kZSBlbGltaW5hdGVkIChEQ0UnZCkuXG4gICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGNoZWNrRENFKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gRGV2VG9vbHMgc2hvdWxkbid0IGNyYXNoIFJlYWN0LCBubyBtYXR0ZXIgd2hhdC5cbiAgICAvLyBXZSBzaG91bGQgc3RpbGwgcmVwb3J0IGluIGNhc2Ugd2UgYnJlYWsgdGhpcyBjb2RlLlxuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAvLyBEQ0UgY2hlY2sgc2hvdWxkIGhhcHBlbiBiZWZvcmUgUmVhY3RET00gYnVuZGxlIGV4ZWN1dGVzIHNvIHRoYXRcbiAgLy8gRGV2VG9vbHMgY2FuIHJlcG9ydCBiYWQgbWluaWZpY2F0aW9uIGR1cmluZyBpbmplY3Rpb24uXG4gIGNoZWNrRENFKCk7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8477\n"))},8944:(module,__unused_webpack_exports,__webpack_require__)=>{eval(__webpack_require__.ts("\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (false) {}\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (true) {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = __webpack_require__(4279);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODk0NC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQyxFQUFFLEVBUzFDO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxJQUFxQztBQUN6QztBQUNBO0FBQ0E7QUFDQSxFQUFFLDBDQUFnRTtBQUNsRSxFQUFFLEtBQUssRUFFTiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcz8xYzkyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY2hlY2tEQ0UoKSB7XG4gIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbiAgaWYgKFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUaGlzIGJyYW5jaCBpcyB1bnJlYWNoYWJsZSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWRcbiAgICAvLyBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGNvbmRpdGlvbiBpcyB0cnVlIG9ubHkgaW4gZGV2ZWxvcG1lbnQuXG4gICAgLy8gVGhlcmVmb3JlIGlmIHRoZSBicmFuY2ggaXMgc3RpbGwgaGVyZSwgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIHdhc24ndFxuICAgIC8vIHByb3Blcmx5IGFwcGxpZWQuXG4gICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBtZXNzYWdlLiBSZWFjdCBEZXZUb29scyByZWxpZXMgb24gaXQuIEFsc28gbWFrZSBzdXJlXG4gICAgLy8gdGhpcyBtZXNzYWdlIGRvZXNuJ3Qgb2NjdXIgZWxzZXdoZXJlIGluIHRoaXMgZnVuY3Rpb24sIG9yIGl0IHdpbGwgY2F1c2VcbiAgICAvLyBhIGZhbHNlIHBvc2l0aXZlLlxuICAgIHRocm93IG5ldyBFcnJvcignXl9eJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29kZSBhYm92ZSBoYXMgYmVlbiBkZWFkIGNvZGUgZWxpbWluYXRlZCAoRENFJ2QpLlxuICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShjaGVja0RDRSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIERldlRvb2xzIHNob3VsZG4ndCBjcmFzaCBSZWFjdCwgbm8gbWF0dGVyIHdoYXQuXG4gICAgLy8gV2Ugc2hvdWxkIHN0aWxsIHJlcG9ydCBpbiBjYXNlIHdlIGJyZWFrIHRoaXMgY29kZS5cbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gRENFIGNoZWNrIHNob3VsZCBoYXBwZW4gYmVmb3JlIFJlYWN0RE9NIGJ1bmRsZSBleGVjdXRlcyBzbyB0aGF0XG4gIC8vIERldlRvb2xzIGNhbiByZXBvcnQgYmFkIG1pbmlmaWNhdGlvbiBkdXJpbmcgaW5qZWN0aW9uLlxuICBjaGVja0RDRSgpO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS1jbGllbnQucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20tY2xpZW50LmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8944\n"))}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.