(()=>{var __webpack_modules__={342:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";eval('\n;// CONCATENATED MODULE: external "window.wp.element"\nconst external_window_wp_element_namespaceObject = window.wp.element;\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/context.js\n\nconst getDefaultValue = () => ({\n theme_version: \'1.0.0\',\n theme_name: \'Word\'\n});\nconst DashboardContext = (0,external_window_wp_element_namespaceObject.createContext)(getDefaultValue());\nconst Provider = DashboardContext.Provider;\nconst Consumer = DashboardContext.Consumer;\n/* harmony default export */ const context = (DashboardContext);\n;// CONCATENATED MODULE: external "window.wp.i18n"\nconst external_window_wp_i18n_namespaceObject = window.wp.i18n;\n;// CONCATENATED MODULE: external "ctEvents"\nconst external_ctEvents_namespaceObject = ctEvents;\nvar external_ctEvents_default = /*#__PURE__*/__webpack_require__.n(external_ctEvents_namespaceObject);\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/Heading.js\n\n\n\n\n\nconst Heading = () => {\n const {\n theme_name,\n theme_custom_description,\n dashboard_has_heading\n } = (0,external_window_wp_element_namespaceObject.useContext)(context);\n let afterContent = {\n content: null\n };\n external_ctEvents_default().trigger(\'ct:dashboard:heading:after\', afterContent);\n return (0,external_window_wp_element_namespaceObject.createElement)("div", null, (0,external_window_wp_element_namespaceObject.createElement)("h2", {\n onClick: e => e.shiftKey && external_ctEvents_default().trigger(\'ct:dashboard:heading:advanced-click\')\n }, dashboard_has_heading === \'yes\' && (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "35",\n height: "35",\n viewBox: "0 0 50 50",\n xmlns: "http://www.w3.org/2000/svg"\n }, (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M25 0c13.807 0 25 11.193 25 25S38.807 50 25 50 0 38.807 0 25 11.193 0 25 0zm5.469 25.701a.246.246 0 00-.332 0L19.36 35.812c-.073.07-.021.188.083.188h10.085a.486.486 0 00.331-.129l4.73-4.438c.548-.515.548-1.351 0-1.867zm0-11a.246.246 0 00-.332 0l-12 11.259a.427.427 0 00-.137.311v8.374c0 .098.126.147.2.078l15.551-14.666c.55-.516.55-1.748 0-2.264zM28.279 14H18.233c-.129 0-.234.099-.234.22v9.425c0 .098.126.148.2.078l10.161-9.535c.074-.07.022-.188-.083-.188z",\n fill: "#23282D",\n "fill-rule": "evenodd"\n })), theme_name, dashboard_has_heading === \'yes\' && afterContent.content), (0,external_window_wp_element_namespaceObject.createElement)("p", null, theme_custom_description || (0,external_window_wp_i18n_namespaceObject.__)(\'The most innovative, intuitive and lightning fast WordPress theme. Build your next web project visually, in no time.\', \'blocksy\')));\n};\n\n/* harmony default export */ const js_Heading = (Heading);\n// EXTERNAL MODULE: external "React"\nvar external_React_ = __webpack_require__(363);\nvar external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);\n// EXTERNAL MODULE: ./node_modules/invariant/browser.js\nvar browser = __webpack_require__(143);\nvar browser_default = /*#__PURE__*/__webpack_require__.n(browser);\n// EXTERNAL MODULE: ./node_modules/create-react-context/lib/index.js\nvar lib = __webpack_require__(404);\nvar lib_default = /*#__PURE__*/__webpack_require__.n(lib);\n;// CONCATENATED MODULE: ./node_modules/react-lifecycles-compat/react-lifecycles-compat.es.js\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\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\nfunction componentWillMount() {\n // Call this.constructor.gDSFP to support sub-classes.\n var state = this.constructor.getDerivedStateFromProps(this.props, this.state);\n if (state !== null && state !== undefined) {\n this.setState(state);\n }\n}\n\nfunction componentWillReceiveProps(nextProps) {\n // Call this.constructor.gDSFP to support sub-classes.\n // Use the setState() updater to ensure state isn\'t stale in certain edge cases.\n function updater(prevState) {\n var state = this.constructor.getDerivedStateFromProps(nextProps, prevState);\n return state !== null && state !== undefined ? state : null;\n }\n // Binding "this" is important for shallow renderer support.\n this.setState(updater.bind(this));\n}\n\nfunction componentWillUpdate(nextProps, nextState) {\n try {\n var prevProps = this.props;\n var prevState = this.state;\n this.props = nextProps;\n this.state = nextState;\n this.__reactInternalSnapshotFlag = true;\n this.__reactInternalSnapshot = this.getSnapshotBeforeUpdate(\n prevProps,\n prevState\n );\n } finally {\n this.props = prevProps;\n this.state = prevState;\n }\n}\n\n// React may warn about cWM/cWRP/cWU methods being deprecated.\n// Add a flag to suppress these warnings for this special case.\ncomponentWillMount.__suppressDeprecationWarning = true;\ncomponentWillReceiveProps.__suppressDeprecationWarning = true;\ncomponentWillUpdate.__suppressDeprecationWarning = true;\n\nfunction polyfill(Component) {\n var prototype = Component.prototype;\n\n if (!prototype || !prototype.isReactComponent) {\n throw new Error(\'Can only polyfill class components\');\n }\n\n if (\n typeof Component.getDerivedStateFromProps !== \'function\' &&\n typeof prototype.getSnapshotBeforeUpdate !== \'function\'\n ) {\n return Component;\n }\n\n // If new component APIs are defined, "unsafe" lifecycles won\'t be called.\n // Error if any of these lifecycles are present,\n // Because they would work differently between older and newer (16.3+) versions of React.\n var foundWillMountName = null;\n var foundWillReceivePropsName = null;\n var foundWillUpdateName = null;\n if (typeof prototype.componentWillMount === \'function\') {\n foundWillMountName = \'componentWillMount\';\n } else if (typeof prototype.UNSAFE_componentWillMount === \'function\') {\n foundWillMountName = \'UNSAFE_componentWillMount\';\n }\n if (typeof prototype.componentWillReceiveProps === \'function\') {\n foundWillReceivePropsName = \'componentWillReceiveProps\';\n } else if (typeof prototype.UNSAFE_componentWillReceiveProps === \'function\') {\n foundWillReceivePropsName = \'UNSAFE_componentWillReceiveProps\';\n }\n if (typeof prototype.componentWillUpdate === \'function\') {\n foundWillUpdateName = \'componentWillUpdate\';\n } else if (typeof prototype.UNSAFE_componentWillUpdate === \'function\') {\n foundWillUpdateName = \'UNSAFE_componentWillUpdate\';\n }\n if (\n foundWillMountName !== null ||\n foundWillReceivePropsName !== null ||\n foundWillUpdateName !== null\n ) {\n var componentName = Component.displayName || Component.name;\n var newApiName =\n typeof Component.getDerivedStateFromProps === \'function\'\n ? \'getDerivedStateFromProps()\'\n : \'getSnapshotBeforeUpdate()\';\n\n throw Error(\n \'Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n\' +\n componentName +\n \' uses \' +\n newApiName +\n \' but also contains the following legacy lifecycles:\' +\n (foundWillMountName !== null ? \'\\n \' + foundWillMountName : \'\') +\n (foundWillReceivePropsName !== null\n ? \'\\n \' + foundWillReceivePropsName\n : \'\') +\n (foundWillUpdateName !== null ? \'\\n \' + foundWillUpdateName : \'\') +\n \'\\n\\nThe above lifecycles should be removed. Learn more about this warning here:\\n\' +\n \'https://fb.me/react-async-component-lifecycle-hooks\'\n );\n }\n\n // React <= 16.2 does not support static getDerivedStateFromProps.\n // As a workaround, use cWM and cWRP to invoke the new static lifecycle.\n // Newer versions of React will ignore these lifecycles if gDSFP exists.\n if (typeof Component.getDerivedStateFromProps === \'function\') {\n prototype.componentWillMount = componentWillMount;\n prototype.componentWillReceiveProps = componentWillReceiveProps;\n }\n\n // React <= 16.2 does not support getSnapshotBeforeUpdate.\n // As a workaround, use cWU to invoke the new lifecycle.\n // Newer versions of React will ignore that lifecycle if gSBU exists.\n if (typeof prototype.getSnapshotBeforeUpdate === \'function\') {\n if (typeof prototype.componentDidUpdate !== \'function\') {\n throw new Error(\n \'Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype\'\n );\n }\n\n prototype.componentWillUpdate = componentWillUpdate;\n\n var componentDidUpdate = prototype.componentDidUpdate;\n\n prototype.componentDidUpdate = function componentDidUpdatePolyfill(\n prevProps,\n prevState,\n maybeSnapshot\n ) {\n // 16.3+ will not execute our will-update method;\n // It will pass a snapshot value to did-update though.\n // Older versions will require our polyfilled will-update value.\n // We need to handle both cases, but can\'t just check for the presence of "maybeSnapshot",\n // Because for <= 15.x versions this might be a "prevContext" object.\n // We also can\'t just check "__reactInternalSnapshot",\n // Because get-snapshot might return a falsy value.\n // So check for the explicit __reactInternalSnapshotFlag flag to determine behavior.\n var snapshot = this.__reactInternalSnapshotFlag\n ? this.__reactInternalSnapshot\n : maybeSnapshot;\n\n componentDidUpdate.call(this, prevProps, prevState, snapshot);\n };\n }\n\n return Component;\n}\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@reach/router/es/lib/utils.js\n\n\n////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\nvar startsWith = function startsWith(string, search) {\n return string.substr(0, search.length) === search;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n// static > dynamic > splat > root\n//\n// This way we don\'t have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split("?"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === "";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || "*";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join("/");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? false ? 0 : browser_default()(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don\'t match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: "/" + uriSegments.slice(0, index).join("/")\n };\n break;\n }\n }\n\n return match || default_ || null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\nvar utils_match = function match(path, uri) {\n return pick([{ path: path }], uri);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be "in a directory"\n// you can be "at a file", too. For example\n//\n// browserSpecResolve(\'foo\', \'/bar/\') => /bar/foo\n// browserSpecResolve(\'foo\', \'/bar\') => /foo\n//\n// But on the command line of a file system, it\'s not as complicated, you can\'t\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// \n// // instead of\n// \n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\nvar utils_resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, "/")) {\n return to;\n }\n\n var _to$split = to.split("?"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split("?"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname);\n\n // ?a=b, /users?b=c => /users?a=b\n if (toSegments[0] === "") {\n return addQuery(basePathname, toQuery);\n }\n\n // profile, /users/789 => /users/789/profile\n if (!startsWith(toSegments[0], ".")) {\n var pathname = baseSegments.concat(toSegments).join("/");\n return addQuery((basePathname === "/" ? "" : "/") + pathname, toQuery);\n }\n\n // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === "..") segments.pop();else if (segment !== ".") segments.push(segment);\n }\n\n return addQuery("/" + segments.join("/"), toQuery);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split("?"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? "" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = "/" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join("/");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? "" : _params$location$sear;\n\n var searchSplit = search.split("?")[1] || "";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n var fromString = segmentize(from).filter(filter).sort().join("/");\n var toString = segmentize(to).filter(filter).sort().join("/");\n return fromString === toString;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar paramRe = /^:(.+)/;\n\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === "";\n};\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === "*";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return { route: route, score: score, index: index };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri\n // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, "").split("/");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? "?" + query.join("&") : "");\n};\n\nvar reservedNames = ["uri", "path"];\n\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n};\n\n////////////////////////////////////////////////////////////////////////////////\n\n;// CONCATENATED MODULE: ./node_modules/@reach/router/es/lib/history.js\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || "initial"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({ location: location, action: "POP" });\n };\n\n source.addEventListener("popstate", popstateListener);\n\n return function () {\n source.removeEventListener("popstate", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === "number") {\n source.history.go(to);\n } else {\n state = _extends({}, state, { key: Date.now() + "" });\n // try...catch iOS Safari limits to 100 pushState calls\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? "replace" : "assign"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({ location: location, action: "PUSH" });\n });\n return transition;\n }\n };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "/";\n\n var searchIndex = initialPath.indexOf("?");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : ""\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n\n return {\n get location() {\n return stack[index];\n },\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n\n history: {\n get entries() {\n return stack;\n },\n get index() {\n return index;\n },\n get state() {\n return states[index];\n },\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split("?"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? "" : _uri$split$;\n\n index++;\n stack.push({ pathname: pathname, search: search.length ? "?" + search : search });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split("?"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? "" : _uri$split2$;\n\n stack[index] = { pathname: pathname, search: search };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\nvar canUseDOM = !!(typeof window !== "undefined" && window.document && window.document.createElement);\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar history_navigate = globalHistory.navigate;\n\n////////////////////////////////////////////////////////////////////////////////\n\n\n;// CONCATENATED MODULE: ./node_modules/@reach/router/es/index.js\nvar es_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/* eslint-disable jsx-a11y/anchor-has-content */\n\n\n\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n var Ctx = lib_default()(defaultValue);\n Ctx.displayName = name;\n return Ctx;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\nvar LocationContext = createNamedContext("Location");\n\n// sets up a listener if there isn\'t one already so apps don\'t need to be\n// wrapped in some top level provider\nvar es_Location = function Location(_ref) {\n var children = _ref.children;\n return external_React_default().createElement(\n LocationContext.Consumer,\n null,\n function (context) {\n return context ? children(context) : external_React_default().createElement(\n LocationProvider,\n null,\n children\n );\n }\n );\n};\n\nvar LocationProvider = function (_React$Component) {\n _inherits(LocationProvider, _React$Component);\n\n function LocationProvider() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, LocationProvider);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n context: _this.getContext(),\n refs: { unlisten: null }\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n LocationProvider.prototype.getContext = function getContext() {\n var _props$history = this.props.history,\n navigate = _props$history.navigate,\n location = _props$history.location;\n\n return { navigate: navigate, location: location };\n };\n\n LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n if (isRedirect(error)) {\n var _navigate = this.props.history.navigate;\n\n _navigate(error.uri, { replace: true });\n } else {\n throw error;\n }\n };\n\n LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevState.context.location !== this.state.context.location) {\n this.props.history._onTransitionComplete();\n }\n };\n\n LocationProvider.prototype.componentDidMount = function componentDidMount() {\n var _this2 = this;\n\n var refs = this.state.refs,\n history = this.props.history;\n\n history._onTransitionComplete();\n refs.unlisten = history.listen(function () {\n Promise.resolve().then(function () {\n // TODO: replace rAF with react deferred update API when it\'s ready https://github.com/facebook/react/issues/13306\n requestAnimationFrame(function () {\n if (!_this2.unmounted) {\n _this2.setState(function () {\n return { context: _this2.getContext() };\n });\n }\n });\n });\n });\n };\n\n LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n var refs = this.state.refs;\n\n this.unmounted = true;\n refs.unlisten();\n };\n\n LocationProvider.prototype.render = function render() {\n var context = this.state.context,\n children = this.props.children;\n\n return external_React_default().createElement(\n LocationContext.Provider,\n { value: context },\n typeof children === "function" ? children(context) : children || null\n );\n };\n\n return LocationProvider;\n}((external_React_default()).Component);\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n history: globalHistory\n};\n false ? 0 : void 0;\nvar ServerLocation = function ServerLocation(_ref2) {\n var url = _ref2.url,\n children = _ref2.children;\n\n var searchIndex = url.indexOf("?");\n var searchExists = searchIndex > -1;\n var pathname = void 0;\n var search = "";\n var hash = "";\n\n if (searchExists) {\n pathname = url.substring(0, searchIndex);\n search = url.substring(searchIndex);\n } else {\n pathname = url;\n }\n\n return React.createElement(\n LocationContext.Provider,\n {\n value: {\n location: {\n pathname: pathname,\n search: search,\n hash: hash\n },\n navigate: function navigate() {\n throw new Error("You can\'t call navigate on the server.");\n }\n }\n },\n children\n );\n};\n////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\nvar BaseContext = createNamedContext("Base", { baseuri: "/", basepath: "/" });\n\n////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\nvar es_Router = function Router(props) {\n return external_React_default().createElement(\n BaseContext.Consumer,\n null,\n function (baseContext) {\n return external_React_default().createElement(\n es_Location,\n null,\n function (locationContext) {\n return external_React_default().createElement(RouterImpl, es_extends({}, baseContext, locationContext, props));\n }\n );\n }\n );\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n _inherits(RouterImpl, _React$PureComponent);\n\n function RouterImpl() {\n _classCallCheck(this, RouterImpl);\n\n return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n }\n\n RouterImpl.prototype.render = function render() {\n var _props = this.props,\n location = _props.location,\n _navigate2 = _props.navigate,\n basepath = _props.basepath,\n primary = _props.primary,\n children = _props.children,\n baseuri = _props.baseuri,\n _props$component = _props.component,\n component = _props$component === undefined ? "div" : _props$component,\n domProps = _objectWithoutProperties(_props, ["location", "navigate", "basepath", "primary", "children", "baseuri", "component"]);\n\n var routes = external_React_default().Children.toArray(children).reduce(function (array, child) {\n var routes = createRoute(basepath)(child);\n return array.concat(routes);\n }, []);\n var pathname = location.pathname;\n\n\n var match = pick(routes, pathname);\n\n if (match) {\n var params = match.params,\n uri = match.uri,\n route = match.route,\n element = match.route.value;\n\n // remove the /* from the end for child routes relative paths\n\n basepath = route.default ? basepath : route.path.replace(/\\*$/, "");\n\n var props = es_extends({}, params, {\n uri: uri,\n location: location,\n navigate: function navigate(to, options) {\n return _navigate2(utils_resolve(to, uri), options);\n }\n });\n\n var clone = external_React_default().cloneElement(element, props, element.props.children ? external_React_default().createElement(\n es_Router,\n { location: location, primary: primary },\n element.props.children\n ) : undefined);\n\n // using \'div\' for < 16.3 support\n var FocusWrapper = primary ? FocusHandler : component;\n // don\'t pass any props to \'div\'\n var wrapperProps = primary ? es_extends({ uri: uri, location: location, component: component }, domProps) : domProps;\n\n return external_React_default().createElement(\n BaseContext.Provider,\n { value: { baseuri: uri, basepath: basepath } },\n external_React_default().createElement(\n FocusWrapper,\n wrapperProps,\n clone\n )\n );\n } else {\n // Not sure if we want this, would require index routes at every level\n // warning(\n // false,\n // `\\n\\nNothing matched:\\n\\t${\n // location.pathname\n // }\\n\\nPaths checked: \\n\\t${routes\n // .map(route => route.path)\n // .join(\n // "\\n\\t"\n // )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n // \\n\\tlet NotFound = () =>
Not Found!
\n // \\n\\t\\n\\t \\n\\t {/* ... */}\\n\\t`\n // );\n return null;\n }\n };\n\n return RouterImpl;\n}((external_React_default()).PureComponent);\n\nRouterImpl.defaultProps = {\n primary: true\n};\n\n\nvar FocusContext = createNamedContext("Focus");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n var uri = _ref3.uri,\n location = _ref3.location,\n component = _ref3.component,\n domProps = _objectWithoutProperties(_ref3, ["uri", "location", "component"]);\n\n return external_React_default().createElement(\n FocusContext.Consumer,\n null,\n function (requestFocus) {\n return external_React_default().createElement(FocusHandlerImpl, es_extends({}, domProps, {\n component: component,\n requestFocus: requestFocus,\n uri: uri,\n location: location\n }));\n }\n );\n};\n\n// don\'t focus on initial render\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n _inherits(FocusHandlerImpl, _React$Component2);\n\n function FocusHandlerImpl() {\n var _temp2, _this4, _ret2;\n\n _classCallCheck(this, FocusHandlerImpl);\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n if (!_this4.state.shouldFocus && node) {\n node.focus();\n }\n }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n }\n\n FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n var initial = prevState.uri == null;\n if (initial) {\n return es_extends({\n shouldFocus: true\n }, nextProps);\n } else {\n var myURIChanged = nextProps.uri !== prevState.uri;\n var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n return es_extends({\n shouldFocus: myURIChanged || navigatedUpToMe\n }, nextProps);\n }\n };\n\n FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n focusHandlerCount++;\n this.focus();\n };\n\n FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n focusHandlerCount--;\n if (focusHandlerCount === 0) {\n initialRender = true;\n }\n };\n\n FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n this.focus();\n }\n };\n\n FocusHandlerImpl.prototype.focus = function focus() {\n if (false) {}\n\n var requestFocus = this.props.requestFocus;\n\n\n if (requestFocus) {\n requestFocus(this.node);\n } else {\n if (initialRender) {\n initialRender = false;\n } else if (this.node) {\n // React polyfills [autofocus] and it fires earlier than cDM,\n // so we were stealing focus away, this line prevents that.\n if (!this.node.contains(document.activeElement)) {\n this.node.focus();\n }\n }\n }\n };\n\n FocusHandlerImpl.prototype.render = function render() {\n var _this5 = this;\n\n var _props2 = this.props,\n children = _props2.children,\n style = _props2.style,\n requestFocus = _props2.requestFocus,\n _props2$component = _props2.component,\n Comp = _props2$component === undefined ? "div" : _props2$component,\n uri = _props2.uri,\n location = _props2.location,\n domProps = _objectWithoutProperties(_props2, ["children", "style", "requestFocus", "component", "uri", "location"]);\n\n return external_React_default().createElement(\n Comp,\n es_extends({\n style: es_extends({ outline: "none" }, style),\n tabIndex: "-1",\n ref: function ref(n) {\n return _this5.node = n;\n }\n }, domProps),\n external_React_default().createElement(\n FocusContext.Provider,\n { value: this.requestFocus },\n this.props.children\n )\n );\n };\n\n return FocusHandlerImpl;\n}((external_React_default()).Component);\n\npolyfill(FocusHandlerImpl);\n\nvar k = function k() {};\n\n////////////////////////////////////////////////////////////////////////////////\nvar forwardRef = (external_React_default()).forwardRef;\n\nif (typeof forwardRef === "undefined") {\n forwardRef = function forwardRef(C) {\n return C;\n };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n var innerRef = _ref4.innerRef,\n props = _objectWithoutProperties(_ref4, ["innerRef"]);\n\n return external_React_default().createElement(\n BaseContext.Consumer,\n null,\n function (_ref5) {\n var basepath = _ref5.basepath,\n baseuri = _ref5.baseuri;\n return external_React_default().createElement(\n es_Location,\n null,\n function (_ref6) {\n var location = _ref6.location,\n navigate = _ref6.navigate;\n\n var to = props.to,\n state = props.state,\n replace = props.replace,\n _props$getProps = props.getProps,\n getProps = _props$getProps === undefined ? k : _props$getProps,\n anchorProps = _objectWithoutProperties(props, ["to", "state", "replace", "getProps"]);\n\n var href = utils_resolve(to, baseuri);\n var encodedHref = encodeURI(href);\n var isCurrent = location.pathname === encodedHref;\n var isPartiallyCurrent = startsWith(location.pathname, encodedHref);\n\n return external_React_default().createElement("a", es_extends({\n ref: ref || innerRef,\n "aria-current": isCurrent ? "page" : undefined\n }, anchorProps, getProps({ isCurrent: isCurrent, isPartiallyCurrent: isPartiallyCurrent, href: href, location: location }), {\n href: href,\n onClick: function onClick(event) {\n if (anchorProps.onClick) anchorProps.onClick(event);\n if (shouldNavigate(event)) {\n event.preventDefault();\n var shouldReplace = replace;\n if (typeof replace !== "boolean" && isCurrent) {\n var _location$state = es_extends({}, location.state),\n key = _location$state.key,\n restState = _objectWithoutProperties(_location$state, ["key"]);\n\n shouldReplace = shallowCompare(es_extends({}, state), restState);\n }\n navigate(href, {\n state: state,\n replace: shouldReplace\n });\n }\n }\n }));\n }\n );\n }\n );\n});\n\nLink.displayName = "Link";\n\n false ? 0 : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nfunction RedirectRequest(uri) {\n this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n _inherits(RedirectImpl, _React$Component3);\n\n function RedirectImpl() {\n _classCallCheck(this, RedirectImpl);\n\n return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n }\n\n // Support React < 16 with this hook\n RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n var _props3 = this.props,\n navigate = _props3.navigate,\n to = _props3.to,\n from = _props3.from,\n _props3$replace = _props3.replace,\n replace = _props3$replace === undefined ? true : _props3$replace,\n state = _props3.state,\n noThrow = _props3.noThrow,\n baseuri = _props3.baseuri,\n props = _objectWithoutProperties(_props3, ["navigate", "to", "from", "replace", "state", "noThrow", "baseuri"]);\n\n Promise.resolve().then(function () {\n var resolvedTo = utils_resolve(to, baseuri);\n navigate(insertParams(resolvedTo, props), { replace: replace, state: state });\n });\n };\n\n RedirectImpl.prototype.render = function render() {\n var _props4 = this.props,\n navigate = _props4.navigate,\n to = _props4.to,\n from = _props4.from,\n replace = _props4.replace,\n state = _props4.state,\n noThrow = _props4.noThrow,\n baseuri = _props4.baseuri,\n props = _objectWithoutProperties(_props4, ["navigate", "to", "from", "replace", "state", "noThrow", "baseuri"]);\n\n var resolvedTo = utils_resolve(to, baseuri);\n if (!noThrow) redirectTo(insertParams(resolvedTo, props));\n return null;\n };\n\n return RedirectImpl;\n}((external_React_default()).Component);\n\nvar Redirect = function Redirect(props) {\n return external_React_default().createElement(\n BaseContext.Consumer,\n null,\n function (_ref7) {\n var baseuri = _ref7.baseuri;\n return external_React_default().createElement(\n es_Location,\n null,\n function (locationContext) {\n return external_React_default().createElement(RedirectImpl, es_extends({}, locationContext, { baseuri: baseuri }, props));\n }\n );\n }\n );\n};\n\n false ? 0 : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nvar Match = function Match(_ref8) {\n var path = _ref8.path,\n children = _ref8.children;\n return external_React_default().createElement(\n BaseContext.Consumer,\n null,\n function (_ref9) {\n var baseuri = _ref9.baseuri;\n return external_React_default().createElement(\n es_Location,\n null,\n function (_ref10) {\n var navigate = _ref10.navigate,\n location = _ref10.location;\n\n var resolvedPath = utils_resolve(path, baseuri);\n var result = utils_match(resolvedPath, location.pathname);\n return children({\n navigate: navigate,\n location: location,\n match: result ? es_extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null\n });\n }\n );\n }\n );\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\nvar useLocation = function useLocation() {\n var context = useContext(LocationContext);\n\n if (!context) {\n throw new Error("useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n var context = useContext(LocationContext);\n\n if (!context) {\n throw new Error("useNavigate hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n return context.navigate;\n};\n\nvar useParams = function useParams() {\n var context = useContext(BaseContext);\n\n if (!context) {\n throw new Error("useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n var location = useLocation();\n\n var results = match(context.basepath, location.pathname);\n\n return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n if (!path) {\n throw new Error("useMatch(path: string) requires an argument of a string to match against");\n }\n var context = useContext(BaseContext);\n\n if (!context) {\n throw new Error("useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n var location = useLocation();\n\n var resolvedPath = resolve(path, context.baseuri);\n var result = match(resolvedPath, location.pathname);\n return result ? es_extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar stripSlashes = function stripSlashes(str) {\n return str.replace(/(^\\/+|\\/+$)/g, "");\n};\n\nvar createRoute = function createRoute(basepath) {\n return function (element) {\n if (!element) {\n return null;\n }\n\n if (element.type === (external_React_default()).Fragment && element.props.children) {\n return external_React_default().Children.map(element.props.children, createRoute(basepath));\n }\n !(element.props.path || element.props.default || element.type === Redirect) ? false ? 0 : browser_default()(false) : void 0;\n\n !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? false ? 0 : browser_default()(false) : void 0;\n\n !!(element.type === Redirect && !validateRedirect(element.props.from, element.props.to)) ? false ? 0 : browser_default()(false) : void 0;\n\n if (element.props.default) {\n return { value: element, default: true };\n }\n\n var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n\n var path = elementPath === "/" ? basepath : stripSlashes(basepath) + "/" + stripSlashes(elementPath);\n\n return {\n value: element,\n default: element.props.default,\n path: element.props.children ? stripSlashes(path) + "/*" : path\n };\n };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n};\n\n////////////////////////////////////////////////////////////////////////\n\n// EXTERNAL MODULE: ./node_modules/react-spring/renderprops.js\nvar renderprops = __webpack_require__(823);\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/Navigation.js\nconst _excluded = ["path", "text"],\n _excluded2 = ["path", "text"];\n\nfunction Navigation_extends() { Navigation_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return Navigation_extends.apply(this, arguments); }\n\nfunction Navigation_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\nconst Navigation = () => {\n const userNavigationLinks = [];\n const endUserNavigationLinks = [];\n const {\n theme_version\n } = (0,external_window_wp_element_namespaceObject.useContext)(context);\n external_ctEvents_default().trigger(\'ct:dashboard:navigation-links\', userNavigationLinks);\n external_ctEvents_default().trigger(\'ct:dashboard:end-navigation-links\', endUserNavigationLinks);\n let hasPlugins = !ctDashboardLocalizations.plugin_data.hide_plugins_tab;\n return (0,external_window_wp_element_namespaceObject.createElement)("ul", {\n className: "dashboard-navigation"\n }, (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)(Link, {\n to: "/"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Home\', \'blocksy\'))), userNavigationLinks.map(_ref => {\n let {\n path,\n text\n } = _ref,\n props = Navigation_objectWithoutProperties(_ref, _excluded);\n\n return (0,external_window_wp_element_namespaceObject.createElement)("li", {\n key: path\n }, (0,external_window_wp_element_namespaceObject.createElement)(Link, Navigation_extends({\n to: path\n }, props), text));\n }), !ctDashboardLocalizations.plugin_data.hide_plugins_tab && (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)(Link, {\n to: "/plugins"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Useful Plugins\', \'blocksy\'))), !ctDashboardLocalizations.plugin_data.hide_changelogs_tab && (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)(Link, {\n to: "/changelog"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Changelog\', \'blocksy\'), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "ct-version"\n }, theme_version))), (!ctDashboardLocalizations.plugin_data || !ctDashboardLocalizations.plugin_data.is_pro) && (0,external_window_wp_element_namespaceObject.createElement)("li", {\n className: "ct-pro-tab"\n }, (0,external_window_wp_element_namespaceObject.createElement)(Link, {\n to: "/pro"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Free vs Pro\', \'blocksy\'))), endUserNavigationLinks.map(_ref2 => {\n let {\n path,\n text\n } = _ref2,\n props = Navigation_objectWithoutProperties(_ref2, _excluded2);\n\n return (0,external_window_wp_element_namespaceObject.createElement)("li", {\n key: path\n }, (0,external_window_wp_element_namespaceObject.createElement)(Link, Navigation_extends({\n to: path\n }, props), text));\n }));\n};\n\n/* harmony default export */ const js_Navigation = (Navigation);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/components/SubmitSupport.js\n\n\n\n\nconst SubmitSupport = () => {\n if (ctDashboardLocalizations.plugin_data.hide_support_section) {\n return null;\n }\n\n return (0,external_window_wp_element_namespaceObject.createElement)("div", {\n className: "ct-support-container"\n }, (0,external_window_wp_element_namespaceObject.createElement)("h2", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Need help or advice?\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("p", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Got a question or need help with the theme? You can always submit a support ticket or ask for help in our friendly Facebook community.\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n href: ctDashboardLocalizations.support_url,\n className: "ct-button",\n "data-hover": "blue",\n target: "_blank"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Submit a Support Ticket\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n href: "https://www.facebook.com/groups/blocksy.community",\n className: "ct-button",\n "data-hover": "blue",\n target: "_blank"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Join Facebook Community\', \'blocksy\')));\n};\n\n/* harmony default export */ const components_SubmitSupport = (SubmitSupport);\n;// CONCATENATED MODULE: external "jQuery"\nconst external_jQuery_namespaceObject = jQuery;\nvar external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_namespaceObject);\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/screens/Home.js\n\n\n\n\n\n\n\nconst Home = () => {\n const {\n is_companion_active,\n companion_download_link,\n child_download_link\n } = (0,external_window_wp_element_namespaceObject.useContext)(context);\n let beforeContent = {\n content: null\n };\n let afterContent = {\n content: null\n };\n const [isLoading, setIsLoading] = (0,external_window_wp_element_namespaceObject.useState)(false);\n const [customStatus, setCustomStatus] = (0,external_window_wp_element_namespaceObject.useState)(false);\n external_ctEvents_default().trigger(\'ct:dashboard:home:before\', beforeContent);\n external_ctEvents_default().trigger(\'ct:dashboard:home:after\', afterContent);\n const finalStatus = customStatus || is_companion_active;\n return (0,external_window_wp_element_namespaceObject.createElement)("section", null, beforeContent.content, (0,external_window_wp_element_namespaceObject.createElement)("div", {\n className: "ct-first-steps-container"\n }, (0,external_window_wp_element_namespaceObject.createElement)("h2", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Customizer Shortcuts\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("ul", {\n className: "ct-first-steps"\n }, (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "20",\n height: "20",\n viewBox: "0 0 20 20"\n }, (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M15.8,5.9L10,0L4.2,5.9C1,9.1,1,14.3,4.2,17.6C5.8,19.2,7.9,20,10,20s4.2-0.8,5.8-2.4C19,14.3,19,9.1,15.8,5.9z M10,17.9c-1.6,0-3.2-0.6-4.4-1.8c-1.2-1.2-1.8-2.7-1.8-4.4s0.6-3.2,1.8-4.4L10,2.9V17.9z"\n })), (0,external_window_wp_element_namespaceObject.createElement)("h4", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Color Options\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("p", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Set the theme global colors, select the font, button and background colors.\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n href: `${ctDashboardLocalizations.customizer_url}${encodeURI(`[section]=color`)}`,\n className: "ct-button"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Go to option\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "20",\n height: "20",\n viewBox: "0 0 20 20"\n }, (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M20,17.5v-15C20,1.1,18.9,0,17.5,0h-15C1.1,0,0,1.1,0,2.5v15C0,18.9,1.1,20,2.5,20h15C18.9,20,20,18.9,20,17.5z M18.8,17.6c0,0.6-0.6,1.2-1.2,1.2h-15c-0.7,0-1.2-0.5-1.2-1.2V7h17.5V17.6z"\n })), (0,external_window_wp_element_namespaceObject.createElement)("h4", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Header Options\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("p", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Set the theme header type, set the colors, spacing, alignment and more.\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n href: `${ctDashboardLocalizations.customizer_url}${encodeURI(`[section]=header`)}`,\n className: "ct-button",\n "data-hover": "white"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Go to option\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "20",\n height: "20",\n viewBox: "0 0 20 20"\n }, (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M18,0H5.3c-1.1,0-2,1.1-2,2.4V4H2C0.9,4,0,5.1,0,6.4v0.8v9.6v0.8C0,18.9,0.9,20,2,20h3.3h1.3H18c1.1,0,2-1.1,2-2.4V2.4C20,1.1,19.1,0,18,0zM3.3,16.8c0,0.4-0.3,0.8-0.7,0.8c-0.4,0-0.7-0.4-0.7-0.8V6.6c0-0.1,0.1-0.2,0.2-0.2h0.9c0.1,0,0.2,0.1,0.2,0.2V16.8z M18,17.4c0,0.1-0.1,0.2-0.2,0.2H5.2c0.1-0.3,0.1-0.5,0.1-0.8V7.2c0,0,0,0,0,0V2.6c0-0.1,0.1-0.2,0.2-0.2h12.3c0.1,0,0.2,0.1,0.2,0.2V17.4z M6.9,5.3c-0.1,0-0.2-0.1-0.2-0.2V3.5c0-0.1,0.1-0.2,0.2-0.2h9.6c0.1,0,0.2,0.1,0.2,0.2v1.6c0,0.1-0.1,0.2-0.2,0.2H6.9z M16.5,13.3c0.1,0,0.2-0.1,0.2-0.2V9.5c0-0.1-0.1-0.2-0.2-0.2h-4.3c-0.1,0-0.2,0.1-0.2,0.2v3.6c0,0.1,0.1,0.2,0.2,0.2H16.5zM10.7,7.3c0-0.4-0.3-0.7-0.7-0.7H7.3C7,6.7,6.7,7,6.7,7.3l0,0C6.7,7.7,7,8,7.3,8H10C10.4,8,10.7,7.7,10.7,7.3L10.7,7.3z M10.7,10c0-0.4-0.3-0.7-0.7-0.7H7.3C7,9.3,6.7,9.6,6.7,10l0,0c0,0.4,0.3,0.7,0.7,0.7H10C10.4,10.7,10.7,10.4,10.7,10L10.7,10z M16.7,7.3c0-0.4-0.3-0.7-0.7-0.7h-3.3C12.3,6.7,12,7,12,7.3l0,0C12,7.7,12.3,8,12.7,8H16C16.4,8,16.7,7.7,16.7,7.3L16.7,7.3z M10.7,15.3c0,0.4-0.3,0.7-0.7,0.7H7.3c-0.4,0-0.7-0.3-0.7-0.7l0,0c0-0.4,0.3-0.7,0.7-0.7H10C10.4,14.7,10.7,15,10.7,15.3L10.7,15.3zM16.7,15.3c0,0.4-0.3,0.7-0.7,0.7h-3.3c-0.4,0-0.7-0.3-0.7-0.7l0,0c0-0.4,0.3-0.7,0.7-0.7H16C16.4,14.7,16.7,15,16.7,15.3L16.7,15.3z M10.7,12.7c0-0.4-0.3-0.7-0.7-0.7H7.3c-0.4,0-0.7,0.3-0.7,0.7l0,0c0,0.4,0.3,0.7,0.7,0.7H10C10.4,13.3,10.7,13,10.7,12.7L10.7,12.7z"\n })), (0,external_window_wp_element_namespaceObject.createElement)("h4", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Blog Options\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("p", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Set the blog entries type, number of cards, spacing, colors and more.\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n href: `${ctDashboardLocalizations.customizer_url}${encodeURI(`[section]=blog_posts`)}`,\n className: "ct-button",\n "data-hover": "white"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Go to option\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "20",\n height: "20",\n viewBox: "0 0 20 20"\n }, (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M18,2h-2v16h2c1.1,0,2-0.9,2-2V4C20,2.9,19.1,2,18,2z"\n }), (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M13.1,0H1.9C0.8,0,0,0.9,0,2v16c0,1.1,0.8,2,1.9,2h11.2c1,0,1.9-0.9,1.9-2V2C15,0.9,14.2,0,13.1,0zM13,16c0,0.5-0.5,1-1,1H3c-0.5,0-1-0.5-1-1v-2c0-0.5,0.5-1,1-1h9c0.5,0,1,0.5,1,1V16zM12.5,11h-10C2.2,11,2,10.8,2,10.5C2,10.2,2.2,10,2.5,10h10c0.3,0,0.5,0.2,0.5,0.5C13,10.8,12.8,11,12.5,11z M12.5,8h-10C2.2,8,2,7.8,2,7.5C2,7.2,2.2,7,2.5,7h10C12.8,7,13,7.2,13,7.5C13,7.8,12.8,8,12.5,8zM12.5,5h-10C2.2,5,2,4.8,2,4.5C2,4.2,2.2,4,2.5,4h10C12.8,4,13,4.2,13,4.5C13,4.8,12.8,5,12.5,5z"\n })), (0,external_window_wp_element_namespaceObject.createElement)("h4", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Page Options\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("p", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Set the page container width, spacing, sidebar and more.\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n href: `${ctDashboardLocalizations.customizer_url}${encodeURI(\'[section]=single_pages\')}`,\n className: "ct-button",\n "data-hover": "white"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Go to option\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "20",\n height: "20",\n viewBox: "0 0 20 20"\n }, (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M0,2.5l0,15C0,18.9,1.1,20,2.5,20h15c1.4,0,2.5-1.1,2.5-2.5v-15C20,1.1,18.9,0,17.5,0l-15,0C1.1,0,0,1.1,0,2.5z M2.4,1.1H13v17.5H2.4c-0.7,0-1.2-0.5-1.2-1.2v-15C1.2,1.8,1.8,1.2,2.4,1.1L2.4,1.1z"\n })), (0,external_window_wp_element_namespaceObject.createElement)("h4", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Sidebar Options\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("p", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Set the sidebar width, design type, spacing, colors.\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n href: `${ctDashboardLocalizations.customizer_url}${encodeURI(\'[section]=sidebar\')}`,\n className: "ct-button",\n "data-hover": "white"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Go to option\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "20",\n height: "20",\n viewBox: "0 0 20 20"\n }, (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M17.5,0h-15C1.1,0,0,1.1,0,2.5v15C0,18.9,1.1,20,2.5,20h15c1.4,0,2.5-1.1,2.5-2.5v-15C20,1.1,18.9,0,17.5,0z M18.8,13H1.2V2.4c0-0.6,0.6-1.2,1.2-1.2h15c0.7,0,1.2,0.5,1.2,1.2V13z"\n })), (0,external_window_wp_element_namespaceObject.createElement)("h4", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Footer Options\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("p", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Set the footer type, number of columns, spacing and colors.\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n href: `${ctDashboardLocalizations.customizer_url}${encodeURI(\'[section]=footer\')}`,\n className: "ct-button",\n "data-hover": "white"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Go to option\', \'blocksy\')))), is_companion_active !== \'active\' && (0,external_window_wp_element_namespaceObject.createElement)(external_window_wp_element_namespaceObject.Fragment, null, (0,external_window_wp_element_namespaceObject.createElement)("h2", {\n className: "ct-downloads-heading"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Downloads\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("ul", {\n className: "ct-downloads"\n }, (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "20",\n height: "20",\n viewBox: "0 0 20 20"\n }, (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M3.1,0c-0.4,0-0.8,0.2-1,0.6L0.2,3.9C0.1,4.1,0,4.2,0,4.4v13.3C0,19,1,20,2.2,20h15.6c1.2,0,2.2-1,2.2-2.2V4.4c0-0.2-0.1-0.4-0.2-0.6l-1.9-3.3c-0.2-0.3-0.6-0.6-1-0.6H3.1z M3.7,2.2h12.6l1.3,2.2H2.4L3.7,2.2z M2.2,6.7h15.6v11.1H2.2V6.7zM8.9,8.3v3.3H5.6l4.4,4.4l4.4-4.4h-3.3V8.3H8.9z"\n })), (0,external_window_wp_element_namespaceObject.createElement)("h3", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Blocksy Companion\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("p", null, (0,external_window_wp_i18n_namespaceObject.__)(\'By downloading and installing this plugin you will have access to demo templates, extensions and a lot more stunning features.\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n className: "ct-button",\n onClick: e => {\n e.stopPropagation();\n setIsLoading(true);\n external_jQuery_default().ajax(ajaxurl, {\n type: \'POST\',\n data: {\n action: \'blocksy_notice_button_click\'\n }\n }).then(_ref => {\n let {\n success,\n data\n } = _ref;\n\n if (success) {\n setCustomStatus(data.status);\n\n if (data.status === \'active\') {\n location.assign(data.pluginUrl);\n }\n }\n\n setIsLoading(false);\n });\n }\n }, isLoading ? (0,external_window_wp_i18n_namespaceObject.__)(\'Installing & activating...\', \'blocksy\') : finalStatus === \'uninstalled\' ? (0,external_window_wp_i18n_namespaceObject.__)(\'Install Blocksy Companion\', \'blocksy\') : finalStatus === \'installed\' ? (0,external_window_wp_i18n_namespaceObject.__)(\'Activate Blocksy Companion\', \'blocksy\') : (0,external_window_wp_i18n_namespaceObject.__)(\'Blocksy Companion active!\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "20",\n height: "20",\n viewBox: "0 0 20 20"\n }, (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M3.1,0c-0.4,0-0.8,0.2-1,0.6L0.2,3.9C0.1,4.1,0,4.2,0,4.4v13.3C0,19,1,20,2.2,20h15.6c1.2,0,2.2-1,2.2-2.2V4.4c0-0.2-0.1-0.4-0.2-0.6l-1.9-3.3c-0.2-0.3-0.6-0.6-1-0.6H3.1z M3.7,2.2h12.6l1.3,2.2H2.4L3.7,2.2z M2.2,6.7h15.6v11.1H2.2V6.7zM8.9,8.3v3.3H5.6l4.4,4.4l4.4-4.4h-3.3V8.3H8.9z"\n })), (0,external_window_wp_element_namespaceObject.createElement)("h3", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Blocksy Child Theme\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("p", null, (0,external_window_wp_i18n_namespaceObject.__)(\'By using a child theme you can modify any file without the fear of breaking something in the parent theme.\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n className: "ct-button",\n href: child_download_link,\n target: "_blank"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Download now\', \'blocksy\')))))), afterContent.content, (0,external_window_wp_element_namespaceObject.createElement)(components_SubmitSupport, null));\n};\n\n/* harmony default export */ const screens_Home = (Home);\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/components/SinglePremiumPlugin.js\n\n\n\nconst SinglePremiumPlugin = _ref => {\n let {\n status,\n plugin,\n onPluginsSync\n } = _ref;\n const [isLoading, setIsLoading] = (0,external_window_wp_element_namespaceObject.useState)(false);\n\n const makeAction = async (plugin, actionName) => {\n const body = new FormData();\n body.append(\'plugin\', plugin);\n body.append(\'action\', actionName);\n setIsLoading(true);\n\n try {\n await fetch(ctDashboardLocalizations.ajax_url, {\n method: \'POST\',\n body\n });\n onPluginsSync();\n } catch (e) {}\n\n setIsLoading(false);\n };\n\n return (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("h4", {\n className: "ct-extension-title"\n }, plugin.title, isLoading && (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "15",\n height: "15",\n viewBox: "0 0 100 100"\n }, (0,external_window_wp_element_namespaceObject.createElement)("g", {\n transform: "translate(50,50)"\n }, (0,external_window_wp_element_namespaceObject.createElement)("g", {\n transform: "scale(1)"\n }, (0,external_window_wp_element_namespaceObject.createElement)("circle", {\n cx: "0",\n cy: "0",\n r: "50",\n fill: "#687c93"\n }), (0,external_window_wp_element_namespaceObject.createElement)("circle", {\n cx: "0",\n cy: "-26",\n r: "12",\n fill: "#ffffff",\n transform: "rotate(161.634)"\n }, (0,external_window_wp_element_namespaceObject.createElement)("animateTransform", {\n attributeName: "transform",\n type: "rotate",\n calcMode: "linear",\n values: "0 0 0;360 0 0",\n keyTimes: "0;1",\n dur: "1s",\n begin: "0s",\n repeatCount: "indefinite"\n })))))), plugin.description && (0,external_window_wp_element_namespaceObject.createElement)("div", {\n className: "ct-extension-description"\n }, plugin.description), (0,external_window_wp_element_namespaceObject.createElement)("div", {\n className: "ct-extension-actions"\n }, status === \'activated\' && (0,external_window_wp_element_namespaceObject.createElement)("a", {\n onClick: () => makeAction(plugin.name, \'premium_plugin_deactivate\'),\n className: "ct-button"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Deactivate\', \'blocksy\')), status === \'deactivated\' && (0,external_window_wp_element_namespaceObject.createElement)("a", {\n onClick: () => makeAction(plugin.name, \'premium_plugin_activate\'),\n className: "ct-button-primary"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Activate\', \'blocksy\')), status === \'uninstalled\' && !plugin.comingsoon && plugin.type !== \'link\' && (0,external_window_wp_element_namespaceObject.createElement)("a", {\n onClick: () => makeAction(plugin.name, \'premium_plugin_download\'),\n className: "ct-button"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Install\', \'blocksy\')), status === \'uninstalled\' && !plugin.comingsoon && plugin.type === \'link\' && (0,external_window_wp_element_namespaceObject.createElement)("a", {\n href: plugin.link,\n className: "ct-button",\n target: "_blank"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Download\', \'blocksy\')), status === \'uninstalled\' && plugin.comingsoon && (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "ct-badge"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'COMING SOON\', \'blocksy\'))));\n};\n\n/* harmony default export */ const components_SinglePremiumPlugin = (SinglePremiumPlugin);\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/screens/RecommendedPlugins.js\n\n\n\n\n\n\nlet plugins_status_cache = null;\nlet staticSource = ctDashboardLocalizations.clean_install_plugins;\nconst pluginsWithNames = () => Object.values(staticSource).map((plugin, index) => {\n plugin[\'name\'] = Object.keys(staticSource)[index];\n return plugin;\n});\n\nconst RecommendedPlugins = () => {\n const [isLoading, setIsLoading] = (0,external_window_wp_element_namespaceObject.useState)(!plugins_status_cache);\n const [plugins_status, setPluginStatus] = (0,external_window_wp_element_namespaceObject.useState)(plugins_status_cache || []);\n const plugins = pluginsWithNames();\n\n const syncPlugins = async function () {\n let verbose = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (verbose) {\n setIsLoading(true);\n }\n\n const body = new FormData();\n body.append(\'action\', \'get_premium_plugins_status\');\n\n try {\n const response = await fetch(ctDashboardLocalizations.ajax_url, {\n method: \'POST\',\n body\n });\n\n if (response.status === 200) {\n const {\n success,\n data\n } = await response.json();\n\n if (success) {\n setPluginStatus(data);\n plugins_status_cache = data;\n }\n }\n } catch (e) {}\n\n setIsLoading(false);\n };\n\n (0,external_window_wp_element_namespaceObject.useEffect)(() => {\n syncPlugins(!plugins_status_cache);\n }, []);\n return (0,external_window_wp_element_namespaceObject.createElement)("div", null, (0,external_window_wp_element_namespaceObject.createElement)(renderprops/* Transition */.uT, {\n items: isLoading,\n from: {\n opacity: 0\n },\n enter: [{\n opacity: 1\n }],\n leave: [{\n opacity: 0\n }],\n initial: null,\n config: (key, phase) => {\n return phase === \'leave\' ? {\n duration: 300\n } : {\n delay: 300,\n duration: 300\n };\n }\n }, isLoading => {\n if (isLoading) {\n return props => (0,external_window_wp_element_namespaceObject.createElement)(renderprops/* animated.p */.q.p, {\n style: props,\n className: "ct-loading-text"\n }, (0,external_window_wp_element_namespaceObject.createElement)("span", null), (0,external_window_wp_i18n_namespaceObject.__)(\'Loading Plugins Status...\', \'blocksy\'));\n }\n\n return props => (0,external_window_wp_element_namespaceObject.createElement)(renderprops/* animated.div */.q.div, {\n style: props\n }, plugins.length > 0 && (0,external_window_wp_element_namespaceObject.createElement)(external_window_wp_element_namespaceObject.Fragment, null, (0,external_window_wp_element_namespaceObject.createElement)("ul", {\n className: "ct-extensions-list"\n }, plugins.map(plugin => (0,external_window_wp_element_namespaceObject.createElement)(components_SinglePremiumPlugin, {\n plugin: plugin,\n key: plugin.name,\n onPluginsSync: () => syncPlugins(),\n status: (plugins_status.find(_ref => {\n let {\n name\n } = _ref;\n return name === plugin.name;\n }) || {}).status\n }))), (0,external_window_wp_element_namespaceObject.createElement)(components_SubmitSupport, null)));\n }));\n};\n\n/* harmony default export */ const screens_RecommendedPlugins = (RecommendedPlugins);\n;// CONCATENATED MODULE: external "window.wp.date"\nconst external_window_wp_date_namespaceObject = window.wp.date;\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/screens/Changelog.js\n\n\n\n\n\nlet changelog_cache = null;\n\nconst parseChangelog = function (changelog) {\n let {\n hasBetas\n } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return changelog.replace(/\\r/g, \'\').replace(/(\\r\\n|\\r|\\n){3,}/g, \'$1\\n\\n\').split(\'\\n\\n\').map(versionDescriptor => {\n let [version, date] = versionDescriptor.split(/\\r?\\n/)[0].split(\':\');\n return {\n version,\n date: (0,external_window_wp_date_namespaceObject.dateI18n)(\'F j, Y\', new Date(date.trim())),\n descriptor: versionDescriptor\n };\n }).filter(_ref => {\n let {\n version\n } = _ref;\n return hasBetas ? true : version.indexOf(\'beta\') === -1;\n });\n};\n\nconst SingleVersion = _ref2 => {\n let {\n versionDescriptor\n } = _ref2;\n const [_, ...allReleaseChanges] = versionDescriptor.descriptor.split(/\\r?\\n/);\n return (0,external_window_wp_element_namespaceObject.createElement)("section", null, (0,external_window_wp_element_namespaceObject.createElement)("h2", null, (0,external_window_wp_i18n_namespaceObject.sprintf)( // translators: placeholder here means the actual version.\n (0,external_window_wp_i18n_namespaceObject.__)(\'Version: %s\', \'blocksy\'), versionDescriptor.version), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.sprintf)( // translators: placeholder here means the actual date.\n (0,external_window_wp_i18n_namespaceObject.__)(\'Released on %s\', \'blocksy\'), versionDescriptor.date))), (0,external_window_wp_element_namespaceObject.createElement)("div", {\n className: "ct-release-info",\n dangerouslySetInnerHTML: {\n __html: ``.replace(/New:/g, \'\').replace(/Improvement:/g, \'\').replace(/Fix:/g, \'\')\n }\n }));\n};\n\n/* harmony default export */ const Changelog = (() => {\n const [isLoading, setIsLoading] = (0,external_window_wp_element_namespaceObject.useState)(!changelog_cache);\n const [changelog, setChangelog] = (0,external_window_wp_element_namespaceObject.useState)(changelog_cache);\n const [currentChangelog, setCurrentChangelog] = (0,external_window_wp_element_namespaceObject.useState)(0);\n let hasBetas = false;\n\n if (window.ctDashboardLocalizations && window.ctDashboardLocalizations.plugin_data && window.ctDashboardLocalizations.plugin_data.has_beta_consent) {\n hasBetas = window.ctDashboardLocalizations.plugin_data.has_beta_consent;\n }\n\n const syncChangelog = async function () {\n let verbose = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (verbose) {\n setIsLoading(true);\n }\n\n const body = new FormData();\n body.append(\'action\', \'get_latest_changelog\');\n\n try {\n const response = await fetch(ctDashboardLocalizations.ajax_url, {\n method: \'POST\',\n body\n });\n\n if (response.status === 200) {\n const {\n success,\n data\n } = await response.json();\n\n if (success && data.changelog) {\n setChangelog(data.changelog);\n changelog_cache = data.changelog;\n }\n }\n } catch (e) {}\n\n setIsLoading(false);\n };\n\n (0,external_window_wp_element_namespaceObject.useEffect)(() => {\n syncChangelog(!changelog_cache);\n }, []);\n return (0,external_window_wp_element_namespaceObject.createElement)("section", {\n className: "ct-changelog-wrapper"\n }, (0,external_window_wp_element_namespaceObject.createElement)(renderprops/* Transition */.uT, {\n items: isLoading,\n from: {\n opacity: 0\n },\n enter: [{\n opacity: 1\n }],\n leave: [{\n opacity: 0\n }],\n initial: null,\n config: (key, phase) => {\n return phase === \'leave\' ? {\n duration: 300\n } : {\n delay: 300,\n duration: 300\n };\n }\n }, isLoading => {\n if (isLoading) {\n return props => (0,external_window_wp_element_namespaceObject.createElement)(renderprops/* animated.p */.q.p, {\n className: "ct-loading-text",\n style: props\n }, (0,external_window_wp_element_namespaceObject.createElement)("span", null), (0,external_window_wp_i18n_namespaceObject.__)(\'Loading changelog...\', \'blocksy\'));\n }\n\n return props => (0,external_window_wp_element_namespaceObject.createElement)(renderprops/* animated.div */.q.div, {\n style: props\n }, (0,external_window_wp_element_namespaceObject.createElement)("div", {\n className: classnames_default()(\'changelog-info\', {\n \'has-sources\': changelog && changelog.length > 1\n })\n }, changelog && changelog.length > 1 && (0,external_window_wp_element_namespaceObject.createElement)("ul", {\n className: "changelog-sources"\n }, changelog.map((_ref3, index) => {\n let {\n title\n } = _ref3;\n return (0,external_window_wp_element_namespaceObject.createElement)("li", {\n className: classnames_default()({\n active: index === currentChangelog\n }),\n onClick: () => setCurrentChangelog(index),\n key: title\n }, title);\n })), (0,external_window_wp_element_namespaceObject.createElement)("ul", {\n className: "changelog-explanation"\n }, (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "new"\n }), \' \', (0,external_window_wp_i18n_namespaceObject.__)(\'New\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "fix"\n }), \' \', (0,external_window_wp_i18n_namespaceObject.__)(\'Fix\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "improvement"\n }), (0,external_window_wp_i18n_namespaceObject.__)(\'Update\', \'blocksy\')))), (0,external_window_wp_element_namespaceObject.createElement)("div", {\n className: "changelog-items"\n }, changelog[currentChangelog].changelog ? parseChangelog(changelog[currentChangelog].changelog, {\n hasBetas\n }).map(versionDescriptor => (0,external_window_wp_element_namespaceObject.createElement)(SingleVersion, {\n key: versionDescriptor.version,\n versionDescriptor: versionDescriptor\n })) : (0,external_window_wp_i18n_namespaceObject.__)(\'No changelog present at the moment.\', \'blocksy\')));\n }));\n});\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/window-hash-source.js\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/* harmony default export */ const window_hash_source = (() => {\n return {\n get location() {\n return _objectSpread(_objectSpread({}, window.location), {}, {\n pathname: (window.location.hash || \'#/\').replace(/#/g, \'\')\n });\n },\n\n addEventListener(name, fn) {\n window.addEventListener(name, fn);\n },\n\n removeEventListener(name, fn) {\n window.removeEventListener(name, fn);\n },\n\n history: {\n get state() {\n return window.history.state;\n },\n\n replaceState(state, maybeRef, to) {\n window.history.replaceState(state, maybeRef, `#${to}`);\n },\n\n pushState(state, maybeRef, to) {\n window.history.pushState(state, maybeRef, `#${to}`);\n }\n\n }\n };\n});\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/screens/ProTable.js\n\n\n\n\n\n/* harmony default export */ const ProTable = (() => {\n if (window.ctDashboardLocalizations && window.ctDashboardLocalizations.plugin_data && window.ctDashboardLocalizations.plugin_data.is_pro) {\n return null;\n }\n\n return (0,external_window_wp_element_namespaceObject.createElement)("section", {\n className: "ct-comparison-table"\n }, (0,external_window_wp_element_namespaceObject.createElement)("ul", null, (0,external_window_wp_element_namespaceObject.createElement)("li", {\n className: "ct-table-heading"\n }, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'General Features\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Free\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Pro\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Global color palette\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Related posts module\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Trending posts module\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Newsletter subscribe module\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Cookies notice module\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Custom widgets\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Google fonts\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Custom post types support\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'WooCommerce support\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Multiple conditional sidebars\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Content blocks (hooks)\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Custom code snippets\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Custom fonts (+ support for variable fonts)\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Adobe Typekit fonts\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Local Google fonts (GDPR)\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Advanced menu (mega menu)\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Shortcuts bar\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'White label (only in Agency package)\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }))), (0,external_window_wp_element_namespaceObject.createElement)("ul", null, (0,external_window_wp_element_namespaceObject.createElement)("li", {\n className: "ct-table-heading"\n }, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Header Features\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Free\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Pro\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Header builder\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Transparent header\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Sticky header\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Multiple conditional headers\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Duplicate headers items\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Desktop off-canvas drawer\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'More headers items\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }))), (0,external_window_wp_element_namespaceObject.createElement)("ul", null, (0,external_window_wp_element_namespaceObject.createElement)("li", {\n className: "ct-table-heading"\n }, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Footer Features\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Free\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Pro\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Footer builder\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Footer reveal effect\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Multiple conditional footers\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Duplicate footer items\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'More footer items\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }))), (0,external_window_wp_element_namespaceObject.createElement)("ul", null, (0,external_window_wp_element_namespaceObject.createElement)("li", {\n className: "ct-table-heading"\n }, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'WooCommerce Features\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Free\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Pro\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Advanced archive layouts\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Advanced single product layouts\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'AJAX add to cart\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Quick view module\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Floating cart\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Off-canvas filters\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Off-canvas cart\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'More single product layouts\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Product share icons\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Product gallery slider\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Wishlist\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }))), (0,external_window_wp_element_namespaceObject.createElement)("ul", null, (0,external_window_wp_element_namespaceObject.createElement)("li", {\n className: "ct-table-heading"\n }, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Coming Soon Features\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Free\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Pro\', \'blocksy\'))), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Advanced Custom Post Types module\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Portfolio extension\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n })), (0,external_window_wp_element_namespaceObject.createElement)("li", null, (0,external_window_wp_element_namespaceObject.createElement)("span", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Premium starter sites\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-no-alt"\n }), (0,external_window_wp_element_namespaceObject.createElement)("span", {\n className: "dashicons dashicons-yes"\n }))), (0,external_window_wp_element_namespaceObject.createElement)("div", {\n className: "ct-cta-container"\n }, (0,external_window_wp_element_namespaceObject.createElement)("svg", {\n width: "55",\n height: "55",\n viewBox: "0 0 40.5 48.3"\n }, (0,external_window_wp_element_namespaceObject.createElement)("path", {\n fill: "#2d82c8",\n d: "M33.4 29.4l7.1 12.3-7.4.6-4 6-7.3-12.9"\n }), (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M33.5 29.6L26 42.7l-4.2-7.3 11.6-6 .1.2zM0 41.7l7.5.6 3.9 6 7.2-12.4-11-7.3L0 41.7z",\n fill: "#2271b1"\n }), (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M39.5 18.7c0 1.6-2.4 2.8-2.7 4.3-.4 1.5 1 3.8.2 5.1-.8 1.3-3.4 1.2-4.5 2.3-1.1 1.1-1 3.7-2.3 4.5-1.3.8-3.6-.6-5.1-.2-1.5.4-2.7 2.7-4.3 2.7S18 35 16.5 34.7c-1.5-.4-3.8 1-5.1.2s-1.2-3.4-2.3-4.5-3.7-1-4.5-2.3.6-3.6.2-5.1-2.7-2.7-2.7-4.3 2.4-2.8 2.7-4.3c.4-1.5-1-3.8-.2-5.1C5.4 8 8.1 8.1 9.1 7c1.1-1.1 1-3.7 2.3-4.5s3.6.6 5.1.2C18 2.4 19.2 0 20.8 0c1.6 0 2.8 2.4 4.3 2.7 1.5.4 3.8-1 5.1-.2 1.3.8 1.2 3.4 2.3 4.5 1.1 1.1 3.7 1 4.5 2.3s-.6 3.6-.2 5.1c.3 1.5 2.7 2.7 2.7 4.3z",\n fill: "#599fd9"\n }), (0,external_window_wp_element_namespaceObject.createElement)("path", {\n d: "M23.6 7c-6.4-1.5-12.9 2.5-14.4 8.9-.7 3.1-.2 6.3 1.5 9.1 1.7 2.7 4.3 4.6 7.4 5.4.9.2 1.9.3 2.8.3 2.2 0 4.4-.6 6.3-1.8 2.7-1.7 4.6-4.3 5.4-7.5C34 15 30 8.5 23.6 7zm7 14c-.6 2.6-2.2 4.8-4.5 6.2-2.3 1.4-5 1.8-7.6 1.2-2.6-.6-4.8-2.2-6.2-4.5-1.4-2.3-1.8-5-1.2-7.6.6-2.6 2.2-4.8 4.5-6.2 1.6-1 3.4-1.5 5.2-1.5.8 0 1.5.1 2.3.3 5.4 1.3 8.7 6.7 7.5 12.1zm-8.2-4.5l3.7.5-2.7 2.7.7 3.7-3.4-1.8-3.3 1.8.6-3.7-2.7-2.7 3.8-.5 1.6-3.4 1.7 3.4z",\n fill: "#fff"\n })), (0,external_window_wp_element_namespaceObject.createElement)("h2", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Upgrade Now\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("p", null, (0,external_window_wp_i18n_namespaceObject.__)(\'Upgrade to the Pro version and get instant access to all premium extensions, features and future updates.\', \'blocksy\')), (0,external_window_wp_element_namespaceObject.createElement)("a", {\n href: "https://creativethemes.com/blocksy/pricing/",\n className: "ct-button-primary",\n target: "_blank"\n }, (0,external_window_wp_i18n_namespaceObject.__)(\'Get Blocksy Pro Now\', \'blocksy\'))));\n});\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/Dashboard.js\nconst Dashboard_excluded = ["Component", "key", "path"];\n\nfunction Dashboard_extends() { Dashboard_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return Dashboard_extends.apply(this, arguments); }\n\nfunction Dashboard_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = Dashboard_objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction Dashboard_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction Dashboard_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction Dashboard_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? Dashboard_ownKeys(Object(source), !0).forEach(function (key) { Dashboard_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : Dashboard_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction Dashboard_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nwindow.ctDashboardLocalizations.DashboardContext = context;\n\n\n\n\n\n\nlet Dashboard_history = createHistory(window_hash_source());\n/*\nctEvents.on(\'ct:dashboard:routes\', r =>\n\tr.push({\n\t\tComponent: () =>
hello
,\n\t\tpath: \'/test\'\n\t})\n)\n*/\n\nconst SpringRouter = _ref => {\n let {\n children\n } = _ref;\n return (0,external_window_wp_element_namespaceObject.createElement)(es_Location, null, _ref2 => {\n let {\n location,\n navigate,\n history\n } = _ref2;\n return (0,external_window_wp_element_namespaceObject.createElement)(renderprops/* Transition */.uT, {\n items: location,\n initial: null,\n immediate: (location.state || {}).hasNoChange,\n keys: location => location.pathname,\n from: {\n opacity: 0\n },\n enter: [{\n opacity: 1\n }],\n leave: [{\n opacity: 0\n }],\n config: (key, phase) => {\n return phase === \'leave\' ? {\n duration: 300\n } : {\n delay: 300,\n duration: 300\n };\n }\n }, location => props => (0,external_window_wp_element_namespaceObject.createElement)(renderprops/* animated.div */.q.div, {\n style: Dashboard_objectSpread({}, props)\n }, (0,external_window_wp_element_namespaceObject.createElement)(es_Router, {\n primary: false,\n location: location,\n navigate: navigate\n }, children)));\n });\n};\n\nconst FadeTransitionRouter = props => createElement(Location, null, _ref3 => {\n let {\n location\n } = _ref3;\n return createElement(TransitionGroup, {\n className: "transition-group"\n }, createElement(CSSTransition, {\n key: location.key,\n classNames: "fade",\n timeout: 500\n }, createElement(Router, {\n location: location,\n className: "router",\n primary: false\n }, props.children)));\n});\n\nclass Dashboard extends external_window_wp_element_namespaceObject.Component {\n render() {\n const userRoutes = [];\n external_ctEvents_default().trigger(\'ct:dashboard:routes\', userRoutes);\n return (0,external_window_wp_element_namespaceObject.createElement)(LocationProvider, {\n history: Dashboard_history\n }, (0,external_window_wp_element_namespaceObject.createElement)(Provider, {\n value: Dashboard_objectSpread(Dashboard_objectSpread(Dashboard_objectSpread({}, getDefaultValue()), ctDashboardLocalizations), {}, {\n Link: Link,\n Location: es_Location,\n navigate: history_navigate,\n history: Dashboard_history,\n Match: Match\n })\n }, (0,external_window_wp_element_namespaceObject.createElement)("header", null, (0,external_window_wp_element_namespaceObject.createElement)(js_Heading, null), (0,external_window_wp_element_namespaceObject.createElement)(js_Navigation, null)), (0,external_window_wp_element_namespaceObject.createElement)("section", null, (0,external_window_wp_element_namespaceObject.createElement)(SpringRouter, {\n primary: false,\n className: "router"\n }, (0,external_window_wp_element_namespaceObject.createElement)(screens_Home, {\n path: "/"\n }), (0,external_window_wp_element_namespaceObject.createElement)(screens_RecommendedPlugins, {\n path: "plugins"\n }), (0,external_window_wp_element_namespaceObject.createElement)(Changelog, {\n path: "changelog"\n }), (0,external_window_wp_element_namespaceObject.createElement)(ProTable, {\n path: "pro"\n }), userRoutes.map(_ref4 => {\n let {\n Component,\n key,\n path\n } = _ref4,\n props = Dashboard_objectWithoutProperties(_ref4, Dashboard_excluded);\n\n return (0,external_window_wp_element_namespaceObject.createElement)(Component, Dashboard_extends({\n key: key || path,\n path: path\n }, props));\n })))));\n }\n\n}\n;// CONCATENATED MODULE: ./admin/dashboard/static/js/main.js\n\n\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n if (document.getElementById(\'ct-dashboard\')) {\n (0,external_window_wp_element_namespaceObject.render)((0,external_window_wp_element_namespaceObject.createElement)(Dashboard, null), document.getElementById(\'ct-dashboard\'));\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQyLmpzIiwibWFwcGluZ3MiOiI7O0FBQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBOztBQ0FBOzs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNyTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUM5c0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBOzs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zbWFsbC1jdC9leHRlcm5hbCB2YXIgXCJ3aW5kb3cud3AuZWxlbWVudFwiPzVhZWMiLCJ3ZWJwYWNrOi8vc21hbGwtY3QvLi9hZG1pbi9kYXNoYm9hcmQvc3RhdGljL2pzL2NvbnRleHQuanM/ZjZkMiIsIndlYnBhY2s6Ly9zbWFsbC1jdC9leHRlcm5hbCB2YXIgXCJ3aW5kb3cud3AuaTE4blwiP2RjN2IiLCJ3ZWJwYWNrOi8vc21hbGwtY3QvZXh0ZXJuYWwgdmFyIFwiY3RFdmVudHNcIj84YTJhIiwid2VicGFjazovL3NtYWxsLWN0Ly4vYWRtaW4vZGFzaGJvYXJkL3N0YXRpYy9qcy9IZWFkaW5nLmpzPzE3ZjMiLCJ3ZWJwYWNrOi8vc21hbGwtY3QvLi9ub2RlX21vZHVsZXMvcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQvcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQuZXMuanM/NTQyMiIsIndlYnBhY2s6Ly9zbWFsbC1jdC8uL25vZGVfbW9kdWxlcy9AcmVhY2gvcm91dGVyL2VzL2xpYi91dGlscy5qcz8yZDhhIiwid2VicGFjazovL3NtYWxsLWN0Ly4vbm9kZV9tb2R1bGVzL0ByZWFjaC9yb3V0ZXIvZXMvbGliL2hpc3RvcnkuanM/ZjU3YyIsIndlYnBhY2s6Ly9zbWFsbC1jdC8uL25vZGVfbW9kdWxlcy9AcmVhY2gvcm91dGVyL2VzL2luZGV4LmpzPzYzMDYiLCJ3ZWJwYWNrOi8vc21hbGwtY3QvLi9hZG1pbi9kYXNoYm9hcmQvc3RhdGljL2pzL05hdmlnYXRpb24uanM/Y2Y5YyIsIndlYnBhY2s6Ly9zbWFsbC1jdC8uL2FkbWluL2Rhc2hib2FyZC9zdGF0aWMvanMvY29tcG9uZW50cy9TdWJtaXRTdXBwb3J0LmpzPzZmNGIiLCJ3ZWJwYWNrOi8vc21hbGwtY3QvZXh0ZXJuYWwgdmFyIFwialF1ZXJ5XCI/YTIwYiIsIndlYnBhY2s6Ly9zbWFsbC1jdC8uL2FkbWluL2Rhc2hib2FyZC9zdGF0aWMvanMvc2NyZWVucy9Ib21lLmpzPzUwMWEiLCJ3ZWJwYWNrOi8vc21hbGwtY3QvLi9hZG1pbi9kYXNoYm9hcmQvc3RhdGljL2pzL2NvbXBvbmVudHMvU2luZ2xlUHJlbWl1bVBsdWdpbi5qcz82YWNiIiwid2VicGFjazovL3NtYWxsLWN0Ly4vYWRtaW4vZGFzaGJvYXJkL3N0YXRpYy9qcy9zY3JlZW5zL1JlY29tbWVuZGVkUGx1Z2lucy5qcz9mYTdjIiwid2VicGFjazovL3NtYWxsLWN0L2V4dGVybmFsIHZhciBcIndpbmRvdy53cC5kYXRlXCI/Yjk1ZSIsIndlYnBhY2s6Ly9zbWFsbC1jdC8uL2FkbWluL2Rhc2hib2FyZC9zdGF0aWMvanMvc2NyZWVucy9DaGFuZ2Vsb2cuanM/OWQ5OCIsIndlYnBhY2s6Ly9zbWFsbC1jdC8uL2FkbWluL2Rhc2hib2FyZC9zdGF0aWMvanMvd2luZG93LWhhc2gtc291cmNlLmpzPzAyMjMiLCJ3ZWJwYWNrOi8vc21hbGwtY3QvLi9hZG1pbi9kYXNoYm9hcmQvc3RhdGljL2pzL3NjcmVlbnMvUHJvVGFibGUuanM/MDc3NyIsIndlYnBhY2s6Ly9zbWFsbC1jdC8uL2FkbWluL2Rhc2hib2FyZC9zdGF0aWMvanMvRGFzaGJvYXJkLmpzPzU1ZjAiLCJ3ZWJwYWNrOi8vc21hbGwtY3QvLi9hZG1pbi9kYXNoYm9hcmQvc3RhdGljL2pzL21haW4uanM/YzI0YiJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gd2luZG93LndwLmVsZW1lbnQ7IiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdFZhbHVlID0gKCkgPT4gKHtcbiAgdGhlbWVfdmVyc2lvbjogJzEuMC4wJyxcbiAgdGhlbWVfbmFtZTogJ1dvcmQnXG59KTtcbmNvbnN0IERhc2hib2FyZENvbnRleHQgPSBjcmVhdGVDb250ZXh0KGdldERlZmF1bHRWYWx1ZSgpKTtcbmV4cG9ydCBjb25zdCBQcm92aWRlciA9IERhc2hib2FyZENvbnRleHQuUHJvdmlkZXI7XG5leHBvcnQgY29uc3QgQ29uc3VtZXIgPSBEYXNoYm9hcmRDb250ZXh0LkNvbnN1bWVyO1xuZXhwb3J0IGRlZmF1bHQgRGFzaGJvYXJkQ29udGV4dDsiLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gd2luZG93LndwLmkxOG47IiwiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IGN0RXZlbnRzOyIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgdXNlQ29udGV4dCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgRGFzaGJvYXJkQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHsgc3ByaW50ZiwgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCBjdEV2ZW50cyBmcm9tICdjdC1ldmVudHMnO1xuXG5jb25zdCBIZWFkaW5nID0gKCkgPT4ge1xuICBjb25zdCB7XG4gICAgdGhlbWVfbmFtZSxcbiAgICB0aGVtZV9jdXN0b21fZGVzY3JpcHRpb24sXG4gICAgZGFzaGJvYXJkX2hhc19oZWFkaW5nXG4gIH0gPSB1c2VDb250ZXh0KERhc2hib2FyZENvbnRleHQpO1xuICBsZXQgYWZ0ZXJDb250ZW50ID0ge1xuICAgIGNvbnRlbnQ6IG51bGxcbiAgfTtcbiAgY3RFdmVudHMudHJpZ2dlcignY3Q6ZGFzaGJvYXJkOmhlYWRpbmc6YWZ0ZXInLCBhZnRlckNvbnRlbnQpO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwiaDJcIiwge1xuICAgIG9uQ2xpY2s6IGUgPT4gZS5zaGlmdEtleSAmJiBjdEV2ZW50cy50cmlnZ2VyKCdjdDpkYXNoYm9hcmQ6aGVhZGluZzphZHZhbmNlZC1jbGljaycpXG4gIH0sIGRhc2hib2FyZF9oYXNfaGVhZGluZyA9PT0gJ3llcycgJiYgY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IFwiMzVcIixcbiAgICBoZWlnaHQ6IFwiMzVcIixcbiAgICB2aWV3Qm94OiBcIjAgMCA1MCA1MFwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTI1IDBjMTMuODA3IDAgMjUgMTEuMTkzIDI1IDI1UzM4LjgwNyA1MCAyNSA1MCAwIDM4LjgwNyAwIDI1IDExLjE5MyAwIDI1IDB6bTUuNDY5IDI1LjcwMWEuMjQ2LjI0NiAwIDAwLS4zMzIgMEwxOS4zNiAzNS44MTJjLS4wNzMuMDctLjAyMS4xODguMDgzLjE4OGgxMC4wODVhLjQ4Ni40ODYgMCAwMC4zMzEtLjEyOWw0LjczLTQuNDM4Yy41NDgtLjUxNS41NDgtMS4zNTEgMC0xLjg2N3ptMC0xMWEuMjQ2LjI0NiAwIDAwLS4zMzIgMGwtMTIgMTEuMjU5YS40MjcuNDI3IDAgMDAtLjEzNy4zMTF2OC4zNzRjMCAuMDk4LjEyNi4xNDcuMi4wNzhsMTUuNTUxLTE0LjY2NmMuNTUtLjUxNi41NS0xLjc0OCAwLTIuMjY0ek0yOC4yNzkgMTRIMTguMjMzYy0uMTI5IDAtLjIzNC4wOTktLjIzNC4yMnY5LjQyNWMwIC4wOTguMTI2LjE0OC4yLjA3OGwxMC4xNjEtOS41MzVjLjA3NC0uMDcuMDIyLS4xODgtLjA4My0uMTg4elwiLFxuICAgIGZpbGw6IFwiIzIzMjgyRFwiLFxuICAgIFwiZmlsbC1ydWxlXCI6IFwiZXZlbm9kZFwiXG4gIH0pKSwgdGhlbWVfbmFtZSwgZGFzaGJvYXJkX2hhc19oZWFkaW5nID09PSAneWVzJyAmJiBhZnRlckNvbnRlbnQuY29udGVudCksIGNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIHRoZW1lX2N1c3RvbV9kZXNjcmlwdGlvbiB8fCBfXygnVGhlIG1vc3QgaW5ub3ZhdGl2ZSwgaW50dWl0aXZlIGFuZCBsaWdodG5pbmcgZmFzdCBXb3JkUHJlc3MgdGhlbWUuIEJ1aWxkIHlvdXIgbmV4dCB3ZWIgcHJvamVjdCB2aXN1YWxseSwgaW4gbm8gdGltZS4nLCAnYmxvY2tzeScpKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBIZWFkaW5nOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAvLyBDYWxsIHRoaXMuY29uc3RydWN0b3IuZ0RTRlAgdG8gc3VwcG9ydCBzdWItY2xhc3Nlcy5cbiAgdmFyIHN0YXRlID0gdGhpcy5jb25zdHJ1Y3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHModGhpcy5wcm9wcywgdGhpcy5zdGF0ZSk7XG4gIGlmIChzdGF0ZSAhPT0gbnVsbCAmJiBzdGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgLy8gQ2FsbCB0aGlzLmNvbnN0cnVjdG9yLmdEU0ZQIHRvIHN1cHBvcnQgc3ViLWNsYXNzZXMuXG4gIC8vIFVzZSB0aGUgc2V0U3RhdGUoKSB1cGRhdGVyIHRvIGVuc3VyZSBzdGF0ZSBpc24ndCBzdGFsZSBpbiBjZXJ0YWluIGVkZ2UgY2FzZXMuXG4gIGZ1bmN0aW9uIHVwZGF0ZXIocHJldlN0YXRlKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5jb25zdHJ1Y3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgIHJldHVybiBzdGF0ZSAhPT0gbnVsbCAmJiBzdGF0ZSAhPT0gdW5kZWZpbmVkID8gc3RhdGUgOiBudWxsO1xuICB9XG4gIC8vIEJpbmRpbmcgXCJ0aGlzXCIgaXMgaW1wb3J0YW50IGZvciBzaGFsbG93IHJlbmRlcmVyIHN1cHBvcnQuXG4gIHRoaXMuc2V0U3RhdGUodXBkYXRlci5iaW5kKHRoaXMpKTtcbn1cblxuZnVuY3Rpb24gY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICB0cnkge1xuICAgIHZhciBwcmV2UHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHZhciBwcmV2U3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgIHRoaXMucHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgdGhpcy5zdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICB0aGlzLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90RmxhZyA9IHRydWU7XG4gICAgdGhpcy5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdCA9IHRoaXMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoXG4gICAgICBwcmV2UHJvcHMsXG4gICAgICBwcmV2U3RhdGVcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMucHJvcHMgPSBwcmV2UHJvcHM7XG4gICAgdGhpcy5zdGF0ZSA9IHByZXZTdGF0ZTtcbiAgfVxufVxuXG4vLyBSZWFjdCBtYXkgd2FybiBhYm91dCBjV00vY1dSUC9jV1UgbWV0aG9kcyBiZWluZyBkZXByZWNhdGVkLlxuLy8gQWRkIGEgZmxhZyB0byBzdXBwcmVzcyB0aGVzZSB3YXJuaW5ncyBmb3IgdGhpcyBzcGVjaWFsIGNhc2UuXG5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7XG5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgPSB0cnVlO1xuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nID0gdHJ1ZTtcblxuZnVuY3Rpb24gcG9seWZpbGwoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuXG4gIGlmICghcHJvdG90eXBlIHx8ICFwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgcG9seWZpbGwgY2xhc3MgY29tcG9uZW50cycpO1xuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICE9PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIHByb3RvdHlwZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm4gQ29tcG9uZW50O1xuICB9XG5cbiAgLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAvLyBFcnJvciBpZiBhbnkgb2YgdGhlc2UgbGlmZWN5Y2xlcyBhcmUgcHJlc2VudCxcbiAgLy8gQmVjYXVzZSB0aGV5IHdvdWxkIHdvcmsgZGlmZmVyZW50bHkgYmV0d2VlbiBvbGRlciBhbmQgbmV3ZXIgKDE2LjMrKSB2ZXJzaW9ucyBvZiBSZWFjdC5cbiAgdmFyIGZvdW5kV2lsbE1vdW50TmFtZSA9IG51bGw7XG4gIHZhciBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gbnVsbDtcbiAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvdG90eXBlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCc7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb3RvdHlwZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICB9XG4gIGlmICh0eXBlb2YgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm90b3R5cGUuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlJztcbiAgfVxuICBpZiAoXG4gICAgZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsIHx8XG4gICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fFxuICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGxcbiAgKSB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWU7XG4gICAgdmFyIG5ld0FwaU5hbWUgPVxuICAgICAgdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCknXG4gICAgICAgIDogJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlKCknO1xuXG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAnVW5zYWZlIGxlZ2FjeSBsaWZlY3ljbGVzIHdpbGwgbm90IGJlIGNhbGxlZCBmb3IgY29tcG9uZW50cyB1c2luZyBuZXcgY29tcG9uZW50IEFQSXMuXFxuXFxuJyArXG4gICAgICAgIGNvbXBvbmVudE5hbWUgK1xuICAgICAgICAnIHVzZXMgJyArXG4gICAgICAgIG5ld0FwaU5hbWUgK1xuICAgICAgICAnIGJ1dCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVnYWN5IGxpZmVjeWNsZXM6JyArXG4gICAgICAgIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgPyAnXFxuICAnICsgZm91bmRXaWxsTW91bnROYW1lIDogJycpICtcbiAgICAgICAgKGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGxcbiAgICAgICAgICA/ICdcXG4gICcgKyBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lXG4gICAgICAgICAgOiAnJykgK1xuICAgICAgICAoZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCA/ICdcXG4gICcgKyBmb3VuZFdpbGxVcGRhdGVOYW1lIDogJycpICtcbiAgICAgICAgJ1xcblxcblRoZSBhYm92ZSBsaWZlY3ljbGVzIHNob3VsZCBiZSByZW1vdmVkLiBMZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOlxcbicgK1xuICAgICAgICAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1hc3luYy1jb21wb25lbnQtbGlmZWN5Y2xlLWhvb2tzJ1xuICAgICk7XG4gIH1cblxuICAvLyBSZWFjdCA8PSAxNi4yIGRvZXMgbm90IHN1cHBvcnQgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy5cbiAgLy8gQXMgYSB3b3JrYXJvdW5kLCB1c2UgY1dNIGFuZCBjV1JQIHRvIGludm9rZSB0aGUgbmV3IHN0YXRpYyBsaWZlY3ljbGUuXG4gIC8vIE5ld2VyIHZlcnNpb25zIG9mIFJlYWN0IHdpbGwgaWdub3JlIHRoZXNlIGxpZmVjeWNsZXMgaWYgZ0RTRlAgZXhpc3RzLlxuICBpZiAodHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm90b3R5cGUuY29tcG9uZW50V2lsbE1vdW50ID0gY29tcG9uZW50V2lsbE1vdW50O1xuICAgIHByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcztcbiAgfVxuXG4gIC8vIFJlYWN0IDw9IDE2LjIgZG9lcyBub3Qgc3VwcG9ydCBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS5cbiAgLy8gQXMgYSB3b3JrYXJvdW5kLCB1c2UgY1dVIHRvIGludm9rZSB0aGUgbmV3IGxpZmVjeWNsZS5cbiAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgUmVhY3Qgd2lsbCBpZ25vcmUgdGhhdCBsaWZlY3ljbGUgaWYgZ1NCVSBleGlzdHMuXG4gIGlmICh0eXBlb2YgcHJvdG90eXBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBwcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgcG9seWZpbGwgZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBmb3IgY29tcG9uZW50cyB0aGF0IGRvIG5vdCBkZWZpbmUgY29tcG9uZW50RGlkVXBkYXRlKCkgb24gdGhlIHByb3RvdHlwZSdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxVcGRhdGUgPSBjb21wb25lbnRXaWxsVXBkYXRlO1xuXG4gICAgdmFyIGNvbXBvbmVudERpZFVwZGF0ZSA9IHByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU7XG5cbiAgICBwcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlUG9seWZpbGwoXG4gICAgICBwcmV2UHJvcHMsXG4gICAgICBwcmV2U3RhdGUsXG4gICAgICBtYXliZVNuYXBzaG90XG4gICAgKSB7XG4gICAgICAvLyAxNi4zKyB3aWxsIG5vdCBleGVjdXRlIG91ciB3aWxsLXVwZGF0ZSBtZXRob2Q7XG4gICAgICAvLyBJdCB3aWxsIHBhc3MgYSBzbmFwc2hvdCB2YWx1ZSB0byBkaWQtdXBkYXRlIHRob3VnaC5cbiAgICAgIC8vIE9sZGVyIHZlcnNpb25zIHdpbGwgcmVxdWlyZSBvdXIgcG9seWZpbGxlZCB3aWxsLXVwZGF0ZSB2YWx1ZS5cbiAgICAgIC8vIFdlIG5lZWQgdG8gaGFuZGxlIGJvdGggY2FzZXMsIGJ1dCBjYW4ndCBqdXN0IGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgXCJtYXliZVNuYXBzaG90XCIsXG4gICAgICAvLyBCZWNhdXNlIGZvciA8PSAxNS54IHZlcnNpb25zIHRoaXMgbWlnaHQgYmUgYSBcInByZXZDb250ZXh0XCIgb2JqZWN0LlxuICAgICAgLy8gV2UgYWxzbyBjYW4ndCBqdXN0IGNoZWNrIFwiX19yZWFjdEludGVybmFsU25hcHNob3RcIixcbiAgICAgIC8vIEJlY2F1c2UgZ2V0LXNuYXBzaG90IG1pZ2h0IHJldHVybiBhIGZhbHN5IHZhbHVlLlxuICAgICAgLy8gU28gY2hlY2sgZm9yIHRoZSBleHBsaWNpdCBfX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEZsYWcgZmxhZyB0byBkZXRlcm1pbmUgYmVoYXZpb3IuXG4gICAgICB2YXIgc25hcHNob3QgPSB0aGlzLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90RmxhZ1xuICAgICAgICA/IHRoaXMuX19yZWFjdEludGVybmFsU25hcHNob3RcbiAgICAgICAgOiBtYXliZVNuYXBzaG90O1xuXG4gICAgICBjb21wb25lbnREaWRVcGRhdGUuY2FsbCh0aGlzLCBwcmV2UHJvcHMsIHByZXZTdGF0ZSwgc25hcHNob3QpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gQ29tcG9uZW50O1xufVxuXG5leHBvcnQgeyBwb2x5ZmlsbCB9O1xuIiwiaW1wb3J0IGludmFyaWFudCBmcm9tIFwiaW52YXJpYW50XCI7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBzdGFydHNXaXRoKHN0cmluZywgc2VhcmNoKSAtIENoZWNrIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGBzZWFyY2hgXG52YXIgc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyaW5nLCBzZWFyY2gpIHtcbiAgcmV0dXJuIHN0cmluZy5zdWJzdHIoMCwgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBwaWNrKHJvdXRlcywgdXJpKVxuLy9cbi8vIFJhbmtzIGFuZCBwaWNrcyB0aGUgYmVzdCByb3V0ZSB0byBtYXRjaC4gRWFjaCBzZWdtZW50IGdldHMgdGhlIGhpZ2hlc3Rcbi8vIGFtb3VudCBvZiBwb2ludHMsIHRoZW4gdGhlIHR5cGUgb2Ygc2VnbWVudCBnZXRzIGFuIGFkZGl0aW9uYWwgYW1vdW50IG9mXG4vLyBwb2ludHMgd2hlcmVcbi8vXG4vLyAgICAgc3RhdGljID4gZHluYW1pYyA+IHNwbGF0ID4gcm9vdFxuLy9cbi8vIFRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIG9yZGVyIG9mIG91ciByb3V0ZXMsIGxldCB0aGVcbi8vIGNvbXB1dGVycyBkbyBpdC5cbi8vXG4vLyBBIHJvdXRlIGxvb2tzIGxpa2UgdGhpc1xuLy9cbi8vICAgICB7IHBhdGgsIGRlZmF1bHQsIHZhbHVlIH1cbi8vXG4vLyBBbmQgYSByZXR1cm5lZCBtYXRjaCBsb29rcyBsaWtlOlxuLy9cbi8vICAgICB7IHJvdXRlLCBwYXJhbXMsIHVyaSB9XG4vL1xuLy8gSSBrbm93LCBJIHNob3VsZCB1c2UgVHlwZVNjcmlwdCBub3QgY29tbWVudHMgZm9yIHRoZXNlIHR5cGVzLlxudmFyIHBpY2sgPSBmdW5jdGlvbiBwaWNrKHJvdXRlcywgdXJpKSB7XG4gIHZhciBtYXRjaCA9IHZvaWQgMDtcbiAgdmFyIGRlZmF1bHRfID0gdm9pZCAwO1xuXG4gIHZhciBfdXJpJHNwbGl0ID0gdXJpLnNwbGl0KFwiP1wiKSxcbiAgICAgIHVyaVBhdGhuYW1lID0gX3VyaSRzcGxpdFswXTtcblxuICB2YXIgdXJpU2VnbWVudHMgPSBzZWdtZW50aXplKHVyaVBhdGhuYW1lKTtcbiAgdmFyIGlzUm9vdFVyaSA9IHVyaVNlZ21lbnRzWzBdID09PSBcIlwiO1xuICB2YXIgcmFua2VkID0gcmFua1JvdXRlcyhyb3V0ZXMpO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcmFua2VkLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBtaXNzZWQgPSBmYWxzZTtcbiAgICB2YXIgcm91dGUgPSByYW5rZWRbaV0ucm91dGU7XG5cbiAgICBpZiAocm91dGUuZGVmYXVsdCkge1xuICAgICAgZGVmYXVsdF8gPSB7XG4gICAgICAgIHJvdXRlOiByb3V0ZSxcbiAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgdXJpOiB1cmlcbiAgICAgIH07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgcm91dGVTZWdtZW50cyA9IHNlZ21lbnRpemUocm91dGUucGF0aCk7XG4gICAgdmFyIHBhcmFtcyA9IHt9O1xuICAgIHZhciBtYXggPSBNYXRoLm1heCh1cmlTZWdtZW50cy5sZW5ndGgsIHJvdXRlU2VnbWVudHMubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuXG4gICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICB2YXIgcm91dGVTZWdtZW50ID0gcm91dGVTZWdtZW50c1tpbmRleF07XG4gICAgICB2YXIgdXJpU2VnbWVudCA9IHVyaVNlZ21lbnRzW2luZGV4XTtcblxuICAgICAgaWYgKGlzU3BsYXQocm91dGVTZWdtZW50KSkge1xuICAgICAgICAvLyBIaXQgYSBzcGxhdCwganVzdCBncmFiIHRoZSByZXN0LCBhbmQgcmV0dXJuIGEgbWF0Y2hcbiAgICAgICAgLy8gdXJpOiAgIC9maWxlcy9kb2N1bWVudHMvd29ya1xuICAgICAgICAvLyByb3V0ZTogL2ZpbGVzLypcbiAgICAgICAgdmFyIHBhcmFtID0gcm91dGVTZWdtZW50LnNsaWNlKDEpIHx8IFwiKlwiO1xuICAgICAgICBwYXJhbXNbcGFyYW1dID0gdXJpU2VnbWVudHMuc2xpY2UoaW5kZXgpLm1hcChkZWNvZGVVUklDb21wb25lbnQpLmpvaW4oXCIvXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHVyaVNlZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBVUkkgaXMgc2hvcnRlciB0aGFuIHRoZSByb3V0ZSwgbm8gbWF0Y2hcbiAgICAgICAgLy8gdXJpOiAgIC91c2Vyc1xuICAgICAgICAvLyByb3V0ZTogL3VzZXJzLzp1c2VySWRcbiAgICAgICAgbWlzc2VkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHZhciBkeW5hbWljTWF0Y2ggPSBwYXJhbVJlLmV4ZWMocm91dGVTZWdtZW50KTtcblxuICAgICAgaWYgKGR5bmFtaWNNYXRjaCAmJiAhaXNSb290VXJpKSB7XG4gICAgICAgIHZhciBtYXRjaElzTm90UmVzZXJ2ZWQgPSByZXNlcnZlZE5hbWVzLmluZGV4T2YoZHluYW1pY01hdGNoWzFdKSA9PT0gLTE7XG4gICAgICAgICFtYXRjaElzTm90UmVzZXJ2ZWQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiPFJvdXRlcj4gZHluYW1pYyBzZWdtZW50IFxcXCJcIiArIGR5bmFtaWNNYXRjaFsxXSArIFwiXFxcIiBpcyBhIHJlc2VydmVkIG5hbWUuIFBsZWFzZSB1c2UgYSBkaWZmZXJlbnQgbmFtZSBpbiBwYXRoIFxcXCJcIiArIHJvdXRlLnBhdGggKyBcIlxcXCIuXCIpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAgICAgdmFyIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHVyaVNlZ21lbnQpO1xuICAgICAgICBwYXJhbXNbZHluYW1pY01hdGNoWzFdXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChyb3V0ZVNlZ21lbnQgIT09IHVyaVNlZ21lbnQpIHtcbiAgICAgICAgLy8gQ3VycmVudCBzZWdtZW50cyBkb24ndCBtYXRjaCwgbm90IGR5bmFtaWMsIG5vdCBzcGxhdCwgc28gbm8gbWF0Y2hcbiAgICAgICAgLy8gdXJpOiAgIC91c2Vycy8xMjMvc2V0dGluZ3NcbiAgICAgICAgLy8gcm91dGU6IC91c2Vycy86aWQvcHJvZmlsZVxuICAgICAgICBtaXNzZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW1pc3NlZCkge1xuICAgICAgbWF0Y2ggPSB7XG4gICAgICAgIHJvdXRlOiByb3V0ZSxcbiAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgIHVyaTogXCIvXCIgKyB1cmlTZWdtZW50cy5zbGljZSgwLCBpbmRleCkuam9pbihcIi9cIilcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0Y2ggfHwgZGVmYXVsdF8gfHwgbnVsbDtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBtYXRjaChwYXRoLCB1cmkpIC0gTWF0Y2hlcyBqdXN0IG9uZSBwYXRoIHRvIGEgdXJpLCBhbHNvIGxvbFxudmFyIG1hdGNoID0gZnVuY3Rpb24gbWF0Y2gocGF0aCwgdXJpKSB7XG4gIHJldHVybiBwaWNrKFt7IHBhdGg6IHBhdGggfV0sIHVyaSk7XG59O1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gcmVzb2x2ZSh0bywgYmFzZXBhdGgpXG4vL1xuLy8gUmVzb2x2ZXMgVVJJcyBhcyB0aG91Z2ggZXZlcnkgcGF0aCBpcyBhIGRpcmVjdG9yeSwgbm8gZmlsZXMuICBSZWxhdGl2ZSBVUklzXG4vLyBpbiB0aGUgYnJvd3NlciBjYW4gZmVlbCBhd2t3YXJkIGJlY2F1c2Ugbm90IG9ubHkgY2FuIHlvdSBiZSBcImluIGEgZGlyZWN0b3J5XCJcbi8vIHlvdSBjYW4gYmUgXCJhdCBhIGZpbGVcIiwgdG9vLiBGb3IgZXhhbXBsZVxuLy9cbi8vICAgICBicm93c2VyU3BlY1Jlc29sdmUoJ2ZvbycsICcvYmFyLycpID0+IC9iYXIvZm9vXG4vLyAgICAgYnJvd3NlclNwZWNSZXNvbHZlKCdmb28nLCAnL2JhcicpID0+IC9mb29cbi8vXG4vLyBCdXQgb24gdGhlIGNvbW1hbmQgbGluZSBvZiBhIGZpbGUgc3lzdGVtLCBpdCdzIG5vdCBhcyBjb21wbGljYXRlZCwgeW91IGNhbid0XG4vLyBgY2RgIGZyb20gYSBmaWxlLCBvbmx5IGRpcmVjdG9yaWVzLiAgVGhpcyB3YXksIGxpbmtzIGhhdmUgdG8ga25vdyBsZXNzIGFib3V0XG4vLyB0aGVpciBjdXJyZW50IHBhdGguIFRvIGdvIGRlZXBlciB5b3UgY2FuIGRvIHRoaXM6XG4vL1xuLy8gICAgIDxMaW5rIHRvPVwiZGVlcGVyXCIvPlxuLy8gICAgIC8vIGluc3RlYWQgb2Zcbi8vICAgICA8TGluayB0bz1geyR7cHJvcHMudXJpfS9kZWVwZXJ9YC8+XG4vL1xuLy8gSnVzdCBsaWtlIGBjZGAsIGlmIHlvdSB3YW50IHRvIGdvIGRlZXBlciBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHlvdSBkbyB0aGlzOlxuLy9cbi8vICAgICBjZCBkZWVwZXJcbi8vICAgICAjIG5vdFxuLy8gICAgIGNkICQocHdkKS9kZWVwZXJcbi8vXG4vLyBCeSB0cmVhdGluZyBldmVyeSBwYXRoIGFzIGEgZGlyZWN0b3J5LCBsaW5raW5nIHRvIHJlbGF0aXZlIHBhdGhzIHNob3VsZFxuLy8gcmVxdWlyZSBsZXNzIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gYW5kIChmaW5nZXJzIGNyb3NzZWQpIGJlIG1vcmUgaW50dWl0aXZlLlxudmFyIHJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKHRvLCBiYXNlKSB7XG4gIC8vIC9mb28vYmFyLCAvYmF6L3F1eCA9PiAvZm9vL2JhclxuICBpZiAoc3RhcnRzV2l0aCh0bywgXCIvXCIpKSB7XG4gICAgcmV0dXJuIHRvO1xuICB9XG5cbiAgdmFyIF90byRzcGxpdCA9IHRvLnNwbGl0KFwiP1wiKSxcbiAgICAgIHRvUGF0aG5hbWUgPSBfdG8kc3BsaXRbMF0sXG4gICAgICB0b1F1ZXJ5ID0gX3RvJHNwbGl0WzFdO1xuXG4gIHZhciBfYmFzZSRzcGxpdCA9IGJhc2Uuc3BsaXQoXCI/XCIpLFxuICAgICAgYmFzZVBhdGhuYW1lID0gX2Jhc2Ukc3BsaXRbMF07XG5cbiAgdmFyIHRvU2VnbWVudHMgPSBzZWdtZW50aXplKHRvUGF0aG5hbWUpO1xuICB2YXIgYmFzZVNlZ21lbnRzID0gc2VnbWVudGl6ZShiYXNlUGF0aG5hbWUpO1xuXG4gIC8vID9hPWIsIC91c2Vycz9iPWMgPT4gL3VzZXJzP2E9YlxuICBpZiAodG9TZWdtZW50c1swXSA9PT0gXCJcIikge1xuICAgIHJldHVybiBhZGRRdWVyeShiYXNlUGF0aG5hbWUsIHRvUXVlcnkpO1xuICB9XG5cbiAgLy8gcHJvZmlsZSwgL3VzZXJzLzc4OSA9PiAvdXNlcnMvNzg5L3Byb2ZpbGVcbiAgaWYgKCFzdGFydHNXaXRoKHRvU2VnbWVudHNbMF0sIFwiLlwiKSkge1xuICAgIHZhciBwYXRobmFtZSA9IGJhc2VTZWdtZW50cy5jb25jYXQodG9TZWdtZW50cykuam9pbihcIi9cIik7XG4gICAgcmV0dXJuIGFkZFF1ZXJ5KChiYXNlUGF0aG5hbWUgPT09IFwiL1wiID8gXCJcIiA6IFwiL1wiKSArIHBhdGhuYW1lLCB0b1F1ZXJ5KTtcbiAgfVxuXG4gIC8vIC4vICAgICAgICAgL3VzZXJzLzEyMyAgPT4gIC91c2Vycy8xMjNcbiAgLy8gLi4vICAgICAgICAvdXNlcnMvMTIzICA9PiAgL3VzZXJzXG4gIC8vIC4uLy4uICAgICAgL3VzZXJzLzEyMyAgPT4gIC9cbiAgLy8gLi4vLi4vb25lICAvYS9iL2MvZCAgICA9PiAgL2EvYi9vbmVcbiAgLy8gLi4vLi9vbmUgICAvYS9iL2MvZCAgICA9PiAgL2EvYi9jL29uZVxuICB2YXIgYWxsU2VnbWVudHMgPSBiYXNlU2VnbWVudHMuY29uY2F0KHRvU2VnbWVudHMpO1xuICB2YXIgc2VnbWVudHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhbGxTZWdtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgc2VnbWVudCA9IGFsbFNlZ21lbnRzW2ldO1xuICAgIGlmIChzZWdtZW50ID09PSBcIi4uXCIpIHNlZ21lbnRzLnBvcCgpO2Vsc2UgaWYgKHNlZ21lbnQgIT09IFwiLlwiKSBzZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGFkZFF1ZXJ5KFwiL1wiICsgc2VnbWVudHMuam9pbihcIi9cIiksIHRvUXVlcnkpO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIGluc2VydFBhcmFtcyhwYXRoLCBwYXJhbXMpXG5cbnZhciBpbnNlcnRQYXJhbXMgPSBmdW5jdGlvbiBpbnNlcnRQYXJhbXMocGF0aCwgcGFyYW1zKSB7XG4gIHZhciBfcGF0aCRzcGxpdCA9IHBhdGguc3BsaXQoXCI/XCIpLFxuICAgICAgcGF0aEJhc2UgPSBfcGF0aCRzcGxpdFswXSxcbiAgICAgIF9wYXRoJHNwbGl0JCA9IF9wYXRoJHNwbGl0WzFdLFxuICAgICAgcXVlcnkgPSBfcGF0aCRzcGxpdCQgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfcGF0aCRzcGxpdCQ7XG5cbiAgdmFyIHNlZ21lbnRzID0gc2VnbWVudGl6ZShwYXRoQmFzZSk7XG4gIHZhciBjb25zdHJ1Y3RlZFBhdGggPSBcIi9cIiArIHNlZ21lbnRzLm1hcChmdW5jdGlvbiAoc2VnbWVudCkge1xuICAgIHZhciBtYXRjaCA9IHBhcmFtUmUuZXhlYyhzZWdtZW50KTtcbiAgICByZXR1cm4gbWF0Y2ggPyBwYXJhbXNbbWF0Y2hbMV1dIDogc2VnbWVudDtcbiAgfSkuam9pbihcIi9cIik7XG4gIHZhciBfcGFyYW1zJGxvY2F0aW9uID0gcGFyYW1zLmxvY2F0aW9uO1xuICBfcGFyYW1zJGxvY2F0aW9uID0gX3BhcmFtcyRsb2NhdGlvbiA9PT0gdW5kZWZpbmVkID8ge30gOiBfcGFyYW1zJGxvY2F0aW9uO1xuICB2YXIgX3BhcmFtcyRsb2NhdGlvbiRzZWFyID0gX3BhcmFtcyRsb2NhdGlvbi5zZWFyY2gsXG4gICAgICBzZWFyY2ggPSBfcGFyYW1zJGxvY2F0aW9uJHNlYXIgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfcGFyYW1zJGxvY2F0aW9uJHNlYXI7XG5cbiAgdmFyIHNlYXJjaFNwbGl0ID0gc2VhcmNoLnNwbGl0KFwiP1wiKVsxXSB8fCBcIlwiO1xuICBjb25zdHJ1Y3RlZFBhdGggPSBhZGRRdWVyeShjb25zdHJ1Y3RlZFBhdGgsIHF1ZXJ5LCBzZWFyY2hTcGxpdCk7XG4gIHJldHVybiBjb25zdHJ1Y3RlZFBhdGg7XG59O1xuXG52YXIgdmFsaWRhdGVSZWRpcmVjdCA9IGZ1bmN0aW9uIHZhbGlkYXRlUmVkaXJlY3QoZnJvbSwgdG8pIHtcbiAgdmFyIGZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihzZWdtZW50KSB7XG4gICAgcmV0dXJuIGlzRHluYW1pYyhzZWdtZW50KTtcbiAgfTtcbiAgdmFyIGZyb21TdHJpbmcgPSBzZWdtZW50aXplKGZyb20pLmZpbHRlcihmaWx0ZXIpLnNvcnQoKS5qb2luKFwiL1wiKTtcbiAgdmFyIHRvU3RyaW5nID0gc2VnbWVudGl6ZSh0bykuZmlsdGVyKGZpbHRlcikuc29ydCgpLmpvaW4oXCIvXCIpO1xuICByZXR1cm4gZnJvbVN0cmluZyA9PT0gdG9TdHJpbmc7XG59O1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gSnVua1xudmFyIHBhcmFtUmUgPSAvXjooLispLztcblxudmFyIFNFR01FTlRfUE9JTlRTID0gNDtcbnZhciBTVEFUSUNfUE9JTlRTID0gMztcbnZhciBEWU5BTUlDX1BPSU5UUyA9IDI7XG52YXIgU1BMQVRfUEVOQUxUWSA9IDE7XG52YXIgUk9PVF9QT0lOVFMgPSAxO1xuXG52YXIgaXNSb290U2VnbWVudCA9IGZ1bmN0aW9uIGlzUm9vdFNlZ21lbnQoc2VnbWVudCkge1xuICByZXR1cm4gc2VnbWVudCA9PT0gXCJcIjtcbn07XG52YXIgaXNEeW5hbWljID0gZnVuY3Rpb24gaXNEeW5hbWljKHNlZ21lbnQpIHtcbiAgcmV0dXJuIHBhcmFtUmUudGVzdChzZWdtZW50KTtcbn07XG52YXIgaXNTcGxhdCA9IGZ1bmN0aW9uIGlzU3BsYXQoc2VnbWVudCkge1xuICByZXR1cm4gc2VnbWVudCAmJiBzZWdtZW50WzBdID09PSBcIipcIjtcbn07XG5cbnZhciByYW5rUm91dGUgPSBmdW5jdGlvbiByYW5rUm91dGUocm91dGUsIGluZGV4KSB7XG4gIHZhciBzY29yZSA9IHJvdXRlLmRlZmF1bHQgPyAwIDogc2VnbWVudGl6ZShyb3V0ZS5wYXRoKS5yZWR1Y2UoZnVuY3Rpb24gKHNjb3JlLCBzZWdtZW50KSB7XG4gICAgc2NvcmUgKz0gU0VHTUVOVF9QT0lOVFM7XG4gICAgaWYgKGlzUm9vdFNlZ21lbnQoc2VnbWVudCkpIHNjb3JlICs9IFJPT1RfUE9JTlRTO2Vsc2UgaWYgKGlzRHluYW1pYyhzZWdtZW50KSkgc2NvcmUgKz0gRFlOQU1JQ19QT0lOVFM7ZWxzZSBpZiAoaXNTcGxhdChzZWdtZW50KSkgc2NvcmUgLT0gU0VHTUVOVF9QT0lOVFMgKyBTUExBVF9QRU5BTFRZO2Vsc2Ugc2NvcmUgKz0gU1RBVElDX1BPSU5UUztcbiAgICByZXR1cm4gc2NvcmU7XG4gIH0sIDApO1xuICByZXR1cm4geyByb3V0ZTogcm91dGUsIHNjb3JlOiBzY29yZSwgaW5kZXg6IGluZGV4IH07XG59O1xuXG52YXIgcmFua1JvdXRlcyA9IGZ1bmN0aW9uIHJhbmtSb3V0ZXMocm91dGVzKSB7XG4gIHJldHVybiByb3V0ZXMubWFwKHJhbmtSb3V0ZSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhLnNjb3JlIDwgYi5zY29yZSA/IDEgOiBhLnNjb3JlID4gYi5zY29yZSA/IC0xIDogYS5pbmRleCAtIGIuaW5kZXg7XG4gIH0pO1xufTtcblxudmFyIHNlZ21lbnRpemUgPSBmdW5jdGlvbiBzZWdtZW50aXplKHVyaSkge1xuICByZXR1cm4gdXJpXG4gIC8vIHN0cmlwIHN0YXJ0aW5nL2VuZGluZyBzbGFzaGVzXG4gIC5yZXBsYWNlKC8oXlxcLyt8XFwvKyQpL2csIFwiXCIpLnNwbGl0KFwiL1wiKTtcbn07XG5cbnZhciBhZGRRdWVyeSA9IGZ1bmN0aW9uIGFkZFF1ZXJ5KHBhdGhuYW1lKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBxdWVyeSA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBxdWVyeVtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBxdWVyeSA9IHF1ZXJ5LmZpbHRlcihmdW5jdGlvbiAocSkge1xuICAgIHJldHVybiBxICYmIHEubGVuZ3RoID4gMDtcbiAgfSk7XG4gIHJldHVybiBwYXRobmFtZSArIChxdWVyeSAmJiBxdWVyeS5sZW5ndGggPiAwID8gXCI/XCIgKyBxdWVyeS5qb2luKFwiJlwiKSA6IFwiXCIpO1xufTtcblxudmFyIHJlc2VydmVkTmFtZXMgPSBbXCJ1cmlcIiwgXCJwYXRoXCJdO1xuXG4vKipcbiAqIFNoYWxsb3cgY29tcGFyZXMgdHdvIG9iamVjdHMuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMiBUaGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlLlxuICovXG52YXIgc2hhbGxvd0NvbXBhcmUgPSBmdW5jdGlvbiBzaGFsbG93Q29tcGFyZShvYmoxLCBvYmoyKSB7XG4gIHZhciBvYmoxS2V5cyA9IE9iamVjdC5rZXlzKG9iajEpO1xuICByZXR1cm4gb2JqMUtleXMubGVuZ3RoID09PSBPYmplY3Qua2V5cyhvYmoyKS5sZW5ndGggJiYgb2JqMUtleXMuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBvYmoyLmhhc093blByb3BlcnR5KGtleSkgJiYgb2JqMVtrZXldID09PSBvYmoyW2tleV07XG4gIH0pO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCB7IHN0YXJ0c1dpdGgsIHBpY2ssIG1hdGNoLCByZXNvbHZlLCBpbnNlcnRQYXJhbXMsIHZhbGlkYXRlUmVkaXJlY3QsIHNoYWxsb3dDb21wYXJlIH07IiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIGdldExvY2F0aW9uID0gZnVuY3Rpb24gZ2V0TG9jYXRpb24oc291cmNlKSB7XG4gIHZhciBfc291cmNlJGxvY2F0aW9uID0gc291cmNlLmxvY2F0aW9uLFxuICAgICAgc2VhcmNoID0gX3NvdXJjZSRsb2NhdGlvbi5zZWFyY2gsXG4gICAgICBoYXNoID0gX3NvdXJjZSRsb2NhdGlvbi5oYXNoLFxuICAgICAgaHJlZiA9IF9zb3VyY2UkbG9jYXRpb24uaHJlZixcbiAgICAgIG9yaWdpbiA9IF9zb3VyY2UkbG9jYXRpb24ub3JpZ2luLFxuICAgICAgcHJvdG9jb2wgPSBfc291cmNlJGxvY2F0aW9uLnByb3RvY29sLFxuICAgICAgaG9zdCA9IF9zb3VyY2UkbG9jYXRpb24uaG9zdCxcbiAgICAgIGhvc3RuYW1lID0gX3NvdXJjZSRsb2NhdGlvbi5ob3N0bmFtZSxcbiAgICAgIHBvcnQgPSBfc291cmNlJGxvY2F0aW9uLnBvcnQ7XG4gIHZhciBwYXRobmFtZSA9IHNvdXJjZS5sb2NhdGlvbi5wYXRobmFtZTtcblxuXG4gIGlmICghcGF0aG5hbWUgJiYgaHJlZiAmJiBjYW5Vc2VET00pIHtcbiAgICB2YXIgdXJsID0gbmV3IFVSTChocmVmKTtcbiAgICBwYXRobmFtZSA9IHVybC5wYXRobmFtZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWU6IGVuY29kZVVSSShkZWNvZGVVUkkocGF0aG5hbWUpKSxcbiAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICBoYXNoOiBoYXNoLFxuICAgIGhyZWY6IGhyZWYsXG4gICAgb3JpZ2luOiBvcmlnaW4sXG4gICAgcHJvdG9jb2w6IHByb3RvY29sLFxuICAgIGhvc3Q6IGhvc3QsXG4gICAgaG9zdG5hbWU6IGhvc3RuYW1lLFxuICAgIHBvcnQ6IHBvcnQsXG4gICAgc3RhdGU6IHNvdXJjZS5oaXN0b3J5LnN0YXRlLFxuICAgIGtleTogc291cmNlLmhpc3Rvcnkuc3RhdGUgJiYgc291cmNlLmhpc3Rvcnkuc3RhdGUua2V5IHx8IFwiaW5pdGlhbFwiXG4gIH07XG59O1xuXG52YXIgY3JlYXRlSGlzdG9yeSA9IGZ1bmN0aW9uIGNyZWF0ZUhpc3Rvcnkoc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oc291cmNlKTtcbiAgdmFyIHRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgdmFyIHJlc29sdmVUcmFuc2l0aW9uID0gZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb24oKSB7fTtcblxuICByZXR1cm4ge1xuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgIHJldHVybiBsb2NhdGlvbjtcbiAgICB9LFxuXG4gICAgZ2V0IHRyYW5zaXRpb25pbmcoKSB7XG4gICAgICByZXR1cm4gdHJhbnNpdGlvbmluZztcbiAgICB9LFxuXG4gICAgX29uVHJhbnNpdGlvbkNvbXBsZXRlOiBmdW5jdGlvbiBfb25UcmFuc2l0aW9uQ29tcGxldGUoKSB7XG4gICAgICB0cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICByZXNvbHZlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgbGlzdGVuOiBmdW5jdGlvbiBsaXN0ZW4obGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgICAgdmFyIHBvcHN0YXRlTGlzdGVuZXIgPSBmdW5jdGlvbiBwb3BzdGF0ZUxpc3RlbmVyKCkge1xuICAgICAgICBsb2NhdGlvbiA9IGdldExvY2F0aW9uKHNvdXJjZSk7XG4gICAgICAgIGxpc3RlbmVyKHsgbG9jYXRpb246IGxvY2F0aW9uLCBhY3Rpb246IFwiUE9QXCIgfSk7XG4gICAgICB9O1xuXG4gICAgICBzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHBvcHN0YXRlTGlzdGVuZXIpO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBzb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHBvcHN0YXRlTGlzdGVuZXIpO1xuICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgIHJldHVybiBmbiAhPT0gbGlzdGVuZXI7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9LFxuICAgIG5hdmlnYXRlOiBmdW5jdGlvbiBuYXZpZ2F0ZSh0bykge1xuICAgICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICAgIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgICAgICBfcmVmJHJlcGxhY2UgPSBfcmVmLnJlcGxhY2UsXG4gICAgICAgICAgcmVwbGFjZSA9IF9yZWYkcmVwbGFjZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHJlcGxhY2U7XG5cbiAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgc291cmNlLmhpc3RvcnkuZ28odG8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUgPSBfZXh0ZW5kcyh7fSwgc3RhdGUsIHsga2V5OiBEYXRlLm5vdygpICsgXCJcIiB9KTtcbiAgICAgICAgLy8gdHJ5Li4uY2F0Y2ggaU9TIFNhZmFyaSBsaW1pdHMgdG8gMTAwIHB1c2hTdGF0ZSBjYWxsc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0cmFuc2l0aW9uaW5nIHx8IHJlcGxhY2UpIHtcbiAgICAgICAgICAgIHNvdXJjZS5oaXN0b3J5LnJlcGxhY2VTdGF0ZShzdGF0ZSwgbnVsbCwgdG8pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3VyY2UuaGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsIG51bGwsIHRvKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBzb3VyY2UubG9jYXRpb25bcmVwbGFjZSA/IFwicmVwbGFjZVwiIDogXCJhc3NpZ25cIl0odG8pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oc291cmNlKTtcbiAgICAgIHRyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgdmFyIHRyYW5zaXRpb24gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVHJhbnNpdGlvbiA9IHJlcztcbiAgICAgIH0pO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5lcih7IGxvY2F0aW9uOiBsb2NhdGlvbiwgYWN0aW9uOiBcIlBVU0hcIiB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb247XG4gICAgfVxuICB9O1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFN0b3JlcyBoaXN0b3J5IGVudHJpZXMgaW4gbWVtb3J5IGZvciB0ZXN0aW5nIG9yIG90aGVyIHBsYXRmb3JtcyBsaWtlIE5hdGl2ZVxudmFyIGNyZWF0ZU1lbW9yeVNvdXJjZSA9IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVNvdXJjZSgpIHtcbiAgdmFyIGluaXRpYWxQYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBcIi9cIjtcblxuICB2YXIgc2VhcmNoSW5kZXggPSBpbml0aWFsUGF0aC5pbmRleE9mKFwiP1wiKTtcbiAgdmFyIGluaXRpYWxMb2NhdGlvbiA9IHtcbiAgICBwYXRobmFtZTogc2VhcmNoSW5kZXggPiAtMSA/IGluaXRpYWxQYXRoLnN1YnN0cigwLCBzZWFyY2hJbmRleCkgOiBpbml0aWFsUGF0aCxcbiAgICBzZWFyY2g6IHNlYXJjaEluZGV4ID4gLTEgPyBpbml0aWFsUGF0aC5zdWJzdHIoc2VhcmNoSW5kZXgpIDogXCJcIlxuICB9O1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgc3RhY2sgPSBbaW5pdGlhbExvY2F0aW9uXTtcbiAgdmFyIHN0YXRlcyA9IFtudWxsXTtcblxuICByZXR1cm4ge1xuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgIHJldHVybiBzdGFja1tpbmRleF07XG4gICAgfSxcbiAgICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKG5hbWUsIGZuKSB7fSxcbiAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGZuKSB7fSxcblxuICAgIGhpc3Rvcnk6IHtcbiAgICAgIGdldCBlbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gc3RhY2s7XG4gICAgICB9LFxuICAgICAgZ2V0IGluZGV4KCkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9LFxuICAgICAgZ2V0IHN0YXRlKCkge1xuICAgICAgICByZXR1cm4gc3RhdGVzW2luZGV4XTtcbiAgICAgIH0sXG4gICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIHB1c2hTdGF0ZShzdGF0ZSwgXywgdXJpKSB7XG4gICAgICAgIHZhciBfdXJpJHNwbGl0ID0gdXJpLnNwbGl0KFwiP1wiKSxcbiAgICAgICAgICAgIHBhdGhuYW1lID0gX3VyaSRzcGxpdFswXSxcbiAgICAgICAgICAgIF91cmkkc3BsaXQkID0gX3VyaSRzcGxpdFsxXSxcbiAgICAgICAgICAgIHNlYXJjaCA9IF91cmkkc3BsaXQkID09PSB1bmRlZmluZWQgPyBcIlwiIDogX3VyaSRzcGxpdCQ7XG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgc3RhY2sucHVzaCh7IHBhdGhuYW1lOiBwYXRobmFtZSwgc2VhcmNoOiBzZWFyY2gubGVuZ3RoID8gXCI/XCIgKyBzZWFyY2ggOiBzZWFyY2ggfSk7XG4gICAgICAgIHN0YXRlcy5wdXNoKHN0YXRlKTtcbiAgICAgIH0sXG4gICAgICByZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIHJlcGxhY2VTdGF0ZShzdGF0ZSwgXywgdXJpKSB7XG4gICAgICAgIHZhciBfdXJpJHNwbGl0MiA9IHVyaS5zcGxpdChcIj9cIiksXG4gICAgICAgICAgICBwYXRobmFtZSA9IF91cmkkc3BsaXQyWzBdLFxuICAgICAgICAgICAgX3VyaSRzcGxpdDIkID0gX3VyaSRzcGxpdDJbMV0sXG4gICAgICAgICAgICBzZWFyY2ggPSBfdXJpJHNwbGl0MiQgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfdXJpJHNwbGl0MiQ7XG5cbiAgICAgICAgc3RhY2tbaW5kZXhdID0geyBwYXRobmFtZTogcGF0aG5hbWUsIHNlYXJjaDogc2VhcmNoIH07XG4gICAgICAgIHN0YXRlc1tpbmRleF0gPSBzdGF0ZTtcbiAgICAgIH0sXG4gICAgICBnbzogZnVuY3Rpb24gZ28odG8pIHtcbiAgICAgICAgdmFyIG5ld0luZGV4ID0gaW5kZXggKyB0bztcblxuICAgICAgICBpZiAobmV3SW5kZXggPCAwIHx8IG5ld0luZGV4ID4gc3RhdGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCA9IG5ld0luZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBnbG9iYWwgaGlzdG9yeSAtIHVzZXMgd2luZG93Lmhpc3RvcnkgYXMgdGhlIHNvdXJjZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBhXG4vLyBtZW1vcnkgaGlzdG9yeVxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbnZhciBnZXRTb3VyY2UgPSBmdW5jdGlvbiBnZXRTb3VyY2UoKSB7XG4gIHJldHVybiBjYW5Vc2VET00gPyB3aW5kb3cgOiBjcmVhdGVNZW1vcnlTb3VyY2UoKTtcbn07XG5cbnZhciBnbG9iYWxIaXN0b3J5ID0gY3JlYXRlSGlzdG9yeShnZXRTb3VyY2UoKSk7XG52YXIgbmF2aWdhdGUgPSBnbG9iYWxIaXN0b3J5Lm5hdmlnYXRlO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQgeyBnbG9iYWxIaXN0b3J5LCBuYXZpZ2F0ZSwgY3JlYXRlSGlzdG9yeSwgY3JlYXRlTWVtb3J5U291cmNlIH07IiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2FuY2hvci1oYXMtY29udGVudCAqL1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSBcImludmFyaWFudFwiO1xuaW1wb3J0IGNyZWF0ZUNvbnRleHQgZnJvbSBcImNyZWF0ZS1yZWFjdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBwb2x5ZmlsbCB9IGZyb20gXCJyZWFjdC1saWZlY3ljbGVzLWNvbXBhdFwiO1xuaW1wb3J0IHsgc3RhcnRzV2l0aCwgcGljaywgcmVzb2x2ZSwgbWF0Y2gsIGluc2VydFBhcmFtcywgdmFsaWRhdGVSZWRpcmVjdCwgc2hhbGxvd0NvbXBhcmUgfSBmcm9tIFwiLi9saWIvdXRpbHNcIjtcbmltcG9ydCB7IGdsb2JhbEhpc3RvcnksIG5hdmlnYXRlLCBjcmVhdGVIaXN0b3J5LCBjcmVhdGVNZW1vcnlTb3VyY2UgfSBmcm9tIFwiLi9saWIvaGlzdG9yeVwiO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG52YXIgY3JlYXRlTmFtZWRDb250ZXh0ID0gZnVuY3Rpb24gY3JlYXRlTmFtZWRDb250ZXh0KG5hbWUsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgQ3R4ID0gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpO1xuICBDdHguZGlzcGxheU5hbWUgPSBuYW1lO1xuICByZXR1cm4gQ3R4O1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIExvY2F0aW9uIENvbnRleHQvUHJvdmlkZXJcbnZhciBMb2NhdGlvbkNvbnRleHQgPSBjcmVhdGVOYW1lZENvbnRleHQoXCJMb2NhdGlvblwiKTtcblxuLy8gc2V0cyB1cCBhIGxpc3RlbmVyIGlmIHRoZXJlIGlzbid0IG9uZSBhbHJlYWR5IHNvIGFwcHMgZG9uJ3QgbmVlZCB0byBiZVxuLy8gd3JhcHBlZCBpbiBzb21lIHRvcCBsZXZlbCBwcm92aWRlclxudmFyIExvY2F0aW9uID0gZnVuY3Rpb24gTG9jYXRpb24oX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICBMb2NhdGlvbkNvbnRleHQuQ29uc3VtZXIsXG4gICAgbnVsbCxcbiAgICBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIGNvbnRleHQgPyBjaGlsZHJlbihjb250ZXh0KSA6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIExvY2F0aW9uUHJvdmlkZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApO1xuICAgIH1cbiAgKTtcbn07XG5cbnZhciBMb2NhdGlvblByb3ZpZGVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKExvY2F0aW9uUHJvdmlkZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIExvY2F0aW9uUHJvdmlkZXIoKSB7XG4gICAgdmFyIF90ZW1wLCBfdGhpcywgX3JldDtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMb2NhdGlvblByb3ZpZGVyKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNvbnRleHQ6IF90aGlzLmdldENvbnRleHQoKSxcbiAgICAgIHJlZnM6IHsgdW5saXN0ZW46IG51bGwgfVxuICAgIH0sIF90ZW1wKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgTG9jYXRpb25Qcm92aWRlci5wcm90b3R5cGUuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gICAgdmFyIF9wcm9wcyRoaXN0b3J5ID0gdGhpcy5wcm9wcy5oaXN0b3J5LFxuICAgICAgICBuYXZpZ2F0ZSA9IF9wcm9wcyRoaXN0b3J5Lm5hdmlnYXRlLFxuICAgICAgICBsb2NhdGlvbiA9IF9wcm9wcyRoaXN0b3J5LmxvY2F0aW9uO1xuXG4gICAgcmV0dXJuIHsgbmF2aWdhdGU6IG5hdmlnYXRlLCBsb2NhdGlvbjogbG9jYXRpb24gfTtcbiAgfTtcblxuICBMb2NhdGlvblByb3ZpZGVyLnByb3RvdHlwZS5jb21wb25lbnREaWRDYXRjaCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBpbmZvKSB7XG4gICAgaWYgKGlzUmVkaXJlY3QoZXJyb3IpKSB7XG4gICAgICB2YXIgX25hdmlnYXRlID0gdGhpcy5wcm9wcy5oaXN0b3J5Lm5hdmlnYXRlO1xuXG4gICAgICBfbmF2aWdhdGUoZXJyb3IudXJpLCB7IHJlcGxhY2U6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBMb2NhdGlvblByb3ZpZGVyLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICBpZiAocHJldlN0YXRlLmNvbnRleHQubG9jYXRpb24gIT09IHRoaXMuc3RhdGUuY29udGV4dC5sb2NhdGlvbikge1xuICAgICAgdGhpcy5wcm9wcy5oaXN0b3J5Ll9vblRyYW5zaXRpb25Db21wbGV0ZSgpO1xuICAgIH1cbiAgfTtcblxuICBMb2NhdGlvblByb3ZpZGVyLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHJlZnMgPSB0aGlzLnN0YXRlLnJlZnMsXG4gICAgICAgIGhpc3RvcnkgPSB0aGlzLnByb3BzLmhpc3Rvcnk7XG5cbiAgICBoaXN0b3J5Ll9vblRyYW5zaXRpb25Db21wbGV0ZSgpO1xuICAgIHJlZnMudW5saXN0ZW4gPSBoaXN0b3J5Lmxpc3RlbihmdW5jdGlvbiAoKSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSByQUYgd2l0aCByZWFjdCBkZWZlcnJlZCB1cGRhdGUgQVBJIHdoZW4gaXQncyByZWFkeSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMzA2XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFfdGhpczIudW5tb3VudGVkKSB7XG4gICAgICAgICAgICBfdGhpczIuc2V0U3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4geyBjb250ZXh0OiBfdGhpczIuZ2V0Q29udGV4dCgpIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYXRpb25Qcm92aWRlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB2YXIgcmVmcyA9IHRoaXMuc3RhdGUucmVmcztcblxuICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZTtcbiAgICByZWZzLnVubGlzdGVuKCk7XG4gIH07XG5cbiAgTG9jYXRpb25Qcm92aWRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBjb250ZXh0ID0gdGhpcy5zdGF0ZS5jb250ZXh0LFxuICAgICAgICBjaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW47XG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgIExvY2F0aW9uQ29udGV4dC5Qcm92aWRlcixcbiAgICAgIHsgdmFsdWU6IGNvbnRleHQgfSxcbiAgICAgIHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiID8gY2hpbGRyZW4oY29udGV4dCkgOiBjaGlsZHJlbiB8fCBudWxsXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTG9jYXRpb25Qcm92aWRlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG5Mb2NhdGlvblByb3ZpZGVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgaGlzdG9yeTogZ2xvYmFsSGlzdG9yeVxufTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IExvY2F0aW9uUHJvdmlkZXIucHJvcFR5cGVzID0ge1xuICBoaXN0b3J5OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn0gOiB2b2lkIDA7XG52YXIgU2VydmVyTG9jYXRpb24gPSBmdW5jdGlvbiBTZXJ2ZXJMb2NhdGlvbihfcmVmMikge1xuICB2YXIgdXJsID0gX3JlZjIudXJsLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMi5jaGlsZHJlbjtcblxuICB2YXIgc2VhcmNoSW5kZXggPSB1cmwuaW5kZXhPZihcIj9cIik7XG4gIHZhciBzZWFyY2hFeGlzdHMgPSBzZWFyY2hJbmRleCA+IC0xO1xuICB2YXIgcGF0aG5hbWUgPSB2b2lkIDA7XG4gIHZhciBzZWFyY2ggPSBcIlwiO1xuICB2YXIgaGFzaCA9IFwiXCI7XG5cbiAgaWYgKHNlYXJjaEV4aXN0cykge1xuICAgIHBhdGhuYW1lID0gdXJsLnN1YnN0cmluZygwLCBzZWFyY2hJbmRleCk7XG4gICAgc2VhcmNoID0gdXJsLnN1YnN0cmluZyhzZWFyY2hJbmRleCk7XG4gIH0gZWxzZSB7XG4gICAgcGF0aG5hbWUgPSB1cmw7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICBMb2NhdGlvbkNvbnRleHQuUHJvdmlkZXIsXG4gICAge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBzZWFyY2gsXG4gICAgICAgICAgaGFzaDogaGFzaFxuICAgICAgICB9LFxuICAgICAgICBuYXZpZ2F0ZTogZnVuY3Rpb24gbmF2aWdhdGUoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbid0IGNhbGwgbmF2aWdhdGUgb24gdGhlIHNlcnZlci5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNoaWxkcmVuXG4gICk7XG59O1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFNldHMgYmFzZXVyaSBhbmQgYmFzZXBhdGggZm9yIG5lc3RlZCByb3V0ZXJzIGFuZCBsaW5rc1xudmFyIEJhc2VDb250ZXh0ID0gY3JlYXRlTmFtZWRDb250ZXh0KFwiQmFzZVwiLCB7IGJhc2V1cmk6IFwiL1wiLCBiYXNlcGF0aDogXCIvXCIgfSk7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBUaGUgbWFpbiBldmVudCwgd2VsY29tZSB0byB0aGUgc2hvdyBldmVyeWJvZHkuXG52YXIgUm91dGVyID0gZnVuY3Rpb24gUm91dGVyKHByb3BzKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgIEJhc2VDb250ZXh0LkNvbnN1bWVyLFxuICAgIG51bGwsXG4gICAgZnVuY3Rpb24gKGJhc2VDb250ZXh0KSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgTG9jYXRpb24sXG4gICAgICAgIG51bGwsXG4gICAgICAgIGZ1bmN0aW9uIChsb2NhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZXJJbXBsLCBfZXh0ZW5kcyh7fSwgYmFzZUNvbnRleHQsIGxvY2F0aW9uQ29udGV4dCwgcHJvcHMpKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICk7XG59O1xuXG52YXIgUm91dGVySW1wbCA9IGZ1bmN0aW9uIChfUmVhY3QkUHVyZUNvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUm91dGVySW1wbCwgX1JlYWN0JFB1cmVDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvdXRlckltcGwoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJvdXRlckltcGwpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRQdXJlQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUm91dGVySW1wbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBsb2NhdGlvbiA9IF9wcm9wcy5sb2NhdGlvbixcbiAgICAgICAgX25hdmlnYXRlMiA9IF9wcm9wcy5uYXZpZ2F0ZSxcbiAgICAgICAgYmFzZXBhdGggPSBfcHJvcHMuYmFzZXBhdGgsXG4gICAgICAgIHByaW1hcnkgPSBfcHJvcHMucHJpbWFyeSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGJhc2V1cmkgPSBfcHJvcHMuYmFzZXVyaSxcbiAgICAgICAgX3Byb3BzJGNvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnQsXG4gICAgICAgIGNvbXBvbmVudCA9IF9wcm9wcyRjb21wb25lbnQgPT09IHVuZGVmaW5lZCA/IFwiZGl2XCIgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgICBkb21Qcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFtcImxvY2F0aW9uXCIsIFwibmF2aWdhdGVcIiwgXCJiYXNlcGF0aFwiLCBcInByaW1hcnlcIiwgXCJjaGlsZHJlblwiLCBcImJhc2V1cmlcIiwgXCJjb21wb25lbnRcIl0pO1xuXG4gICAgdmFyIHJvdXRlcyA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pLnJlZHVjZShmdW5jdGlvbiAoYXJyYXksIGNoaWxkKSB7XG4gICAgICB2YXIgcm91dGVzID0gY3JlYXRlUm91dGUoYmFzZXBhdGgpKGNoaWxkKTtcbiAgICAgIHJldHVybiBhcnJheS5jb25jYXQocm91dGVzKTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIHBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XG5cblxuICAgIHZhciBtYXRjaCA9IHBpY2socm91dGVzLCBwYXRobmFtZSk7XG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBtYXRjaC5wYXJhbXMsXG4gICAgICAgICAgdXJpID0gbWF0Y2gudXJpLFxuICAgICAgICAgIHJvdXRlID0gbWF0Y2gucm91dGUsXG4gICAgICAgICAgZWxlbWVudCA9IG1hdGNoLnJvdXRlLnZhbHVlO1xuXG4gICAgICAvLyByZW1vdmUgdGhlIC8qIGZyb20gdGhlIGVuZCBmb3IgY2hpbGQgcm91dGVzIHJlbGF0aXZlIHBhdGhzXG5cbiAgICAgIGJhc2VwYXRoID0gcm91dGUuZGVmYXVsdCA/IGJhc2VwYXRoIDogcm91dGUucGF0aC5yZXBsYWNlKC9cXCokLywgXCJcIik7XG5cbiAgICAgIHZhciBwcm9wcyA9IF9leHRlbmRzKHt9LCBwYXJhbXMsIHtcbiAgICAgICAgdXJpOiB1cmksXG4gICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgbmF2aWdhdGU6IGZ1bmN0aW9uIG5hdmlnYXRlKHRvLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIF9uYXZpZ2F0ZTIocmVzb2x2ZSh0bywgdXJpKSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY2xvbmUgPSBSZWFjdC5jbG9uZUVsZW1lbnQoZWxlbWVudCwgcHJvcHMsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4gPyBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBSb3V0ZXIsXG4gICAgICAgIHsgbG9jYXRpb246IGxvY2F0aW9uLCBwcmltYXJ5OiBwcmltYXJ5IH0sXG4gICAgICAgIGVsZW1lbnQucHJvcHMuY2hpbGRyZW5cbiAgICAgICkgOiB1bmRlZmluZWQpO1xuXG4gICAgICAvLyB1c2luZyAnZGl2JyBmb3IgPCAxNi4zIHN1cHBvcnRcbiAgICAgIHZhciBGb2N1c1dyYXBwZXIgPSBwcmltYXJ5ID8gRm9jdXNIYW5kbGVyIDogY29tcG9uZW50O1xuICAgICAgLy8gZG9uJ3QgcGFzcyBhbnkgcHJvcHMgdG8gJ2RpdidcbiAgICAgIHZhciB3cmFwcGVyUHJvcHMgPSBwcmltYXJ5ID8gX2V4dGVuZHMoeyB1cmk6IHVyaSwgbG9jYXRpb246IGxvY2F0aW9uLCBjb21wb25lbnQ6IGNvbXBvbmVudCB9LCBkb21Qcm9wcykgOiBkb21Qcm9wcztcblxuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIEJhc2VDb250ZXh0LlByb3ZpZGVyLFxuICAgICAgICB7IHZhbHVlOiB7IGJhc2V1cmk6IHVyaSwgYmFzZXBhdGg6IGJhc2VwYXRoIH0gfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBGb2N1c1dyYXBwZXIsXG4gICAgICAgICAgd3JhcHBlclByb3BzLFxuICAgICAgICAgIGNsb25lXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vdCBzdXJlIGlmIHdlIHdhbnQgdGhpcywgd291bGQgcmVxdWlyZSBpbmRleCByb3V0ZXMgYXQgZXZlcnkgbGV2ZWxcbiAgICAgIC8vIHdhcm5pbmcoXG4gICAgICAvLyAgIGZhbHNlLFxuICAgICAgLy8gICBgPFJvdXRlciBiYXNlcGF0aD1cIiR7YmFzZXBhdGh9XCI+XFxuXFxuTm90aGluZyBtYXRjaGVkOlxcblxcdCR7XG4gICAgICAvLyAgICAgbG9jYXRpb24ucGF0aG5hbWVcbiAgICAgIC8vICAgfVxcblxcblBhdGhzIGNoZWNrZWQ6IFxcblxcdCR7cm91dGVzXG4gICAgICAvLyAgICAgLm1hcChyb3V0ZSA9PiByb3V0ZS5wYXRoKVxuICAgICAgLy8gICAgIC5qb2luKFxuICAgICAgLy8gICAgICAgXCJcXG5cXHRcIlxuICAgICAgLy8gICAgICl9XFxuXFxuVG8gZ2V0IHJpZCBvZiB0aGlzIHdhcm5pbmcsIGFkZCBhIGRlZmF1bHQgTm90Rm91bmQgY29tcG9uZW50IGFzIGNoaWxkIG9mIFJvdXRlcjpcbiAgICAgIC8vICAgXFxuXFx0bGV0IE5vdEZvdW5kID0gKCkgPT4gPGRpdj5Ob3QgRm91bmQhPC9kaXY+XG4gICAgICAvLyAgIFxcblxcdDxSb3V0ZXI+XFxuXFx0ICA8Tm90Rm91bmQgZGVmYXVsdC8+XFxuXFx0ICB7LyogLi4uICovfVxcblxcdDwvUm91dGVyPmBcbiAgICAgIC8vICk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFJvdXRlckltcGw7XG59KFJlYWN0LlB1cmVDb21wb25lbnQpO1xuXG5Sb3V0ZXJJbXBsLmRlZmF1bHRQcm9wcyA9IHtcbiAgcHJpbWFyeTogdHJ1ZVxufTtcblxuXG52YXIgRm9jdXNDb250ZXh0ID0gY3JlYXRlTmFtZWRDb250ZXh0KFwiRm9jdXNcIik7XG5cbnZhciBGb2N1c0hhbmRsZXIgPSBmdW5jdGlvbiBGb2N1c0hhbmRsZXIoX3JlZjMpIHtcbiAgdmFyIHVyaSA9IF9yZWYzLnVyaSxcbiAgICAgIGxvY2F0aW9uID0gX3JlZjMubG9jYXRpb24sXG4gICAgICBjb21wb25lbnQgPSBfcmVmMy5jb21wb25lbnQsXG4gICAgICBkb21Qcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMywgW1widXJpXCIsIFwibG9jYXRpb25cIiwgXCJjb21wb25lbnRcIl0pO1xuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgIEZvY3VzQ29udGV4dC5Db25zdW1lcixcbiAgICBudWxsLFxuICAgIGZ1bmN0aW9uIChyZXF1ZXN0Rm9jdXMpIHtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzSGFuZGxlckltcGwsIF9leHRlbmRzKHt9LCBkb21Qcm9wcywge1xuICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICAgICAgcmVxdWVzdEZvY3VzOiByZXF1ZXN0Rm9jdXMsXG4gICAgICAgIHVyaTogdXJpLFxuICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25cbiAgICAgIH0pKTtcbiAgICB9XG4gICk7XG59O1xuXG4vLyBkb24ndCBmb2N1cyBvbiBpbml0aWFsIHJlbmRlclxudmFyIGluaXRpYWxSZW5kZXIgPSB0cnVlO1xudmFyIGZvY3VzSGFuZGxlckNvdW50ID0gMDtcblxudmFyIEZvY3VzSGFuZGxlckltcGwgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudDIpIHtcbiAgX2luaGVyaXRzKEZvY3VzSGFuZGxlckltcGwsIF9SZWFjdCRDb21wb25lbnQyKTtcblxuICBmdW5jdGlvbiBGb2N1c0hhbmRsZXJJbXBsKCkge1xuICAgIHZhciBfdGVtcDIsIF90aGlzNCwgX3JldDI7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9jdXNIYW5kbGVySW1wbCk7XG5cbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0MiA9IChfdGVtcDIgPSAoX3RoaXM0ID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudDIuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50MiwgW3RoaXNdLmNvbmNhdChhcmdzKSkpLCBfdGhpczQpLCBfdGhpczQuc3RhdGUgPSB7fSwgX3RoaXM0LnJlcXVlc3RGb2N1cyA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBpZiAoIV90aGlzNC5zdGF0ZS5zaG91bGRGb2N1cyAmJiBub2RlKSB7XG4gICAgICAgIG5vZGUuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9LCBfdGVtcDIpLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpczQsIF9yZXQyKTtcbiAgfVxuXG4gIEZvY3VzSGFuZGxlckltcGwuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgdmFyIGluaXRpYWwgPSBwcmV2U3RhdGUudXJpID09IG51bGw7XG4gICAgaWYgKGluaXRpYWwpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIHNob3VsZEZvY3VzOiB0cnVlXG4gICAgICB9LCBuZXh0UHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbXlVUklDaGFuZ2VkID0gbmV4dFByb3BzLnVyaSAhPT0gcHJldlN0YXRlLnVyaTtcbiAgICAgIHZhciBuYXZpZ2F0ZWRVcFRvTWUgPSBwcmV2U3RhdGUubG9jYXRpb24ucGF0aG5hbWUgIT09IG5leHRQcm9wcy5sb2NhdGlvbi5wYXRobmFtZSAmJiBuZXh0UHJvcHMubG9jYXRpb24ucGF0aG5hbWUgPT09IG5leHRQcm9wcy51cmk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBzaG91bGRGb2N1czogbXlVUklDaGFuZ2VkIHx8IG5hdmlnYXRlZFVwVG9NZVxuICAgICAgfSwgbmV4dFByb3BzKTtcbiAgICB9XG4gIH07XG5cbiAgRm9jdXNIYW5kbGVySW1wbC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBmb2N1c0hhbmRsZXJDb3VudCsrO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfTtcblxuICBGb2N1c0hhbmRsZXJJbXBsLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGZvY3VzSGFuZGxlckNvdW50LS07XG4gICAgaWYgKGZvY3VzSGFuZGxlckNvdW50ID09PSAwKSB7XG4gICAgICBpbml0aWFsUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgRm9jdXNIYW5kbGVySW1wbC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgaWYgKHByZXZQcm9wcy5sb2NhdGlvbiAhPT0gdGhpcy5wcm9wcy5sb2NhdGlvbiAmJiB0aGlzLnN0YXRlLnNob3VsZEZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIEZvY3VzSGFuZGxlckltcGwucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgLy8gZ2V0dGluZyBjYW5ub3QgcmVhZCBwcm9wZXJ0eSBmb2N1cyBvZiBudWxsIGluIHRoZSB0ZXN0c1xuICAgICAgLy8gYW5kIHRoYXQgYml0IG9mIGdsb2JhbCBgaW5pdGlhbFJlbmRlcmAgc3RhdGUgY2F1c2VzIHByb2JsZW1zXG4gICAgICAvLyBzaG91bGQgcHJvYmFibHkgZmlndXJlIGl0IG91dCFcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmVxdWVzdEZvY3VzID0gdGhpcy5wcm9wcy5yZXF1ZXN0Rm9jdXM7XG5cblxuICAgIGlmIChyZXF1ZXN0Rm9jdXMpIHtcbiAgICAgIHJlcXVlc3RGb2N1cyh0aGlzLm5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW5pdGlhbFJlbmRlcikge1xuICAgICAgICBpbml0aWFsUmVuZGVyID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZSkge1xuICAgICAgICAvLyBSZWFjdCBwb2x5ZmlsbHMgW2F1dG9mb2N1c10gYW5kIGl0IGZpcmVzIGVhcmxpZXIgdGhhbiBjRE0sXG4gICAgICAgIC8vIHNvIHdlIHdlcmUgc3RlYWxpbmcgZm9jdXMgYXdheSwgdGhpcyBsaW5lIHByZXZlbnRzIHRoYXQuXG4gICAgICAgIGlmICghdGhpcy5ub2RlLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgdGhpcy5ub2RlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgRm9jdXNIYW5kbGVySW1wbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wczIuY2hpbGRyZW4sXG4gICAgICAgIHN0eWxlID0gX3Byb3BzMi5zdHlsZSxcbiAgICAgICAgcmVxdWVzdEZvY3VzID0gX3Byb3BzMi5yZXF1ZXN0Rm9jdXMsXG4gICAgICAgIF9wcm9wczIkY29tcG9uZW50ID0gX3Byb3BzMi5jb21wb25lbnQsXG4gICAgICAgIENvbXAgPSBfcHJvcHMyJGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkID8gXCJkaXZcIiA6IF9wcm9wczIkY29tcG9uZW50LFxuICAgICAgICB1cmkgPSBfcHJvcHMyLnVyaSxcbiAgICAgICAgbG9jYXRpb24gPSBfcHJvcHMyLmxvY2F0aW9uLFxuICAgICAgICBkb21Qcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMyLCBbXCJjaGlsZHJlblwiLCBcInN0eWxlXCIsIFwicmVxdWVzdEZvY3VzXCIsIFwiY29tcG9uZW50XCIsIFwidXJpXCIsIFwibG9jYXRpb25cIl0pO1xuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICBDb21wLFxuICAgICAgX2V4dGVuZHMoe1xuICAgICAgICBzdHlsZTogX2V4dGVuZHMoeyBvdXRsaW5lOiBcIm5vbmVcIiB9LCBzdHlsZSksXG4gICAgICAgIHRhYkluZGV4OiBcIi0xXCIsXG4gICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKG4pIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXM1Lm5vZGUgPSBuO1xuICAgICAgICB9XG4gICAgICB9LCBkb21Qcm9wcyksXG4gICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBGb2N1c0NvbnRleHQuUHJvdmlkZXIsXG4gICAgICAgIHsgdmFsdWU6IHRoaXMucmVxdWVzdEZvY3VzIH0sXG4gICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBGb2N1c0hhbmRsZXJJbXBsO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5wb2x5ZmlsbChGb2N1c0hhbmRsZXJJbXBsKTtcblxudmFyIGsgPSBmdW5jdGlvbiBrKCkge307XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG52YXIgZm9yd2FyZFJlZiA9IFJlYWN0LmZvcndhcmRSZWY7XG5cbmlmICh0eXBlb2YgZm9yd2FyZFJlZiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBmb3J3YXJkUmVmID0gZnVuY3Rpb24gZm9yd2FyZFJlZihDKSB7XG4gICAgcmV0dXJuIEM7XG4gIH07XG59XG5cbnZhciBMaW5rID0gZm9yd2FyZFJlZihmdW5jdGlvbiAoX3JlZjQsIHJlZikge1xuICB2YXIgaW5uZXJSZWYgPSBfcmVmNC5pbm5lclJlZixcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY0LCBbXCJpbm5lclJlZlwiXSk7XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgQmFzZUNvbnRleHQuQ29uc3VtZXIsXG4gICAgbnVsbCxcbiAgICBmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgIHZhciBiYXNlcGF0aCA9IF9yZWY1LmJhc2VwYXRoLFxuICAgICAgICAgIGJhc2V1cmkgPSBfcmVmNS5iYXNldXJpO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIExvY2F0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICBmdW5jdGlvbiAoX3JlZjYpIHtcbiAgICAgICAgICB2YXIgbG9jYXRpb24gPSBfcmVmNi5sb2NhdGlvbixcbiAgICAgICAgICAgICAgbmF2aWdhdGUgPSBfcmVmNi5uYXZpZ2F0ZTtcblxuICAgICAgICAgIHZhciB0byA9IHByb3BzLnRvLFxuICAgICAgICAgICAgICBzdGF0ZSA9IHByb3BzLnN0YXRlLFxuICAgICAgICAgICAgICByZXBsYWNlID0gcHJvcHMucmVwbGFjZSxcbiAgICAgICAgICAgICAgX3Byb3BzJGdldFByb3BzID0gcHJvcHMuZ2V0UHJvcHMsXG4gICAgICAgICAgICAgIGdldFByb3BzID0gX3Byb3BzJGdldFByb3BzID09PSB1bmRlZmluZWQgPyBrIDogX3Byb3BzJGdldFByb3BzLFxuICAgICAgICAgICAgICBhbmNob3JQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1widG9cIiwgXCJzdGF0ZVwiLCBcInJlcGxhY2VcIiwgXCJnZXRQcm9wc1wiXSk7XG5cbiAgICAgICAgICB2YXIgaHJlZiA9IHJlc29sdmUodG8sIGJhc2V1cmkpO1xuICAgICAgICAgIHZhciBlbmNvZGVkSHJlZiA9IGVuY29kZVVSSShocmVmKTtcbiAgICAgICAgICB2YXIgaXNDdXJyZW50ID0gbG9jYXRpb24ucGF0aG5hbWUgPT09IGVuY29kZWRIcmVmO1xuICAgICAgICAgIHZhciBpc1BhcnRpYWxseUN1cnJlbnQgPSBzdGFydHNXaXRoKGxvY2F0aW9uLnBhdGhuYW1lLCBlbmNvZGVkSHJlZik7XG5cbiAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgX2V4dGVuZHMoe1xuICAgICAgICAgICAgcmVmOiByZWYgfHwgaW5uZXJSZWYsXG4gICAgICAgICAgICBcImFyaWEtY3VycmVudFwiOiBpc0N1cnJlbnQgPyBcInBhZ2VcIiA6IHVuZGVmaW5lZFxuICAgICAgICAgIH0sIGFuY2hvclByb3BzLCBnZXRQcm9wcyh7IGlzQ3VycmVudDogaXNDdXJyZW50LCBpc1BhcnRpYWxseUN1cnJlbnQ6IGlzUGFydGlhbGx5Q3VycmVudCwgaHJlZjogaHJlZiwgbG9jYXRpb246IGxvY2F0aW9uIH0pLCB7XG4gICAgICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhldmVudCkge1xuICAgICAgICAgICAgICBpZiAoYW5jaG9yUHJvcHMub25DbGljaykgYW5jaG9yUHJvcHMub25DbGljayhldmVudCk7XG4gICAgICAgICAgICAgIGlmIChzaG91bGROYXZpZ2F0ZShldmVudCkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHZhciBzaG91bGRSZXBsYWNlID0gcmVwbGFjZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2UgIT09IFwiYm9vbGVhblwiICYmIGlzQ3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgdmFyIF9sb2NhdGlvbiRzdGF0ZSA9IF9leHRlbmRzKHt9LCBsb2NhdGlvbi5zdGF0ZSksXG4gICAgICAgICAgICAgICAgICAgICAga2V5ID0gX2xvY2F0aW9uJHN0YXRlLmtleSxcbiAgICAgICAgICAgICAgICAgICAgICByZXN0U3RhdGUgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX2xvY2F0aW9uJHN0YXRlLCBbXCJrZXlcIl0pO1xuXG4gICAgICAgICAgICAgICAgICBzaG91bGRSZXBsYWNlID0gc2hhbGxvd0NvbXBhcmUoX2V4dGVuZHMoe30sIHN0YXRlKSwgcmVzdFN0YXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmF2aWdhdGUoaHJlZiwge1xuICAgICAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgICAgICAgcmVwbGFjZTogc2hvdWxkUmVwbGFjZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgKTtcbn0pO1xuXG5MaW5rLmRpc3BsYXlOYW1lID0gXCJMaW5rXCI7XG5cbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IExpbmsucHJvcFR5cGVzID0ge1xuICB0bzogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG59IDogdm9pZCAwO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZnVuY3Rpb24gUmVkaXJlY3RSZXF1ZXN0KHVyaSkge1xuICB0aGlzLnVyaSA9IHVyaTtcbn1cblxudmFyIGlzUmVkaXJlY3QgPSBmdW5jdGlvbiBpc1JlZGlyZWN0KG8pIHtcbiAgcmV0dXJuIG8gaW5zdGFuY2VvZiBSZWRpcmVjdFJlcXVlc3Q7XG59O1xuXG52YXIgcmVkaXJlY3RUbyA9IGZ1bmN0aW9uIHJlZGlyZWN0VG8odG8pIHtcbiAgdGhyb3cgbmV3IFJlZGlyZWN0UmVxdWVzdCh0byk7XG59O1xuXG52YXIgUmVkaXJlY3RJbXBsID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQzKSB7XG4gIF9pbmhlcml0cyhSZWRpcmVjdEltcGwsIF9SZWFjdCRDb21wb25lbnQzKTtcblxuICBmdW5jdGlvbiBSZWRpcmVjdEltcGwoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlZGlyZWN0SW1wbCk7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudDMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICAvLyBTdXBwb3J0IFJlYWN0IDwgMTYgd2l0aCB0aGlzIGhvb2tcbiAgUmVkaXJlY3RJbXBsLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHZhciBfcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgbmF2aWdhdGUgPSBfcHJvcHMzLm5hdmlnYXRlLFxuICAgICAgICB0byA9IF9wcm9wczMudG8sXG4gICAgICAgIGZyb20gPSBfcHJvcHMzLmZyb20sXG4gICAgICAgIF9wcm9wczMkcmVwbGFjZSA9IF9wcm9wczMucmVwbGFjZSxcbiAgICAgICAgcmVwbGFjZSA9IF9wcm9wczMkcmVwbGFjZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9wcm9wczMkcmVwbGFjZSxcbiAgICAgICAgc3RhdGUgPSBfcHJvcHMzLnN0YXRlLFxuICAgICAgICBub1Rocm93ID0gX3Byb3BzMy5ub1Rocm93LFxuICAgICAgICBiYXNldXJpID0gX3Byb3BzMy5iYXNldXJpLFxuICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMzLCBbXCJuYXZpZ2F0ZVwiLCBcInRvXCIsIFwiZnJvbVwiLCBcInJlcGxhY2VcIiwgXCJzdGF0ZVwiLCBcIm5vVGhyb3dcIiwgXCJiYXNldXJpXCJdKTtcblxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlc29sdmVkVG8gPSByZXNvbHZlKHRvLCBiYXNldXJpKTtcbiAgICAgIG5hdmlnYXRlKGluc2VydFBhcmFtcyhyZXNvbHZlZFRvLCBwcm9wcyksIHsgcmVwbGFjZTogcmVwbGFjZSwgc3RhdGU6IHN0YXRlIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIFJlZGlyZWN0SW1wbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgbmF2aWdhdGUgPSBfcHJvcHM0Lm5hdmlnYXRlLFxuICAgICAgICB0byA9IF9wcm9wczQudG8sXG4gICAgICAgIGZyb20gPSBfcHJvcHM0LmZyb20sXG4gICAgICAgIHJlcGxhY2UgPSBfcHJvcHM0LnJlcGxhY2UsXG4gICAgICAgIHN0YXRlID0gX3Byb3BzNC5zdGF0ZSxcbiAgICAgICAgbm9UaHJvdyA9IF9wcm9wczQubm9UaHJvdyxcbiAgICAgICAgYmFzZXVyaSA9IF9wcm9wczQuYmFzZXVyaSxcbiAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzNCwgW1wibmF2aWdhdGVcIiwgXCJ0b1wiLCBcImZyb21cIiwgXCJyZXBsYWNlXCIsIFwic3RhdGVcIiwgXCJub1Rocm93XCIsIFwiYmFzZXVyaVwiXSk7XG5cbiAgICB2YXIgcmVzb2x2ZWRUbyA9IHJlc29sdmUodG8sIGJhc2V1cmkpO1xuICAgIGlmICghbm9UaHJvdykgcmVkaXJlY3RUbyhpbnNlcnRQYXJhbXMocmVzb2x2ZWRUbywgcHJvcHMpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICByZXR1cm4gUmVkaXJlY3RJbXBsO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG52YXIgUmVkaXJlY3QgPSBmdW5jdGlvbiBSZWRpcmVjdChwcm9wcykge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICBCYXNlQ29udGV4dC5Db25zdW1lcixcbiAgICBudWxsLFxuICAgIGZ1bmN0aW9uIChfcmVmNykge1xuICAgICAgdmFyIGJhc2V1cmkgPSBfcmVmNy5iYXNldXJpO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIExvY2F0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICBmdW5jdGlvbiAobG9jYXRpb25Db250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVkaXJlY3RJbXBsLCBfZXh0ZW5kcyh7fSwgbG9jYXRpb25Db250ZXh0LCB7IGJhc2V1cmk6IGJhc2V1cmkgfSwgcHJvcHMpKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICk7XG59O1xuXG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBSZWRpcmVjdC5wcm9wVHlwZXMgPSB7XG4gIGZyb206IFByb3BUeXBlcy5zdHJpbmcsXG4gIHRvOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbn0gOiB2b2lkIDA7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG52YXIgTWF0Y2ggPSBmdW5jdGlvbiBNYXRjaChfcmVmOCkge1xuICB2YXIgcGF0aCA9IF9yZWY4LnBhdGgsXG4gICAgICBjaGlsZHJlbiA9IF9yZWY4LmNoaWxkcmVuO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICBCYXNlQ29udGV4dC5Db25zdW1lcixcbiAgICBudWxsLFxuICAgIGZ1bmN0aW9uIChfcmVmOSkge1xuICAgICAgdmFyIGJhc2V1cmkgPSBfcmVmOS5iYXNldXJpO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIExvY2F0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICBmdW5jdGlvbiAoX3JlZjEwKSB7XG4gICAgICAgICAgdmFyIG5hdmlnYXRlID0gX3JlZjEwLm5hdmlnYXRlLFxuICAgICAgICAgICAgICBsb2NhdGlvbiA9IF9yZWYxMC5sb2NhdGlvbjtcblxuICAgICAgICAgIHZhciByZXNvbHZlZFBhdGggPSByZXNvbHZlKHBhdGgsIGJhc2V1cmkpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBtYXRjaChyZXNvbHZlZFBhdGgsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oe1xuICAgICAgICAgICAgbmF2aWdhdGU6IG5hdmlnYXRlLFxuICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICAgICAgbWF0Y2g6IHJlc3VsdCA/IF9leHRlbmRzKHt9LCByZXN1bHQucGFyYW1zLCB7XG4gICAgICAgICAgICAgIHVyaTogcmVzdWx0LnVyaSxcbiAgICAgICAgICAgICAgcGF0aDogcGF0aFxuICAgICAgICAgICAgfSkgOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICApO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEhvb2tzXG5cbnZhciB1c2VMb2NhdGlvbiA9IGZ1bmN0aW9uIHVzZUxvY2F0aW9uKCkge1xuICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KTtcblxuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VMb2NhdGlvbiBob29rIHdhcyB1c2VkIGJ1dCBhIExvY2F0aW9uQ29udGV4dC5Qcm92aWRlciB3YXMgbm90IGZvdW5kIGluIHRoZSBwYXJlbnQgdHJlZS4gTWFrZSBzdXJlIHRoaXMgaXMgdXNlZCBpbiBhIGNvbXBvbmVudCB0aGF0IGlzIGEgY2hpbGQgb2YgUm91dGVyXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQubG9jYXRpb247XG59O1xuXG52YXIgdXNlTmF2aWdhdGUgPSBmdW5jdGlvbiB1c2VOYXZpZ2F0ZSgpIHtcbiAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KExvY2F0aW9uQ29udGV4dCk7XG5cbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlTmF2aWdhdGUgaG9vayB3YXMgdXNlZCBidXQgYSBMb2NhdGlvbkNvbnRleHQuUHJvdmlkZXIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcGFyZW50IHRyZWUuIE1ha2Ugc3VyZSB0aGlzIGlzIHVzZWQgaW4gYSBjb21wb25lbnQgdGhhdCBpcyBhIGNoaWxkIG9mIFJvdXRlclwiKTtcbiAgfVxuXG4gIHJldHVybiBjb250ZXh0Lm5hdmlnYXRlO1xufTtcblxudmFyIHVzZVBhcmFtcyA9IGZ1bmN0aW9uIHVzZVBhcmFtcygpIHtcbiAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KEJhc2VDb250ZXh0KTtcblxuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VQYXJhbXMgaG9vayB3YXMgdXNlZCBidXQgYSBMb2NhdGlvbkNvbnRleHQuUHJvdmlkZXIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcGFyZW50IHRyZWUuIE1ha2Ugc3VyZSB0aGlzIGlzIHVzZWQgaW4gYSBjb21wb25lbnQgdGhhdCBpcyBhIGNoaWxkIG9mIFJvdXRlclwiKTtcbiAgfVxuXG4gIHZhciBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG5cbiAgdmFyIHJlc3VsdHMgPSBtYXRjaChjb250ZXh0LmJhc2VwYXRoLCBsb2NhdGlvbi5wYXRobmFtZSk7XG5cbiAgcmV0dXJuIHJlc3VsdHMgPyByZXN1bHRzLnBhcmFtcyA6IG51bGw7XG59O1xuXG52YXIgdXNlTWF0Y2ggPSBmdW5jdGlvbiB1c2VNYXRjaChwYXRoKSB7XG4gIGlmICghcGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZU1hdGNoKHBhdGg6IHN0cmluZykgcmVxdWlyZXMgYW4gYXJndW1lbnQgb2YgYSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdFwiKTtcbiAgfVxuICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoQmFzZUNvbnRleHQpO1xuXG4gIGlmICghY29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZU1hdGNoIGhvb2sgd2FzIHVzZWQgYnV0IGEgTG9jYXRpb25Db250ZXh0LlByb3ZpZGVyIHdhcyBub3QgZm91bmQgaW4gdGhlIHBhcmVudCB0cmVlLiBNYWtlIHN1cmUgdGhpcyBpcyB1c2VkIGluIGEgY29tcG9uZW50IHRoYXQgaXMgYSBjaGlsZCBvZiBSb3V0ZXJcIik7XG4gIH1cblxuICB2YXIgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuXG4gIHZhciByZXNvbHZlZFBhdGggPSByZXNvbHZlKHBhdGgsIGNvbnRleHQuYmFzZXVyaSk7XG4gIHZhciByZXN1bHQgPSBtYXRjaChyZXNvbHZlZFBhdGgsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgcmV0dXJuIHJlc3VsdCA/IF9leHRlbmRzKHt9LCByZXN1bHQucGFyYW1zLCB7XG4gICAgdXJpOiByZXN1bHQudXJpLFxuICAgIHBhdGg6IHBhdGhcbiAgfSkgOiBudWxsO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEp1bmtcbnZhciBzdHJpcFNsYXNoZXMgPSBmdW5jdGlvbiBzdHJpcFNsYXNoZXMoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKF5cXC8rfFxcLyskKS9nLCBcIlwiKTtcbn07XG5cbnZhciBjcmVhdGVSb3V0ZSA9IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlKGJhc2VwYXRoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUmVhY3QuRnJhZ21lbnQgJiYgZWxlbWVudC5wcm9wcy5jaGlsZHJlbikge1xuICAgICAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLm1hcChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCBjcmVhdGVSb3V0ZShiYXNlcGF0aCkpO1xuICAgIH1cbiAgICAhKGVsZW1lbnQucHJvcHMucGF0aCB8fCBlbGVtZW50LnByb3BzLmRlZmF1bHQgfHwgZWxlbWVudC50eXBlID09PSBSZWRpcmVjdCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiPFJvdXRlcj46IENoaWxkcmVuIG9mIDxSb3V0ZXI+IG11c3QgaGF2ZSBhIGBwYXRoYCBvciBgZGVmYXVsdGAgcHJvcCwgb3IgYmUgYSBgPFJlZGlyZWN0PmAuIE5vbmUgZm91bmQgb24gZWxlbWVudCB0eXBlIGBcIiArIGVsZW1lbnQudHlwZSArIFwiYFwiKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgICAhIShlbGVtZW50LnR5cGUgPT09IFJlZGlyZWN0ICYmICghZWxlbWVudC5wcm9wcy5mcm9tIHx8ICFlbGVtZW50LnByb3BzLnRvKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiPFJlZGlyZWN0IGZyb209XFxcIlwiICsgZWxlbWVudC5wcm9wcy5mcm9tICsgXCJcXFwiIHRvPVxcXCJcIiArIGVsZW1lbnQucHJvcHMudG8gKyBcIlxcXCIvPiByZXF1aXJlcyBib3RoIFxcXCJmcm9tXFxcIiBhbmQgXFxcInRvXFxcIiBwcm9wcyB3aGVuIGluc2lkZSBhIDxSb3V0ZXI+LlwiKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgICAhIShlbGVtZW50LnR5cGUgPT09IFJlZGlyZWN0ICYmICF2YWxpZGF0ZVJlZGlyZWN0KGVsZW1lbnQucHJvcHMuZnJvbSwgZWxlbWVudC5wcm9wcy50bykpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBcIjxSZWRpcmVjdCBmcm9tPVxcXCJcIiArIGVsZW1lbnQucHJvcHMuZnJvbSArIFwiIHRvPVxcXCJcIiArIGVsZW1lbnQucHJvcHMudG8gKyBcIlxcXCIvPiBoYXMgbWlzbWF0Y2hlZCBkeW5hbWljIHNlZ21lbnRzLCBlbnN1cmUgYm90aCBwYXRocyBoYXZlIHRoZSBleGFjdCBzYW1lIGR5bmFtaWMgc2VnbWVudHMuXCIpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICAgIGlmIChlbGVtZW50LnByb3BzLmRlZmF1bHQpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBlbGVtZW50LCBkZWZhdWx0OiB0cnVlIH07XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnRQYXRoID0gZWxlbWVudC50eXBlID09PSBSZWRpcmVjdCA/IGVsZW1lbnQucHJvcHMuZnJvbSA6IGVsZW1lbnQucHJvcHMucGF0aDtcblxuICAgIHZhciBwYXRoID0gZWxlbWVudFBhdGggPT09IFwiL1wiID8gYmFzZXBhdGggOiBzdHJpcFNsYXNoZXMoYmFzZXBhdGgpICsgXCIvXCIgKyBzdHJpcFNsYXNoZXMoZWxlbWVudFBhdGgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBlbGVtZW50LFxuICAgICAgZGVmYXVsdDogZWxlbWVudC5wcm9wcy5kZWZhdWx0LFxuICAgICAgcGF0aDogZWxlbWVudC5wcm9wcy5jaGlsZHJlbiA/IHN0cmlwU2xhc2hlcyhwYXRoKSArIFwiLypcIiA6IHBhdGhcbiAgICB9O1xuICB9O1xufTtcblxudmFyIHNob3VsZE5hdmlnYXRlID0gZnVuY3Rpb24gc2hvdWxkTmF2aWdhdGUoZXZlbnQpIHtcbiAgcmV0dXJuICFldmVudC5kZWZhdWx0UHJldmVudGVkICYmIGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiAhKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXkpO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5leHBvcnQgeyBMaW5rLCBMb2NhdGlvbiwgTG9jYXRpb25Qcm92aWRlciwgTWF0Y2gsIFJlZGlyZWN0LCBSb3V0ZXIsIFNlcnZlckxvY2F0aW9uLCBjcmVhdGVIaXN0b3J5LCBjcmVhdGVNZW1vcnlTb3VyY2UsIGlzUmVkaXJlY3QsIG5hdmlnYXRlLCByZWRpcmVjdFRvLCBnbG9iYWxIaXN0b3J5LCBtYXRjaCBhcyBtYXRjaFBhdGgsIHVzZUxvY2F0aW9uLCB1c2VOYXZpZ2F0ZSwgdXNlUGFyYW1zLCB1c2VNYXRjaCB9OyIsImNvbnN0IF9leGNsdWRlZCA9IFtcInBhdGhcIiwgXCJ0ZXh0XCJdLFxuICAgICAgX2V4Y2x1ZGVkMiA9IFtcInBhdGhcIiwgXCJ0ZXh0XCJdO1xuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VDb250ZXh0IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCB7IHNwcmludGYsIF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgRGFzaGJvYXJkQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ0ByZWFjaC9yb3V0ZXInO1xuaW1wb3J0IGN0RXZlbnRzIGZyb20gJ2N0LWV2ZW50cyc7XG5cbmNvbnN0IE5hdmlnYXRpb24gPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXJOYXZpZ2F0aW9uTGlua3MgPSBbXTtcbiAgY29uc3QgZW5kVXNlck5hdmlnYXRpb25MaW5rcyA9IFtdO1xuICBjb25zdCB7XG4gICAgdGhlbWVfdmVyc2lvblxuICB9ID0gdXNlQ29udGV4dChEYXNoYm9hcmRDb250ZXh0KTtcbiAgY3RFdmVudHMudHJpZ2dlcignY3Q6ZGFzaGJvYXJkOm5hdmlnYXRpb24tbGlua3MnLCB1c2VyTmF2aWdhdGlvbkxpbmtzKTtcbiAgY3RFdmVudHMudHJpZ2dlcignY3Q6ZGFzaGJvYXJkOmVuZC1uYXZpZ2F0aW9uLWxpbmtzJywgZW5kVXNlck5hdmlnYXRpb25MaW5rcyk7XG4gIGxldCBoYXNQbHVnaW5zID0gIWN0RGFzaGJvYXJkTG9jYWxpemF0aW9ucy5wbHVnaW5fZGF0YS5oaWRlX3BsdWdpbnNfdGFiO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGJvYXJkLW5hdmlnYXRpb25cIlxuICB9LCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChMaW5rLCB7XG4gICAgdG86IFwiL1wiXG4gIH0sIF9fKCdIb21lJywgJ2Jsb2Nrc3knKSkpLCB1c2VyTmF2aWdhdGlvbkxpbmtzLm1hcChfcmVmID0+IHtcbiAgICBsZXQge1xuICAgICAgcGF0aCxcbiAgICAgIHRleHRcbiAgICB9ID0gX3JlZixcbiAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAga2V5OiBwYXRoXG4gICAgfSwgY3JlYXRlRWxlbWVudChMaW5rLCBfZXh0ZW5kcyh7XG4gICAgICB0bzogcGF0aFxuICAgIH0sIHByb3BzKSwgdGV4dCkpO1xuICB9KSwgIWN0RGFzaGJvYXJkTG9jYWxpemF0aW9ucy5wbHVnaW5fZGF0YS5oaWRlX3BsdWdpbnNfdGFiICYmIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KExpbmssIHtcbiAgICB0bzogXCIvcGx1Z2luc1wiXG4gIH0sIF9fKCdVc2VmdWwgUGx1Z2lucycsICdibG9ja3N5JykpKSwgIWN0RGFzaGJvYXJkTG9jYWxpemF0aW9ucy5wbHVnaW5fZGF0YS5oaWRlX2NoYW5nZWxvZ3NfdGFiICYmIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KExpbmssIHtcbiAgICB0bzogXCIvY2hhbmdlbG9nXCJcbiAgfSwgX18oJ0NoYW5nZWxvZycsICdibG9ja3N5JyksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtdmVyc2lvblwiXG4gIH0sIHRoZW1lX3ZlcnNpb24pKSksICghY3REYXNoYm9hcmRMb2NhbGl6YXRpb25zLnBsdWdpbl9kYXRhIHx8ICFjdERhc2hib2FyZExvY2FsaXphdGlvbnMucGx1Z2luX2RhdGEuaXNfcHJvKSAmJiBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1wcm8tdGFiXCJcbiAgfSwgY3JlYXRlRWxlbWVudChMaW5rLCB7XG4gICAgdG86IFwiL3Byb1wiXG4gIH0sIF9fKCdGcmVlIHZzIFBybycsICdibG9ja3N5JykpKSwgZW5kVXNlck5hdmlnYXRpb25MaW5rcy5tYXAoX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBwYXRoLFxuICAgICAgdGV4dFxuICAgIH0gPSBfcmVmMixcbiAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIF9leGNsdWRlZDIpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICBrZXk6IHBhdGhcbiAgICB9LCBjcmVhdGVFbGVtZW50KExpbmssIF9leHRlbmRzKHtcbiAgICAgIHRvOiBwYXRoXG4gICAgfSwgcHJvcHMpLCB0ZXh0KSk7XG4gIH0pKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE5hdmlnYXRpb247IiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VFZmZlY3QsIHVzZVN0YXRlLCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmNvbnN0IFN1Ym1pdFN1cHBvcnQgPSAoKSA9PiB7XG4gIGlmIChjdERhc2hib2FyZExvY2FsaXphdGlvbnMucGx1Z2luX2RhdGEuaGlkZV9zdXBwb3J0X3NlY3Rpb24pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3Qtc3VwcG9ydC1jb250YWluZXJcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwiaDJcIiwgbnVsbCwgX18oJ05lZWQgaGVscCBvciBhZHZpY2U/JywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIF9fKCdHb3QgYSBxdWVzdGlvbiBvciBuZWVkIGhlbHAgd2l0aCB0aGUgdGhlbWU/IFlvdSBjYW4gYWx3YXlzIHN1Ym1pdCBhIHN1cHBvcnQgdGlja2V0IG9yIGFzayBmb3IgaGVscCBpbiBvdXIgZnJpZW5kbHkgRmFjZWJvb2sgY29tbXVuaXR5LicsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgaHJlZjogY3REYXNoYm9hcmRMb2NhbGl6YXRpb25zLnN1cHBvcnRfdXJsLFxuICAgIGNsYXNzTmFtZTogXCJjdC1idXR0b25cIixcbiAgICBcImRhdGEtaG92ZXJcIjogXCJibHVlXCIsXG4gICAgdGFyZ2V0OiBcIl9ibGFua1wiXG4gIH0sIF9fKCdTdWJtaXQgYSBTdXBwb3J0IFRpY2tldCcsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgaHJlZjogXCJodHRwczovL3d3dy5mYWNlYm9vay5jb20vZ3JvdXBzL2Jsb2Nrc3kuY29tbXVuaXR5XCIsXG4gICAgY2xhc3NOYW1lOiBcImN0LWJ1dHRvblwiLFxuICAgIFwiZGF0YS1ob3ZlclwiOiBcImJsdWVcIixcbiAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcbiAgfSwgX18oJ0pvaW4gRmFjZWJvb2sgQ29tbXVuaXR5JywgJ2Jsb2Nrc3knKSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU3VibWl0U3VwcG9ydDsiLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0galF1ZXJ5OyIsImltcG9ydCB7IHVzZVN0YXRlLCBjcmVhdGVFbGVtZW50LCB1c2VDb250ZXh0LCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgeyBfXywgc3ByaW50ZiB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IFN1Ym1pdFN1cHBvcnQgZnJvbSAnLi4vY29tcG9uZW50cy9TdWJtaXRTdXBwb3J0JztcbmltcG9ydCBEYXNoYm9hcmRDb250ZXh0IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IGN0RXZlbnRzIGZyb20gJ2N0LWV2ZW50cyc7XG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG5jb25zdCBIb21lID0gKCkgPT4ge1xuICBjb25zdCB7XG4gICAgaXNfY29tcGFuaW9uX2FjdGl2ZSxcbiAgICBjb21wYW5pb25fZG93bmxvYWRfbGluayxcbiAgICBjaGlsZF9kb3dubG9hZF9saW5rXG4gIH0gPSB1c2VDb250ZXh0KERhc2hib2FyZENvbnRleHQpO1xuICBsZXQgYmVmb3JlQ29udGVudCA9IHtcbiAgICBjb250ZW50OiBudWxsXG4gIH07XG4gIGxldCBhZnRlckNvbnRlbnQgPSB7XG4gICAgY29udGVudDogbnVsbFxuICB9O1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbY3VzdG9tU3RhdHVzLCBzZXRDdXN0b21TdGF0dXNdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjdEV2ZW50cy50cmlnZ2VyKCdjdDpkYXNoYm9hcmQ6aG9tZTpiZWZvcmUnLCBiZWZvcmVDb250ZW50KTtcbiAgY3RFdmVudHMudHJpZ2dlcignY3Q6ZGFzaGJvYXJkOmhvbWU6YWZ0ZXInLCBhZnRlckNvbnRlbnQpO1xuICBjb25zdCBmaW5hbFN0YXR1cyA9IGN1c3RvbVN0YXR1cyB8fCBpc19jb21wYW5pb25fYWN0aXZlO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwgbnVsbCwgYmVmb3JlQ29udGVudC5jb250ZW50LCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtZmlyc3Qtc3RlcHMtY29udGFpbmVyXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcImgyXCIsIG51bGwsIF9fKCdDdXN0b21pemVyIFNob3J0Y3V0cycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1maXJzdC1zdGVwc1wiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB3aWR0aDogXCIyMFwiLFxuICAgIGhlaWdodDogXCIyMFwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDIwIDIwXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE1LjgsNS45TDEwLDBMNC4yLDUuOUMxLDkuMSwxLDE0LjMsNC4yLDE3LjZDNS44LDE5LjIsNy45LDIwLDEwLDIwczQuMi0wLjgsNS44LTIuNEMxOSwxNC4zLDE5LDkuMSwxNS44LDUuOXogTTEwLDE3LjljLTEuNiwwLTMuMi0wLjYtNC40LTEuOGMtMS4yLTEuMi0xLjgtMi43LTEuOC00LjRzMC42LTMuMiwxLjgtNC40TDEwLDIuOVYxNy45elwiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImg0XCIsIG51bGwsIF9fKCdDb2xvciBPcHRpb25zJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIF9fKCdTZXQgdGhlIHRoZW1lIGdsb2JhbCBjb2xvcnMsIHNlbGVjdCB0aGUgZm9udCwgYnV0dG9uIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycy4nLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgIGhyZWY6IGAke2N0RGFzaGJvYXJkTG9jYWxpemF0aW9ucy5jdXN0b21pemVyX3VybH0ke2VuY29kZVVSSShgW3NlY3Rpb25dPWNvbG9yYCl9YCxcbiAgICBjbGFzc05hbWU6IFwiY3QtYnV0dG9uXCJcbiAgfSwgX18oJ0dvIHRvIG9wdGlvbicsICdibG9ja3N5JykpKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiBcIjIwXCIsXG4gICAgaGVpZ2h0OiBcIjIwXCIsXG4gICAgdmlld0JveDogXCIwIDAgMjAgMjBcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMjAsMTcuNXYtMTVDMjAsMS4xLDE4LjksMCwxNy41LDBoLTE1QzEuMSwwLDAsMS4xLDAsMi41djE1QzAsMTguOSwxLjEsMjAsMi41LDIwaDE1QzE4LjksMjAsMjAsMTguOSwyMCwxNy41eiBNMTguOCwxNy42YzAsMC42LTAuNiwxLjItMS4yLDEuMmgtMTVjLTAuNywwLTEuMi0wLjUtMS4yLTEuMlY3aDE3LjVWMTcuNnpcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJoNFwiLCBudWxsLCBfXygnSGVhZGVyIE9wdGlvbnMnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInBcIiwgbnVsbCwgX18oJ1NldCB0aGUgdGhlbWUgaGVhZGVyIHR5cGUsIHNldCB0aGUgY29sb3JzLCBzcGFjaW5nLCBhbGlnbm1lbnQgYW5kIG1vcmUuJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICBocmVmOiBgJHtjdERhc2hib2FyZExvY2FsaXphdGlvbnMuY3VzdG9taXplcl91cmx9JHtlbmNvZGVVUkkoYFtzZWN0aW9uXT1oZWFkZXJgKX1gLFxuICAgIGNsYXNzTmFtZTogXCJjdC1idXR0b25cIixcbiAgICBcImRhdGEtaG92ZXJcIjogXCJ3aGl0ZVwiXG4gIH0sIF9fKCdHbyB0byBvcHRpb24nLCAnYmxvY2tzeScpKSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB3aWR0aDogXCIyMFwiLFxuICAgIGhlaWdodDogXCIyMFwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDIwIDIwXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE4LDBINS4zYy0xLjEsMC0yLDEuMS0yLDIuNFY0SDJDMC45LDQsMCw1LjEsMCw2LjR2MC44djkuNnYwLjhDMCwxOC45LDAuOSwyMCwyLDIwaDMuM2gxLjNIMThjMS4xLDAsMi0xLjEsMi0yLjRWMi40QzIwLDEuMSwxOS4xLDAsMTgsMHpNMy4zLDE2LjhjMCwwLjQtMC4zLDAuOC0wLjcsMC44Yy0wLjQsMC0wLjctMC40LTAuNy0wLjhWNi42YzAtMC4xLDAuMS0wLjIsMC4yLTAuMmgwLjljMC4xLDAsMC4yLDAuMSwwLjIsMC4yVjE2Ljh6IE0xOCwxNy40YzAsMC4xLTAuMSwwLjItMC4yLDAuMkg1LjJjMC4xLTAuMywwLjEtMC41LDAuMS0wLjhWNy4yYzAsMCwwLDAsMCwwVjIuNmMwLTAuMSwwLjEtMC4yLDAuMi0wLjJoMTIuM2MwLjEsMCwwLjIsMC4xLDAuMiwwLjJWMTcuNHogTTYuOSw1LjNjLTAuMSwwLTAuMi0wLjEtMC4yLTAuMlYzLjVjMC0wLjEsMC4xLTAuMiwwLjItMC4yaDkuNmMwLjEsMCwwLjIsMC4xLDAuMiwwLjJ2MS42YzAsMC4xLTAuMSwwLjItMC4yLDAuMkg2Ljl6IE0xNi41LDEzLjNjMC4xLDAsMC4yLTAuMSwwLjItMC4yVjkuNWMwLTAuMS0wLjEtMC4yLTAuMi0wLjJoLTQuM2MtMC4xLDAtMC4yLDAuMS0wLjIsMC4ydjMuNmMwLDAuMSwwLjEsMC4yLDAuMiwwLjJIMTYuNXpNMTAuNyw3LjNjMC0wLjQtMC4zLTAuNy0wLjctMC43SDcuM0M3LDYuNyw2LjcsNyw2LjcsNy4zbDAsMEM2LjcsNy43LDcsOCw3LjMsOEgxMEMxMC40LDgsMTAuNyw3LjcsMTAuNyw3LjNMMTAuNyw3LjN6IE0xMC43LDEwYzAtMC40LTAuMy0wLjctMC43LTAuN0g3LjNDNyw5LjMsNi43LDkuNiw2LjcsMTBsMCwwYzAsMC40LDAuMywwLjcsMC43LDAuN0gxMEMxMC40LDEwLjcsMTAuNywxMC40LDEwLjcsMTBMMTAuNywxMHogTTE2LjcsNy4zYzAtMC40LTAuMy0wLjctMC43LTAuN2gtMy4zQzEyLjMsNi43LDEyLDcsMTIsNy4zbDAsMEMxMiw3LjcsMTIuMyw4LDEyLjcsOEgxNkMxNi40LDgsMTYuNyw3LjcsMTYuNyw3LjNMMTYuNyw3LjN6IE0xMC43LDE1LjNjMCwwLjQtMC4zLDAuNy0wLjcsMC43SDcuM2MtMC40LDAtMC43LTAuMy0wLjctMC43bDAsMGMwLTAuNCwwLjMtMC43LDAuNy0wLjdIMTBDMTAuNCwxNC43LDEwLjcsMTUsMTAuNywxNS4zTDEwLjcsMTUuM3pNMTYuNywxNS4zYzAsMC40LTAuMywwLjctMC43LDAuN2gtMy4zYy0wLjQsMC0wLjctMC4zLTAuNy0wLjdsMCwwYzAtMC40LDAuMy0wLjcsMC43LTAuN0gxNkMxNi40LDE0LjcsMTYuNywxNSwxNi43LDE1LjNMMTYuNywxNS4zeiBNMTAuNywxMi43YzAtMC40LTAuMy0wLjctMC43LTAuN0g3LjNjLTAuNCwwLTAuNywwLjMtMC43LDAuN2wwLDBjMCwwLjQsMC4zLDAuNywwLjcsMC43SDEwQzEwLjQsMTMuMywxMC43LDEzLDEwLjcsMTIuN0wxMC43LDEyLjd6XCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwiaDRcIiwgbnVsbCwgX18oJ0Jsb2cgT3B0aW9ucycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBfXygnU2V0IHRoZSBibG9nIGVudHJpZXMgdHlwZSwgbnVtYmVyIG9mIGNhcmRzLCBzcGFjaW5nLCBjb2xvcnMgYW5kIG1vcmUuJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICBocmVmOiBgJHtjdERhc2hib2FyZExvY2FsaXphdGlvbnMuY3VzdG9taXplcl91cmx9JHtlbmNvZGVVUkkoYFtzZWN0aW9uXT1ibG9nX3Bvc3RzYCl9YCxcbiAgICBjbGFzc05hbWU6IFwiY3QtYnV0dG9uXCIsXG4gICAgXCJkYXRhLWhvdmVyXCI6IFwid2hpdGVcIlxuICB9LCBfXygnR28gdG8gb3B0aW9uJywgJ2Jsb2Nrc3knKSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IFwiMjBcIixcbiAgICBoZWlnaHQ6IFwiMjBcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyMCAyMFwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xOCwyaC0ydjE2aDJjMS4xLDAsMi0wLjksMi0yVjRDMjAsMi45LDE5LjEsMiwxOCwyelwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTMuMSwwSDEuOUMwLjgsMCwwLDAuOSwwLDJ2MTZjMCwxLjEsMC44LDIsMS45LDJoMTEuMmMxLDAsMS45LTAuOSwxLjktMlYyQzE1LDAuOSwxNC4yLDAsMTMuMSwwek0xMywxNmMwLDAuNS0wLjUsMS0xLDFIM2MtMC41LDAtMS0wLjUtMS0xdi0yYzAtMC41LDAuNS0xLDEtMWg5YzAuNSwwLDEsMC41LDEsMVYxNnpNMTIuNSwxMWgtMTBDMi4yLDExLDIsMTAuOCwyLDEwLjVDMiwxMC4yLDIuMiwxMCwyLjUsMTBoMTBjMC4zLDAsMC41LDAuMiwwLjUsMC41QzEzLDEwLjgsMTIuOCwxMSwxMi41LDExeiBNMTIuNSw4aC0xMEMyLjIsOCwyLDcuOCwyLDcuNUMyLDcuMiwyLjIsNywyLjUsN2gxMEMxMi44LDcsMTMsNy4yLDEzLDcuNUMxMyw3LjgsMTIuOCw4LDEyLjUsOHpNMTIuNSw1aC0xMEMyLjIsNSwyLDQuOCwyLDQuNUMyLDQuMiwyLjIsNCwyLjUsNGgxMEMxMi44LDQsMTMsNC4yLDEzLDQuNUMxMyw0LjgsMTIuOCw1LDEyLjUsNXpcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJoNFwiLCBudWxsLCBfXygnUGFnZSBPcHRpb25zJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIF9fKCdTZXQgdGhlIHBhZ2UgY29udGFpbmVyIHdpZHRoLCBzcGFjaW5nLCBzaWRlYmFyIGFuZCBtb3JlLicsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgaHJlZjogYCR7Y3REYXNoYm9hcmRMb2NhbGl6YXRpb25zLmN1c3RvbWl6ZXJfdXJsfSR7ZW5jb2RlVVJJKCdbc2VjdGlvbl09c2luZ2xlX3BhZ2VzJyl9YCxcbiAgICBjbGFzc05hbWU6IFwiY3QtYnV0dG9uXCIsXG4gICAgXCJkYXRhLWhvdmVyXCI6IFwid2hpdGVcIlxuICB9LCBfXygnR28gdG8gb3B0aW9uJywgJ2Jsb2Nrc3knKSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IFwiMjBcIixcbiAgICBoZWlnaHQ6IFwiMjBcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyMCAyMFwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0wLDIuNWwwLDE1QzAsMTguOSwxLjEsMjAsMi41LDIwaDE1YzEuNCwwLDIuNS0xLjEsMi41LTIuNXYtMTVDMjAsMS4xLDE4LjksMCwxNy41LDBsLTE1LDBDMS4xLDAsMCwxLjEsMCwyLjV6IE0yLjQsMS4xSDEzdjE3LjVIMi40Yy0wLjcsMC0xLjItMC41LTEuMi0xLjJ2LTE1QzEuMiwxLjgsMS44LDEuMiwyLjQsMS4xTDIuNCwxLjF6XCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwiaDRcIiwgbnVsbCwgX18oJ1NpZGViYXIgT3B0aW9ucycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBfXygnU2V0IHRoZSBzaWRlYmFyIHdpZHRoLCBkZXNpZ24gdHlwZSwgc3BhY2luZywgY29sb3JzLicsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgaHJlZjogYCR7Y3REYXNoYm9hcmRMb2NhbGl6YXRpb25zLmN1c3RvbWl6ZXJfdXJsfSR7ZW5jb2RlVVJJKCdbc2VjdGlvbl09c2lkZWJhcicpfWAsXG4gICAgY2xhc3NOYW1lOiBcImN0LWJ1dHRvblwiLFxuICAgIFwiZGF0YS1ob3ZlclwiOiBcIndoaXRlXCJcbiAgfSwgX18oJ0dvIHRvIG9wdGlvbicsICdibG9ja3N5JykpKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiBcIjIwXCIsXG4gICAgaGVpZ2h0OiBcIjIwXCIsXG4gICAgdmlld0JveDogXCIwIDAgMjAgMjBcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTcuNSwwaC0xNUMxLjEsMCwwLDEuMSwwLDIuNXYxNUMwLDE4LjksMS4xLDIwLDIuNSwyMGgxNWMxLjQsMCwyLjUtMS4xLDIuNS0yLjV2LTE1QzIwLDEuMSwxOC45LDAsMTcuNSwweiBNMTguOCwxM0gxLjJWMi40YzAtMC42LDAuNi0xLjIsMS4yLTEuMmgxNWMwLjcsMCwxLjIsMC41LDEuMiwxLjJWMTN6XCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwiaDRcIiwgbnVsbCwgX18oJ0Zvb3RlciBPcHRpb25zJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIF9fKCdTZXQgdGhlIGZvb3RlciB0eXBlLCBudW1iZXIgb2YgY29sdW1ucywgc3BhY2luZyBhbmQgY29sb3JzLicsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgaHJlZjogYCR7Y3REYXNoYm9hcmRMb2NhbGl6YXRpb25zLmN1c3RvbWl6ZXJfdXJsfSR7ZW5jb2RlVVJJKCdbc2VjdGlvbl09Zm9vdGVyJyl9YCxcbiAgICBjbGFzc05hbWU6IFwiY3QtYnV0dG9uXCIsXG4gICAgXCJkYXRhLWhvdmVyXCI6IFwid2hpdGVcIlxuICB9LCBfXygnR28gdG8gb3B0aW9uJywgJ2Jsb2Nrc3knKSkpKSwgaXNfY29tcGFuaW9uX2FjdGl2ZSAhPT0gJ2FjdGl2ZScgJiYgY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgY3JlYXRlRWxlbWVudChcImgyXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtZG93bmxvYWRzLWhlYWRpbmdcIlxuICB9LCBfXygnRG93bmxvYWRzJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWRvd25sb2Fkc1wiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB3aWR0aDogXCIyMFwiLFxuICAgIGhlaWdodDogXCIyMFwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDIwIDIwXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTMuMSwwYy0wLjQsMC0wLjgsMC4yLTEsMC42TDAuMiwzLjlDMC4xLDQuMSwwLDQuMiwwLDQuNHYxMy4zQzAsMTksMSwyMCwyLjIsMjBoMTUuNmMxLjIsMCwyLjItMSwyLjItMi4yVjQuNGMwLTAuMi0wLjEtMC40LTAuMi0wLjZsLTEuOS0zLjNjLTAuMi0wLjMtMC42LTAuNi0xLTAuNkgzLjF6IE0zLjcsMi4yaDEyLjZsMS4zLDIuMkgyLjRMMy43LDIuMnogTTIuMiw2LjdoMTUuNnYxMS4xSDIuMlY2Ljd6TTguOSw4LjN2My4zSDUuNmw0LjQsNC40bDQuNC00LjRoLTMuM1Y4LjNIOC45elwiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImgzXCIsIG51bGwsIF9fKCdCbG9ja3N5IENvbXBhbmlvbicsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBfXygnQnkgZG93bmxvYWRpbmcgYW5kIGluc3RhbGxpbmcgdGhpcyBwbHVnaW4geW91IHdpbGwgaGF2ZSBhY2Nlc3MgdG8gZGVtbyB0ZW1wbGF0ZXMsIGV4dGVuc2lvbnMgYW5kIGEgbG90IG1vcmUgc3R1bm5pbmcgZmVhdHVyZXMuJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtYnV0dG9uXCIsXG4gICAgb25DbGljazogZSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgICAgJC5hamF4KGFqYXh1cmwsIHtcbiAgICAgICAgdHlwZTogJ1BPU1QnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgYWN0aW9uOiAnYmxvY2tzeV9ub3RpY2VfYnV0dG9uX2NsaWNrJ1xuICAgICAgICB9XG4gICAgICB9KS50aGVuKF9yZWYgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHN1Y2Nlc3MsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9ID0gX3JlZjtcblxuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIHNldEN1c3RvbVN0YXR1cyhkYXRhLnN0YXR1cyk7XG5cbiAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09ICdhY3RpdmUnKSB7XG4gICAgICAgICAgICBsb2NhdGlvbi5hc3NpZ24oZGF0YS5wbHVnaW5VcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIGlzTG9hZGluZyA/IF9fKCdJbnN0YWxsaW5nICYgYWN0aXZhdGluZy4uLicsICdibG9ja3N5JykgOiBmaW5hbFN0YXR1cyA9PT0gJ3VuaW5zdGFsbGVkJyA/IF9fKCdJbnN0YWxsIEJsb2Nrc3kgQ29tcGFuaW9uJywgJ2Jsb2Nrc3knKSA6IGZpbmFsU3RhdHVzID09PSAnaW5zdGFsbGVkJyA/IF9fKCdBY3RpdmF0ZSBCbG9ja3N5IENvbXBhbmlvbicsICdibG9ja3N5JykgOiBfXygnQmxvY2tzeSBDb21wYW5pb24gYWN0aXZlIScsICdibG9ja3N5JykpKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiBcIjIwXCIsXG4gICAgaGVpZ2h0OiBcIjIwXCIsXG4gICAgdmlld0JveDogXCIwIDAgMjAgMjBcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMy4xLDBjLTAuNCwwLTAuOCwwLjItMSwwLjZMMC4yLDMuOUMwLjEsNC4xLDAsNC4yLDAsNC40djEzLjNDMCwxOSwxLDIwLDIuMiwyMGgxNS42YzEuMiwwLDIuMi0xLDIuMi0yLjJWNC40YzAtMC4yLTAuMS0wLjQtMC4yLTAuNmwtMS45LTMuM2MtMC4yLTAuMy0wLjYtMC42LTEtMC42SDMuMXogTTMuNywyLjJoMTIuNmwxLjMsMi4ySDIuNEwzLjcsMi4yeiBNMi4yLDYuN2gxNS42djExLjFIMi4yVjYuN3pNOC45LDguM3YzLjNINS42bDQuNCw0LjRsNC40LTQuNGgtMy4zVjguM0g4Ljl6XCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwiaDNcIiwgbnVsbCwgX18oJ0Jsb2Nrc3kgQ2hpbGQgVGhlbWUnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInBcIiwgbnVsbCwgX18oJ0J5IHVzaW5nIGEgY2hpbGQgdGhlbWUgeW91IGNhbiBtb2RpZnkgYW55IGZpbGUgd2l0aG91dCB0aGUgZmVhciBvZiBicmVha2luZyBzb21ldGhpbmcgaW4gdGhlIHBhcmVudCB0aGVtZS4nLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1idXR0b25cIixcbiAgICBocmVmOiBjaGlsZF9kb3dubG9hZF9saW5rLFxuICAgIHRhcmdldDogXCJfYmxhbmtcIlxuICB9LCBfXygnRG93bmxvYWQgbm93JywgJ2Jsb2Nrc3knKSkpKSkpLCBhZnRlckNvbnRlbnQuY29udGVudCwgY3JlYXRlRWxlbWVudChTdWJtaXRTdXBwb3J0LCBudWxsKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBIb21lOyIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgdXNlU3RhdGUgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IHsgX18sIHNwcmludGYgfSBmcm9tICdjdC1pMThuJztcblxuY29uc3QgU2luZ2xlUHJlbWl1bVBsdWdpbiA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHN0YXR1cyxcbiAgICBwbHVnaW4sXG4gICAgb25QbHVnaW5zU3luY1xuICB9ID0gX3JlZjtcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBtYWtlQWN0aW9uID0gYXN5bmMgKHBsdWdpbiwgYWN0aW9uTmFtZSkgPT4ge1xuICAgIGNvbnN0IGJvZHkgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBib2R5LmFwcGVuZCgncGx1Z2luJywgcGx1Z2luKTtcbiAgICBib2R5LmFwcGVuZCgnYWN0aW9uJywgYWN0aW9uTmFtZSk7XG4gICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZldGNoKGN0RGFzaGJvYXJkTG9jYWxpemF0aW9ucy5hamF4X3VybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keVxuICAgICAgfSk7XG4gICAgICBvblBsdWdpbnNTeW5jKCk7XG4gICAgfSBjYXRjaCAoZSkge31cblxuICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gIH07XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwiaDRcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1leHRlbnNpb24tdGl0bGVcIlxuICB9LCBwbHVnaW4udGl0bGUsIGlzTG9hZGluZyAmJiBjcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB3aWR0aDogXCIxNVwiLFxuICAgIGhlaWdodDogXCIxNVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDEwMCAxMDBcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZSg1MCw1MClcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgdHJhbnNmb3JtOiBcInNjYWxlKDEpXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IFwiMFwiLFxuICAgIGN5OiBcIjBcIixcbiAgICByOiBcIjUwXCIsXG4gICAgZmlsbDogXCIjNjg3YzkzXCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiBcIjBcIixcbiAgICBjeTogXCItMjZcIixcbiAgICByOiBcIjEyXCIsXG4gICAgZmlsbDogXCIjZmZmZmZmXCIsXG4gICAgdHJhbnNmb3JtOiBcInJvdGF0ZSgxNjEuNjM0KVwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJhbmltYXRlVHJhbnNmb3JtXCIsIHtcbiAgICBhdHRyaWJ1dGVOYW1lOiBcInRyYW5zZm9ybVwiLFxuICAgIHR5cGU6IFwicm90YXRlXCIsXG4gICAgY2FsY01vZGU6IFwibGluZWFyXCIsXG4gICAgdmFsdWVzOiBcIjAgMCAwOzM2MCAwIDBcIixcbiAgICBrZXlUaW1lczogXCIwOzFcIixcbiAgICBkdXI6IFwiMXNcIixcbiAgICBiZWdpbjogXCIwc1wiLFxuICAgIHJlcGVhdENvdW50OiBcImluZGVmaW5pdGVcIlxuICB9KSkpKSkpLCBwbHVnaW4uZGVzY3JpcHRpb24gJiYgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWV4dGVuc2lvbi1kZXNjcmlwdGlvblwiXG4gIH0sIHBsdWdpbi5kZXNjcmlwdGlvbiksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1leHRlbnNpb24tYWN0aW9uc1wiXG4gIH0sIHN0YXR1cyA9PT0gJ2FjdGl2YXRlZCcgJiYgY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgIG9uQ2xpY2s6ICgpID0+IG1ha2VBY3Rpb24ocGx1Z2luLm5hbWUsICdwcmVtaXVtX3BsdWdpbl9kZWFjdGl2YXRlJyksXG4gICAgY2xhc3NOYW1lOiBcImN0LWJ1dHRvblwiXG4gIH0sIF9fKCdEZWFjdGl2YXRlJywgJ2Jsb2Nrc3knKSksIHN0YXR1cyA9PT0gJ2RlYWN0aXZhdGVkJyAmJiBjcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgb25DbGljazogKCkgPT4gbWFrZUFjdGlvbihwbHVnaW4ubmFtZSwgJ3ByZW1pdW1fcGx1Z2luX2FjdGl2YXRlJyksXG4gICAgY2xhc3NOYW1lOiBcImN0LWJ1dHRvbi1wcmltYXJ5XCJcbiAgfSwgX18oJ0FjdGl2YXRlJywgJ2Jsb2Nrc3knKSksIHN0YXR1cyA9PT0gJ3VuaW5zdGFsbGVkJyAmJiAhcGx1Z2luLmNvbWluZ3Nvb24gJiYgcGx1Z2luLnR5cGUgIT09ICdsaW5rJyAmJiBjcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgb25DbGljazogKCkgPT4gbWFrZUFjdGlvbihwbHVnaW4ubmFtZSwgJ3ByZW1pdW1fcGx1Z2luX2Rvd25sb2FkJyksXG4gICAgY2xhc3NOYW1lOiBcImN0LWJ1dHRvblwiXG4gIH0sIF9fKCdJbnN0YWxsJywgJ2Jsb2Nrc3knKSksIHN0YXR1cyA9PT0gJ3VuaW5zdGFsbGVkJyAmJiAhcGx1Z2luLmNvbWluZ3Nvb24gJiYgcGx1Z2luLnR5cGUgPT09ICdsaW5rJyAmJiBjcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgaHJlZjogcGx1Z2luLmxpbmssXG4gICAgY2xhc3NOYW1lOiBcImN0LWJ1dHRvblwiLFxuICAgIHRhcmdldDogXCJfYmxhbmtcIlxuICB9LCBfXygnRG93bmxvYWQnLCAnYmxvY2tzeScpKSwgc3RhdHVzID09PSAndW5pbnN0YWxsZWQnICYmIHBsdWdpbi5jb21pbmdzb29uICYmIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtYmFkZ2VcIlxuICB9LCBfXygnQ09NSU5HIFNPT04nLCAnYmxvY2tzeScpKSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2luZ2xlUHJlbWl1bVBsdWdpbjsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZUVmZmVjdCwgRnJhZ21lbnQsIHVzZVN0YXRlIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBTaW5nbGVQcmVtaXVtUGx1Z2luIGZyb20gJy4uL2NvbXBvbmVudHMvU2luZ2xlUHJlbWl1bVBsdWdpbic7XG5pbXBvcnQgeyBUcmFuc2l0aW9uLCBhbmltYXRlZCB9IGZyb20gJ3JlYWN0LXNwcmluZy9yZW5kZXJwcm9wcyc7XG5pbXBvcnQgU3VibWl0U3VwcG9ydCBmcm9tICcuLi9jb21wb25lbnRzL1N1Ym1pdFN1cHBvcnQnO1xubGV0IHBsdWdpbnNfc3RhdHVzX2NhY2hlID0gbnVsbDtcbmxldCBzdGF0aWNTb3VyY2UgPSBjdERhc2hib2FyZExvY2FsaXphdGlvbnMuY2xlYW5faW5zdGFsbF9wbHVnaW5zO1xuZXhwb3J0IGNvbnN0IHBsdWdpbnNXaXRoTmFtZXMgPSAoKSA9PiBPYmplY3QudmFsdWVzKHN0YXRpY1NvdXJjZSkubWFwKChwbHVnaW4sIGluZGV4KSA9PiB7XG4gIHBsdWdpblsnbmFtZSddID0gT2JqZWN0LmtleXMoc3RhdGljU291cmNlKVtpbmRleF07XG4gIHJldHVybiBwbHVnaW47XG59KTtcblxuY29uc3QgUmVjb21tZW5kZWRQbHVnaW5zID0gKCkgPT4ge1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoIXBsdWdpbnNfc3RhdHVzX2NhY2hlKTtcbiAgY29uc3QgW3BsdWdpbnNfc3RhdHVzLCBzZXRQbHVnaW5TdGF0dXNdID0gdXNlU3RhdGUocGx1Z2luc19zdGF0dXNfY2FjaGUgfHwgW10pO1xuICBjb25zdCBwbHVnaW5zID0gcGx1Z2luc1dpdGhOYW1lcygpO1xuXG4gIGNvbnN0IHN5bmNQbHVnaW5zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGxldCB2ZXJib3NlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGJvZHkuYXBwZW5kKCdhY3Rpb24nLCAnZ2V0X3ByZW1pdW1fcGx1Z2luc19zdGF0dXMnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGN0RGFzaGJvYXJkTG9jYWxpemF0aW9ucy5hamF4X3VybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgc3VjY2VzcyxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICBzZXRQbHVnaW5TdGF0dXMoZGF0YSk7XG4gICAgICAgICAgcGx1Z2luc19zdGF0dXNfY2FjaGUgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge31cblxuICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzeW5jUGx1Z2lucyghcGx1Z2luc19zdGF0dXNfY2FjaGUpO1xuICB9LCBbXSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbiwge1xuICAgIGl0ZW1zOiBpc0xvYWRpbmcsXG4gICAgZnJvbToge1xuICAgICAgb3BhY2l0eTogMFxuICAgIH0sXG4gICAgZW50ZXI6IFt7XG4gICAgICBvcGFjaXR5OiAxXG4gICAgfV0sXG4gICAgbGVhdmU6IFt7XG4gICAgICBvcGFjaXR5OiAwXG4gICAgfV0sXG4gICAgaW5pdGlhbDogbnVsbCxcbiAgICBjb25maWc6IChrZXksIHBoYXNlKSA9PiB7XG4gICAgICByZXR1cm4gcGhhc2UgPT09ICdsZWF2ZScgPyB7XG4gICAgICAgIGR1cmF0aW9uOiAzMDBcbiAgICAgIH0gOiB7XG4gICAgICAgIGRlbGF5OiAzMDAsXG4gICAgICAgIGR1cmF0aW9uOiAzMDBcbiAgICAgIH07XG4gICAgfVxuICB9LCBpc0xvYWRpbmcgPT4ge1xuICAgIGlmIChpc0xvYWRpbmcpIHtcbiAgICAgIHJldHVybiBwcm9wcyA9PiBjcmVhdGVFbGVtZW50KGFuaW1hdGVkLnAsIHtcbiAgICAgICAgc3R5bGU6IHByb3BzLFxuICAgICAgICBjbGFzc05hbWU6IFwiY3QtbG9hZGluZy10ZXh0XCJcbiAgICAgIH0sIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpLCBfXygnTG9hZGluZyBQbHVnaW5zIFN0YXR1cy4uLicsICdibG9ja3N5JykpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wcyA9PiBjcmVhdGVFbGVtZW50KGFuaW1hdGVkLmRpdiwge1xuICAgICAgc3R5bGU6IHByb3BzXG4gICAgfSwgcGx1Z2lucy5sZW5ndGggPiAwICYmIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiY3QtZXh0ZW5zaW9ucy1saXN0XCJcbiAgICB9LCBwbHVnaW5zLm1hcChwbHVnaW4gPT4gY3JlYXRlRWxlbWVudChTaW5nbGVQcmVtaXVtUGx1Z2luLCB7XG4gICAgICBwbHVnaW46IHBsdWdpbixcbiAgICAgIGtleTogcGx1Z2luLm5hbWUsXG4gICAgICBvblBsdWdpbnNTeW5jOiAoKSA9PiBzeW5jUGx1Z2lucygpLFxuICAgICAgc3RhdHVzOiAocGx1Z2luc19zdGF0dXMuZmluZChfcmVmID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBuYW1lXG4gICAgICAgIH0gPSBfcmVmO1xuICAgICAgICByZXR1cm4gbmFtZSA9PT0gcGx1Z2luLm5hbWU7XG4gICAgICB9KSB8fCB7fSkuc3RhdHVzXG4gICAgfSkpKSwgY3JlYXRlRWxlbWVudChTdWJtaXRTdXBwb3J0LCBudWxsKSkpO1xuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZWNvbW1lbmRlZFBsdWdpbnM7IiwiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHdpbmRvdy53cC5kYXRlOyIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IHsgZGF0ZUkxOG4gfSBmcm9tICdAd29yZHByZXNzL2RhdGUnO1xuaW1wb3J0IHsgX18sIHNwcmludGYgfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgVHJhbnNpdGlvbiwgYW5pbWF0ZWQgfSBmcm9tICdyZWFjdC1zcHJpbmcvcmVuZGVycHJvcHMnO1xubGV0IGNoYW5nZWxvZ19jYWNoZSA9IG51bGw7XG5cbmNvbnN0IHBhcnNlQ2hhbmdlbG9nID0gZnVuY3Rpb24gKGNoYW5nZWxvZykge1xuICBsZXQge1xuICAgIGhhc0JldGFzXG4gIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICByZXR1cm4gY2hhbmdlbG9nLnJlcGxhY2UoL1xcci9nLCAnJykucmVwbGFjZSgvKFxcclxcbnxcXHJ8XFxuKXszLH0vZywgJyQxXFxuXFxuJykuc3BsaXQoJ1xcblxcbicpLm1hcCh2ZXJzaW9uRGVzY3JpcHRvciA9PiB7XG4gICAgbGV0IFt2ZXJzaW9uLCBkYXRlXSA9IHZlcnNpb25EZXNjcmlwdG9yLnNwbGl0KC9cXHI/XFxuLylbMF0uc3BsaXQoJzonKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbixcbiAgICAgIGRhdGU6IGRhdGVJMThuKCdGIGosIFknLCBuZXcgRGF0ZShkYXRlLnRyaW0oKSkpLFxuICAgICAgZGVzY3JpcHRvcjogdmVyc2lvbkRlc2NyaXB0b3JcbiAgICB9O1xuICB9KS5maWx0ZXIoX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHZlcnNpb25cbiAgICB9ID0gX3JlZjtcbiAgICByZXR1cm4gaGFzQmV0YXMgPyB0cnVlIDogdmVyc2lvbi5pbmRleE9mKCdiZXRhJykgPT09IC0xO1xuICB9KTtcbn07XG5cbmNvbnN0IFNpbmdsZVZlcnNpb24gPSBfcmVmMiA9PiB7XG4gIGxldCB7XG4gICAgdmVyc2lvbkRlc2NyaXB0b3JcbiAgfSA9IF9yZWYyO1xuICBjb25zdCBbXywgLi4uYWxsUmVsZWFzZUNoYW5nZXNdID0gdmVyc2lvbkRlc2NyaXB0b3IuZGVzY3JpcHRvci5zcGxpdCgvXFxyP1xcbi8pO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcImgyXCIsIG51bGwsIHNwcmludGYoIC8vIHRyYW5zbGF0b3JzOiBwbGFjZWhvbGRlciBoZXJlIG1lYW5zIHRoZSBhY3R1YWwgdmVyc2lvbi5cbiAgX18oJ1ZlcnNpb246ICVzJywgJ2Jsb2Nrc3knKSwgdmVyc2lvbkRlc2NyaXB0b3IudmVyc2lvbiksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIHNwcmludGYoIC8vIHRyYW5zbGF0b3JzOiBwbGFjZWhvbGRlciBoZXJlIG1lYW5zIHRoZSBhY3R1YWwgZGF0ZS5cbiAgX18oJ1JlbGVhc2VkIG9uICVzJywgJ2Jsb2Nrc3knKSwgdmVyc2lvbkRlc2NyaXB0b3IuZGF0ZSkpKSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXJlbGVhc2UtaW5mb1wiLFxuICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICBfX2h0bWw6IGA8dWw+PGxpPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAke2FsbFJlbGVhc2VDaGFuZ2VzLmpvaW4oJ1xcbicpLnRyaW0oKS5zcGxpdCgnXFxuJykubWFwKGMgPT4gYy5yZXBsYWNlKC9eLVxccy8sICcnKSkubWFwKGMgPT4gYy5yZXBsYWNlKC9gKC4qPylgL2csICc8Y29kZT4kMTwvY29kZT4nKSkubWFwKGMgPT4gYy5yZXBsYWNlKC9cXFsoLio/KVxcXVxcKCguKj8pXFwpL2csICc8YSBocmVmPVwiJDJcIj4kMTwvYT4nKSkuam9pbignPC9saT48bGk+Jyl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjwvdWw+YC5yZXBsYWNlKC9OZXc6L2csICc8c3BhbiBjbGFzcz1cIm5ld1wiIHRpdGxlPVwiTmV3XCI+PC9zcGFuPicpLnJlcGxhY2UoL0ltcHJvdmVtZW50Oi9nLCAnPHNwYW4gY2xhc3M9XCJpbXByb3ZlbWVudFwiIHRpdGxlPVwiRW5oYW5jZVwiPjwvc3Bhbj4nKS5yZXBsYWNlKC9GaXg6L2csICc8c3BhbiBjbGFzcz1cImZpeFwiIHRpdGxlPVwiRml4XCI+PC9zcGFuPicpXG4gICAgfVxuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoKCkgPT4ge1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoIWNoYW5nZWxvZ19jYWNoZSk7XG4gIGNvbnN0IFtjaGFuZ2Vsb2csIHNldENoYW5nZWxvZ10gPSB1c2VTdGF0ZShjaGFuZ2Vsb2dfY2FjaGUpO1xuICBjb25zdCBbY3VycmVudENoYW5nZWxvZywgc2V0Q3VycmVudENoYW5nZWxvZ10gPSB1c2VTdGF0ZSgwKTtcbiAgbGV0IGhhc0JldGFzID0gZmFsc2U7XG5cbiAgaWYgKHdpbmRvdy5jdERhc2hib2FyZExvY2FsaXphdGlvbnMgJiYgd2luZG93LmN0RGFzaGJvYXJkTG9jYWxpemF0aW9ucy5wbHVnaW5fZGF0YSAmJiB3aW5kb3cuY3REYXNoYm9hcmRMb2NhbGl6YXRpb25zLnBsdWdpbl9kYXRhLmhhc19iZXRhX2NvbnNlbnQpIHtcbiAgICBoYXNCZXRhcyA9IHdpbmRvdy5jdERhc2hib2FyZExvY2FsaXphdGlvbnMucGx1Z2luX2RhdGEuaGFzX2JldGFfY29uc2VudDtcbiAgfVxuXG4gIGNvbnN0IHN5bmNDaGFuZ2Vsb2cgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHZlcmJvc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgYm9keS5hcHBlbmQoJ2FjdGlvbicsICdnZXRfbGF0ZXN0X2NoYW5nZWxvZycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goY3REYXNoYm9hcmRMb2NhbGl6YXRpb25zLmFqYXhfdXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBzdWNjZXNzLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICBpZiAoc3VjY2VzcyAmJiBkYXRhLmNoYW5nZWxvZykge1xuICAgICAgICAgIHNldENoYW5nZWxvZyhkYXRhLmNoYW5nZWxvZyk7XG4gICAgICAgICAgY2hhbmdlbG9nX2NhY2hlID0gZGF0YS5jaGFuZ2Vsb2c7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHN5bmNDaGFuZ2Vsb2coIWNoYW5nZWxvZ19jYWNoZSk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtY2hhbmdlbG9nLXdyYXBwZXJcIlxuICB9LCBjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHtcbiAgICBpdGVtczogaXNMb2FkaW5nLFxuICAgIGZyb206IHtcbiAgICAgIG9wYWNpdHk6IDBcbiAgICB9LFxuICAgIGVudGVyOiBbe1xuICAgICAgb3BhY2l0eTogMVxuICAgIH1dLFxuICAgIGxlYXZlOiBbe1xuICAgICAgb3BhY2l0eTogMFxuICAgIH1dLFxuICAgIGluaXRpYWw6IG51bGwsXG4gICAgY29uZmlnOiAoa2V5LCBwaGFzZSkgPT4ge1xuICAgICAgcmV0dXJuIHBoYXNlID09PSAnbGVhdmUnID8ge1xuICAgICAgICBkdXJhdGlvbjogMzAwXG4gICAgICB9IDoge1xuICAgICAgICBkZWxheTogMzAwLFxuICAgICAgICBkdXJhdGlvbjogMzAwXG4gICAgICB9O1xuICAgIH1cbiAgfSwgaXNMb2FkaW5nID0+IHtcbiAgICBpZiAoaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gcHJvcHMgPT4gY3JlYXRlRWxlbWVudChhbmltYXRlZC5wLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJjdC1sb2FkaW5nLXRleHRcIixcbiAgICAgICAgc3R5bGU6IHByb3BzXG4gICAgICB9LCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKSwgX18oJ0xvYWRpbmcgY2hhbmdlbG9nLi4uJywgJ2Jsb2Nrc3knKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzID0+IGNyZWF0ZUVsZW1lbnQoYW5pbWF0ZWQuZGl2LCB7XG4gICAgICBzdHlsZTogcHJvcHNcbiAgICB9LCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY2hhbmdlbG9nLWluZm8nLCB7XG4gICAgICAgICdoYXMtc291cmNlcyc6IGNoYW5nZWxvZyAmJiBjaGFuZ2Vsb2cubGVuZ3RoID4gMVxuICAgICAgfSlcbiAgICB9LCBjaGFuZ2Vsb2cgJiYgY2hhbmdlbG9nLmxlbmd0aCA+IDEgJiYgY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJjaGFuZ2Vsb2ctc291cmNlc1wiXG4gICAgfSwgY2hhbmdlbG9nLm1hcCgoX3JlZjMsIGluZGV4KSA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB0aXRsZVxuICAgICAgfSA9IF9yZWYzO1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICAgICAgYWN0aXZlOiBpbmRleCA9PT0gY3VycmVudENoYW5nZWxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgb25DbGljazogKCkgPT4gc2V0Q3VycmVudENoYW5nZWxvZyhpbmRleCksXG4gICAgICAgIGtleTogdGl0bGVcbiAgICAgIH0sIHRpdGxlKTtcbiAgICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiY2hhbmdlbG9nLWV4cGxhbmF0aW9uXCJcbiAgICB9LCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIm5ld1wiXG4gICAgfSksICcgJywgX18oJ05ldycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImZpeFwiXG4gICAgfSksICcgJywgX18oJ0ZpeCcsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImltcHJvdmVtZW50XCJcbiAgICB9KSwgX18oJ1VwZGF0ZScsICdibG9ja3N5JykpKSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImNoYW5nZWxvZy1pdGVtc1wiXG4gICAgfSwgY2hhbmdlbG9nW2N1cnJlbnRDaGFuZ2Vsb2ddLmNoYW5nZWxvZyA/IHBhcnNlQ2hhbmdlbG9nKGNoYW5nZWxvZ1tjdXJyZW50Q2hhbmdlbG9nXS5jaGFuZ2Vsb2csIHtcbiAgICAgIGhhc0JldGFzXG4gICAgfSkubWFwKHZlcnNpb25EZXNjcmlwdG9yID0+IGNyZWF0ZUVsZW1lbnQoU2luZ2xlVmVyc2lvbiwge1xuICAgICAga2V5OiB2ZXJzaW9uRGVzY3JpcHRvci52ZXJzaW9uLFxuICAgICAgdmVyc2lvbkRlc2NyaXB0b3I6IHZlcnNpb25EZXNjcmlwdG9yXG4gICAgfSkpIDogX18oJ05vIGNoYW5nZWxvZyBwcmVzZW50IGF0IHRoZSBtb21lbnQuJywgJ2Jsb2Nrc3knKSkpO1xuICB9KSk7XG59KTsiLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5leHBvcnQgZGVmYXVsdCAoKCkgPT4ge1xuICByZXR1cm4ge1xuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHdpbmRvdy5sb2NhdGlvbiksIHt9LCB7XG4gICAgICAgIHBhdGhuYW1lOiAod2luZG93LmxvY2F0aW9uLmhhc2ggfHwgJyMvJykucmVwbGFjZSgvIy9nLCAnJylcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhZGRFdmVudExpc3RlbmVyKG5hbWUsIGZuKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmbik7XG4gICAgfSxcblxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgZm4pIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGZuKTtcbiAgICB9LFxuXG4gICAgaGlzdG9yeToge1xuICAgICAgZ2V0IHN0YXRlKCkge1xuICAgICAgICByZXR1cm4gd2luZG93Lmhpc3Rvcnkuc3RhdGU7XG4gICAgICB9LFxuXG4gICAgICByZXBsYWNlU3RhdGUoc3RhdGUsIG1heWJlUmVmLCB0bykge1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIG1heWJlUmVmLCBgIyR7dG99YCk7XG4gICAgICB9LFxuXG4gICAgICBwdXNoU3RhdGUoc3RhdGUsIG1heWJlUmVmLCB0bykge1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsIG1heWJlUmVmLCBgIyR7dG99YCk7XG4gICAgICB9XG5cbiAgICB9XG4gIH07XG59KTsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCB7IGRhdGVJMThuIH0gZnJvbSAnQHdvcmRwcmVzcy9kYXRlJztcbmltcG9ydCB7IF9fLCBzcHJpbnRmIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IFRyYW5zaXRpb24sIGFuaW1hdGVkIH0gZnJvbSAncmVhY3Qtc3ByaW5nL3JlbmRlcnByb3BzJztcbmV4cG9ydCBkZWZhdWx0ICgoKSA9PiB7XG4gIGlmICh3aW5kb3cuY3REYXNoYm9hcmRMb2NhbGl6YXRpb25zICYmIHdpbmRvdy5jdERhc2hib2FyZExvY2FsaXphdGlvbnMucGx1Z2luX2RhdGEgJiYgd2luZG93LmN0RGFzaGJvYXJkTG9jYWxpemF0aW9ucy5wbHVnaW5fZGF0YS5pc19wcm8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwic2VjdGlvblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWNvbXBhcmlzb24tdGFibGVcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwidWxcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtdGFibGUtaGVhZGluZ1wiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdHZW5lcmFsIEZlYXR1cmVzJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdGcmVlJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdQcm8nLCAnYmxvY2tzeScpKSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnR2xvYmFsIGNvbG9yIHBhbGV0dGUnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ1JlbGF0ZWQgcG9zdHMgbW9kdWxlJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdUcmVuZGluZyBwb3N0cyBtb2R1bGUnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ05ld3NsZXR0ZXIgc3Vic2NyaWJlIG1vZHVsZScsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnQ29va2llcyBub3RpY2UgbW9kdWxlJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdDdXN0b20gd2lkZ2V0cycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnR29vZ2xlIGZvbnRzJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdDdXN0b20gcG9zdCB0eXBlcyBzdXBwb3J0JywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdXb29Db21tZXJjZSBzdXBwb3J0JywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdNdWx0aXBsZSBjb25kaXRpb25hbCBzaWRlYmFycycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnQ29udGVudCBibG9ja3MgKGhvb2tzKScsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnQ3VzdG9tIGNvZGUgc25pcHBldHMnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLW5vLWFsdFwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0N1c3RvbSBmb250cyAoKyBzdXBwb3J0IGZvciB2YXJpYWJsZSBmb250cyknLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLW5vLWFsdFwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0Fkb2JlIFR5cGVraXQgZm9udHMnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLW5vLWFsdFwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0xvY2FsIEdvb2dsZSBmb250cyAoR0RQUiknLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLW5vLWFsdFwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0FkdmFuY2VkIG1lbnUgKG1lZ2EgbWVudSknLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLW5vLWFsdFwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ1Nob3J0Y3V0cyBiYXInLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLW5vLWFsdFwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ1doaXRlIGxhYmVsIChvbmx5IGluIEFnZW5jeSBwYWNrYWdlKScsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSkpLCBjcmVhdGVFbGVtZW50KFwidWxcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtdGFibGUtaGVhZGluZ1wiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdIZWFkZXIgRmVhdHVyZXMnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0ZyZWUnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ1BybycsICdibG9ja3N5JykpKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdIZWFkZXIgYnVpbGRlcicsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnVHJhbnNwYXJlbnQgaGVhZGVyJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdTdGlja3kgaGVhZGVyJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdNdWx0aXBsZSBjb25kaXRpb25hbCBoZWFkZXJzJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy1uby1hbHRcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdEdXBsaWNhdGUgaGVhZGVycyBpdGVtcycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnRGVza3RvcCBvZmYtY2FudmFzIGRyYXdlcicsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnTW9yZSBoZWFkZXJzIGl0ZW1zJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy1uby1hbHRcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSksIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC10YWJsZS1oZWFkaW5nXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0Zvb3RlciBGZWF0dXJlcycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnRnJlZScsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnUHJvJywgJ2Jsb2Nrc3knKSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0Zvb3RlciBidWlsZGVyJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdGb290ZXIgcmV2ZWFsIGVmZmVjdCcsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnTXVsdGlwbGUgY29uZGl0aW9uYWwgZm9vdGVycycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnRHVwbGljYXRlIGZvb3RlciBpdGVtcycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnTW9yZSBmb290ZXIgaXRlbXMnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLW5vLWFsdFwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpKSwgY3JlYXRlRWxlbWVudChcInVsXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXRhYmxlLWhlYWRpbmdcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnV29vQ29tbWVyY2UgRmVhdHVyZXMnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0ZyZWUnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ1BybycsICdibG9ja3N5JykpKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdBZHZhbmNlZCBhcmNoaXZlIGxheW91dHMnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0FkdmFuY2VkIHNpbmdsZSBwcm9kdWN0IGxheW91dHMnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0FKQVggYWRkIHRvIGNhcnQnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ1F1aWNrIHZpZXcgbW9kdWxlJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy1uby1hbHRcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdGbG9hdGluZyBjYXJ0JywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy1uby1hbHRcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdPZmYtY2FudmFzIGZpbHRlcnMnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLW5vLWFsdFwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMteWVzXCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ09mZi1jYW52YXMgY2FydCcsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnTW9yZSBzaW5nbGUgcHJvZHVjdCBsYXlvdXRzJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy1uby1hbHRcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdQcm9kdWN0IHNoYXJlIGljb25zJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy1uby1hbHRcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdQcm9kdWN0IGdhbGxlcnkgc2xpZGVyJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy1uby1hbHRcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdXaXNobGlzdCcsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSkpLCBjcmVhdGVFbGVtZW50KFwidWxcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtdGFibGUtaGVhZGluZ1wiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIF9fKCdDb21pbmcgU29vbiBGZWF0dXJlcycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnRnJlZScsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnUHJvJywgJ2Jsb2Nrc3knKSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgX18oJ0FkdmFuY2VkIEN1c3RvbSBQb3N0IFR5cGVzIG1vZHVsZScsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnUG9ydGZvbGlvIGV4dGVuc2lvbicsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRhc2hpY29ucyBkYXNoaWNvbnMtbm8tYWx0XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy15ZXNcIlxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBfXygnUHJlbWl1bSBzdGFydGVyIHNpdGVzJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiZGFzaGljb25zIGRhc2hpY29ucy1uby1hbHRcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJkYXNoaWNvbnMgZGFzaGljb25zLXllc1wiXG4gIH0pKSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1jdGEtY29udGFpbmVyXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IFwiNTVcIixcbiAgICBoZWlnaHQ6IFwiNTVcIixcbiAgICB2aWV3Qm94OiBcIjAgMCA0MC41IDQ4LjNcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCIjMmQ4MmM4XCIsXG4gICAgZDogXCJNMzMuNCAyOS40bDcuMSAxMi4zLTcuNC42LTQgNi03LjMtMTIuOVwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMzMuNSAyOS42TDI2IDQyLjdsLTQuMi03LjMgMTEuNi02IC4xLjJ6TTAgNDEuN2w3LjUuNiAzLjkgNiA3LjItMTIuNC0xMS03LjNMMCA0MS43elwiLFxuICAgIGZpbGw6IFwiIzIyNzFiMVwiXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMzkuNSAxOC43YzAgMS42LTIuNCAyLjgtMi43IDQuMy0uNCAxLjUgMSAzLjguMiA1LjEtLjggMS4zLTMuNCAxLjItNC41IDIuMy0xLjEgMS4xLTEgMy43LTIuMyA0LjUtMS4zLjgtMy42LS42LTUuMS0uMi0xLjUuNC0yLjcgMi43LTQuMyAyLjdTMTggMzUgMTYuNSAzNC43Yy0xLjUtLjQtMy44IDEtNS4xLjJzLTEuMi0zLjQtMi4zLTQuNS0zLjctMS00LjUtMi4zLjYtMy42LjItNS4xLTIuNy0yLjctMi43LTQuMyAyLjQtMi44IDIuNy00LjNjLjQtMS41LTEtMy44LS4yLTUuMUM1LjQgOCA4LjEgOC4xIDkuMSA3YzEuMS0xLjEgMS0zLjcgMi4zLTQuNXMzLjYuNiA1LjEuMkMxOCAyLjQgMTkuMiAwIDIwLjggMGMxLjYgMCAyLjggMi40IDQuMyAyLjcgMS41LjQgMy44LTEgNS4xLS4yIDEuMy44IDEuMiAzLjQgMi4zIDQuNSAxLjEgMS4xIDMuNyAxIDQuNSAyLjNzLS42IDMuNi0uMiA1LjFjLjMgMS41IDIuNyAyLjcgMi43IDQuM3pcIixcbiAgICBmaWxsOiBcIiM1OTlmZDlcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTIzLjYgN2MtNi40LTEuNS0xMi45IDIuNS0xNC40IDguOS0uNyAzLjEtLjIgNi4zIDEuNSA5LjEgMS43IDIuNyA0LjMgNC42IDcuNCA1LjQuOS4yIDEuOS4zIDIuOC4zIDIuMiAwIDQuNC0uNiA2LjMtMS44IDIuNy0xLjcgNC42LTQuMyA1LjQtNy41QzM0IDE1IDMwIDguNSAyMy42IDd6bTcgMTRjLS42IDIuNi0yLjIgNC44LTQuNSA2LjItMi4zIDEuNC01IDEuOC03LjYgMS4yLTIuNi0uNi00LjgtMi4yLTYuMi00LjUtMS40LTIuMy0xLjgtNS0xLjItNy42LjYtMi42IDIuMi00LjggNC41LTYuMiAxLjYtMSAzLjQtMS41IDUuMi0xLjUuOCAwIDEuNS4xIDIuMy4zIDUuNCAxLjMgOC43IDYuNyA3LjUgMTIuMXptLTguMi00LjVsMy43LjUtMi43IDIuNy43IDMuNy0zLjQtMS44LTMuMyAxLjguNi0zLjctMi43LTIuNyAzLjgtLjUgMS42LTMuNCAxLjcgMy40elwiLFxuICAgIGZpbGw6IFwiI2ZmZlwiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImgyXCIsIG51bGwsIF9fKCdVcGdyYWRlIE5vdycsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBfXygnVXBncmFkZSB0byB0aGUgUHJvIHZlcnNpb24gYW5kIGdldCBpbnN0YW50IGFjY2VzcyB0byBhbGwgcHJlbWl1bSBleHRlbnNpb25zLCBmZWF0dXJlcyBhbmQgZnV0dXJlIHVwZGF0ZXMuJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICBocmVmOiBcImh0dHBzOi8vY3JlYXRpdmV0aGVtZXMuY29tL2Jsb2Nrc3kvcHJpY2luZy9cIixcbiAgICBjbGFzc05hbWU6IFwiY3QtYnV0dG9uLXByaW1hcnlcIixcbiAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcbiAgfSwgX18oJ0dldCBCbG9ja3N5IFBybyBOb3cnLCAnYmxvY2tzeScpKSkpO1xufSk7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiQ29tcG9uZW50XCIsIFwia2V5XCIsIFwicGF0aFwiXTtcblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgRGFzaGJvYXJkQ29udGV4dCwgeyBQcm92aWRlciwgZ2V0RGVmYXVsdFZhbHVlIH0gZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBIZWFkaW5nIGZyb20gJy4vSGVhZGluZyc7XG5pbXBvcnQgeyBSb3V0ZXIsIExpbmssIE1hdGNoLCBMb2NhdGlvbiwgTG9jYXRpb25Qcm92aWRlciwgbmF2aWdhdGUsIGNyZWF0ZUhpc3RvcnkgfSBmcm9tICdAcmVhY2gvcm91dGVyJztcbmltcG9ydCBjdEV2ZW50cyBmcm9tICdjdC1ldmVudHMnO1xuaW1wb3J0IHsgVHJhbnNpdGlvbiwgYW5pbWF0ZWQgfSBmcm9tICdyZWFjdC1zcHJpbmcvcmVuZGVycHJvcHMnO1xud2luZG93LmN0RGFzaGJvYXJkTG9jYWxpemF0aW9ucy5EYXNoYm9hcmRDb250ZXh0ID0gRGFzaGJvYXJkQ29udGV4dDtcbmltcG9ydCBOYXZpZ2F0aW9uIGZyb20gJy4vTmF2aWdhdGlvbic7XG5pbXBvcnQgSG9tZSBmcm9tICcuL3NjcmVlbnMvSG9tZSc7XG5pbXBvcnQgUmVjb21tZW5kZWRQbHVnaW5zIGZyb20gJy4vc2NyZWVucy9SZWNvbW1lbmRlZFBsdWdpbnMnO1xuaW1wb3J0IENoYW5nZWxvZyBmcm9tICcuL3NjcmVlbnMvQ2hhbmdlbG9nJztcbmltcG9ydCB3aW5kb3dIYXNoU291cmNlIGZyb20gJy4vd2luZG93LWhhc2gtc291cmNlJztcbmltcG9ydCBQcm9UYWJsZSBmcm9tICcuL3NjcmVlbnMvUHJvVGFibGUnO1xubGV0IGhpc3RvcnkgPSBjcmVhdGVIaXN0b3J5KHdpbmRvd0hhc2hTb3VyY2UoKSk7XG4vKlxuY3RFdmVudHMub24oJ2N0OmRhc2hib2FyZDpyb3V0ZXMnLCByID0+XG5cdHIucHVzaCh7XG5cdFx0Q29tcG9uZW50OiAoKSA9PiA8ZGl2IGtleT1cInRlc3RcIj5oZWxsbzwvZGl2Pixcblx0XHRwYXRoOiAnL3Rlc3QnXG5cdH0pXG4pXG4qL1xuXG5jb25zdCBTcHJpbmdSb3V0ZXIgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBjaGlsZHJlblxuICB9ID0gX3JlZjtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoTG9jYXRpb24sIG51bGwsIF9yZWYyID0+IHtcbiAgICBsZXQge1xuICAgICAgbG9jYXRpb24sXG4gICAgICBuYXZpZ2F0ZSxcbiAgICAgIGhpc3RvcnlcbiAgICB9ID0gX3JlZjI7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbiwge1xuICAgICAgaXRlbXM6IGxvY2F0aW9uLFxuICAgICAgaW5pdGlhbDogbnVsbCxcbiAgICAgIGltbWVkaWF0ZTogKGxvY2F0aW9uLnN0YXRlIHx8IHt9KS5oYXNOb0NoYW5nZSxcbiAgICAgIGtleXM6IGxvY2F0aW9uID0+IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgZnJvbToge1xuICAgICAgICBvcGFjaXR5OiAwXG4gICAgICB9LFxuICAgICAgZW50ZXI6IFt7XG4gICAgICAgIG9wYWNpdHk6IDFcbiAgICAgIH1dLFxuICAgICAgbGVhdmU6IFt7XG4gICAgICAgIG9wYWNpdHk6IDBcbiAgICAgIH1dLFxuICAgICAgY29uZmlnOiAoa2V5LCBwaGFzZSkgPT4ge1xuICAgICAgICByZXR1cm4gcGhhc2UgPT09ICdsZWF2ZScgPyB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMFxuICAgICAgICB9IDoge1xuICAgICAgICAgIGRlbGF5OiAzMDAsXG4gICAgICAgICAgZHVyYXRpb246IDMwMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIGxvY2F0aW9uID0+IHByb3BzID0+IGNyZWF0ZUVsZW1lbnQoYW5pbWF0ZWQuZGl2LCB7XG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpXG4gICAgfSwgY3JlYXRlRWxlbWVudChSb3V0ZXIsIHtcbiAgICAgIHByaW1hcnk6IGZhbHNlLFxuICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgbmF2aWdhdGU6IG5hdmlnYXRlXG4gICAgfSwgY2hpbGRyZW4pKSk7XG4gIH0pO1xufTtcblxuY29uc3QgRmFkZVRyYW5zaXRpb25Sb3V0ZXIgPSBwcm9wcyA9PiBjcmVhdGVFbGVtZW50KExvY2F0aW9uLCBudWxsLCBfcmVmMyA9PiB7XG4gIGxldCB7XG4gICAgbG9jYXRpb25cbiAgfSA9IF9yZWYzO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uR3JvdXAsIHtcbiAgICBjbGFzc05hbWU6IFwidHJhbnNpdGlvbi1ncm91cFwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoQ1NTVHJhbnNpdGlvbiwge1xuICAgIGtleTogbG9jYXRpb24ua2V5LFxuICAgIGNsYXNzTmFtZXM6IFwiZmFkZVwiLFxuICAgIHRpbWVvdXQ6IDUwMFxuICB9LCBjcmVhdGVFbGVtZW50KFJvdXRlciwge1xuICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICBjbGFzc05hbWU6IFwicm91dGVyXCIsXG4gICAgcHJpbWFyeTogZmFsc2VcbiAgfSwgcHJvcHMuY2hpbGRyZW4pKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHVzZXJSb3V0ZXMgPSBbXTtcbiAgICBjdEV2ZW50cy50cmlnZ2VyKCdjdDpkYXNoYm9hcmQ6cm91dGVzJywgdXNlclJvdXRlcyk7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoTG9jYXRpb25Qcm92aWRlciwge1xuICAgICAgaGlzdG9yeTogaGlzdG9yeVxuICAgIH0sIGNyZWF0ZUVsZW1lbnQoUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0RGVmYXVsdFZhbHVlKCkpLCBjdERhc2hib2FyZExvY2FsaXphdGlvbnMpLCB7fSwge1xuICAgICAgICBMaW5rLFxuICAgICAgICBMb2NhdGlvbixcbiAgICAgICAgbmF2aWdhdGUsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIE1hdGNoXG4gICAgICB9KVxuICAgIH0sIGNyZWF0ZUVsZW1lbnQoXCJoZWFkZXJcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChIZWFkaW5nLCBudWxsKSwgY3JlYXRlRWxlbWVudChOYXZpZ2F0aW9uLCBudWxsKSksIGNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoU3ByaW5nUm91dGVyLCB7XG4gICAgICBwcmltYXJ5OiBmYWxzZSxcbiAgICAgIGNsYXNzTmFtZTogXCJyb3V0ZXJcIlxuICAgIH0sIGNyZWF0ZUVsZW1lbnQoSG9tZSwge1xuICAgICAgcGF0aDogXCIvXCJcbiAgICB9KSwgY3JlYXRlRWxlbWVudChSZWNvbW1lbmRlZFBsdWdpbnMsIHtcbiAgICAgIHBhdGg6IFwicGx1Z2luc1wiXG4gICAgfSksIGNyZWF0ZUVsZW1lbnQoQ2hhbmdlbG9nLCB7XG4gICAgICBwYXRoOiBcImNoYW5nZWxvZ1wiXG4gICAgfSksIGNyZWF0ZUVsZW1lbnQoUHJvVGFibGUsIHtcbiAgICAgIHBhdGg6IFwicHJvXCJcbiAgICB9KSwgdXNlclJvdXRlcy5tYXAoX3JlZjQgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICBrZXksXG4gICAgICAgIHBhdGhcbiAgICAgIH0gPSBfcmVmNCxcbiAgICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmNCwgX2V4Y2x1ZGVkKTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgICAgIGtleToga2V5IHx8IHBhdGgsXG4gICAgICAgIHBhdGg6IHBhdGhcbiAgICAgIH0sIHByb3BzKSk7XG4gICAgfSkpKSkpO1xuICB9XG5cbn0iLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCByZW5kZXIgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IERhc2hib2FyZCBmcm9tICcuL0Rhc2hib2FyZCc7XG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N0LWRhc2hib2FyZCcpKSB7XG4gICAgcmVuZGVyKGNyZWF0ZUVsZW1lbnQoRGFzaGJvYXJkLCBudWxsKSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N0LWRhc2hib2FyZCcpKTtcbiAgfVxufSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///342\n')},184:(module,exports)=>{eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n Copyright (c) 2018 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString === Object.prototype.toString) {\n\t\t\t\t\tfor (var key in arg) {\n\t\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif ( true && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (true) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n\t\t\treturn classNames;\n\t\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {}\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NtYWxsLWN0Ly4vbm9kZV9tb2R1bGVzL2NsYXNzbmFtZXMvaW5kZXguanM/NGQyNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAgQ29weXJpZ2h0IChjKSAyMDE4IEplZCBXYXRzb24uXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlXG4gIGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXNcbiovXG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgaGFzT3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cblx0ZnVuY3Rpb24gY2xhc3NOYW1lcygpIHtcblx0XHR2YXIgY2xhc3NlcyA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0XHRpZiAoIWFyZykgY29udGludWU7XG5cblx0XHRcdHZhciBhcmdUeXBlID0gdHlwZW9mIGFyZztcblxuXHRcdFx0aWYgKGFyZ1R5cGUgPT09ICdzdHJpbmcnIHx8IGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChhcmcpO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcblx0XHRcdFx0aWYgKGFyZy5sZW5ndGgpIHtcblx0XHRcdFx0XHR2YXIgaW5uZXIgPSBjbGFzc05hbWVzLmFwcGx5KG51bGwsIGFyZyk7XG5cdFx0XHRcdFx0aWYgKGlubmVyKSB7XG5cdFx0XHRcdFx0XHRjbGFzc2VzLnB1c2goaW5uZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhcmdUeXBlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRpZiAoYXJnLnRvU3RyaW5nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7XG5cdFx0XHRcdFx0Zm9yICh2YXIga2V5IGluIGFyZykge1xuXHRcdFx0XHRcdFx0aWYgKGhhc093bi5jYWxsKGFyZywga2V5KSAmJiBhcmdba2V5XSkge1xuXHRcdFx0XHRcdFx0XHRjbGFzc2VzLnB1c2goa2V5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGFyZy50b1N0cmluZygpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdGNsYXNzTmFtZXMuZGVmYXVsdCA9IGNsYXNzTmFtZXM7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWVzO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyByZWdpc3RlciBhcyAnY2xhc3NuYW1lcycsIGNvbnNpc3RlbnQgd2l0aCBucG0gcGFja2FnZSBuYW1lXG5cdFx0ZGVmaW5lKCdjbGFzc25hbWVzJywgW10sIGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5jbGFzc05hbWVzID0gY2xhc3NOYW1lcztcblx0fVxufSgpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///184\n")},966:(module,exports,__webpack_require__)=>{"use strict";eval('\n\nexports.__esModule = true;\n\nvar _react = __webpack_require__(363);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(697);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _gud = __webpack_require__(815);\n\nvar _gud2 = _interopRequireDefault(_gud);\n\nvar _warning = __webpack_require__(473);\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\n\n// Inlined Object.is polyfill.\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\nfunction objectIs(x, y) {\n if (x === y) {\n return x !== 0 || 1 / x === 1 / y;\n } else {\n return x !== x && y !== y;\n }\n}\n\nfunction createEventEmitter(value) {\n var handlers = [];\n return {\n on: function on(handler) {\n handlers.push(handler);\n },\n off: function off(handler) {\n handlers = handlers.filter(function (h) {\n return h !== handler;\n });\n },\n get: function get() {\n return value;\n },\n set: function set(newValue, changedBits) {\n value = newValue;\n handlers.forEach(function (handler) {\n return handler(value, changedBits);\n });\n }\n };\n}\n\nfunction onlyChild(children) {\n return Array.isArray(children) ? children[0] : children;\n}\n\nfunction createReactContext(defaultValue, calculateChangedBits) {\n var _Provider$childContex, _Consumer$contextType;\n\n var contextProp = \'__create-react-context-\' + (0, _gud2.default)() + \'__\';\n\n var Provider = function (_Component) {\n _inherits(Provider, _Component);\n\n function Provider() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, Provider);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _Component.call.apply(_Component, [this].concat(args))), _this), _this.emitter = createEventEmitter(_this.props.value), _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n Provider.prototype.getChildContext = function getChildContext() {\n var _ref;\n\n return _ref = {}, _ref[contextProp] = this.emitter, _ref;\n };\n\n Provider.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n if (this.props.value !== nextProps.value) {\n var oldValue = this.props.value;\n var newValue = nextProps.value;\n var changedBits = void 0;\n\n if (objectIs(oldValue, newValue)) {\n changedBits = 0; // No change\n } else {\n changedBits = typeof calculateChangedBits === \'function\' ? calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n if (false) {}\n\n changedBits |= 0;\n\n if (changedBits !== 0) {\n this.emitter.set(nextProps.value, changedBits);\n }\n }\n }\n };\n\n Provider.prototype.render = function render() {\n return this.props.children;\n };\n\n return Provider;\n }(_react.Component);\n\n Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[contextProp] = _propTypes2.default.object.isRequired, _Provider$childContex);\n\n var Consumer = function (_Component2) {\n _inherits(Consumer, _Component2);\n\n function Consumer() {\n var _temp2, _this2, _ret2;\n\n _classCallCheck(this, Consumer);\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _ret2 = (_temp2 = (_this2 = _possibleConstructorReturn(this, _Component2.call.apply(_Component2, [this].concat(args))), _this2), _this2.state = {\n value: _this2.getValue()\n }, _this2.onUpdate = function (newValue, changedBits) {\n var observedBits = _this2.observedBits | 0;\n if ((observedBits & changedBits) !== 0) {\n _this2.setState({ value: _this2.getValue() });\n }\n }, _temp2), _possibleConstructorReturn(_this2, _ret2);\n }\n\n Consumer.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n var observedBits = nextProps.observedBits;\n\n this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT // Subscribe to all changes by default\n : observedBits;\n };\n\n Consumer.prototype.componentDidMount = function componentDidMount() {\n if (this.context[contextProp]) {\n this.context[contextProp].on(this.onUpdate);\n }\n var observedBits = this.props.observedBits;\n\n this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT // Subscribe to all changes by default\n : observedBits;\n };\n\n Consumer.prototype.componentWillUnmount = function componentWillUnmount() {\n if (this.context[contextProp]) {\n this.context[contextProp].off(this.onUpdate);\n }\n };\n\n Consumer.prototype.getValue = function getValue() {\n if (this.context[contextProp]) {\n return this.context[contextProp].get();\n } else {\n return defaultValue;\n }\n };\n\n Consumer.prototype.render = function render() {\n return onlyChild(this.props.children)(this.state.value);\n };\n\n return Consumer;\n }(_react.Component);\n\n Consumer.contextTypes = (_Consumer$contextType = {}, _Consumer$contextType[contextProp] = _propTypes2.default.object, _Consumer$contextType);\n\n\n return {\n Provider: Provider,\n Consumer: Consumer\n };\n}\n\nexports["default"] = createReactContext;\nmodule.exports = exports[\'default\'];//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTY2LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zbWFsbC1jdC8uL25vZGVfbW9kdWxlcy9jcmVhdGUtcmVhY3QtY29udGV4dC9saWIvaW1wbGVtZW50YXRpb24uanM/NjljMCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfZ3VkID0gcmVxdWlyZSgnZ3VkJyk7XG5cbnZhciBfZ3VkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2d1ZCk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBNQVhfU0lHTkVEXzMxX0JJVF9JTlQgPSAxMDczNzQxODIzO1xuXG4vLyBJbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbC5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuZnVuY3Rpb24gb2JqZWN0SXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50RW1pdHRlcih2YWx1ZSkge1xuICB2YXIgaGFuZGxlcnMgPSBbXTtcbiAgcmV0dXJuIHtcbiAgICBvbjogZnVuY3Rpb24gb24oaGFuZGxlcikge1xuICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICB9LFxuICAgIG9mZjogZnVuY3Rpb24gb2ZmKGhhbmRsZXIpIHtcbiAgICAgIGhhbmRsZXJzID0gaGFuZGxlcnMuZmlsdGVyKGZ1bmN0aW9uIChoKSB7XG4gICAgICAgIHJldHVybiBoICE9PSBoYW5kbGVyO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KG5ld1ZhbHVlLCBjaGFuZ2VkQml0cykge1xuICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIGhhbmRsZXJzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIodmFsdWUsIGNoYW5nZWRCaXRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKSA/IGNoaWxkcmVuWzBdIDogY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlYWN0Q29udGV4dChkZWZhdWx0VmFsdWUsIGNhbGN1bGF0ZUNoYW5nZWRCaXRzKSB7XG4gIHZhciBfUHJvdmlkZXIkY2hpbGRDb250ZXgsIF9Db25zdW1lciRjb250ZXh0VHlwZTtcblxuICB2YXIgY29udGV4dFByb3AgPSAnX19jcmVhdGUtcmVhY3QtY29udGV4dC0nICsgKDAsIF9ndWQyLmRlZmF1bHQpKCkgKyAnX18nO1xuXG4gIHZhciBQcm92aWRlciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKFByb3ZpZGVyLCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIFByb3ZpZGVyKCkge1xuICAgICAgdmFyIF90ZW1wLCBfdGhpcywgX3JldDtcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb3ZpZGVyKTtcblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9yZXQgPSAoX3RlbXAgPSAoX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkpLCBfdGhpcyksIF90aGlzLmVtaXR0ZXIgPSBjcmVhdGVFdmVudEVtaXR0ZXIoX3RoaXMucHJvcHMudmFsdWUpLCBfdGVtcCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgICB9XG5cbiAgICBQcm92aWRlci5wcm90b3R5cGUuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgICAgdmFyIF9yZWY7XG5cbiAgICAgIHJldHVybiBfcmVmID0ge30sIF9yZWZbY29udGV4dFByb3BdID0gdGhpcy5lbWl0dGVyLCBfcmVmO1xuICAgIH07XG5cbiAgICBQcm92aWRlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy52YWx1ZSAhPT0gbmV4dFByb3BzLnZhbHVlKSB7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMucHJvcHMudmFsdWU7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IG5leHRQcm9wcy52YWx1ZTtcbiAgICAgICAgdmFyIGNoYW5nZWRCaXRzID0gdm9pZCAwO1xuXG4gICAgICAgIGlmIChvYmplY3RJcyhvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgICAgY2hhbmdlZEJpdHMgPSAwOyAvLyBObyBjaGFuZ2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VkQml0cyA9IHR5cGVvZiBjYWxjdWxhdGVDaGFuZ2VkQml0cyA9PT0gJ2Z1bmN0aW9uJyA/IGNhbGN1bGF0ZUNoYW5nZWRCaXRzKG9sZFZhbHVlLCBuZXdWYWx1ZSkgOiBNQVhfU0lHTkVEXzMxX0JJVF9JTlQ7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICgwLCBfd2FybmluZzIuZGVmYXVsdCkoKGNoYW5nZWRCaXRzICYgTUFYX1NJR05FRF8zMV9CSVRfSU5UKSA9PT0gY2hhbmdlZEJpdHMsICdjYWxjdWxhdGVDaGFuZ2VkQml0czogRXhwZWN0ZWQgdGhlIHJldHVybiB2YWx1ZSB0byBiZSBhICcgKyAnMzEtYml0IGludGVnZXIuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzJywgY2hhbmdlZEJpdHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoYW5nZWRCaXRzIHw9IDA7XG5cbiAgICAgICAgICBpZiAoY2hhbmdlZEJpdHMgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5zZXQobmV4dFByb3BzLnZhbHVlLCBjaGFuZ2VkQml0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIFByb3ZpZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFByb3ZpZGVyO1xuICB9KF9yZWFjdC5Db21wb25lbnQpO1xuXG4gIFByb3ZpZGVyLmNoaWxkQ29udGV4dFR5cGVzID0gKF9Qcm92aWRlciRjaGlsZENvbnRleCA9IHt9LCBfUHJvdmlkZXIkY2hpbGRDb250ZXhbY29udGV4dFByb3BdID0gX3Byb3BUeXBlczIuZGVmYXVsdC5vYmplY3QuaXNSZXF1aXJlZCwgX1Byb3ZpZGVyJGNoaWxkQ29udGV4KTtcblxuICB2YXIgQ29uc3VtZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudDIpIHtcbiAgICBfaW5oZXJpdHMoQ29uc3VtZXIsIF9Db21wb25lbnQyKTtcblxuICAgIGZ1bmN0aW9uIENvbnN1bWVyKCkge1xuICAgICAgdmFyIF90ZW1wMiwgX3RoaXMyLCBfcmV0MjtcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbnN1bWVyKTtcblxuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3JldDIgPSAoX3RlbXAyID0gKF90aGlzMiA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQyLmNhbGwuYXBwbHkoX0NvbXBvbmVudDIsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMyKSwgX3RoaXMyLnN0YXRlID0ge1xuICAgICAgICB2YWx1ZTogX3RoaXMyLmdldFZhbHVlKClcbiAgICAgIH0sIF90aGlzMi5vblVwZGF0ZSA9IGZ1bmN0aW9uIChuZXdWYWx1ZSwgY2hhbmdlZEJpdHMpIHtcbiAgICAgICAgdmFyIG9ic2VydmVkQml0cyA9IF90aGlzMi5vYnNlcnZlZEJpdHMgfCAwO1xuICAgICAgICBpZiAoKG9ic2VydmVkQml0cyAmIGNoYW5nZWRCaXRzKSAhPT0gMCkge1xuICAgICAgICAgIF90aGlzMi5zZXRTdGF0ZSh7IHZhbHVlOiBfdGhpczIuZ2V0VmFsdWUoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgX3RlbXAyKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMyLCBfcmV0Mik7XG4gICAgfVxuXG4gICAgQ29uc3VtZXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIG9ic2VydmVkQml0cyA9IG5leHRQcm9wcy5vYnNlcnZlZEJpdHM7XG5cbiAgICAgIHRoaXMub2JzZXJ2ZWRCaXRzID0gb2JzZXJ2ZWRCaXRzID09PSB1bmRlZmluZWQgfHwgb2JzZXJ2ZWRCaXRzID09PSBudWxsID8gTUFYX1NJR05FRF8zMV9CSVRfSU5UIC8vIFN1YnNjcmliZSB0byBhbGwgY2hhbmdlcyBieSBkZWZhdWx0XG4gICAgICA6IG9ic2VydmVkQml0cztcbiAgICB9O1xuXG4gICAgQ29uc3VtZXIucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICBpZiAodGhpcy5jb250ZXh0W2NvbnRleHRQcm9wXSkge1xuICAgICAgICB0aGlzLmNvbnRleHRbY29udGV4dFByb3BdLm9uKHRoaXMub25VcGRhdGUpO1xuICAgICAgfVxuICAgICAgdmFyIG9ic2VydmVkQml0cyA9IHRoaXMucHJvcHMub2JzZXJ2ZWRCaXRzO1xuXG4gICAgICB0aGlzLm9ic2VydmVkQml0cyA9IG9ic2VydmVkQml0cyA9PT0gdW5kZWZpbmVkIHx8IG9ic2VydmVkQml0cyA9PT0gbnVsbCA/IE1BWF9TSUdORURfMzFfQklUX0lOVCAvLyBTdWJzY3JpYmUgdG8gYWxsIGNoYW5nZXMgYnkgZGVmYXVsdFxuICAgICAgOiBvYnNlcnZlZEJpdHM7XG4gICAgfTtcblxuICAgIENvbnN1bWVyLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKHRoaXMuY29udGV4dFtjb250ZXh0UHJvcF0pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0W2NvbnRleHRQcm9wXS5vZmYodGhpcy5vblVwZGF0ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIENvbnN1bWVyLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uIGdldFZhbHVlKCkge1xuICAgICAgaWYgKHRoaXMuY29udGV4dFtjb250ZXh0UHJvcF0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dFtjb250ZXh0UHJvcF0uZ2V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBDb25zdW1lci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIG9ubHlDaGlsZCh0aGlzLnByb3BzLmNoaWxkcmVuKSh0aGlzLnN0YXRlLnZhbHVlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIENvbnN1bWVyO1xuICB9KF9yZWFjdC5Db21wb25lbnQpO1xuXG4gIENvbnN1bWVyLmNvbnRleHRUeXBlcyA9IChfQ29uc3VtZXIkY29udGV4dFR5cGUgPSB7fSwgX0NvbnN1bWVyJGNvbnRleHRUeXBlW2NvbnRleHRQcm9wXSA9IF9wcm9wVHlwZXMyLmRlZmF1bHQub2JqZWN0LCBfQ29uc3VtZXIkY29udGV4dFR5cGUpO1xuXG5cbiAgcmV0dXJuIHtcbiAgICBQcm92aWRlcjogUHJvdmlkZXIsXG4gICAgQ29uc3VtZXI6IENvbnN1bWVyXG4gIH07XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZVJlYWN0Q29udGV4dDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///966\n')},404:(module,exports,__webpack_require__)=>{"use strict";eval("\n\nexports.__esModule = true;\n\nvar _react = __webpack_require__(363);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _implementation = __webpack_require__(966);\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports[\"default\"] = _react2.default.createContext || _implementation2.default;\nmodule.exports = exports['default'];//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc21hbGwtY3QvLi9ub2RlX21vZHVsZXMvY3JlYXRlLXJlYWN0LWNvbnRleHQvbGliL2luZGV4LmpzP2ZlZGMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbnZhciBfaW1wbGVtZW50YXRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW1wbGVtZW50YXRpb24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlQ29udGV4dCB8fCBfaW1wbGVtZW50YXRpb24yLmRlZmF1bHQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///404\n")},815:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// @flow\n\n\nvar key = '__global_unique_id__';\n\nmodule.exports = function() {\n return __webpack_require__.g[key] = (__webpack_require__.g[key] || 0) + 1;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODE1LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zbWFsbC1jdC8uL25vZGVfbW9kdWxlcy9ndWQvaW5kZXguanM/N2Q5YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIga2V5ID0gJ19fZ2xvYmFsX3VuaXF1ZV9pZF9fJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGdsb2JhbFtrZXldID0gKGdsb2JhbFtrZXldIHx8IDApICsgMTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///815\n")},143:module=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\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\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {}\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NtYWxsLWN0Ly4vbm9kZV9tb2R1bGVzL2ludmFyaWFudC9icm93c2VyLmpzPzQwYjYiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciBpbnZhcmlhbnQgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICtcbiAgICAgICAgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107IH0pXG4gICAgICApO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///143\n")},703:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\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\nvar ReactPropTypesSecret = __webpack_require__(414);\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zbWFsbC1jdC8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qcz9kN2EwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge31cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25XaXRoUmVzZXQoKSB7fVxuZW1wdHlGdW5jdGlvbldpdGhSZXNldC5yZXNldFdhcm5pbmdDYWNoZSA9IGVtcHR5RnVuY3Rpb247XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIHNoaW0ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICBpZiAoc2VjcmV0ID09PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgLy8gSXQgaXMgc3RpbGwgc2FmZSB3aGVuIGNhbGxlZCBmcm9tIFJlYWN0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgJ1VzZSBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKSB0byBjYWxsIHRoZW0uICcgK1xuICAgICAgJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnXG4gICAgKTtcbiAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB0aHJvdyBlcnI7XG4gIH07XG4gIHNoaW0uaXNSZXF1aXJlZCA9IHNoaW07XG4gIGZ1bmN0aW9uIGdldFNoaW0oKSB7XG4gICAgcmV0dXJuIHNoaW07XG4gIH07XG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogc2hpbSxcbiAgICBiaWdpbnQ6IHNoaW0sXG4gICAgYm9vbDogc2hpbSxcbiAgICBmdW5jOiBzaGltLFxuICAgIG51bWJlcjogc2hpbSxcbiAgICBvYmplY3Q6IHNoaW0sXG4gICAgc3RyaW5nOiBzaGltLFxuICAgIHN5bWJvbDogc2hpbSxcblxuICAgIGFueTogc2hpbSxcbiAgICBhcnJheU9mOiBnZXRTaGltLFxuICAgIGVsZW1lbnQ6IHNoaW0sXG4gICAgZWxlbWVudFR5cGU6IHNoaW0sXG4gICAgaW5zdGFuY2VPZjogZ2V0U2hpbSxcbiAgICBub2RlOiBzaGltLFxuICAgIG9iamVjdE9mOiBnZXRTaGltLFxuICAgIG9uZU9mOiBnZXRTaGltLFxuICAgIG9uZU9mVHlwZTogZ2V0U2hpbSxcbiAgICBzaGFwZTogZ2V0U2hpbSxcbiAgICBleGFjdDogZ2V0U2hpbSxcblxuICAgIGNoZWNrUHJvcFR5cGVzOiBlbXB0eUZ1bmN0aW9uV2l0aFJlc2V0LFxuICAgIHJlc2V0V2FybmluZ0NhY2hlOiBlbXB0eUZ1bmN0aW9uXG4gIH07XG5cbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///703\n")},697:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\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\nif (false) { var throwOnDirectAccess, ReactIs; } else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = __webpack_require__(703)();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjk3LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NtYWxsLWN0Ly4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanM/ZDdiYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKFJlYWN0SXMuaXNFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///697\n")},414:module=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\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\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NtYWxsLWN0Ly4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzPzU5YjAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///414\n")},823:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = ({ value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar _objectWithoutPropertiesLoose = _interopDefault(__webpack_require__(366));\nvar _extends = _interopDefault(__webpack_require__(462));\nvar React = __webpack_require__(363);\nvar React__default = _interopDefault(React);\nvar ReactDOM = _interopDefault(__webpack_require__(533));\n\nlet bugfixes = undefined;\nlet applyAnimatedValues = undefined;\nlet colorNames = [];\nlet requestFrame = cb => typeof window !== 'undefined' && window.requestAnimationFrame(cb);\nlet cancelFrame = cb => typeof window !== 'undefined' && window.cancelAnimationFrame(cb);\nlet interpolation = undefined;\nlet now = () => Date.now();\nlet defaultElement = undefined;\nlet createAnimatedStyle = undefined;\nconst injectApplyAnimatedValues = (fn, transform) => applyAnimatedValues = {\n fn,\n transform\n};\nconst injectColorNames = names => colorNames = names;\nconst injectBugfixes = fn => bugfixes = fn;\nconst injectInterpolation = cls => interpolation = cls;\nconst injectFrame = (raf, caf) => {\n var _ref = [raf, caf];\n requestFrame = _ref[0];\n cancelFrame = _ref[1];\n return _ref;\n};\nconst injectNow = nowFn => now = nowFn;\nconst injectDefaultElement = el => defaultElement = el;\nconst injectCreateAnimatedStyle = factory => createAnimatedStyle = factory;\n\nvar Globals = /*#__PURE__*/Object.freeze({\n get bugfixes () { return bugfixes; },\n get applyAnimatedValues () { return applyAnimatedValues; },\n get colorNames () { return colorNames; },\n get requestFrame () { return requestFrame; },\n get cancelFrame () { return cancelFrame; },\n get interpolation () { return interpolation; },\n get now () { return now; },\n get defaultElement () { return defaultElement; },\n get createAnimatedStyle () { return createAnimatedStyle; },\n injectApplyAnimatedValues: injectApplyAnimatedValues,\n injectColorNames: injectColorNames,\n injectBugfixes: injectBugfixes,\n injectInterpolation: injectInterpolation,\n injectFrame: injectFrame,\n injectNow: injectNow,\n injectDefaultElement: injectDefaultElement,\n injectCreateAnimatedStyle: injectCreateAnimatedStyle\n});\n\nclass Animated {\n attach() {}\n\n detach() {}\n\n getValue() {}\n\n getAnimatedValue() {\n return this.getValue();\n }\n\n addChild(child) {}\n\n removeChild(child) {}\n\n getChildren() {\n return [];\n }\n\n}\n\nconst getValues = object => Object.keys(object).map(k => object[k]);\n\nclass AnimatedWithChildren extends Animated {\n constructor() {\n var _this;\n\n super(...arguments);\n _this = this;\n this.children = [];\n\n this.getChildren = () => this.children;\n\n this.getPayload = function (index) {\n if (index === void 0) {\n index = undefined;\n }\n\n return index !== void 0 && _this.payload ? _this.payload[index] : _this.payload || _this;\n };\n }\n\n addChild(child) {\n if (this.children.length === 0) this.attach();\n this.children.push(child);\n }\n\n removeChild(child) {\n const index = this.children.indexOf(child);\n this.children.splice(index, 1);\n if (this.children.length === 0) this.detach();\n }\n\n}\nclass AnimatedArrayWithChildren extends AnimatedWithChildren {\n constructor() {\n super(...arguments);\n this.payload = [];\n\n this.getAnimatedValue = () => this.getValue();\n\n this.attach = () => this.payload.forEach(p => p instanceof Animated && p.addChild(this));\n\n this.detach = () => this.payload.forEach(p => p instanceof Animated && p.removeChild(this));\n }\n\n}\nclass AnimatedObjectWithChildren extends AnimatedWithChildren {\n constructor() {\n super(...arguments);\n this.payload = {};\n\n this.getAnimatedValue = () => this.getValue(true);\n\n this.attach = () => getValues(this.payload).forEach(s => s instanceof Animated && s.addChild(this));\n\n this.detach = () => getValues(this.payload).forEach(s => s instanceof Animated && s.removeChild(this));\n }\n\n getValue(animated) {\n if (animated === void 0) {\n animated = false;\n }\n\n const payload = {};\n\n for (const key in this.payload) {\n const value = this.payload[key];\n if (animated && !(value instanceof Animated)) continue;\n payload[key] = value instanceof Animated ? value[animated ? 'getAnimatedValue' : 'getValue']() : value;\n }\n\n return payload;\n }\n\n}\n\nclass AnimatedStyle extends AnimatedObjectWithChildren {\n constructor(style) {\n super();\n style = style || {};\n if (style.transform && !(style.transform instanceof Animated)) style = applyAnimatedValues.transform(style);\n this.payload = style;\n }\n\n}\n\n// http://www.w3.org/TR/css3-color/#svg-color\nconst colors = {\n transparent: 0x00000000,\n aliceblue: 0xf0f8ffff,\n antiquewhite: 0xfaebd7ff,\n aqua: 0x00ffffff,\n aquamarine: 0x7fffd4ff,\n azure: 0xf0ffffff,\n beige: 0xf5f5dcff,\n bisque: 0xffe4c4ff,\n black: 0x000000ff,\n blanchedalmond: 0xffebcdff,\n blue: 0x0000ffff,\n blueviolet: 0x8a2be2ff,\n brown: 0xa52a2aff,\n burlywood: 0xdeb887ff,\n burntsienna: 0xea7e5dff,\n cadetblue: 0x5f9ea0ff,\n chartreuse: 0x7fff00ff,\n chocolate: 0xd2691eff,\n coral: 0xff7f50ff,\n cornflowerblue: 0x6495edff,\n cornsilk: 0xfff8dcff,\n crimson: 0xdc143cff,\n cyan: 0x00ffffff,\n darkblue: 0x00008bff,\n darkcyan: 0x008b8bff,\n darkgoldenrod: 0xb8860bff,\n darkgray: 0xa9a9a9ff,\n darkgreen: 0x006400ff,\n darkgrey: 0xa9a9a9ff,\n darkkhaki: 0xbdb76bff,\n darkmagenta: 0x8b008bff,\n darkolivegreen: 0x556b2fff,\n darkorange: 0xff8c00ff,\n darkorchid: 0x9932ccff,\n darkred: 0x8b0000ff,\n darksalmon: 0xe9967aff,\n darkseagreen: 0x8fbc8fff,\n darkslateblue: 0x483d8bff,\n darkslategray: 0x2f4f4fff,\n darkslategrey: 0x2f4f4fff,\n darkturquoise: 0x00ced1ff,\n darkviolet: 0x9400d3ff,\n deeppink: 0xff1493ff,\n deepskyblue: 0x00bfffff,\n dimgray: 0x696969ff,\n dimgrey: 0x696969ff,\n dodgerblue: 0x1e90ffff,\n firebrick: 0xb22222ff,\n floralwhite: 0xfffaf0ff,\n forestgreen: 0x228b22ff,\n fuchsia: 0xff00ffff,\n gainsboro: 0xdcdcdcff,\n ghostwhite: 0xf8f8ffff,\n gold: 0xffd700ff,\n goldenrod: 0xdaa520ff,\n gray: 0x808080ff,\n green: 0x008000ff,\n greenyellow: 0xadff2fff,\n grey: 0x808080ff,\n honeydew: 0xf0fff0ff,\n hotpink: 0xff69b4ff,\n indianred: 0xcd5c5cff,\n indigo: 0x4b0082ff,\n ivory: 0xfffff0ff,\n khaki: 0xf0e68cff,\n lavender: 0xe6e6faff,\n lavenderblush: 0xfff0f5ff,\n lawngreen: 0x7cfc00ff,\n lemonchiffon: 0xfffacdff,\n lightblue: 0xadd8e6ff,\n lightcoral: 0xf08080ff,\n lightcyan: 0xe0ffffff,\n lightgoldenrodyellow: 0xfafad2ff,\n lightgray: 0xd3d3d3ff,\n lightgreen: 0x90ee90ff,\n lightgrey: 0xd3d3d3ff,\n lightpink: 0xffb6c1ff,\n lightsalmon: 0xffa07aff,\n lightseagreen: 0x20b2aaff,\n lightskyblue: 0x87cefaff,\n lightslategray: 0x778899ff,\n lightslategrey: 0x778899ff,\n lightsteelblue: 0xb0c4deff,\n lightyellow: 0xffffe0ff,\n lime: 0x00ff00ff,\n limegreen: 0x32cd32ff,\n linen: 0xfaf0e6ff,\n magenta: 0xff00ffff,\n maroon: 0x800000ff,\n mediumaquamarine: 0x66cdaaff,\n mediumblue: 0x0000cdff,\n mediumorchid: 0xba55d3ff,\n mediumpurple: 0x9370dbff,\n mediumseagreen: 0x3cb371ff,\n mediumslateblue: 0x7b68eeff,\n mediumspringgreen: 0x00fa9aff,\n mediumturquoise: 0x48d1ccff,\n mediumvioletred: 0xc71585ff,\n midnightblue: 0x191970ff,\n mintcream: 0xf5fffaff,\n mistyrose: 0xffe4e1ff,\n moccasin: 0xffe4b5ff,\n navajowhite: 0xffdeadff,\n navy: 0x000080ff,\n oldlace: 0xfdf5e6ff,\n olive: 0x808000ff,\n olivedrab: 0x6b8e23ff,\n orange: 0xffa500ff,\n orangered: 0xff4500ff,\n orchid: 0xda70d6ff,\n palegoldenrod: 0xeee8aaff,\n palegreen: 0x98fb98ff,\n paleturquoise: 0xafeeeeff,\n palevioletred: 0xdb7093ff,\n papayawhip: 0xffefd5ff,\n peachpuff: 0xffdab9ff,\n peru: 0xcd853fff,\n pink: 0xffc0cbff,\n plum: 0xdda0ddff,\n powderblue: 0xb0e0e6ff,\n purple: 0x800080ff,\n rebeccapurple: 0x663399ff,\n red: 0xff0000ff,\n rosybrown: 0xbc8f8fff,\n royalblue: 0x4169e1ff,\n saddlebrown: 0x8b4513ff,\n salmon: 0xfa8072ff,\n sandybrown: 0xf4a460ff,\n seagreen: 0x2e8b57ff,\n seashell: 0xfff5eeff,\n sienna: 0xa0522dff,\n silver: 0xc0c0c0ff,\n skyblue: 0x87ceebff,\n slateblue: 0x6a5acdff,\n slategray: 0x708090ff,\n slategrey: 0x708090ff,\n snow: 0xfffafaff,\n springgreen: 0x00ff7fff,\n steelblue: 0x4682b4ff,\n tan: 0xd2b48cff,\n teal: 0x008080ff,\n thistle: 0xd8bfd8ff,\n tomato: 0xff6347ff,\n turquoise: 0x40e0d0ff,\n violet: 0xee82eeff,\n wheat: 0xf5deb3ff,\n white: 0xffffffff,\n whitesmoke: 0xf5f5f5ff,\n yellow: 0xffff00ff,\n yellowgreen: 0x9acd32ff\n};\n\nclass Interpolation {\n // Default config = config, args\n // Short config = range, output, extrapolate\n static create(config, output, extra) {\n if (typeof config === 'function') return config;else if (interpolation && config.output && typeof config.output[0] === 'string') return interpolation(config);else if (Array.isArray(config)) return Interpolation.create({\n range: config,\n output,\n extrapolate: extra || 'extend'\n });\n let outputRange = config.output;\n let inputRange = config.range || [0, 1];\n\n let easing = config.easing || (t => t);\n\n let extrapolateLeft = 'extend';\n let map = config.map;\n if (config.extrapolateLeft !== undefined) extrapolateLeft = config.extrapolateLeft;else if (config.extrapolate !== undefined) extrapolateLeft = config.extrapolate;\n let extrapolateRight = 'extend';\n if (config.extrapolateRight !== undefined) extrapolateRight = config.extrapolateRight;else if (config.extrapolate !== undefined) extrapolateRight = config.extrapolate;\n return input => {\n let range = findRange(input, inputRange);\n return interpolate(input, inputRange[range], inputRange[range + 1], outputRange[range], outputRange[range + 1], easing, extrapolateLeft, extrapolateRight, map);\n };\n }\n\n}\n\nfunction interpolate(input, inputMin, inputMax, outputMin, outputMax, easing, extrapolateLeft, extrapolateRight, map) {\n let result = map ? map(input) : input; // Extrapolate\n\n if (result < inputMin) {\n if (extrapolateLeft === 'identity') return result;else if (extrapolateLeft === 'clamp') result = inputMin;\n }\n\n if (result > inputMax) {\n if (extrapolateRight === 'identity') return result;else if (extrapolateRight === 'clamp') result = inputMax;\n }\n\n if (outputMin === outputMax) return outputMin;\n if (inputMin === inputMax) return input <= inputMin ? outputMin : outputMax; // Input Range\n\n if (inputMin === -Infinity) result = -result;else if (inputMax === Infinity) result = result - inputMin;else result = (result - inputMin) / (inputMax - inputMin); // Easing\n\n result = easing(result); // Output Range\n\n if (outputMin === -Infinity) result = -result;else if (outputMax === Infinity) result = result + outputMin;else result = result * (outputMax - outputMin) + outputMin;\n return result;\n}\n\nfunction findRange(input, inputRange) {\n for (var i = 1; i < inputRange.length - 1; ++i) if (inputRange[i] >= input) break;\n\n return i - 1;\n}\n\n// const INTEGER = '[-+]?\\\\d+';\nconst NUMBER = '[-+]?\\\\d*\\\\.?\\\\d+';\nconst PERCENTAGE = NUMBER + '%';\n\nfunction call() {\n return '\\\\(\\\\s*(' + Array.prototype.slice.call(arguments).join(')\\\\s*,\\\\s*(') + ')\\\\s*\\\\)';\n}\n\nconst rgb = new RegExp('rgb' + call(NUMBER, NUMBER, NUMBER));\nconst rgba = new RegExp('rgba' + call(NUMBER, NUMBER, NUMBER, NUMBER));\nconst hsl = new RegExp('hsl' + call(NUMBER, PERCENTAGE, PERCENTAGE));\nconst hsla = new RegExp('hsla' + call(NUMBER, PERCENTAGE, PERCENTAGE, NUMBER));\nconst hex3 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nconst hex4 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nconst hex6 = /^#([0-9a-fA-F]{6})$/;\nconst hex8 = /^#([0-9a-fA-F]{8})$/;\n\n/*\nhttps://github.com/react-community/normalize-css-color\n\nBSD 3-Clause License\n\nCopyright (c) 2016, React Community\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\nfunction normalizeColor(color) {\n let match;\n\n if (typeof color === 'number') {\n return color >>> 0 === color && color >= 0 && color <= 0xffffffff ? color : null;\n } // Ordered based on occurrences on Facebook codebase\n\n\n if (match = hex6.exec(color)) return parseInt(match[1] + 'ff', 16) >>> 0;\n if (colors.hasOwnProperty(color)) return colors[color];\n\n if (match = rgb.exec(color)) {\n return (parse255(match[1]) << 24 | // r\n parse255(match[2]) << 16 | // g\n parse255(match[3]) << 8 | // b\n 0x000000ff) >>> // a\n 0;\n }\n\n if (match = rgba.exec(color)) {\n return (parse255(match[1]) << 24 | // r\n parse255(match[2]) << 16 | // g\n parse255(match[3]) << 8 | // b\n parse1(match[4])) >>> // a\n 0;\n }\n\n if (match = hex3.exec(color)) {\n return parseInt(match[1] + match[1] + // r\n match[2] + match[2] + // g\n match[3] + match[3] + // b\n 'ff', // a\n 16) >>> 0;\n } // https://drafts.csswg.org/css-color-4/#hex-notation\n\n\n if (match = hex8.exec(color)) return parseInt(match[1], 16) >>> 0;\n\n if (match = hex4.exec(color)) {\n return parseInt(match[1] + match[1] + // r\n match[2] + match[2] + // g\n match[3] + match[3] + // b\n match[4] + match[4], // a\n 16) >>> 0;\n }\n\n if (match = hsl.exec(color)) {\n return (hslToRgb(parse360(match[1]), // h\n parsePercentage(match[2]), // s\n parsePercentage(match[3]) // l\n ) | 0x000000ff) >>> // a\n 0;\n }\n\n if (match = hsla.exec(color)) {\n return (hslToRgb(parse360(match[1]), // h\n parsePercentage(match[2]), // s\n parsePercentage(match[3]) // l\n ) | parse1(match[4])) >>> // a\n 0;\n }\n\n return null;\n}\n\nfunction hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\n\nfunction hslToRgb(h, s, l) {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const r = hue2rgb(p, q, h + 1 / 3);\n const g = hue2rgb(p, q, h);\n const b = hue2rgb(p, q, h - 1 / 3);\n return Math.round(r * 255) << 24 | Math.round(g * 255) << 16 | Math.round(b * 255) << 8;\n}\n\nfunction parse255(str) {\n const int = parseInt(str, 10);\n if (int < 0) return 0;\n if (int > 255) return 255;\n return int;\n}\n\nfunction parse360(str) {\n const int = parseFloat(str);\n return (int % 360 + 360) % 360 / 360;\n}\n\nfunction parse1(str) {\n const num = parseFloat(str);\n if (num < 0) return 0;\n if (num > 1) return 255;\n return Math.round(num * 255);\n}\n\nfunction parsePercentage(str) {\n // parseFloat conveniently ignores the final %\n const int = parseFloat(str);\n if (int < 0) return 0;\n if (int > 100) return 1;\n return int / 100;\n}\n\nfunction colorToRgba(input) {\n let int32Color = normalizeColor(input);\n if (int32Color === null) return input;\n int32Color = int32Color || 0;\n let r = (int32Color & 0xff000000) >>> 24;\n let g = (int32Color & 0x00ff0000) >>> 16;\n let b = (int32Color & 0x0000ff00) >>> 8;\n let a = (int32Color & 0x000000ff) / 255;\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n} // Problem: https://github.com/animatedjs/animated/pull/102\n// Solution: https://stackoverflow.com/questions/638565/parsing-scientific-notation-sensibly/658662\n\n\nconst stringShapeRegex = /[+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g; // Covers rgb, rgba, hsl, hsla\n// Taken from https://gist.github.com/olmokramer/82ccce673f86db7cda5e\n\nconst colorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\\((-?\\d+%?[,\\s]+){2,3}\\s*[\\d\\.]+%?\\))/gi; // Covers color names (transparent, blue, etc.)\n\nconst colorNamesRegex = new RegExp(`(${Object.keys(colors).join('|')})`, 'g');\n/**\n * Supports string shapes by extracting numbers so new values can be computed,\n * and recombines those values into new strings of the same shape. Supports\n * things like:\n *\n * rgba(123, 42, 99, 0.36) // colors\n * -45deg // values with units\n * 0 2px 2px 0px rgba(0, 0, 0, 0.12) // box shadows\n */\n\nfunction createInterpolation(config) {\n // Replace colors with rgba\n const outputRange = config.output.map(rangeValue => rangeValue.replace(colorRegex, colorToRgba)).map(rangeValue => rangeValue.replace(colorNamesRegex, colorToRgba)); // ->\n // [\n // [0, 50],\n // [100, 150],\n // [200, 250],\n // [0, 0.5],\n // ]\n\n const outputRanges = outputRange[0].match(stringShapeRegex).map(() => []);\n outputRange.forEach(value => {\n value.match(stringShapeRegex).forEach((number, i) => outputRanges[i].push(+number));\n });\n const interpolations = outputRange[0].match(stringShapeRegex).map((value, i) => {\n return Interpolation.create(_extends({}, config, {\n output: outputRanges[i]\n }));\n });\n return input => {\n let i = 0;\n return outputRange[0] // 'rgba(0, 100, 200, 0)'\n // ->\n // 'rgba(${interpolations[0](input)}, ${interpolations[1](input)}, ...'\n .replace(stringShapeRegex, () => interpolations[i++](input)) // rgba requires that the r,g,b are integers.... so we want to round them, but we *dont* want to\n // round the opacity (4th column).\n .replace(/rgba\\(([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+)\\)/gi, (_, p1, p2, p3, p4) => `rgba(${Math.round(p1)}, ${Math.round(p2)}, ${Math.round(p3)}, ${p4})`);\n };\n}\n\nclass AnimatedInterpolation extends AnimatedArrayWithChildren {\n constructor(parents, _config, _arg) {\n super();\n\n this.getValue = () => this.calc(...this.payload.map(value => value.getValue()));\n\n this.updateConfig = (config, arg) => this.calc = Interpolation.create(config, arg);\n\n this.interpolate = (config, arg) => new AnimatedInterpolation(this, config, arg);\n\n this.payload = // AnimatedArrays should unfold, except AnimatedInterpolation which is taken as is\n parents instanceof AnimatedArrayWithChildren && !parents.updateConfig ? parents.payload : Array.isArray(parents) ? parents : [parents];\n this.calc = Interpolation.create(_config, _arg);\n }\n\n}\nconst interpolate$1 = (parents, config, arg) => parents && new AnimatedInterpolation(parents, config, arg);\n\n/**\n * Animated works by building a directed acyclic graph of dependencies\n * transparently when you render your Animated components.\n *\n * new Animated.Value(0)\n * .interpolate() .interpolate() new Animated.Value(1)\n * opacity translateY scale\n * style transform\n * View#234 style\n * View#123\n *\n * A) Top Down phase\n * When an Animated.Value is updated, we recursively go down through this\n * graph in order to find leaf nodes: the views that we flag as needing\n * an update.\n *\n * B) Bottom Up phase\n * When a view is flagged as needing an update, we recursively go back up\n * in order to build the new value that it needs. The reason why we need\n * this two-phases process is to deal with composite props such as\n * transform which can receive values from multiple parents.\n */\n\nfunction findAnimatedStyles(node, styles) {\n if (typeof node.update === 'function') styles.add(node);else node.getChildren().forEach(child => findAnimatedStyles(child, styles));\n}\n/**\n * Standard value for driving animations. One `Animated.Value` can drive\n * multiple properties in a synchronized fashion, but can only be driven by one\n * mechanism at a time. Using a new mechanism (e.g. starting a new animation,\n * or calling `setValue`) will stop any previous ones.\n */\n\n\nclass AnimatedValue extends AnimatedWithChildren {\n constructor(_value) {\n var _this;\n\n super();\n _this = this;\n\n this.setValue = function (value, flush) {\n if (flush === void 0) {\n flush = true;\n }\n\n _this.value = value;\n if (flush) _this.flush();\n };\n\n this.getValue = () => this.value;\n\n this.updateStyles = () => findAnimatedStyles(this, this.animatedStyles);\n\n this.updateValue = value => this.flush(this.value = value);\n\n this.interpolate = (config, arg) => new AnimatedInterpolation(this, config, arg);\n\n this.value = _value;\n this.animatedStyles = new Set();\n this.done = false;\n this.startPosition = _value;\n this.lastPosition = _value;\n this.lastVelocity = undefined;\n this.lastTime = undefined;\n this.controller = undefined;\n }\n\n flush() {\n if (this.animatedStyles.size === 0) this.updateStyles();\n this.animatedStyles.forEach(animatedStyle => animatedStyle.update());\n }\n\n prepare(controller) {\n // Values stay loyal to their original controller, this is also a way to\n // detect trailing values originating from a foreign controller\n if (this.controller === undefined) this.controller = controller;\n\n if (this.controller === controller) {\n this.startPosition = this.value;\n this.lastPosition = this.value;\n this.lastVelocity = controller.isActive ? this.lastVelocity : undefined;\n this.lastTime = controller.isActive ? this.lastTime : undefined;\n this.done = false;\n this.animatedStyles.clear();\n }\n }\n\n}\n\nclass AnimatedArray extends AnimatedArrayWithChildren {\n constructor(array) {\n var _this;\n\n super();\n _this = this;\n\n this.setValue = function (value, flush) {\n if (flush === void 0) {\n flush = true;\n }\n\n if (Array.isArray(value)) {\n if (value.length === _this.payload.length) value.forEach((v, i) => _this.payload[i].setValue(v, flush));\n } else _this.payload.forEach((v, i) => _this.payload[i].setValue(value, flush));\n };\n\n this.getValue = () => this.payload.map(v => v.getValue());\n\n this.interpolate = (config, arg) => new AnimatedInterpolation(this, config, arg);\n\n this.payload = array.map(n => new AnimatedValue(n));\n }\n\n}\n\nfunction withDefault(value, defaultValue) {\n return value === undefined || value === null ? defaultValue : value;\n}\nfunction toArray(a) {\n return a !== void 0 ? Array.isArray(a) ? a : [a] : [];\n}\nfunction shallowEqual(a, b) {\n if (typeof a !== typeof b) return false;\n if (typeof a === 'string' || typeof a === 'number') return a === b;\n let i;\n\n for (i in a) if (!(i in b)) return false;\n\n for (i in b) if (a[i] !== b[i]) return false;\n\n return i === void 0 ? a === b : true;\n}\nfunction callProp(obj) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return typeof obj === 'function' ? obj(...args) : obj;\n}\nfunction getValues$1(object) {\n return Object.keys(object).map(k => object[k]);\n}\nfunction getForwardProps(props) {\n const to = props.to,\n from = props.from,\n config = props.config,\n native = props.native,\n onStart = props.onStart,\n onRest = props.onRest,\n onFrame = props.onFrame,\n children = props.children,\n reset = props.reset,\n reverse = props.reverse,\n force = props.force,\n immediate = props.immediate,\n impl = props.impl,\n inject = props.inject,\n delay = props.delay,\n attach = props.attach,\n destroyed = props.destroyed,\n interpolateTo = props.interpolateTo,\n autoStart = props.autoStart,\n ref = props.ref,\n forward = _objectWithoutPropertiesLoose(props, [\"to\", \"from\", \"config\", \"native\", \"onStart\", \"onRest\", \"onFrame\", \"children\", \"reset\", \"reverse\", \"force\", \"immediate\", \"impl\", \"inject\", \"delay\", \"attach\", \"destroyed\", \"interpolateTo\", \"autoStart\", \"ref\"]);\n\n return forward;\n}\nfunction interpolateTo(props) {\n const forward = getForwardProps(props);\n const rest = Object.keys(props).reduce((a, k) => forward[k] !== void 0 ? a : _extends({}, a, {\n [k]: props[k]\n }), {});\n return _extends({\n to: forward\n }, rest);\n}\nfunction convertToAnimatedValue(acc, _ref) {\n let name = _ref[0],\n value = _ref[1];\n return _extends({}, acc, {\n [name]: new (Array.isArray(value) ? AnimatedArray : AnimatedValue)(value)\n });\n}\nfunction convertValues(props) {\n const from = props.from,\n to = props.to,\n native = props.native;\n const allProps = Object.entries(_extends({}, from, to));\n return native ? allProps.reduce(convertToAnimatedValue, {}) : _extends({}, from, to);\n}\nfunction handleRef(ref, forward) {\n if (forward) {\n // If it's a function, assume it's a ref callback\n if (typeof forward === 'function') forward(ref);else if (typeof forward === 'object') {\n // If it's an object and has a 'current' property, assume it's a ref object\n forward.current = ref;\n }\n }\n\n return ref;\n}\n\nconst check = value => value === 'auto';\n\nconst overwrite = (width, height) => (acc, _ref) => {\n let name = _ref[0],\n value = _ref[1];\n return _extends({}, acc, {\n [name]: value === 'auto' ? ~name.indexOf('height') ? height : width : value\n });\n};\n\nfunction fixAuto(props, callback) {\n const from = props.from,\n to = props.to,\n children = props.children; // Dry-route props back if nothing's using 'auto' in there\n // TODO: deal with \"null\"\n\n if (!(getValues$1(to).some(check) || getValues$1(from).some(check))) return; // Fetch render v-dom\n\n let element = children(convertValues(props)); // A spring can return undefined/null, check against that (#153)\n\n if (!element) return; // Or it could be an array (#346) ...\n\n if (Array.isArray(element)) element = {\n type: 'div',\n props: {\n children: element\n } // Extract styles\n\n };\n const elementStyles = element.props.style; // Return v.dom with injected ref\n\n return React__default.createElement(element.type, _extends({\n key: element.key ? element.key : undefined\n }, element.props, {\n style: _extends({}, elementStyles, {\n position: 'absolute',\n visibility: 'hidden'\n }),\n ref: _ref2 => {\n if (_ref2) {\n // Once it's rendered out, fetch bounds (minus padding/margin/borders)\n let node = ReactDOM.findDOMNode(_ref2);\n let width, height;\n let cs = getComputedStyle(node);\n\n if (cs.boxSizing === 'border-box') {\n width = node.offsetWidth;\n height = node.offsetHeight;\n } else {\n const paddingX = parseFloat(cs.paddingLeft || 0) + parseFloat(cs.paddingRight || 0);\n const paddingY = parseFloat(cs.paddingTop || 0) + parseFloat(cs.paddingBottom || 0);\n const borderX = parseFloat(cs.borderLeftWidth || 0) + parseFloat(cs.borderRightWidth || 0);\n const borderY = parseFloat(cs.borderTopWidth || 0) + parseFloat(cs.borderBottomWidth || 0);\n width = node.offsetWidth - paddingX - borderX;\n height = node.offsetHeight - paddingY - borderY;\n }\n\n const convert = overwrite(width, height);\n callback(_extends({}, props, {\n from: Object.entries(from).reduce(convert, from),\n to: Object.entries(to).reduce(convert, to)\n }));\n }\n }\n }));\n}\n\nlet isUnitlessNumber = {\n animationIterationCount: true,\n borderImageOutset: true,\n borderImageSlice: true,\n borderImageWidth: true,\n boxFlex: true,\n boxFlexGroup: true,\n boxOrdinalGroup: true,\n columnCount: true,\n columns: true,\n flex: true,\n flexGrow: true,\n flexPositive: true,\n flexShrink: true,\n flexNegative: true,\n flexOrder: true,\n gridRow: true,\n gridRowEnd: true,\n gridRowSpan: true,\n gridRowStart: true,\n gridColumn: true,\n gridColumnEnd: true,\n gridColumnSpan: true,\n gridColumnStart: true,\n fontWeight: true,\n lineClamp: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n tabSize: true,\n widows: true,\n zIndex: true,\n zoom: true,\n // SVG-related properties\n fillOpacity: true,\n floodOpacity: true,\n stopOpacity: true,\n strokeDasharray: true,\n strokeDashoffset: true,\n strokeMiterlimit: true,\n strokeOpacity: true,\n strokeWidth: true\n};\n\nconst prefixKey = (prefix, key) => prefix + key.charAt(0).toUpperCase() + key.substring(1);\n\nconst prefixes = ['Webkit', 'Ms', 'Moz', 'O'];\nisUnitlessNumber = Object.keys(isUnitlessNumber).reduce((acc, prop) => {\n prefixes.forEach(prefix => acc[prefixKey(prefix, prop)] = acc[prop]);\n return acc;\n}, isUnitlessNumber);\n\nfunction dangerousStyleValue(name, value, isCustomProperty) {\n if (value == null || typeof value === 'boolean' || value === '') return '';\n if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers\n\n return ('' + value).trim();\n}\n\nconst attributeCache = {};\ninjectCreateAnimatedStyle(style => new AnimatedStyle(style));\ninjectDefaultElement('div');\ninjectInterpolation(createInterpolation);\ninjectColorNames(colors);\ninjectBugfixes(fixAuto);\ninjectApplyAnimatedValues((instance, props) => {\n if (instance.nodeType && instance.setAttribute !== undefined) {\n const style = props.style,\n children = props.children,\n scrollTop = props.scrollTop,\n scrollLeft = props.scrollLeft,\n attributes = _objectWithoutPropertiesLoose(props, [\"style\", \"children\", \"scrollTop\", \"scrollLeft\"]);\n\n if (scrollTop !== void 0) instance.scrollTop = scrollTop;\n if (scrollLeft !== void 0) instance.scrollLeft = scrollLeft; // Set textContent, if children is an animatable value\n\n if (children !== void 0) instance.textContent = children; // Set styles ...\n\n for (let styleName in style) {\n if (!style.hasOwnProperty(styleName)) continue;\n var isCustomProperty = styleName.indexOf('--') === 0;\n var styleValue = dangerousStyleValue(styleName, style[styleName], isCustomProperty);\n if (styleName === 'float') styleName = 'cssFloat';\n if (isCustomProperty) instance.style.setProperty(styleName, styleValue);else instance.style[styleName] = styleValue;\n } // Set attributes ...\n\n\n for (let name in attributes) {\n // Attributes are written in dash case\n const dashCase = attributeCache[name] || (attributeCache[name] = name.replace(/([A-Z])/g, n => '-' + n.toLowerCase()));\n if (typeof instance.getAttribute(dashCase) !== 'undefined') instance.setAttribute(dashCase, attributes[name]);\n }\n } else return false;\n}, style => style);\n\nlet active = false;\nconst controllers = new Set();\n\nconst frameLoop = () => {\n let time = now();\n\n for (let controller of controllers) {\n let isDone = true;\n let noChange = true;\n\n for (let configIdx = 0; configIdx < controller.configs.length; configIdx++) {\n let config = controller.configs[configIdx];\n let endOfAnimation, lastTime;\n\n for (let valIdx = 0; valIdx < config.animatedValues.length; valIdx++) {\n let animation = config.animatedValues[valIdx]; // If an animation is done, skip, until all of them conclude\n\n if (animation.done) continue;\n let from = config.fromValues[valIdx];\n let to = config.toValues[valIdx];\n let position = animation.lastPosition;\n let isAnimated = to instanceof Animated;\n let velocity = Array.isArray(config.initialVelocity) ? config.initialVelocity[valIdx] : config.initialVelocity;\n if (isAnimated) to = to.getValue(); // Conclude animation if it's either immediate, or from-values match end-state\n\n if (config.immediate || !isAnimated && !config.decay && from === to) {\n animation.updateValue(to);\n animation.done = true;\n continue;\n } // Doing delay here instead of setTimeout is one async worry less\n\n\n if (config.delay && time - controller.startTime < config.delay) {\n isDone = false;\n continue;\n } // Flag change\n\n\n noChange = false; // Break animation when string values are involved\n\n if (typeof from === 'string' || typeof to === 'string') {\n animation.updateValue(to);\n animation.done = true;\n continue;\n }\n\n if (config.duration !== void 0) {\n /** Duration easing */\n position = from + config.easing((time - controller.startTime - config.delay) / config.duration) * (to - from);\n endOfAnimation = time >= controller.startTime + config.delay + config.duration;\n } else if (config.decay) {\n /** Decay easing */\n position = from + velocity / (1 - 0.998) * (1 - Math.exp(-(1 - 0.998) * (time - controller.startTime)));\n endOfAnimation = Math.abs(animation.lastPosition - position) < 0.1;\n if (endOfAnimation) to = position;\n } else {\n /** Spring easing */\n lastTime = animation.lastTime !== void 0 ? animation.lastTime : time;\n velocity = animation.lastVelocity !== void 0 ? animation.lastVelocity : config.initialVelocity; // If we lost a lot of frames just jump to the end.\n\n if (time > lastTime + 64) lastTime = time; // http://gafferongames.com/game-physics/fix-your-timestep/\n\n let numSteps = Math.floor(time - lastTime);\n\n for (let i = 0; i < numSteps; ++i) {\n let force = -config.tension * (position - to);\n let damping = -config.friction * velocity;\n let acceleration = (force + damping) / config.mass;\n velocity = velocity + acceleration * 1 / 1000;\n position = position + velocity * 1 / 1000;\n } // Conditions for stopping the spring animation\n\n\n let isOvershooting = config.clamp && config.tension !== 0 ? from < to ? position > to : position < to : false;\n let isVelocity = Math.abs(velocity) <= config.precision;\n let isDisplacement = config.tension !== 0 ? Math.abs(to - position) <= config.precision : true;\n endOfAnimation = isOvershooting || isVelocity && isDisplacement;\n animation.lastVelocity = velocity;\n animation.lastTime = time;\n } // Trails aren't done until their parents conclude\n\n\n if (isAnimated && !config.toValues[valIdx].done) endOfAnimation = false;\n\n if (endOfAnimation) {\n // Ensure that we end up with a round value\n if (animation.value !== to) position = to;\n animation.done = true;\n } else isDone = false;\n\n animation.updateValue(position);\n animation.lastPosition = position;\n } // Keep track of updated values only when necessary\n\n\n if (controller.props.onFrame || !controller.props.native) controller.animatedProps[config.name] = config.interpolation.getValue();\n } // Update callbacks in the end of the frame\n\n\n if (controller.props.onFrame || !controller.props.native) {\n if (!controller.props.native && controller.onUpdate) controller.onUpdate();\n if (controller.props.onFrame) controller.props.onFrame(controller.animatedProps);\n } // Either call onEnd or next frame\n\n\n if (isDone) {\n controllers.delete(controller);\n controller.debouncedOnEnd({\n finished: true,\n noChange\n });\n }\n } // Loop over as long as there are controllers ...\n\n\n if (controllers.size) requestFrame(frameLoop);else active = false;\n};\n\nconst addController = controller => {\n if (!controllers.has(controller)) {\n controllers.add(controller);\n if (!active) requestFrame(frameLoop);\n active = true;\n }\n};\n\nconst removeController = controller => {\n if (controllers.has(controller)) {\n controllers.delete(controller);\n }\n};\n\nclass Controller {\n constructor(props, config) {\n if (config === void 0) {\n config = {\n native: true,\n interpolateTo: true,\n autoStart: true\n };\n }\n\n this.getValues = () => this.props.native ? this.interpolations : this.animatedProps;\n\n this.dependents = new Set();\n this.isActive = false;\n this.hasChanged = false;\n this.props = {};\n this.merged = {};\n this.animations = {};\n this.interpolations = {};\n this.animatedProps = {};\n this.configs = [];\n this.frame = undefined;\n this.startTime = undefined;\n this.lastTime = undefined;\n this.update(_extends({}, props, config));\n }\n\n update(props) {\n this.props = _extends({}, this.props, props);\n\n let _ref = this.props.interpolateTo ? interpolateTo(this.props) : this.props,\n _ref$from = _ref.from,\n from = _ref$from === void 0 ? {} : _ref$from,\n _ref$to = _ref.to,\n to = _ref$to === void 0 ? {} : _ref$to,\n _ref$config = _ref.config,\n config = _ref$config === void 0 ? {} : _ref$config,\n _ref$delay = _ref.delay,\n delay = _ref$delay === void 0 ? 0 : _ref$delay,\n reverse = _ref.reverse,\n attach = _ref.attach,\n reset = _ref.reset,\n immediate = _ref.immediate,\n autoStart = _ref.autoStart,\n ref = _ref.ref; // Reverse values when requested\n\n\n if (reverse) {\n var _ref2 = [to, from];\n from = _ref2[0];\n to = _ref2[1];\n }\n\n this.hasChanged = false; // Attachment handling, trailed springs can \"attach\" themselves to a previous spring\n\n let target = attach && attach(this); // Reset merged props when necessary\n\n let extra = reset ? {} : this.merged; // This will collect all props that were ever set\n\n this.merged = _extends({}, from, extra, to); // Reduces input { name: value } pairs into animated values\n\n this.animations = Object.entries(this.merged).reduce((acc, _ref3, i) => {\n let name = _ref3[0],\n value = _ref3[1];\n // Issue cached entries, except on reset\n let entry = !reset && acc[name] || {}; // Figure out what the value is supposed to be\n\n const isNumber = typeof value === 'number';\n const isString = typeof value === 'string' && !value.startsWith('#') && !/\\d/.test(value) && !colorNames[value];\n const isArray = !isNumber && !isString && Array.isArray(value);\n let fromValue = from[name] !== undefined ? from[name] : value;\n let toValue = isNumber || isArray ? value : isString ? value : 1;\n let toConfig = callProp(config, name);\n if (target) toValue = target.animations[name].parent; // Detect changes, animated values will be checked in the raf-loop\n\n if (toConfig.decay !== void 0 || !shallowEqual(entry.changes, value)) {\n this.hasChanged = true;\n let parent, interpolation$$1;\n if (isNumber || isString) parent = interpolation$$1 = entry.parent || new AnimatedValue(fromValue);else if (isArray) parent = interpolation$$1 = entry.parent || new AnimatedArray(fromValue);else {\n const prev = entry.interpolation && entry.interpolation.calc(entry.parent.value);\n\n if (entry.parent) {\n parent = entry.parent;\n parent.setValue(0, false);\n } else parent = new AnimatedValue(0);\n\n const range = {\n output: [prev !== void 0 ? prev : fromValue, value]\n };\n\n if (entry.interpolation) {\n interpolation$$1 = entry.interpolation;\n entry.interpolation.updateConfig(range);\n } else interpolation$$1 = parent.interpolate(range);\n } // Set immediate values\n\n if (callProp(immediate, name)) parent.setValue(value, false); // Reset animated values\n\n const animatedValues = toArray(parent.getPayload());\n animatedValues.forEach(value => value.prepare(this));\n return _extends({}, acc, {\n [name]: _extends({}, entry, {\n name,\n parent,\n interpolation: interpolation$$1,\n animatedValues,\n changes: value,\n fromValues: toArray(parent.getValue()),\n toValues: toArray(target ? toValue.getPayload() : toValue),\n immediate: callProp(immediate, name),\n delay: withDefault(toConfig.delay, delay || 0),\n initialVelocity: withDefault(toConfig.velocity, 0),\n clamp: withDefault(toConfig.clamp, false),\n precision: withDefault(toConfig.precision, 0.01),\n tension: withDefault(toConfig.tension, 170),\n friction: withDefault(toConfig.friction, 26),\n mass: withDefault(toConfig.mass, 1),\n duration: toConfig.duration,\n easing: withDefault(toConfig.easing, t => t),\n decay: toConfig.decay\n })\n });\n } else return acc;\n }, this.animations);\n\n if (this.hasChanged) {\n this.configs = getValues$1(this.animations);\n this.animatedProps = {};\n this.interpolations = {};\n\n for (let key in this.animations) {\n this.interpolations[key] = this.animations[key].interpolation;\n this.animatedProps[key] = this.animations[key].interpolation.getValue();\n }\n } // TODO: clean up ref in controller\n\n\n for (var _len = arguments.length, start = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n start[_key - 1] = arguments[_key];\n }\n\n if (!ref && (autoStart || start.length)) this.start(...start);\n const onEnd = start[0],\n onUpdate = start[1];\n this.onEnd = typeof onEnd === 'function' && onEnd;\n this.onUpdate = onUpdate;\n return this.getValues();\n }\n\n start(onEnd, onUpdate) {\n this.startTime = now();\n if (this.isActive) this.stop();\n this.isActive = true;\n this.onEnd = typeof onEnd === 'function' && onEnd;\n this.onUpdate = onUpdate;\n if (this.props.onStart) this.props.onStart();\n addController(this);\n return new Promise(res => this.resolve = res);\n }\n\n stop(finished) {\n if (finished === void 0) {\n finished = false;\n }\n\n // Reset collected changes since the animation has been stopped cold turkey\n if (finished) getValues$1(this.animations).forEach(a => a.changes = undefined);\n this.debouncedOnEnd({\n finished\n });\n }\n\n destroy() {\n removeController(this);\n this.props = {};\n this.merged = {};\n this.animations = {};\n this.interpolations = {};\n this.animatedProps = {};\n this.configs = [];\n }\n\n debouncedOnEnd(result) {\n removeController(this);\n this.isActive = false;\n const onEnd = this.onEnd;\n this.onEnd = null;\n if (onEnd) onEnd(result);\n if (this.resolve) this.resolve();\n this.resolve = null;\n }\n\n}\n\nclass AnimatedProps extends AnimatedObjectWithChildren {\n constructor(props, callback) {\n super();\n if (props.style) props = _extends({}, props, {\n style: createAnimatedStyle(props.style)\n });\n this.payload = props;\n this.update = callback;\n this.attach();\n }\n\n}\n\nfunction createAnimatedComponent(Component) {\n class AnimatedComponent extends React__default.Component {\n constructor(props) {\n super();\n\n this.callback = () => {\n if (this.node) {\n const didUpdate = applyAnimatedValues.fn(this.node, this.propsAnimated.getAnimatedValue(), this);\n if (didUpdate === false) this.forceUpdate();\n }\n };\n\n this.attachProps(props);\n }\n\n componentWillUnmount() {\n this.propsAnimated && this.propsAnimated.detach();\n }\n\n setNativeProps(props) {\n const didUpdate = applyAnimatedValues.fn(this.node, props, this);\n if (didUpdate === false) this.forceUpdate();\n } // The system is best designed when setNativeProps is implemented. It is\n // able to avoid re-rendering and directly set the attributes that\n // changed. However, setNativeProps can only be implemented on leaf\n // native components. If you want to animate a composite component, you\n // need to re-render it. In this case, we have a fallback that uses\n // forceUpdate.\n\n\n attachProps(_ref) {\n let forwardRef = _ref.forwardRef,\n nextProps = _objectWithoutPropertiesLoose(_ref, [\"forwardRef\"]);\n\n const oldPropsAnimated = this.propsAnimated;\n this.propsAnimated = new AnimatedProps(nextProps, this.callback); // When you call detach, it removes the element from the parent list\n // of children. If it goes to 0, then the parent also detaches itself\n // and so on.\n // An optimization is to attach the new elements and THEN detach the old\n // ones instead of detaching and THEN attaching.\n // This way the intermediate state isn't to go to 0 and trigger\n // this expensive recursive detaching to then re-attach everything on\n // the very next operation.\n\n oldPropsAnimated && oldPropsAnimated.detach();\n }\n\n shouldComponentUpdate(props) {\n const style = props.style,\n nextProps = _objectWithoutPropertiesLoose(props, [\"style\"]);\n\n const _this$props = this.props,\n currentStyle = _this$props.style,\n currentProps = _objectWithoutPropertiesLoose(_this$props, [\"style\"]);\n\n if (!shallowEqual(currentProps, nextProps) || !shallowEqual(currentStyle, style)) {\n this.attachProps(props);\n return true;\n }\n\n return false;\n }\n\n render() {\n const _this$propsAnimated$g = this.propsAnimated.getValue(),\n scrollTop = _this$propsAnimated$g.scrollTop,\n scrollLeft = _this$propsAnimated$g.scrollLeft,\n animatedProps = _objectWithoutPropertiesLoose(_this$propsAnimated$g, [\"scrollTop\", \"scrollLeft\"]);\n\n return React__default.createElement(Component, _extends({}, animatedProps, {\n ref: node => this.node = handleRef(node, this.props.forwardRef)\n }));\n }\n\n }\n\n return React__default.forwardRef((props, ref) => React__default.createElement(AnimatedComponent, _extends({}, props, {\n forwardRef: ref\n })));\n}\n\nconst config = {\n default: {\n tension: 170,\n friction: 26\n },\n gentle: {\n tension: 120,\n friction: 14\n },\n wobbly: {\n tension: 180,\n friction: 12\n },\n stiff: {\n tension: 210,\n friction: 20\n },\n slow: {\n tension: 280,\n friction: 60\n },\n molasses: {\n tension: 280,\n friction: 120\n }\n};\n\nclass Spring extends React__default.Component {\n constructor() {\n super(...arguments);\n this.state = {\n lastProps: {\n from: {},\n to: {}\n },\n propsChanged: false,\n internal: false\n };\n this.controller = new Controller(null, null);\n this.didUpdate = false;\n this.didInject = false;\n this.finished = true;\n\n this.start = () => {\n this.finished = false;\n let wasMounted = this.mounted;\n this.controller.start(props => this.finish(_extends({}, props, {\n wasMounted\n })), this.update);\n };\n\n this.stop = () => this.controller.stop(true);\n\n this.update = () => this.mounted && this.setState({\n internal: true\n });\n\n this.finish = (_ref) => {\n let finished = _ref.finished,\n noChange = _ref.noChange,\n wasMounted = _ref.wasMounted;\n this.finished = true;\n\n if (this.mounted && finished) {\n // Only call onRest if either we *were* mounted, or when there were changes\n if (this.props.onRest && (wasMounted || !noChange)) this.props.onRest(this.controller.merged); // Restore end-state\n\n if (this.mounted && this.didInject) {\n this.afterInject = convertValues(this.props);\n this.setState({\n internal: true\n });\n } // If we have an inject or values to apply after the animation we ping here\n\n\n if (this.mounted && (this.didInject || this.props.after)) this.setState({\n internal: true\n });\n this.didInject = false;\n }\n };\n }\n\n componentDidMount() {\n // componentDidUpdate isn't called on mount, we call it here to start animating\n this.componentDidUpdate();\n this.mounted = true;\n }\n\n componentWillUnmount() {\n // Stop all ongoing animtions\n this.mounted = false;\n this.stop();\n }\n\n static getDerivedStateFromProps(props, _ref2) {\n let internal = _ref2.internal,\n lastProps = _ref2.lastProps;\n // The following is a test against props that could alter the animation\n const from = props.from,\n to = props.to,\n reset = props.reset,\n force = props.force;\n const propsChanged = !shallowEqual(to, lastProps.to) || !shallowEqual(from, lastProps.from) || reset && !internal || force && !internal;\n return {\n propsChanged,\n lastProps: props,\n internal: false\n };\n }\n\n render() {\n const children = this.props.children;\n const propsChanged = this.state.propsChanged; // Inject phase -----------------------------------------------------------\n // Handle injected frames, for instance targets/web/fix-auto\n // An inject will return an intermediary React node which measures itself out\n // .. and returns a callback when the values sought after are ready, usually \"auto\".\n\n if (this.props.inject && propsChanged && !this.injectProps) {\n const frame = this.props.inject(this.props, injectProps => {\n // The inject frame has rendered, now let's update animations...\n this.injectProps = injectProps;\n this.setState({\n internal: true\n });\n }); // Render out injected frame\n\n if (frame) return frame;\n } // Update phase -----------------------------------------------------------\n\n\n if (this.injectProps || propsChanged) {\n // We can potentially cause setState, but we're inside render, the flag prevents that\n this.didInject = false; // Update animations, this turns from/to props into AnimatedValues\n // An update can occur on injected props, or when own-props have changed.\n\n if (this.injectProps) {\n this.controller.update(this.injectProps); // didInject is needed, because there will be a 3rd stage, where the original values\n // .. will be restored after the animation is finished. When someone animates towards\n // .. \"auto\", the end-result should be \"auto\", not \"1999px\", which would block nested\n // .. height/width changes.\n\n this.didInject = true;\n } else if (propsChanged) this.controller.update(this.props); // Flag an update that occured, componentDidUpdate will start the animation later on\n\n\n this.didUpdate = true;\n this.afterInject = undefined;\n this.injectProps = undefined;\n } // Render phase -----------------------------------------------------------\n // Render out raw values or AnimatedValues depending on \"native\"\n\n\n let values = _extends({}, this.controller.getValues(), this.afterInject);\n\n if (this.finished) values = _extends({}, values, this.props.after);\n return Object.keys(values).length ? children(values) : null;\n }\n\n componentDidUpdate() {\n // The animation has to start *after* render, since at that point the scene\n // .. graph should be established, so we do it here. Unfortunatelly, non-native\n // .. animations as well as \"auto\"-injects call forceUpdate, so it's causing a loop.\n // .. didUpdate prevents that as it gets set only on prop changes.\n if (this.didUpdate) this.start();\n this.didUpdate = false;\n }\n\n}\nSpring.defaultProps = {\n from: {},\n to: {},\n config: config.default,\n native: false,\n immediate: false,\n reset: false,\n force: false,\n inject: bugfixes\n};\n\nclass Trail extends React__default.PureComponent {\n constructor() {\n super(...arguments);\n this.first = true;\n this.instances = new Set();\n\n this.hook = (instance, index, length, reverse) => {\n // Add instance to set\n this.instances.add(instance); // Return undefined on the first index and from then on the previous instance\n\n if (reverse ? index === length - 1 : index === 0) return undefined;else return Array.from(this.instances)[reverse ? index + 1 : index - 1];\n };\n }\n\n render() {\n const _this$props = this.props,\n items = _this$props.items,\n _children = _this$props.children,\n _this$props$from = _this$props.from,\n from = _this$props$from === void 0 ? {} : _this$props$from,\n initial = _this$props.initial,\n reverse = _this$props.reverse,\n keys = _this$props.keys,\n delay = _this$props.delay,\n onRest = _this$props.onRest,\n props = _objectWithoutPropertiesLoose(_this$props, [\"items\", \"children\", \"from\", \"initial\", \"reverse\", \"keys\", \"delay\", \"onRest\"]);\n\n const array = toArray(items);\n return toArray(array).map((item, i) => React__default.createElement(Spring, _extends({\n onRest: i === 0 ? onRest : null,\n key: typeof keys === 'function' ? keys(item) : toArray(keys)[i],\n from: this.first && initial !== void 0 ? initial || {} : from\n }, props, {\n delay: i === 0 && delay || undefined,\n attach: instance => this.hook(instance, i, array.length, reverse),\n children: props => {\n const child = _children(item, i);\n\n return child ? child(props) : null;\n }\n })));\n }\n\n componentDidUpdate(prevProps) {\n this.first = false;\n if (prevProps.items !== this.props.items) this.instances.clear();\n }\n\n}\nTrail.defaultProps = {\n keys: item => item\n};\n\nconst DEFAULT = '__default';\n\nclass KeyframesImpl extends React__default.PureComponent {\n constructor() {\n var _this;\n\n super(...arguments);\n _this = this;\n this.guid = 0;\n this.state = {\n props: {},\n resolve: () => null,\n last: true,\n index: 0\n };\n\n this.next = function (props, last, index) {\n if (last === void 0) {\n last = true;\n }\n\n if (index === void 0) {\n index = 0;\n }\n\n _this.running = true;\n return new Promise(resolve => {\n _this.mounted && _this.setState(state => ({\n props,\n resolve,\n last,\n index\n }), () => _this.running = false);\n });\n };\n }\n\n componentDidMount() {\n this.mounted = true;\n this.componentDidUpdate({});\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n componentDidUpdate(previous) {\n var _this2 = this;\n\n const _this$props = this.props,\n states = _this$props.states,\n f = _this$props.filter,\n state = _this$props.state;\n\n if (previous.state !== this.props.state || this.props.reset && !this.running || !shallowEqual(states[state], previous.states[previous.state])) {\n if (states && state && states[state]) {\n const localId = ++this.guid;\n const slots = states[state];\n\n if (slots) {\n if (Array.isArray(slots)) {\n let q = Promise.resolve();\n\n for (let i = 0; i < slots.length; i++) {\n let index = i;\n let slot = slots[index];\n let last = index === slots.length - 1;\n q = q.then(() => localId === this.guid && this.next(f(slot), last, index));\n }\n } else if (typeof slots === 'function') {\n let index = 0;\n slots( // next\n function (props, last) {\n if (last === void 0) {\n last = false;\n }\n\n return localId === _this2.guid && _this2.next(f(props), last, index++);\n }, // cancel\n () => requestFrame(() => this.instance && this.instance.stop()), // ownprops\n this.props);\n } else {\n this.next(f(states[state]));\n }\n }\n }\n }\n }\n\n render() {\n const _this$state = this.state,\n props = _this$state.props,\n resolve = _this$state.resolve,\n last = _this$state.last,\n index = _this$state.index;\n if (!props || Object.keys(props).length === 0) return null;\n\n let _this$props2 = this.props,\n state = _this$props2.state,\n filter = _this$props2.filter,\n states = _this$props2.states,\n config = _this$props2.config,\n Component = _this$props2.primitive,\n _onRest = _this$props2.onRest,\n forwardRef = _this$props2.forwardRef,\n rest = _objectWithoutPropertiesLoose(_this$props2, [\"state\", \"filter\", \"states\", \"config\", \"primitive\", \"onRest\", \"forwardRef\"]); // Arrayed configs need an index to process\n\n\n if (Array.isArray(config)) config = config[index];\n return React__default.createElement(Component, _extends({\n ref: _ref => this.instance = handleRef(_ref, forwardRef),\n config: config\n }, rest, props, {\n onRest: args => {\n resolve(args);\n if (_onRest && last) _onRest(args);\n }\n }));\n }\n\n}\n\nKeyframesImpl.defaultProps = {\n state: DEFAULT\n};\nconst Keyframes = React__default.forwardRef((props, ref) => React__default.createElement(KeyframesImpl, _extends({}, props, {\n forwardRef: ref\n})));\n\nKeyframes.create = primitive => function (states, filter) {\n if (filter === void 0) {\n filter = states => states;\n }\n\n if (typeof states === 'function' || Array.isArray(states)) states = {\n [DEFAULT]: states\n };\n return props => React__default.createElement(KeyframesImpl, _extends({\n primitive: primitive,\n states: states,\n filter: filter\n }, props));\n};\n\nKeyframes.Spring = states => Keyframes.create(Spring)(states, interpolateTo);\n\nKeyframes.Trail = states => Keyframes.create(Trail)(states, interpolateTo);\n\nlet guid = 0;\n\nlet get = props => {\n let items = props.items,\n keys = props.keys,\n rest = _objectWithoutPropertiesLoose(props, [\"items\", \"keys\"]);\n\n items = toArray(items !== void 0 ? items : null);\n keys = typeof keys === 'function' ? items.map(keys) : toArray(keys); // Make sure numeric keys are interpreted as Strings (5 !== \"5\")\n\n return _extends({\n items,\n keys: keys.map(key => String(key))\n }, rest);\n};\n\nclass Transition extends React__default.PureComponent {\n componentDidMount() {\n this.mounted = true;\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n constructor(prevProps) {\n super(prevProps);\n\n this.destroyItem = (item, key, state) => values => {\n const _this$props = this.props,\n onRest = _this$props.onRest,\n onDestroyed = _this$props.onDestroyed;\n\n if (this.mounted) {\n onDestroyed && onDestroyed(item);\n this.setState((_ref) => {\n let deleted = _ref.deleted;\n return {\n deleted: deleted.filter(t => t.key !== key)\n };\n });\n onRest && onRest(item, state, values);\n }\n };\n\n this.state = {\n first: true,\n transitions: [],\n current: {},\n deleted: [],\n prevProps\n };\n }\n\n static getDerivedStateFromProps(props, _ref2) {\n let first = _ref2.first,\n prevProps = _ref2.prevProps,\n state = _objectWithoutPropertiesLoose(_ref2, [\"first\", \"prevProps\"]);\n\n let _get = get(props),\n items = _get.items,\n keys = _get.keys,\n initial = _get.initial,\n from = _get.from,\n enter = _get.enter,\n leave = _get.leave,\n update = _get.update,\n _get$trail = _get.trail,\n trail = _get$trail === void 0 ? 0 : _get$trail,\n unique = _get.unique,\n config = _get.config;\n\n let _get2 = get(prevProps),\n _keys = _get2.keys,\n _items = _get2.items;\n\n let current = _extends({}, state.current);\n\n let deleted = [...state.deleted]; // Compare next keys with current keys\n\n let currentKeys = Object.keys(current);\n let currentSet = new Set(currentKeys);\n let nextSet = new Set(keys);\n let added = keys.filter(item => !currentSet.has(item));\n let removed = state.transitions.filter(item => !item.destroyed && !nextSet.has(item.originalKey)).map(i => i.originalKey);\n let updated = keys.filter(item => currentSet.has(item));\n let delay = 0;\n added.forEach(key => {\n // In unique mode, remove fading out transitions if their key comes in again\n if (unique && deleted.find(d => d.originalKey === key)) deleted = deleted.filter(t => t.originalKey !== key);\n const keyIndex = keys.indexOf(key);\n const item = items[keyIndex];\n const state = 'enter';\n current[key] = {\n state,\n originalKey: key,\n key: unique ? String(key) : guid++,\n item,\n trail: delay = delay + trail,\n config: callProp(config, item, state),\n from: callProp(first ? initial !== void 0 ? initial || {} : from : from, item),\n to: callProp(enter, item)\n };\n });\n removed.forEach(key => {\n const keyIndex = _keys.indexOf(key);\n\n const item = _items[keyIndex];\n const state = 'leave';\n deleted.push(_extends({}, current[key], {\n state,\n destroyed: true,\n left: _keys[Math.max(0, keyIndex - 1)],\n right: _keys[Math.min(_keys.length, keyIndex + 1)],\n trail: delay = delay + trail,\n config: callProp(config, item, state),\n to: callProp(leave, item)\n }));\n delete current[key];\n });\n updated.forEach(key => {\n const keyIndex = keys.indexOf(key);\n const item = items[keyIndex];\n const state = 'update';\n current[key] = _extends({}, current[key], {\n item,\n state,\n trail: delay = delay + trail,\n config: callProp(config, item, state),\n to: callProp(update, item)\n });\n }); // This tries to restore order for deleted items by finding their last known siblings\n\n let out = keys.map(key => current[key]);\n deleted.forEach((_ref3) => {\n let left = _ref3.left,\n right = _ref3.right,\n transition = _objectWithoutPropertiesLoose(_ref3, [\"left\", \"right\"]);\n\n let pos; // Was it the element on the left, if yes, move there ...\n\n if ((pos = out.findIndex(t => t.originalKey === left)) !== -1) pos += 1; // Or how about the element on the right ...\n\n if (pos === -1) pos = out.findIndex(t => t.originalKey === right); // Maybe we'll find it in the list of deleted items\n\n if (pos === -1) pos = deleted.findIndex(t => t.originalKey === left); // Checking right side as well\n\n if (pos === -1) pos = deleted.findIndex(t => t.originalKey === right); // And if nothing else helps, move it to the start ¯\\_(ツ)_/¯\n\n pos = Math.max(0, pos);\n out = [...out.slice(0, pos), transition, ...out.slice(pos)];\n });\n return {\n first: first && added.length === 0,\n transitions: out,\n current,\n deleted,\n prevProps: props\n };\n }\n\n render() {\n const _this$props2 = this.props,\n initial = _this$props2.initial,\n _this$props2$from = _this$props2.from,\n _this$props2$enter = _this$props2.enter,\n _this$props2$leave = _this$props2.leave,\n _this$props2$update = _this$props2.update,\n onDestroyed = _this$props2.onDestroyed,\n keys = _this$props2.keys,\n items = _this$props2.items,\n onFrame = _this$props2.onFrame,\n onRest = _this$props2.onRest,\n onStart = _this$props2.onStart,\n trail = _this$props2.trail,\n config = _this$props2.config,\n _children = _this$props2.children,\n unique = _this$props2.unique,\n reset = _this$props2.reset,\n extra = _objectWithoutPropertiesLoose(_this$props2, [\"initial\", \"from\", \"enter\", \"leave\", \"update\", \"onDestroyed\", \"keys\", \"items\", \"onFrame\", \"onRest\", \"onStart\", \"trail\", \"config\", \"children\", \"unique\", \"reset\"]);\n\n return this.state.transitions.map((_ref4, i) => {\n let state = _ref4.state,\n key = _ref4.key,\n item = _ref4.item,\n from = _ref4.from,\n to = _ref4.to,\n trail = _ref4.trail,\n config = _ref4.config,\n destroyed = _ref4.destroyed;\n return React__default.createElement(Keyframes, _extends({\n reset: reset && state === 'enter',\n primitive: Spring,\n state: state,\n filter: interpolateTo,\n states: {\n [state]: to\n },\n key: key,\n onRest: destroyed ? this.destroyItem(item, key, state) : onRest && (values => onRest(item, state, values)),\n onStart: onStart && (() => onStart(item, state)),\n onFrame: onFrame && (values => onFrame(item, state, values)),\n delay: trail,\n config: config\n }, extra, {\n from: from,\n children: props => {\n const child = _children(item, state, i);\n\n return child ? child(props) : null;\n }\n }));\n });\n }\n\n}\nTransition.defaultProps = {\n keys: item => item,\n unique: false,\n reset: false\n};\n\nconst domElements = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr', // SVG\n'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan'];\nconst extendedAnimated = domElements.reduce((acc, element) => {\n acc[element] = createAnimatedComponent(element);\n return acc;\n}, createAnimatedComponent);\n\n__webpack_unused_export__ = Spring;\n__webpack_unused_export__ = Keyframes;\nexports.uT = Transition;\n__webpack_unused_export__ = Trail;\n__webpack_unused_export__ = Controller;\n__webpack_unused_export__ = config;\nexports.q = extendedAnimated;\n__webpack_unused_export__ = interpolate$1;\n__webpack_unused_export__ = Globals;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIzLmpzIiwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zbWFsbC1jdC8uL25vZGVfbW9kdWxlcy9yZWFjdC1zcHJpbmcvcmVuZGVycHJvcHMuanM/M2Y4NyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZXgpIHsgcmV0dXJuIChleCAmJiAodHlwZW9mIGV4ID09PSAnb2JqZWN0JykgJiYgJ2RlZmF1bHQnIGluIGV4KSA/IGV4WydkZWZhdWx0J10gOiBleDsgfVxuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZScpKTtcbnZhciBfZXh0ZW5kcyA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzJykpO1xudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBSZWFjdF9fZGVmYXVsdCA9IF9pbnRlcm9wRGVmYXVsdChSZWFjdCk7XG52YXIgUmVhY3RET00gPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgncmVhY3QtZG9tJykpO1xuXG5sZXQgYnVnZml4ZXMgPSB1bmRlZmluZWQ7XG5sZXQgYXBwbHlBbmltYXRlZFZhbHVlcyA9IHVuZGVmaW5lZDtcbmxldCBjb2xvck5hbWVzID0gW107XG5sZXQgcmVxdWVzdEZyYW1lID0gY2IgPT4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShjYik7XG5sZXQgY2FuY2VsRnJhbWUgPSBjYiA9PiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoY2IpO1xubGV0IGludGVycG9sYXRpb24gPSB1bmRlZmluZWQ7XG5sZXQgbm93ID0gKCkgPT4gRGF0ZS5ub3coKTtcbmxldCBkZWZhdWx0RWxlbWVudCA9IHVuZGVmaW5lZDtcbmxldCBjcmVhdGVBbmltYXRlZFN0eWxlID0gdW5kZWZpbmVkO1xuY29uc3QgaW5qZWN0QXBwbHlBbmltYXRlZFZhbHVlcyA9IChmbiwgdHJhbnNmb3JtKSA9PiBhcHBseUFuaW1hdGVkVmFsdWVzID0ge1xuICBmbixcbiAgdHJhbnNmb3JtXG59O1xuY29uc3QgaW5qZWN0Q29sb3JOYW1lcyA9IG5hbWVzID0+IGNvbG9yTmFtZXMgPSBuYW1lcztcbmNvbnN0IGluamVjdEJ1Z2ZpeGVzID0gZm4gPT4gYnVnZml4ZXMgPSBmbjtcbmNvbnN0IGluamVjdEludGVycG9sYXRpb24gPSBjbHMgPT4gaW50ZXJwb2xhdGlvbiA9IGNscztcbmNvbnN0IGluamVjdEZyYW1lID0gKHJhZiwgY2FmKSA9PiB7XG4gIHZhciBfcmVmID0gW3JhZiwgY2FmXTtcbiAgcmVxdWVzdEZyYW1lID0gX3JlZlswXTtcbiAgY2FuY2VsRnJhbWUgPSBfcmVmWzFdO1xuICByZXR1cm4gX3JlZjtcbn07XG5jb25zdCBpbmplY3ROb3cgPSBub3dGbiA9PiBub3cgPSBub3dGbjtcbmNvbnN0IGluamVjdERlZmF1bHRFbGVtZW50ID0gZWwgPT4gZGVmYXVsdEVsZW1lbnQgPSBlbDtcbmNvbnN0IGluamVjdENyZWF0ZUFuaW1hdGVkU3R5bGUgPSBmYWN0b3J5ID0+IGNyZWF0ZUFuaW1hdGVkU3R5bGUgPSBmYWN0b3J5O1xuXG52YXIgR2xvYmFscyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgZ2V0IGJ1Z2ZpeGVzICgpIHsgcmV0dXJuIGJ1Z2ZpeGVzOyB9LFxuICBnZXQgYXBwbHlBbmltYXRlZFZhbHVlcyAoKSB7IHJldHVybiBhcHBseUFuaW1hdGVkVmFsdWVzOyB9LFxuICBnZXQgY29sb3JOYW1lcyAoKSB7IHJldHVybiBjb2xvck5hbWVzOyB9LFxuICBnZXQgcmVxdWVzdEZyYW1lICgpIHsgcmV0dXJuIHJlcXVlc3RGcmFtZTsgfSxcbiAgZ2V0IGNhbmNlbEZyYW1lICgpIHsgcmV0dXJuIGNhbmNlbEZyYW1lOyB9LFxuICBnZXQgaW50ZXJwb2xhdGlvbiAoKSB7IHJldHVybiBpbnRlcnBvbGF0aW9uOyB9LFxuICBnZXQgbm93ICgpIHsgcmV0dXJuIG5vdzsgfSxcbiAgZ2V0IGRlZmF1bHRFbGVtZW50ICgpIHsgcmV0dXJuIGRlZmF1bHRFbGVtZW50OyB9LFxuICBnZXQgY3JlYXRlQW5pbWF0ZWRTdHlsZSAoKSB7IHJldHVybiBjcmVhdGVBbmltYXRlZFN0eWxlOyB9LFxuICBpbmplY3RBcHBseUFuaW1hdGVkVmFsdWVzOiBpbmplY3RBcHBseUFuaW1hdGVkVmFsdWVzLFxuICBpbmplY3RDb2xvck5hbWVzOiBpbmplY3RDb2xvck5hbWVzLFxuICBpbmplY3RCdWdmaXhlczogaW5qZWN0QnVnZml4ZXMsXG4gIGluamVjdEludGVycG9sYXRpb246IGluamVjdEludGVycG9sYXRpb24sXG4gIGluamVjdEZyYW1lOiBpbmplY3RGcmFtZSxcbiAgaW5qZWN0Tm93OiBpbmplY3ROb3csXG4gIGluamVjdERlZmF1bHRFbGVtZW50OiBpbmplY3REZWZhdWx0RWxlbWVudCxcbiAgaW5qZWN0Q3JlYXRlQW5pbWF0ZWRTdHlsZTogaW5qZWN0Q3JlYXRlQW5pbWF0ZWRTdHlsZVxufSk7XG5cbmNsYXNzIEFuaW1hdGVkIHtcbiAgYXR0YWNoKCkge31cblxuICBkZXRhY2goKSB7fVxuXG4gIGdldFZhbHVlKCkge31cblxuICBnZXRBbmltYXRlZFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCk7XG4gIH1cblxuICBhZGRDaGlsZChjaGlsZCkge31cblxuICByZW1vdmVDaGlsZChjaGlsZCkge31cblxuICBnZXRDaGlsZHJlbigpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxufVxuXG5jb25zdCBnZXRWYWx1ZXMgPSBvYmplY3QgPT4gT2JqZWN0LmtleXMob2JqZWN0KS5tYXAoayA9PiBvYmplY3Rba10pO1xuXG5jbGFzcyBBbmltYXRlZFdpdGhDaGlsZHJlbiBleHRlbmRzIEFuaW1hdGVkIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICBfdGhpcyA9IHRoaXM7XG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuXG4gICAgdGhpcy5nZXRDaGlsZHJlbiA9ICgpID0+IHRoaXMuY2hpbGRyZW47XG5cbiAgICB0aGlzLmdldFBheWxvYWQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5kZXggIT09IHZvaWQgMCAmJiBfdGhpcy5wYXlsb2FkID8gX3RoaXMucGF5bG9hZFtpbmRleF0gOiBfdGhpcy5wYXlsb2FkIHx8IF90aGlzO1xuICAgIH07XG4gIH1cblxuICBhZGRDaGlsZChjaGlsZCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgdGhpcy5hdHRhY2goKTtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICB9XG5cbiAgcmVtb3ZlQ2hpbGQoY2hpbGQpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZihjaGlsZCk7XG4gICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgdGhpcy5kZXRhY2goKTtcbiAgfVxuXG59XG5jbGFzcyBBbmltYXRlZEFycmF5V2l0aENoaWxkcmVuIGV4dGVuZHMgQW5pbWF0ZWRXaXRoQ2hpbGRyZW4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMucGF5bG9hZCA9IFtdO1xuXG4gICAgdGhpcy5nZXRBbmltYXRlZFZhbHVlID0gKCkgPT4gdGhpcy5nZXRWYWx1ZSgpO1xuXG4gICAgdGhpcy5hdHRhY2ggPSAoKSA9PiB0aGlzLnBheWxvYWQuZm9yRWFjaChwID0+IHAgaW5zdGFuY2VvZiBBbmltYXRlZCAmJiBwLmFkZENoaWxkKHRoaXMpKTtcblxuICAgIHRoaXMuZGV0YWNoID0gKCkgPT4gdGhpcy5wYXlsb2FkLmZvckVhY2gocCA9PiBwIGluc3RhbmNlb2YgQW5pbWF0ZWQgJiYgcC5yZW1vdmVDaGlsZCh0aGlzKSk7XG4gIH1cblxufVxuY2xhc3MgQW5pbWF0ZWRPYmplY3RXaXRoQ2hpbGRyZW4gZXh0ZW5kcyBBbmltYXRlZFdpdGhDaGlsZHJlbiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy5wYXlsb2FkID0ge307XG5cbiAgICB0aGlzLmdldEFuaW1hdGVkVmFsdWUgPSAoKSA9PiB0aGlzLmdldFZhbHVlKHRydWUpO1xuXG4gICAgdGhpcy5hdHRhY2ggPSAoKSA9PiBnZXRWYWx1ZXModGhpcy5wYXlsb2FkKS5mb3JFYWNoKHMgPT4gcyBpbnN0YW5jZW9mIEFuaW1hdGVkICYmIHMuYWRkQ2hpbGQodGhpcykpO1xuXG4gICAgdGhpcy5kZXRhY2ggPSAoKSA9PiBnZXRWYWx1ZXModGhpcy5wYXlsb2FkKS5mb3JFYWNoKHMgPT4gcyBpbnN0YW5jZW9mIEFuaW1hdGVkICYmIHMucmVtb3ZlQ2hpbGQodGhpcykpO1xuICB9XG5cbiAgZ2V0VmFsdWUoYW5pbWF0ZWQpIHtcbiAgICBpZiAoYW5pbWF0ZWQgPT09IHZvaWQgMCkge1xuICAgICAgYW5pbWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnBheWxvYWQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wYXlsb2FkW2tleV07XG4gICAgICBpZiAoYW5pbWF0ZWQgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEFuaW1hdGVkKSkgY29udGludWU7XG4gICAgICBwYXlsb2FkW2tleV0gPSB2YWx1ZSBpbnN0YW5jZW9mIEFuaW1hdGVkID8gdmFsdWVbYW5pbWF0ZWQgPyAnZ2V0QW5pbWF0ZWRWYWx1ZScgOiAnZ2V0VmFsdWUnXSgpIDogdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxufVxuXG5jbGFzcyBBbmltYXRlZFN0eWxlIGV4dGVuZHMgQW5pbWF0ZWRPYmplY3RXaXRoQ2hpbGRyZW4ge1xuICBjb25zdHJ1Y3RvcihzdHlsZSkge1xuICAgIHN1cGVyKCk7XG4gICAgc3R5bGUgPSBzdHlsZSB8fCB7fTtcbiAgICBpZiAoc3R5bGUudHJhbnNmb3JtICYmICEoc3R5bGUudHJhbnNmb3JtIGluc3RhbmNlb2YgQW5pbWF0ZWQpKSBzdHlsZSA9IGFwcGx5QW5pbWF0ZWRWYWx1ZXMudHJhbnNmb3JtKHN0eWxlKTtcbiAgICB0aGlzLnBheWxvYWQgPSBzdHlsZTtcbiAgfVxuXG59XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvI3N2Zy1jb2xvclxuY29uc3QgY29sb3JzID0ge1xuICB0cmFuc3BhcmVudDogMHgwMDAwMDAwMCxcbiAgYWxpY2VibHVlOiAweGYwZjhmZmZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3ZmYsXG4gIGFxdWE6IDB4MDBmZmZmZmYsXG4gIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0ZmYsXG4gIGF6dXJlOiAweGYwZmZmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGNmZixcbiAgYmlzcXVlOiAweGZmZTRjNGZmLFxuICBibGFjazogMHgwMDAwMDBmZixcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkZmYsXG4gIGJsdWU6IDB4MDAwMGZmZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyZmYsXG4gIGJyb3duOiAweGE1MmEyYWZmLFxuICBidXJseXdvb2Q6IDB4ZGViODg3ZmYsXG4gIGJ1cm50c2llbm5hOiAweGVhN2U1ZGZmLFxuICBjYWRldGJsdWU6IDB4NWY5ZWEwZmYsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwZmYsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWVmZixcbiAgY29yYWw6IDB4ZmY3ZjUwZmYsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZGZmLFxuICBjb3Juc2lsazogMHhmZmY4ZGNmZixcbiAgY3JpbXNvbjogMHhkYzE0M2NmZixcbiAgY3lhbjogMHgwMGZmZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiZmYsXG4gIGRhcmtjeWFuOiAweDAwOGI4YmZmLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYmZmLFxuICBkYXJrZ3JheTogMHhhOWE5YTlmZixcbiAgZGFya2dyZWVuOiAweDAwNjQwMGZmLFxuICBkYXJrZ3JleTogMHhhOWE5YTlmZixcbiAgZGFya2toYWtpOiAweGJkYjc2YmZmLFxuICBkYXJrbWFnZW50YTogMHg4YjAwOGJmZixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmZmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwZmYsXG4gIGRhcmtvcmNoaWQ6IDB4OTkzMmNjZmYsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwZmYsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhZmYsXG4gIGRhcmtzZWFncmVlbjogMHg4ZmJjOGZmZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGJmZixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGZmZixcbiAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGZmZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDFmZixcbiAgZGFya3Zpb2xldDogMHg5NDAwZDNmZixcbiAgZGVlcHBpbms6IDB4ZmYxNDkzZmYsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OWZmLFxuICBkaW1ncmV5OiAweDY5Njk2OWZmLFxuICBkb2RnZXJibHVlOiAweDFlOTBmZmZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyZmYsXG4gIGZsb3JhbHdoaXRlOiAweGZmZmFmMGZmLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjJmZixcbiAgZnVjaHNpYTogMHhmZjAwZmZmZixcbiAgZ2FpbnNib3JvOiAweGRjZGNkY2ZmLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZmZmLFxuICBnb2xkOiAweGZmZDcwMGZmLFxuICBnb2xkZW5yb2Q6IDB4ZGFhNTIwZmYsXG4gIGdyYXk6IDB4ODA4MDgwZmYsXG4gIGdyZWVuOiAweDAwODAwMGZmLFxuICBncmVlbnllbGxvdzogMHhhZGZmMmZmZixcbiAgZ3JleTogMHg4MDgwODBmZixcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwZmYsXG4gIGhvdHBpbms6IDB4ZmY2OWI0ZmYsXG4gIGluZGlhbnJlZDogMHhjZDVjNWNmZixcbiAgaW5kaWdvOiAweDRiMDA4MmZmLFxuICBpdm9yeTogMHhmZmZmZjBmZixcbiAga2hha2k6IDB4ZjBlNjhjZmYsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYWZmLFxuICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNWZmLFxuICBsYXduZ3JlZW46IDB4N2NmYzAwZmYsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2RmZixcbiAgbGlnaHRibHVlOiAweGFkZDhlNmZmLFxuICBsaWdodGNvcmFsOiAweGYwODA4MGZmLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmZmYsXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMmZmLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzZmYsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwZmYsXG4gIGxpZ2h0Z3JleTogMHhkM2QzZDNmZixcbiAgbGlnaHRwaW5rOiAweGZmYjZjMWZmLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2FmZixcbiAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWFmZixcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYWZmLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTlmZixcbiAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5ZmYsXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZWZmLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTBmZixcbiAgbGltZTogMHgwMGZmMDBmZixcbiAgbGltZWdyZWVuOiAweDMyY2QzMmZmLFxuICBsaW5lbjogMHhmYWYwZTZmZixcbiAgbWFnZW50YTogMHhmZjAwZmZmZixcbiAgbWFyb29uOiAweDgwMDAwMGZmLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYWZmLFxuICBtZWRpdW1ibHVlOiAweDAwMDBjZGZmLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzZmYsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGJmZixcbiAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxZmYsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWVmZixcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhZmYsXG4gIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2NmZixcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NWZmLFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwZmYsXG4gIG1pbnRjcmVhbTogMHhmNWZmZmFmZixcbiAgbWlzdHlyb3NlOiAweGZmZTRlMWZmLFxuICBtb2NjYXNpbjogMHhmZmU0YjVmZixcbiAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkZmYsXG4gIG5hdnk6IDB4MDAwMDgwZmYsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2ZmYsXG4gIG9saXZlOiAweDgwODAwMGZmLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzZmYsXG4gIG9yYW5nZTogMHhmZmE1MDBmZixcbiAgb3JhbmdlcmVkOiAweGZmNDUwMGZmLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2ZmYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhZmYsXG4gIHBhbGVncmVlbjogMHg5OGZiOThmZixcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWVmZixcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTNmZixcbiAgcGFwYXlhd2hpcDogMHhmZmVmZDVmZixcbiAgcGVhY2hwdWZmOiAweGZmZGFiOWZmLFxuICBwZXJ1OiAweGNkODUzZmZmLFxuICBwaW5rOiAweGZmYzBjYmZmLFxuICBwbHVtOiAweGRkYTBkZGZmLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNmZmLFxuICBwdXJwbGU6IDB4ODAwMDgwZmYsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5ZmYsXG4gIHJlZDogMHhmZjAwMDBmZixcbiAgcm9zeWJyb3duOiAweGJjOGY4ZmZmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxZmYsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxM2ZmLFxuICBzYWxtb246IDB4ZmE4MDcyZmYsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwZmYsXG4gIHNlYWdyZWVuOiAweDJlOGI1N2ZmLFxuICBzZWFzaGVsbDogMHhmZmY1ZWVmZixcbiAgc2llbm5hOiAweGEwNTIyZGZmLFxuICBzaWx2ZXI6IDB4YzBjMGMwZmYsXG4gIHNreWJsdWU6IDB4ODdjZWViZmYsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2RmZixcbiAgc2xhdGVncmF5OiAweDcwODA5MGZmLFxuICBzbGF0ZWdyZXk6IDB4NzA4MDkwZmYsXG4gIHNub3c6IDB4ZmZmYWZhZmYsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZmZmLFxuICBzdGVlbGJsdWU6IDB4NDY4MmI0ZmYsXG4gIHRhbjogMHhkMmI0OGNmZixcbiAgdGVhbDogMHgwMDgwODBmZixcbiAgdGhpc3RsZTogMHhkOGJmZDhmZixcbiAgdG9tYXRvOiAweGZmNjM0N2ZmLFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwZmYsXG4gIHZpb2xldDogMHhlZTgyZWVmZixcbiAgd2hlYXQ6IDB4ZjVkZWIzZmYsXG4gIHdoaXRlOiAweGZmZmZmZmZmLFxuICB3aGl0ZXNtb2tlOiAweGY1ZjVmNWZmLFxuICB5ZWxsb3c6IDB4ZmZmZjAwZmYsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMmZmXG59O1xuXG5jbGFzcyBJbnRlcnBvbGF0aW9uIHtcbiAgLy8gRGVmYXVsdCBjb25maWcgPSBjb25maWcsIGFyZ3NcbiAgLy8gU2hvcnQgY29uZmlnICAgPSByYW5nZSwgb3V0cHV0LCBleHRyYXBvbGF0ZVxuICBzdGF0aWMgY3JlYXRlKGNvbmZpZywgb3V0cHV0LCBleHRyYSkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnZnVuY3Rpb24nKSByZXR1cm4gY29uZmlnO2Vsc2UgaWYgKGludGVycG9sYXRpb24gJiYgY29uZmlnLm91dHB1dCAmJiB0eXBlb2YgY29uZmlnLm91dHB1dFswXSA9PT0gJ3N0cmluZycpIHJldHVybiBpbnRlcnBvbGF0aW9uKGNvbmZpZyk7ZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb25maWcpKSByZXR1cm4gSW50ZXJwb2xhdGlvbi5jcmVhdGUoe1xuICAgICAgcmFuZ2U6IGNvbmZpZyxcbiAgICAgIG91dHB1dCxcbiAgICAgIGV4dHJhcG9sYXRlOiBleHRyYSB8fCAnZXh0ZW5kJ1xuICAgIH0pO1xuICAgIGxldCBvdXRwdXRSYW5nZSA9IGNvbmZpZy5vdXRwdXQ7XG4gICAgbGV0IGlucHV0UmFuZ2UgPSBjb25maWcucmFuZ2UgfHwgWzAsIDFdO1xuXG4gICAgbGV0IGVhc2luZyA9IGNvbmZpZy5lYXNpbmcgfHwgKHQgPT4gdCk7XG5cbiAgICBsZXQgZXh0cmFwb2xhdGVMZWZ0ID0gJ2V4dGVuZCc7XG4gICAgbGV0IG1hcCA9IGNvbmZpZy5tYXA7XG4gICAgaWYgKGNvbmZpZy5leHRyYXBvbGF0ZUxlZnQgIT09IHVuZGVmaW5lZCkgZXh0cmFwb2xhdGVMZWZ0ID0gY29uZmlnLmV4dHJhcG9sYXRlTGVmdDtlbHNlIGlmIChjb25maWcuZXh0cmFwb2xhdGUgIT09IHVuZGVmaW5lZCkgZXh0cmFwb2xhdGVMZWZ0ID0gY29uZmlnLmV4dHJhcG9sYXRlO1xuICAgIGxldCBleHRyYXBvbGF0ZVJpZ2h0ID0gJ2V4dGVuZCc7XG4gICAgaWYgKGNvbmZpZy5leHRyYXBvbGF0ZVJpZ2h0ICE9PSB1bmRlZmluZWQpIGV4dHJhcG9sYXRlUmlnaHQgPSBjb25maWcuZXh0cmFwb2xhdGVSaWdodDtlbHNlIGlmIChjb25maWcuZXh0cmFwb2xhdGUgIT09IHVuZGVmaW5lZCkgZXh0cmFwb2xhdGVSaWdodCA9IGNvbmZpZy5leHRyYXBvbGF0ZTtcbiAgICByZXR1cm4gaW5wdXQgPT4ge1xuICAgICAgbGV0IHJhbmdlID0gZmluZFJhbmdlKGlucHV0LCBpbnB1dFJhbmdlKTtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShpbnB1dCwgaW5wdXRSYW5nZVtyYW5nZV0sIGlucHV0UmFuZ2VbcmFuZ2UgKyAxXSwgb3V0cHV0UmFuZ2VbcmFuZ2VdLCBvdXRwdXRSYW5nZVtyYW5nZSArIDFdLCBlYXNpbmcsIGV4dHJhcG9sYXRlTGVmdCwgZXh0cmFwb2xhdGVSaWdodCwgbWFwKTtcbiAgICB9O1xuICB9XG5cbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGUoaW5wdXQsIGlucHV0TWluLCBpbnB1dE1heCwgb3V0cHV0TWluLCBvdXRwdXRNYXgsIGVhc2luZywgZXh0cmFwb2xhdGVMZWZ0LCBleHRyYXBvbGF0ZVJpZ2h0LCBtYXApIHtcbiAgbGV0IHJlc3VsdCA9IG1hcCA/IG1hcChpbnB1dCkgOiBpbnB1dDsgLy8gRXh0cmFwb2xhdGVcblxuICBpZiAocmVzdWx0IDwgaW5wdXRNaW4pIHtcbiAgICBpZiAoZXh0cmFwb2xhdGVMZWZ0ID09PSAnaWRlbnRpdHknKSByZXR1cm4gcmVzdWx0O2Vsc2UgaWYgKGV4dHJhcG9sYXRlTGVmdCA9PT0gJ2NsYW1wJykgcmVzdWx0ID0gaW5wdXRNaW47XG4gIH1cblxuICBpZiAocmVzdWx0ID4gaW5wdXRNYXgpIHtcbiAgICBpZiAoZXh0cmFwb2xhdGVSaWdodCA9PT0gJ2lkZW50aXR5JykgcmV0dXJuIHJlc3VsdDtlbHNlIGlmIChleHRyYXBvbGF0ZVJpZ2h0ID09PSAnY2xhbXAnKSByZXN1bHQgPSBpbnB1dE1heDtcbiAgfVxuXG4gIGlmIChvdXRwdXRNaW4gPT09IG91dHB1dE1heCkgcmV0dXJuIG91dHB1dE1pbjtcbiAgaWYgKGlucHV0TWluID09PSBpbnB1dE1heCkgcmV0dXJuIGlucHV0IDw9IGlucHV0TWluID8gb3V0cHV0TWluIDogb3V0cHV0TWF4OyAvLyBJbnB1dCBSYW5nZVxuXG4gIGlmIChpbnB1dE1pbiA9PT0gLUluZmluaXR5KSByZXN1bHQgPSAtcmVzdWx0O2Vsc2UgaWYgKGlucHV0TWF4ID09PSBJbmZpbml0eSkgcmVzdWx0ID0gcmVzdWx0IC0gaW5wdXRNaW47ZWxzZSByZXN1bHQgPSAocmVzdWx0IC0gaW5wdXRNaW4pIC8gKGlucHV0TWF4IC0gaW5wdXRNaW4pOyAvLyBFYXNpbmdcblxuICByZXN1bHQgPSBlYXNpbmcocmVzdWx0KTsgLy8gT3V0cHV0IFJhbmdlXG5cbiAgaWYgKG91dHB1dE1pbiA9PT0gLUluZmluaXR5KSByZXN1bHQgPSAtcmVzdWx0O2Vsc2UgaWYgKG91dHB1dE1heCA9PT0gSW5maW5pdHkpIHJlc3VsdCA9IHJlc3VsdCArIG91dHB1dE1pbjtlbHNlIHJlc3VsdCA9IHJlc3VsdCAqIChvdXRwdXRNYXggLSBvdXRwdXRNaW4pICsgb3V0cHV0TWluO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmaW5kUmFuZ2UoaW5wdXQsIGlucHV0UmFuZ2UpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBpbnB1dFJhbmdlLmxlbmd0aCAtIDE7ICsraSkgaWYgKGlucHV0UmFuZ2VbaV0gPj0gaW5wdXQpIGJyZWFrO1xuXG4gIHJldHVybiBpIC0gMTtcbn1cblxuLy8gY29uc3QgSU5URUdFUiA9ICdbLStdP1xcXFxkKyc7XG5jb25zdCBOVU1CRVIgPSAnWy0rXT9cXFxcZCpcXFxcLj9cXFxcZCsnO1xuY29uc3QgUEVSQ0VOVEFHRSA9IE5VTUJFUiArICclJztcblxuZnVuY3Rpb24gY2FsbCgpIHtcbiAgcmV0dXJuICdcXFxcKFxcXFxzKignICsgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCcpXFxcXHMqLFxcXFxzKignKSArICcpXFxcXHMqXFxcXCknO1xufVxuXG5jb25zdCByZ2IgPSBuZXcgUmVnRXhwKCdyZ2InICsgY2FsbChOVU1CRVIsIE5VTUJFUiwgTlVNQkVSKSk7XG5jb25zdCByZ2JhID0gbmV3IFJlZ0V4cCgncmdiYScgKyBjYWxsKE5VTUJFUiwgTlVNQkVSLCBOVU1CRVIsIE5VTUJFUikpO1xuY29uc3QgaHNsID0gbmV3IFJlZ0V4cCgnaHNsJyArIGNhbGwoTlVNQkVSLCBQRVJDRU5UQUdFLCBQRVJDRU5UQUdFKSk7XG5jb25zdCBoc2xhID0gbmV3IFJlZ0V4cCgnaHNsYScgKyBjYWxsKE5VTUJFUiwgUEVSQ0VOVEFHRSwgUEVSQ0VOVEFHRSwgTlVNQkVSKSk7XG5jb25zdCBoZXgzID0gL14jKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pJC87XG5jb25zdCBoZXg0ID0gL14jKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KSQvO1xuY29uc3QgaGV4NiA9IC9eIyhbMC05YS1mQS1GXXs2fSkkLztcbmNvbnN0IGhleDggPSAvXiMoWzAtOWEtZkEtRl17OH0pJC87XG5cbi8qXG5odHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tbXVuaXR5L25vcm1hbGl6ZS1jc3MtY29sb3JcblxuQlNEIDMtQ2xhdXNlIExpY2Vuc2VcblxuQ29weXJpZ2h0IChjKSAyMDE2LCBSZWFjdCBDb21tdW5pdHlcbkFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxubW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG5cblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG5BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG5JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbkZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG5EQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbkNBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG5PUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5mdW5jdGlvbiBub3JtYWxpemVDb2xvcihjb2xvcikge1xuICBsZXQgbWF0Y2g7XG5cbiAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gY29sb3IgPj4+IDAgPT09IGNvbG9yICYmIGNvbG9yID49IDAgJiYgY29sb3IgPD0gMHhmZmZmZmZmZiA/IGNvbG9yIDogbnVsbDtcbiAgfSAvLyBPcmRlcmVkIGJhc2VkIG9uIG9jY3VycmVuY2VzIG9uIEZhY2Vib29rIGNvZGViYXNlXG5cblxuICBpZiAobWF0Y2ggPSBoZXg2LmV4ZWMoY29sb3IpKSByZXR1cm4gcGFyc2VJbnQobWF0Y2hbMV0gKyAnZmYnLCAxNikgPj4+IDA7XG4gIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkoY29sb3IpKSByZXR1cm4gY29sb3JzW2NvbG9yXTtcblxuICBpZiAobWF0Y2ggPSByZ2IuZXhlYyhjb2xvcikpIHtcbiAgICByZXR1cm4gKHBhcnNlMjU1KG1hdGNoWzFdKSA8PCAyNCB8IC8vIHJcbiAgICBwYXJzZTI1NShtYXRjaFsyXSkgPDwgMTYgfCAvLyBnXG4gICAgcGFyc2UyNTUobWF0Y2hbM10pIDw8IDggfCAvLyBiXG4gICAgMHgwMDAwMDBmZikgPj4+IC8vIGFcbiAgICAwO1xuICB9XG5cbiAgaWYgKG1hdGNoID0gcmdiYS5leGVjKGNvbG9yKSkge1xuICAgIHJldHVybiAocGFyc2UyNTUobWF0Y2hbMV0pIDw8IDI0IHwgLy8gclxuICAgIHBhcnNlMjU1KG1hdGNoWzJdKSA8PCAxNiB8IC8vIGdcbiAgICBwYXJzZTI1NShtYXRjaFszXSkgPDwgOCB8IC8vIGJcbiAgICBwYXJzZTEobWF0Y2hbNF0pKSA+Pj4gLy8gYVxuICAgIDA7XG4gIH1cblxuICBpZiAobWF0Y2ggPSBoZXgzLmV4ZWMoY29sb3IpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KG1hdGNoWzFdICsgbWF0Y2hbMV0gKyAvLyByXG4gICAgbWF0Y2hbMl0gKyBtYXRjaFsyXSArIC8vIGdcbiAgICBtYXRjaFszXSArIG1hdGNoWzNdICsgLy8gYlxuICAgICdmZicsIC8vIGFcbiAgICAxNikgPj4+IDA7XG4gIH0gLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy1jb2xvci00LyNoZXgtbm90YXRpb25cblxuXG4gIGlmIChtYXRjaCA9IGhleDguZXhlYyhjb2xvcikpIHJldHVybiBwYXJzZUludChtYXRjaFsxXSwgMTYpID4+PiAwO1xuXG4gIGlmIChtYXRjaCA9IGhleDQuZXhlYyhjb2xvcikpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQobWF0Y2hbMV0gKyBtYXRjaFsxXSArIC8vIHJcbiAgICBtYXRjaFsyXSArIG1hdGNoWzJdICsgLy8gZ1xuICAgIG1hdGNoWzNdICsgbWF0Y2hbM10gKyAvLyBiXG4gICAgbWF0Y2hbNF0gKyBtYXRjaFs0XSwgLy8gYVxuICAgIDE2KSA+Pj4gMDtcbiAgfVxuXG4gIGlmIChtYXRjaCA9IGhzbC5leGVjKGNvbG9yKSkge1xuICAgIHJldHVybiAoaHNsVG9SZ2IocGFyc2UzNjAobWF0Y2hbMV0pLCAvLyBoXG4gICAgcGFyc2VQZXJjZW50YWdlKG1hdGNoWzJdKSwgLy8gc1xuICAgIHBhcnNlUGVyY2VudGFnZShtYXRjaFszXSkgLy8gbFxuICAgICkgfCAweDAwMDAwMGZmKSA+Pj4gLy8gYVxuICAgIDA7XG4gIH1cblxuICBpZiAobWF0Y2ggPSBoc2xhLmV4ZWMoY29sb3IpKSB7XG4gICAgcmV0dXJuIChoc2xUb1JnYihwYXJzZTM2MChtYXRjaFsxXSksIC8vIGhcbiAgICBwYXJzZVBlcmNlbnRhZ2UobWF0Y2hbMl0pLCAvLyBzXG4gICAgcGFyc2VQZXJjZW50YWdlKG1hdGNoWzNdKSAvLyBsXG4gICAgKSB8IHBhcnNlMShtYXRjaFs0XSkpID4+PiAvLyBhXG4gICAgMDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHtcbiAgaWYgKHQgPCAwKSB0ICs9IDE7XG4gIGlmICh0ID4gMSkgdCAtPSAxO1xuICBpZiAodCA8IDEgLyA2KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgaWYgKHQgPCAxIC8gMikgcmV0dXJuIHE7XG4gIGlmICh0IDwgMiAvIDMpIHJldHVybiBwICsgKHEgLSBwKSAqICgyIC8gMyAtIHQpICogNjtcbiAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIGhzbFRvUmdiKGgsIHMsIGwpIHtcbiAgY29uc3QgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XG4gIGNvbnN0IHAgPSAyICogbCAtIHE7XG4gIGNvbnN0IHIgPSBodWUycmdiKHAsIHEsIGggKyAxIC8gMyk7XG4gIGNvbnN0IGcgPSBodWUycmdiKHAsIHEsIGgpO1xuICBjb25zdCBiID0gaHVlMnJnYihwLCBxLCBoIC0gMSAvIDMpO1xuICByZXR1cm4gTWF0aC5yb3VuZChyICogMjU1KSA8PCAyNCB8IE1hdGgucm91bmQoZyAqIDI1NSkgPDwgMTYgfCBNYXRoLnJvdW5kKGIgKiAyNTUpIDw8IDg7XG59XG5cbmZ1bmN0aW9uIHBhcnNlMjU1KHN0cikge1xuICBjb25zdCBpbnQgPSBwYXJzZUludChzdHIsIDEwKTtcbiAgaWYgKGludCA8IDApIHJldHVybiAwO1xuICBpZiAoaW50ID4gMjU1KSByZXR1cm4gMjU1O1xuICByZXR1cm4gaW50O1xufVxuXG5mdW5jdGlvbiBwYXJzZTM2MChzdHIpIHtcbiAgY29uc3QgaW50ID0gcGFyc2VGbG9hdChzdHIpO1xuICByZXR1cm4gKGludCAlIDM2MCArIDM2MCkgJSAzNjAgLyAzNjA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlMShzdHIpIHtcbiAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChzdHIpO1xuICBpZiAobnVtIDwgMCkgcmV0dXJuIDA7XG4gIGlmIChudW0gPiAxKSByZXR1cm4gMjU1O1xuICByZXR1cm4gTWF0aC5yb3VuZChudW0gKiAyNTUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBlcmNlbnRhZ2Uoc3RyKSB7XG4gIC8vIHBhcnNlRmxvYXQgY29udmVuaWVudGx5IGlnbm9yZXMgdGhlIGZpbmFsICVcbiAgY29uc3QgaW50ID0gcGFyc2VGbG9hdChzdHIpO1xuICBpZiAoaW50IDwgMCkgcmV0dXJuIDA7XG4gIGlmIChpbnQgPiAxMDApIHJldHVybiAxO1xuICByZXR1cm4gaW50IC8gMTAwO1xufVxuXG5mdW5jdGlvbiBjb2xvclRvUmdiYShpbnB1dCkge1xuICBsZXQgaW50MzJDb2xvciA9IG5vcm1hbGl6ZUNvbG9yKGlucHV0KTtcbiAgaWYgKGludDMyQ29sb3IgPT09IG51bGwpIHJldHVybiBpbnB1dDtcbiAgaW50MzJDb2xvciA9IGludDMyQ29sb3IgfHwgMDtcbiAgbGV0IHIgPSAoaW50MzJDb2xvciAmIDB4ZmYwMDAwMDApID4+PiAyNDtcbiAgbGV0IGcgPSAoaW50MzJDb2xvciAmIDB4MDBmZjAwMDApID4+PiAxNjtcbiAgbGV0IGIgPSAoaW50MzJDb2xvciAmIDB4MDAwMGZmMDApID4+PiA4O1xuICBsZXQgYSA9IChpbnQzMkNvbG9yICYgMHgwMDAwMDBmZikgLyAyNTU7XG4gIHJldHVybiBgcmdiYSgke3J9LCAke2d9LCAke2J9LCAke2F9KWA7XG59IC8vIFByb2JsZW06IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmltYXRlZGpzL2FuaW1hdGVkL3B1bGwvMTAyXG4vLyBTb2x1dGlvbjogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjM4NTY1L3BhcnNpbmctc2NpZW50aWZpYy1ub3RhdGlvbi1zZW5zaWJseS82NTg2NjJcblxuXG5jb25zdCBzdHJpbmdTaGFwZVJlZ2V4ID0gL1srXFwtXT8oPzowfFsxLTldXFxkKikoPzpcXC5cXGQqKT8oPzpbZUVdWytcXC1dP1xcZCspPy9nOyAvLyBDb3ZlcnMgcmdiLCByZ2JhLCBoc2wsIGhzbGFcbi8vIFRha2VuIGZyb20gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vb2xtb2tyYW1lci84MmNjY2U2NzNmODZkYjdjZGE1ZVxuXG5jb25zdCBjb2xvclJlZ2V4ID0gLygjKD86WzAtOWEtZl17Mn0pezIsNH18KCNbMC05YS1mXXszfSl8KHJnYnxoc2wpYT9cXCgoLT9cXGQrJT9bLFxcc10rKXsyLDN9XFxzKltcXGRcXC5dKyU/XFwpKS9naTsgLy8gQ292ZXJzIGNvbG9yIG5hbWVzICh0cmFuc3BhcmVudCwgYmx1ZSwgZXRjLilcblxuY29uc3QgY29sb3JOYW1lc1JlZ2V4ID0gbmV3IFJlZ0V4cChgKCR7T2JqZWN0LmtleXMoY29sb3JzKS5qb2luKCd8Jyl9KWAsICdnJyk7XG4vKipcbiAqIFN1cHBvcnRzIHN0cmluZyBzaGFwZXMgYnkgZXh0cmFjdGluZyBudW1iZXJzIHNvIG5ldyB2YWx1ZXMgY2FuIGJlIGNvbXB1dGVkLFxuICogYW5kIHJlY29tYmluZXMgdGhvc2UgdmFsdWVzIGludG8gbmV3IHN0cmluZ3Mgb2YgdGhlIHNhbWUgc2hhcGUuICBTdXBwb3J0c1xuICogdGhpbmdzIGxpa2U6XG4gKlxuICogICByZ2JhKDEyMywgNDIsIDk5LCAwLjM2KSAgICAgICAgICAgLy8gY29sb3JzXG4gKiAgIC00NWRlZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgd2l0aCB1bml0c1xuICogICAwIDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMikgLy8gYm94IHNoYWRvd3NcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVJbnRlcnBvbGF0aW9uKGNvbmZpZykge1xuICAvLyBSZXBsYWNlIGNvbG9ycyB3aXRoIHJnYmFcbiAgY29uc3Qgb3V0cHV0UmFuZ2UgPSBjb25maWcub3V0cHV0Lm1hcChyYW5nZVZhbHVlID0+IHJhbmdlVmFsdWUucmVwbGFjZShjb2xvclJlZ2V4LCBjb2xvclRvUmdiYSkpLm1hcChyYW5nZVZhbHVlID0+IHJhbmdlVmFsdWUucmVwbGFjZShjb2xvck5hbWVzUmVnZXgsIGNvbG9yVG9SZ2JhKSk7IC8vIC0+XG4gIC8vIFtcbiAgLy8gICBbMCwgNTBdLFxuICAvLyAgIFsxMDAsIDE1MF0sXG4gIC8vICAgWzIwMCwgMjUwXSxcbiAgLy8gICBbMCwgMC41XSxcbiAgLy8gXVxuXG4gIGNvbnN0IG91dHB1dFJhbmdlcyA9IG91dHB1dFJhbmdlWzBdLm1hdGNoKHN0cmluZ1NoYXBlUmVnZXgpLm1hcCgoKSA9PiBbXSk7XG4gIG91dHB1dFJhbmdlLmZvckVhY2godmFsdWUgPT4ge1xuICAgIHZhbHVlLm1hdGNoKHN0cmluZ1NoYXBlUmVnZXgpLmZvckVhY2goKG51bWJlciwgaSkgPT4gb3V0cHV0UmFuZ2VzW2ldLnB1c2goK251bWJlcikpO1xuICB9KTtcbiAgY29uc3QgaW50ZXJwb2xhdGlvbnMgPSBvdXRwdXRSYW5nZVswXS5tYXRjaChzdHJpbmdTaGFwZVJlZ2V4KS5tYXAoKHZhbHVlLCBpKSA9PiB7XG4gICAgcmV0dXJuIEludGVycG9sYXRpb24uY3JlYXRlKF9leHRlbmRzKHt9LCBjb25maWcsIHtcbiAgICAgIG91dHB1dDogb3V0cHV0UmFuZ2VzW2ldXG4gICAgfSkpO1xuICB9KTtcbiAgcmV0dXJuIGlucHV0ID0+IHtcbiAgICBsZXQgaSA9IDA7XG4gICAgcmV0dXJuIG91dHB1dFJhbmdlWzBdIC8vICdyZ2JhKDAsIDEwMCwgMjAwLCAwKSdcbiAgICAvLyAtPlxuICAgIC8vICdyZ2JhKCR7aW50ZXJwb2xhdGlvbnNbMF0oaW5wdXQpfSwgJHtpbnRlcnBvbGF0aW9uc1sxXShpbnB1dCl9LCAuLi4nXG4gICAgLnJlcGxhY2Uoc3RyaW5nU2hhcGVSZWdleCwgKCkgPT4gaW50ZXJwb2xhdGlvbnNbaSsrXShpbnB1dCkpIC8vIHJnYmEgcmVxdWlyZXMgdGhhdCB0aGUgcixnLGIgYXJlIGludGVnZXJzLi4uLiBzbyB3ZSB3YW50IHRvIHJvdW5kIHRoZW0sIGJ1dCB3ZSAqZG9udCogd2FudCB0b1xuICAgIC8vIHJvdW5kIHRoZSBvcGFjaXR5ICg0dGggY29sdW1uKS5cbiAgICAucmVwbGFjZSgvcmdiYVxcKChbMC05XFwuLV0rKSwgKFswLTlcXC4tXSspLCAoWzAtOVxcLi1dKyksIChbMC05XFwuLV0rKVxcKS9naSwgKF8sIHAxLCBwMiwgcDMsIHA0KSA9PiBgcmdiYSgke01hdGgucm91bmQocDEpfSwgJHtNYXRoLnJvdW5kKHAyKX0sICR7TWF0aC5yb3VuZChwMyl9LCAke3A0fSlgKTtcbiAgfTtcbn1cblxuY2xhc3MgQW5pbWF0ZWRJbnRlcnBvbGF0aW9uIGV4dGVuZHMgQW5pbWF0ZWRBcnJheVdpdGhDaGlsZHJlbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudHMsIF9jb25maWcsIF9hcmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5nZXRWYWx1ZSA9ICgpID0+IHRoaXMuY2FsYyguLi50aGlzLnBheWxvYWQubWFwKHZhbHVlID0+IHZhbHVlLmdldFZhbHVlKCkpKTtcblxuICAgIHRoaXMudXBkYXRlQ29uZmlnID0gKGNvbmZpZywgYXJnKSA9PiB0aGlzLmNhbGMgPSBJbnRlcnBvbGF0aW9uLmNyZWF0ZShjb25maWcsIGFyZyk7XG5cbiAgICB0aGlzLmludGVycG9sYXRlID0gKGNvbmZpZywgYXJnKSA9PiBuZXcgQW5pbWF0ZWRJbnRlcnBvbGF0aW9uKHRoaXMsIGNvbmZpZywgYXJnKTtcblxuICAgIHRoaXMucGF5bG9hZCA9IC8vIEFuaW1hdGVkQXJyYXlzIHNob3VsZCB1bmZvbGQsIGV4Y2VwdCBBbmltYXRlZEludGVycG9sYXRpb24gd2hpY2ggaXMgdGFrZW4gYXMgaXNcbiAgICBwYXJlbnRzIGluc3RhbmNlb2YgQW5pbWF0ZWRBcnJheVdpdGhDaGlsZHJlbiAmJiAhcGFyZW50cy51cGRhdGVDb25maWcgPyBwYXJlbnRzLnBheWxvYWQgOiBBcnJheS5pc0FycmF5KHBhcmVudHMpID8gcGFyZW50cyA6IFtwYXJlbnRzXTtcbiAgICB0aGlzLmNhbGMgPSBJbnRlcnBvbGF0aW9uLmNyZWF0ZShfY29uZmlnLCBfYXJnKTtcbiAgfVxuXG59XG5jb25zdCBpbnRlcnBvbGF0ZSQxID0gKHBhcmVudHMsIGNvbmZpZywgYXJnKSA9PiBwYXJlbnRzICYmIG5ldyBBbmltYXRlZEludGVycG9sYXRpb24ocGFyZW50cywgY29uZmlnLCBhcmcpO1xuXG4vKipcbiAqIEFuaW1hdGVkIHdvcmtzIGJ5IGJ1aWxkaW5nIGEgZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCBvZiBkZXBlbmRlbmNpZXNcbiAqIHRyYW5zcGFyZW50bHkgd2hlbiB5b3UgcmVuZGVyIHlvdXIgQW5pbWF0ZWQgY29tcG9uZW50cy5cbiAqXG4gKiAgICAgICAgICAgICAgIG5ldyBBbmltYXRlZC5WYWx1ZSgwKVxuICogICAgIC5pbnRlcnBvbGF0ZSgpICAgICAgICAuaW50ZXJwb2xhdGUoKSAgICBuZXcgQW5pbWF0ZWQuVmFsdWUoMSlcbiAqICAgICAgICAgb3BhY2l0eSAgICAgICAgICAgICAgIHRyYW5zbGF0ZVkgICAgICBzY2FsZVxuICogICAgICAgICAgc3R5bGUgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtXG4gKiAgICAgICAgIFZpZXcjMjM0ICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyMxMjNcbiAqXG4gKiBBKSBUb3AgRG93biBwaGFzZVxuICogV2hlbiBhbiBBbmltYXRlZC5WYWx1ZSBpcyB1cGRhdGVkLCB3ZSByZWN1cnNpdmVseSBnbyBkb3duIHRocm91Z2ggdGhpc1xuICogZ3JhcGggaW4gb3JkZXIgdG8gZmluZCBsZWFmIG5vZGVzOiB0aGUgdmlld3MgdGhhdCB3ZSBmbGFnIGFzIG5lZWRpbmdcbiAqIGFuIHVwZGF0ZS5cbiAqXG4gKiBCKSBCb3R0b20gVXAgcGhhc2VcbiAqIFdoZW4gYSB2aWV3IGlzIGZsYWdnZWQgYXMgbmVlZGluZyBhbiB1cGRhdGUsIHdlIHJlY3Vyc2l2ZWx5IGdvIGJhY2sgdXBcbiAqIGluIG9yZGVyIHRvIGJ1aWxkIHRoZSBuZXcgdmFsdWUgdGhhdCBpdCBuZWVkcy4gVGhlIHJlYXNvbiB3aHkgd2UgbmVlZFxuICogdGhpcyB0d28tcGhhc2VzIHByb2Nlc3MgaXMgdG8gZGVhbCB3aXRoIGNvbXBvc2l0ZSBwcm9wcyBzdWNoIGFzXG4gKiB0cmFuc2Zvcm0gd2hpY2ggY2FuIHJlY2VpdmUgdmFsdWVzIGZyb20gbXVsdGlwbGUgcGFyZW50cy5cbiAqL1xuXG5mdW5jdGlvbiBmaW5kQW5pbWF0ZWRTdHlsZXMobm9kZSwgc3R5bGVzKSB7XG4gIGlmICh0eXBlb2Ygbm9kZS51cGRhdGUgPT09ICdmdW5jdGlvbicpIHN0eWxlcy5hZGQobm9kZSk7ZWxzZSBub2RlLmdldENoaWxkcmVuKCkuZm9yRWFjaChjaGlsZCA9PiBmaW5kQW5pbWF0ZWRTdHlsZXMoY2hpbGQsIHN0eWxlcykpO1xufVxuLyoqXG4gKiBTdGFuZGFyZCB2YWx1ZSBmb3IgZHJpdmluZyBhbmltYXRpb25zLiAgT25lIGBBbmltYXRlZC5WYWx1ZWAgY2FuIGRyaXZlXG4gKiBtdWx0aXBsZSBwcm9wZXJ0aWVzIGluIGEgc3luY2hyb25pemVkIGZhc2hpb24sIGJ1dCBjYW4gb25seSBiZSBkcml2ZW4gYnkgb25lXG4gKiBtZWNoYW5pc20gYXQgYSB0aW1lLiAgVXNpbmcgYSBuZXcgbWVjaGFuaXNtIChlLmcuIHN0YXJ0aW5nIGEgbmV3IGFuaW1hdGlvbixcbiAqIG9yIGNhbGxpbmcgYHNldFZhbHVlYCkgd2lsbCBzdG9wIGFueSBwcmV2aW91cyBvbmVzLlxuICovXG5cblxuY2xhc3MgQW5pbWF0ZWRWYWx1ZSBleHRlbmRzIEFuaW1hdGVkV2l0aENoaWxkcmVuIHtcbiAgY29uc3RydWN0b3IoX3ZhbHVlKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgc3VwZXIoKTtcbiAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlLCBmbHVzaCkge1xuICAgICAgaWYgKGZsdXNoID09PSB2b2lkIDApIHtcbiAgICAgICAgZmx1c2ggPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgaWYgKGZsdXNoKSBfdGhpcy5mbHVzaCgpO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFZhbHVlID0gKCkgPT4gdGhpcy52YWx1ZTtcblxuICAgIHRoaXMudXBkYXRlU3R5bGVzID0gKCkgPT4gZmluZEFuaW1hdGVkU3R5bGVzKHRoaXMsIHRoaXMuYW5pbWF0ZWRTdHlsZXMpO1xuXG4gICAgdGhpcy51cGRhdGVWYWx1ZSA9IHZhbHVlID0+IHRoaXMuZmx1c2godGhpcy52YWx1ZSA9IHZhbHVlKTtcblxuICAgIHRoaXMuaW50ZXJwb2xhdGUgPSAoY29uZmlnLCBhcmcpID0+IG5ldyBBbmltYXRlZEludGVycG9sYXRpb24odGhpcywgY29uZmlnLCBhcmcpO1xuXG4gICAgdGhpcy52YWx1ZSA9IF92YWx1ZTtcbiAgICB0aGlzLmFuaW1hdGVkU3R5bGVzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IF92YWx1ZTtcbiAgICB0aGlzLmxhc3RQb3NpdGlvbiA9IF92YWx1ZTtcbiAgICB0aGlzLmxhc3RWZWxvY2l0eSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxhc3RUaW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZsdXNoKCkge1xuICAgIGlmICh0aGlzLmFuaW1hdGVkU3R5bGVzLnNpemUgPT09IDApIHRoaXMudXBkYXRlU3R5bGVzKCk7XG4gICAgdGhpcy5hbmltYXRlZFN0eWxlcy5mb3JFYWNoKGFuaW1hdGVkU3R5bGUgPT4gYW5pbWF0ZWRTdHlsZS51cGRhdGUoKSk7XG4gIH1cblxuICBwcmVwYXJlKGNvbnRyb2xsZXIpIHtcbiAgICAvLyBWYWx1ZXMgc3RheSBsb3lhbCB0byB0aGVpciBvcmlnaW5hbCBjb250cm9sbGVyLCB0aGlzIGlzIGFsc28gYSB3YXkgdG9cbiAgICAvLyBkZXRlY3QgdHJhaWxpbmcgdmFsdWVzIG9yaWdpbmF0aW5nIGZyb20gYSBmb3JlaWduIGNvbnRyb2xsZXJcbiAgICBpZiAodGhpcy5jb250cm9sbGVyID09PSB1bmRlZmluZWQpIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG5cbiAgICBpZiAodGhpcy5jb250cm9sbGVyID09PSBjb250cm9sbGVyKSB7XG4gICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0aGlzLnZhbHVlO1xuICAgICAgdGhpcy5sYXN0UG9zaXRpb24gPSB0aGlzLnZhbHVlO1xuICAgICAgdGhpcy5sYXN0VmVsb2NpdHkgPSBjb250cm9sbGVyLmlzQWN0aXZlID8gdGhpcy5sYXN0VmVsb2NpdHkgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmxhc3RUaW1lID0gY29udHJvbGxlci5pc0FjdGl2ZSA/IHRoaXMubGFzdFRpbWUgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuYW5pbWF0ZWRTdHlsZXMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxufVxuXG5jbGFzcyBBbmltYXRlZEFycmF5IGV4dGVuZHMgQW5pbWF0ZWRBcnJheVdpdGhDaGlsZHJlbiB7XG4gIGNvbnN0cnVjdG9yKGFycmF5KSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgc3VwZXIoKTtcbiAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlLCBmbHVzaCkge1xuICAgICAgaWYgKGZsdXNoID09PSB2b2lkIDApIHtcbiAgICAgICAgZmx1c2ggPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gX3RoaXMucGF5bG9hZC5sZW5ndGgpIHZhbHVlLmZvckVhY2goKHYsIGkpID0+IF90aGlzLnBheWxvYWRbaV0uc2V0VmFsdWUodiwgZmx1c2gpKTtcbiAgICAgIH0gZWxzZSBfdGhpcy5wYXlsb2FkLmZvckVhY2goKHYsIGkpID0+IF90aGlzLnBheWxvYWRbaV0uc2V0VmFsdWUodmFsdWUsIGZsdXNoKSk7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0VmFsdWUgPSAoKSA9PiB0aGlzLnBheWxvYWQubWFwKHYgPT4gdi5nZXRWYWx1ZSgpKTtcblxuICAgIHRoaXMuaW50ZXJwb2xhdGUgPSAoY29uZmlnLCBhcmcpID0+IG5ldyBBbmltYXRlZEludGVycG9sYXRpb24odGhpcywgY29uZmlnLCBhcmcpO1xuXG4gICAgdGhpcy5wYXlsb2FkID0gYXJyYXkubWFwKG4gPT4gbmV3IEFuaW1hdGVkVmFsdWUobikpO1xuICB9XG5cbn1cblxuZnVuY3Rpb24gd2l0aERlZmF1bHQodmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xufVxuZnVuY3Rpb24gdG9BcnJheShhKSB7XG4gIHJldHVybiBhICE9PSB2b2lkIDAgPyBBcnJheS5pc0FycmF5KGEpID8gYSA6IFthXSA6IFtdO1xufVxuZnVuY3Rpb24gc2hhbGxvd0VxdWFsKGEsIGIpIHtcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhID09PSAnbnVtYmVyJykgcmV0dXJuIGEgPT09IGI7XG4gIGxldCBpO1xuXG4gIGZvciAoaSBpbiBhKSBpZiAoIShpIGluIGIpKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChpIGluIGIpIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGkgPT09IHZvaWQgMCA/IGEgPT09IGIgOiB0cnVlO1xufVxuZnVuY3Rpb24gY2FsbFByb3Aob2JqKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nID8gb2JqKC4uLmFyZ3MpIDogb2JqO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWVzJDEob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpLm1hcChrID0+IG9iamVjdFtrXSk7XG59XG5mdW5jdGlvbiBnZXRGb3J3YXJkUHJvcHMocHJvcHMpIHtcbiAgY29uc3QgdG8gPSBwcm9wcy50byxcbiAgICAgICAgZnJvbSA9IHByb3BzLmZyb20sXG4gICAgICAgIGNvbmZpZyA9IHByb3BzLmNvbmZpZyxcbiAgICAgICAgbmF0aXZlID0gcHJvcHMubmF0aXZlLFxuICAgICAgICBvblN0YXJ0ID0gcHJvcHMub25TdGFydCxcbiAgICAgICAgb25SZXN0ID0gcHJvcHMub25SZXN0LFxuICAgICAgICBvbkZyYW1lID0gcHJvcHMub25GcmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcmVzZXQgPSBwcm9wcy5yZXNldCxcbiAgICAgICAgcmV2ZXJzZSA9IHByb3BzLnJldmVyc2UsXG4gICAgICAgIGZvcmNlID0gcHJvcHMuZm9yY2UsXG4gICAgICAgIGltbWVkaWF0ZSA9IHByb3BzLmltbWVkaWF0ZSxcbiAgICAgICAgaW1wbCA9IHByb3BzLmltcGwsXG4gICAgICAgIGluamVjdCA9IHByb3BzLmluamVjdCxcbiAgICAgICAgZGVsYXkgPSBwcm9wcy5kZWxheSxcbiAgICAgICAgYXR0YWNoID0gcHJvcHMuYXR0YWNoLFxuICAgICAgICBkZXN0cm95ZWQgPSBwcm9wcy5kZXN0cm95ZWQsXG4gICAgICAgIGludGVycG9sYXRlVG8gPSBwcm9wcy5pbnRlcnBvbGF0ZVRvLFxuICAgICAgICBhdXRvU3RhcnQgPSBwcm9wcy5hdXRvU3RhcnQsXG4gICAgICAgIHJlZiA9IHByb3BzLnJlZixcbiAgICAgICAgZm9yd2FyZCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHByb3BzLCBbXCJ0b1wiLCBcImZyb21cIiwgXCJjb25maWdcIiwgXCJuYXRpdmVcIiwgXCJvblN0YXJ0XCIsIFwib25SZXN0XCIsIFwib25GcmFtZVwiLCBcImNoaWxkcmVuXCIsIFwicmVzZXRcIiwgXCJyZXZlcnNlXCIsIFwiZm9yY2VcIiwgXCJpbW1lZGlhdGVcIiwgXCJpbXBsXCIsIFwiaW5qZWN0XCIsIFwiZGVsYXlcIiwgXCJhdHRhY2hcIiwgXCJkZXN0cm95ZWRcIiwgXCJpbnRlcnBvbGF0ZVRvXCIsIFwiYXV0b1N0YXJ0XCIsIFwicmVmXCJdKTtcblxuICByZXR1cm4gZm9yd2FyZDtcbn1cbmZ1bmN0aW9uIGludGVycG9sYXRlVG8ocHJvcHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGdldEZvcndhcmRQcm9wcyhwcm9wcyk7XG4gIGNvbnN0IHJlc3QgPSBPYmplY3Qua2V5cyhwcm9wcykucmVkdWNlKChhLCBrKSA9PiBmb3J3YXJkW2tdICE9PSB2b2lkIDAgPyBhIDogX2V4dGVuZHMoe30sIGEsIHtcbiAgICBba106IHByb3BzW2tdXG4gIH0pLCB7fSk7XG4gIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgdG86IGZvcndhcmRcbiAgfSwgcmVzdCk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9BbmltYXRlZFZhbHVlKGFjYywgX3JlZikge1xuICBsZXQgbmFtZSA9IF9yZWZbMF0sXG4gICAgICB2YWx1ZSA9IF9yZWZbMV07XG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgYWNjLCB7XG4gICAgW25hbWVdOiBuZXcgKEFycmF5LmlzQXJyYXkodmFsdWUpID8gQW5pbWF0ZWRBcnJheSA6IEFuaW1hdGVkVmFsdWUpKHZhbHVlKVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRWYWx1ZXMocHJvcHMpIHtcbiAgY29uc3QgZnJvbSA9IHByb3BzLmZyb20sXG4gICAgICAgIHRvID0gcHJvcHMudG8sXG4gICAgICAgIG5hdGl2ZSA9IHByb3BzLm5hdGl2ZTtcbiAgY29uc3QgYWxsUHJvcHMgPSBPYmplY3QuZW50cmllcyhfZXh0ZW5kcyh7fSwgZnJvbSwgdG8pKTtcbiAgcmV0dXJuIG5hdGl2ZSA/IGFsbFByb3BzLnJlZHVjZShjb252ZXJ0VG9BbmltYXRlZFZhbHVlLCB7fSkgOiBfZXh0ZW5kcyh7fSwgZnJvbSwgdG8pO1xufVxuZnVuY3Rpb24gaGFuZGxlUmVmKHJlZiwgZm9yd2FyZCkge1xuICBpZiAoZm9yd2FyZCkge1xuICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgYXNzdW1lIGl0J3MgYSByZWYgY2FsbGJhY2tcbiAgICBpZiAodHlwZW9mIGZvcndhcmQgPT09ICdmdW5jdGlvbicpIGZvcndhcmQocmVmKTtlbHNlIGlmICh0eXBlb2YgZm9yd2FyZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIElmIGl0J3MgYW4gb2JqZWN0IGFuZCBoYXMgYSAnY3VycmVudCcgcHJvcGVydHksIGFzc3VtZSBpdCdzIGEgcmVmIG9iamVjdFxuICAgICAgZm9yd2FyZC5jdXJyZW50ID0gcmVmO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWY7XG59XG5cbmNvbnN0IGNoZWNrID0gdmFsdWUgPT4gdmFsdWUgPT09ICdhdXRvJztcblxuY29uc3Qgb3ZlcndyaXRlID0gKHdpZHRoLCBoZWlnaHQpID0+IChhY2MsIF9yZWYpID0+IHtcbiAgbGV0IG5hbWUgPSBfcmVmWzBdLFxuICAgICAgdmFsdWUgPSBfcmVmWzFdO1xuICByZXR1cm4gX2V4dGVuZHMoe30sIGFjYywge1xuICAgIFtuYW1lXTogdmFsdWUgPT09ICdhdXRvJyA/IH5uYW1lLmluZGV4T2YoJ2hlaWdodCcpID8gaGVpZ2h0IDogd2lkdGggOiB2YWx1ZVxuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGZpeEF1dG8ocHJvcHMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGZyb20gPSBwcm9wcy5mcm9tLFxuICAgICAgICB0byA9IHByb3BzLnRvLFxuICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuOyAvLyBEcnktcm91dGUgcHJvcHMgYmFjayBpZiBub3RoaW5nJ3MgdXNpbmcgJ2F1dG8nIGluIHRoZXJlXG4gIC8vIFRPRE86IGRlYWwgd2l0aCBcIm51bGxcIlxuXG4gIGlmICghKGdldFZhbHVlcyQxKHRvKS5zb21lKGNoZWNrKSB8fCBnZXRWYWx1ZXMkMShmcm9tKS5zb21lKGNoZWNrKSkpIHJldHVybjsgLy8gRmV0Y2ggcmVuZGVyIHYtZG9tXG5cbiAgbGV0IGVsZW1lbnQgPSBjaGlsZHJlbihjb252ZXJ0VmFsdWVzKHByb3BzKSk7IC8vIEEgc3ByaW5nIGNhbiByZXR1cm4gdW5kZWZpbmVkL251bGwsIGNoZWNrIGFnYWluc3QgdGhhdCAoIzE1MylcblxuICBpZiAoIWVsZW1lbnQpIHJldHVybjsgLy8gT3IgaXQgY291bGQgYmUgYW4gYXJyYXkgKCMzNDYpIC4uLlxuXG4gIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSBlbGVtZW50ID0ge1xuICAgIHR5cGU6ICdkaXYnLFxuICAgIHByb3BzOiB7XG4gICAgICBjaGlsZHJlbjogZWxlbWVudFxuICAgIH0gLy8gRXh0cmFjdCBzdHlsZXNcblxuICB9O1xuICBjb25zdCBlbGVtZW50U3R5bGVzID0gZWxlbWVudC5wcm9wcy5zdHlsZTsgLy8gUmV0dXJuIHYuZG9tIHdpdGggaW5qZWN0ZWQgcmVmXG5cbiAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZWxlbWVudC50eXBlLCBfZXh0ZW5kcyh7XG4gICAga2V5OiBlbGVtZW50LmtleSA/IGVsZW1lbnQua2V5IDogdW5kZWZpbmVkXG4gIH0sIGVsZW1lbnQucHJvcHMsIHtcbiAgICBzdHlsZTogX2V4dGVuZHMoe30sIGVsZW1lbnRTdHlsZXMsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbidcbiAgICB9KSxcbiAgICByZWY6IF9yZWYyID0+IHtcbiAgICAgIGlmIChfcmVmMikge1xuICAgICAgICAvLyBPbmNlIGl0J3MgcmVuZGVyZWQgb3V0LCBmZXRjaCBib3VuZHMgKG1pbnVzIHBhZGRpbmcvbWFyZ2luL2JvcmRlcnMpXG4gICAgICAgIGxldCBub2RlID0gUmVhY3RET00uZmluZERPTU5vZGUoX3JlZjIpO1xuICAgICAgICBsZXQgd2lkdGgsIGhlaWdodDtcbiAgICAgICAgbGV0IGNzID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcblxuICAgICAgICBpZiAoY3MuYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAgICAgICB3aWR0aCA9IG5vZGUub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgaGVpZ2h0ID0gbm9kZS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcGFkZGluZ1ggPSBwYXJzZUZsb2F0KGNzLnBhZGRpbmdMZWZ0IHx8IDApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nUmlnaHQgfHwgMCk7XG4gICAgICAgICAgY29uc3QgcGFkZGluZ1kgPSBwYXJzZUZsb2F0KGNzLnBhZGRpbmdUb3AgfHwgMCkgKyBwYXJzZUZsb2F0KGNzLnBhZGRpbmdCb3R0b20gfHwgMCk7XG4gICAgICAgICAgY29uc3QgYm9yZGVyWCA9IHBhcnNlRmxvYXQoY3MuYm9yZGVyTGVmdFdpZHRoIHx8IDApICsgcGFyc2VGbG9hdChjcy5ib3JkZXJSaWdodFdpZHRoIHx8IDApO1xuICAgICAgICAgIGNvbnN0IGJvcmRlclkgPSBwYXJzZUZsb2F0KGNzLmJvcmRlclRvcFdpZHRoIHx8IDApICsgcGFyc2VGbG9hdChjcy5ib3JkZXJCb3R0b21XaWR0aCB8fCAwKTtcbiAgICAgICAgICB3aWR0aCA9IG5vZGUub2Zmc2V0V2lkdGggLSBwYWRkaW5nWCAtIGJvcmRlclg7XG4gICAgICAgICAgaGVpZ2h0ID0gbm9kZS5vZmZzZXRIZWlnaHQgLSBwYWRkaW5nWSAtIGJvcmRlclk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb252ZXJ0ID0gb3ZlcndyaXRlKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjYWxsYmFjayhfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgICBmcm9tOiBPYmplY3QuZW50cmllcyhmcm9tKS5yZWR1Y2UoY29udmVydCwgZnJvbSksXG4gICAgICAgICAgdG86IE9iamVjdC5lbnRyaWVzKHRvKS5yZWR1Y2UoY29udmVydCwgdG8pXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pKTtcbn1cblxubGV0IGlzVW5pdGxlc3NOdW1iZXIgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZFJvdzogdHJ1ZSxcbiAgZ3JpZFJvd0VuZDogdHJ1ZSxcbiAgZ3JpZFJvd1NwYW46IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblNwYW46IHRydWUsXG4gIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcbiAgZm9udFdlaWdodDogdHJ1ZSxcbiAgbGluZUNsYW1wOiB0cnVlLFxuICBsaW5lSGVpZ2h0OiB0cnVlLFxuICBvcGFjaXR5OiB0cnVlLFxuICBvcmRlcjogdHJ1ZSxcbiAgb3JwaGFuczogdHJ1ZSxcbiAgdGFiU2l6ZTogdHJ1ZSxcbiAgd2lkb3dzOiB0cnVlLFxuICB6SW5kZXg6IHRydWUsXG4gIHpvb206IHRydWUsXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IHRydWUsXG4gIGZsb29kT3BhY2l0eTogdHJ1ZSxcbiAgc3RvcE9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZURhc2hhcnJheTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSxcbiAgc3Ryb2tlT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlV2lkdGg6IHRydWVcbn07XG5cbmNvbnN0IHByZWZpeEtleSA9IChwcmVmaXgsIGtleSkgPT4gcHJlZml4ICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cmluZygxKTtcblxuY29uc3QgcHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdNcycsICdNb3onLCAnTyddO1xuaXNVbml0bGVzc051bWJlciA9IE9iamVjdC5rZXlzKGlzVW5pdGxlc3NOdW1iZXIpLnJlZHVjZSgoYWNjLCBwcm9wKSA9PiB7XG4gIHByZWZpeGVzLmZvckVhY2gocHJlZml4ID0+IGFjY1twcmVmaXhLZXkocHJlZml4LCBwcm9wKV0gPSBhY2NbcHJvcF0pO1xuICByZXR1cm4gYWNjO1xufSwgaXNVbml0bGVzc051bWJlcik7XG5cbmZ1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSwgdmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgaWYgKHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gJyc7XG4gIGlmICghaXNDdXN0b21Qcm9wZXJ0eSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSAwICYmICEoaXNVbml0bGVzc051bWJlci5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBpc1VuaXRsZXNzTnVtYmVyW25hbWVdKSkgcmV0dXJuIHZhbHVlICsgJ3B4JzsgLy8gUHJlc3VtZXMgaW1wbGljaXQgJ3B4JyBzdWZmaXggZm9yIHVuaXRsZXNzIG51bWJlcnNcblxuICByZXR1cm4gKCcnICsgdmFsdWUpLnRyaW0oKTtcbn1cblxuY29uc3QgYXR0cmlidXRlQ2FjaGUgPSB7fTtcbmluamVjdENyZWF0ZUFuaW1hdGVkU3R5bGUoc3R5bGUgPT4gbmV3IEFuaW1hdGVkU3R5bGUoc3R5bGUpKTtcbmluamVjdERlZmF1bHRFbGVtZW50KCdkaXYnKTtcbmluamVjdEludGVycG9sYXRpb24oY3JlYXRlSW50ZXJwb2xhdGlvbik7XG5pbmplY3RDb2xvck5hbWVzKGNvbG9ycyk7XG5pbmplY3RCdWdmaXhlcyhmaXhBdXRvKTtcbmluamVjdEFwcGx5QW5pbWF0ZWRWYWx1ZXMoKGluc3RhbmNlLCBwcm9wcykgPT4ge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgJiYgaW5zdGFuY2Uuc2V0QXR0cmlidXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgc2Nyb2xsVG9wID0gcHJvcHMuc2Nyb2xsVG9wLFxuICAgICAgICAgIHNjcm9sbExlZnQgPSBwcm9wcy5zY3JvbGxMZWZ0LFxuICAgICAgICAgIGF0dHJpYnV0ZXMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgW1wic3R5bGVcIiwgXCJjaGlsZHJlblwiLCBcInNjcm9sbFRvcFwiLCBcInNjcm9sbExlZnRcIl0pO1xuXG4gICAgaWYgKHNjcm9sbFRvcCAhPT0gdm9pZCAwKSBpbnN0YW5jZS5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgaWYgKHNjcm9sbExlZnQgIT09IHZvaWQgMCkgaW5zdGFuY2Uuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7IC8vIFNldCB0ZXh0Q29udGVudCwgaWYgY2hpbGRyZW4gaXMgYW4gYW5pbWF0YWJsZSB2YWx1ZVxuXG4gICAgaWYgKGNoaWxkcmVuICE9PSB2b2lkIDApIGluc3RhbmNlLnRleHRDb250ZW50ID0gY2hpbGRyZW47IC8vIFNldCBzdHlsZXMgLi4uXG5cbiAgICBmb3IgKGxldCBzdHlsZU5hbWUgaW4gc3R5bGUpIHtcbiAgICAgIGlmICghc3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkgY29udGludWU7XG4gICAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuICAgICAgdmFyIHN0eWxlVmFsdWUgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVbc3R5bGVOYW1lXSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG4gICAgICBpZiAoc3R5bGVOYW1lID09PSAnZmxvYXQnKSBzdHlsZU5hbWUgPSAnY3NzRmxvYXQnO1xuICAgICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIGluc3RhbmNlLnN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7ZWxzZSBpbnN0YW5jZS5zdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTtcbiAgICB9IC8vIFNldCBhdHRyaWJ1dGVzIC4uLlxuXG5cbiAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIC8vIEF0dHJpYnV0ZXMgYXJlIHdyaXR0ZW4gaW4gZGFzaCBjYXNlXG4gICAgICBjb25zdCBkYXNoQ2FzZSA9IGF0dHJpYnV0ZUNhY2hlW25hbWVdIHx8IChhdHRyaWJ1dGVDYWNoZVtuYW1lXSA9IG5hbWUucmVwbGFjZSgvKFtBLVpdKS9nLCBuID0+ICctJyArIG4udG9Mb3dlckNhc2UoKSkpO1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoZGFzaENhc2UpICE9PSAndW5kZWZpbmVkJykgaW5zdGFuY2Uuc2V0QXR0cmlidXRlKGRhc2hDYXNlLCBhdHRyaWJ1dGVzW25hbWVdKTtcbiAgICB9XG4gIH0gZWxzZSByZXR1cm4gZmFsc2U7XG59LCBzdHlsZSA9PiBzdHlsZSk7XG5cbmxldCBhY3RpdmUgPSBmYWxzZTtcbmNvbnN0IGNvbnRyb2xsZXJzID0gbmV3IFNldCgpO1xuXG5jb25zdCBmcmFtZUxvb3AgPSAoKSA9PiB7XG4gIGxldCB0aW1lID0gbm93KCk7XG5cbiAgZm9yIChsZXQgY29udHJvbGxlciBvZiBjb250cm9sbGVycykge1xuICAgIGxldCBpc0RvbmUgPSB0cnVlO1xuICAgIGxldCBub0NoYW5nZSA9IHRydWU7XG5cbiAgICBmb3IgKGxldCBjb25maWdJZHggPSAwOyBjb25maWdJZHggPCBjb250cm9sbGVyLmNvbmZpZ3MubGVuZ3RoOyBjb25maWdJZHgrKykge1xuICAgICAgbGV0IGNvbmZpZyA9IGNvbnRyb2xsZXIuY29uZmlnc1tjb25maWdJZHhdO1xuICAgICAgbGV0IGVuZE9mQW5pbWF0aW9uLCBsYXN0VGltZTtcblxuICAgICAgZm9yIChsZXQgdmFsSWR4ID0gMDsgdmFsSWR4IDwgY29uZmlnLmFuaW1hdGVkVmFsdWVzLmxlbmd0aDsgdmFsSWR4KyspIHtcbiAgICAgICAgbGV0IGFuaW1hdGlvbiA9IGNvbmZpZy5hbmltYXRlZFZhbHVlc1t2YWxJZHhdOyAvLyBJZiBhbiBhbmltYXRpb24gaXMgZG9uZSwgc2tpcCwgdW50aWwgYWxsIG9mIHRoZW0gY29uY2x1ZGVcblxuICAgICAgICBpZiAoYW5pbWF0aW9uLmRvbmUpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgZnJvbSA9IGNvbmZpZy5mcm9tVmFsdWVzW3ZhbElkeF07XG4gICAgICAgIGxldCB0byA9IGNvbmZpZy50b1ZhbHVlc1t2YWxJZHhdO1xuICAgICAgICBsZXQgcG9zaXRpb24gPSBhbmltYXRpb24ubGFzdFBvc2l0aW9uO1xuICAgICAgICBsZXQgaXNBbmltYXRlZCA9IHRvIGluc3RhbmNlb2YgQW5pbWF0ZWQ7XG4gICAgICAgIGxldCB2ZWxvY2l0eSA9IEFycmF5LmlzQXJyYXkoY29uZmlnLmluaXRpYWxWZWxvY2l0eSkgPyBjb25maWcuaW5pdGlhbFZlbG9jaXR5W3ZhbElkeF0gOiBjb25maWcuaW5pdGlhbFZlbG9jaXR5O1xuICAgICAgICBpZiAoaXNBbmltYXRlZCkgdG8gPSB0by5nZXRWYWx1ZSgpOyAvLyBDb25jbHVkZSBhbmltYXRpb24gaWYgaXQncyBlaXRoZXIgaW1tZWRpYXRlLCBvciBmcm9tLXZhbHVlcyBtYXRjaCBlbmQtc3RhdGVcblxuICAgICAgICBpZiAoY29uZmlnLmltbWVkaWF0ZSB8fCAhaXNBbmltYXRlZCAmJiAhY29uZmlnLmRlY2F5ICYmIGZyb20gPT09IHRvKSB7XG4gICAgICAgICAgYW5pbWF0aW9uLnVwZGF0ZVZhbHVlKHRvKTtcbiAgICAgICAgICBhbmltYXRpb24uZG9uZSA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gRG9pbmcgZGVsYXkgaGVyZSBpbnN0ZWFkIG9mIHNldFRpbWVvdXQgaXMgb25lIGFzeW5jIHdvcnJ5IGxlc3NcblxuXG4gICAgICAgIGlmIChjb25maWcuZGVsYXkgJiYgdGltZSAtIGNvbnRyb2xsZXIuc3RhcnRUaW1lIDwgY29uZmlnLmRlbGF5KSB7XG4gICAgICAgICAgaXNEb25lID0gZmFsc2U7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gRmxhZyBjaGFuZ2VcblxuXG4gICAgICAgIG5vQ2hhbmdlID0gZmFsc2U7IC8vIEJyZWFrIGFuaW1hdGlvbiB3aGVuIHN0cmluZyB2YWx1ZXMgYXJlIGludm9sdmVkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgYW5pbWF0aW9uLnVwZGF0ZVZhbHVlKHRvKTtcbiAgICAgICAgICBhbmltYXRpb24uZG9uZSA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLmR1cmF0aW9uICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAvKiogRHVyYXRpb24gZWFzaW5nICovXG4gICAgICAgICAgcG9zaXRpb24gPSBmcm9tICsgY29uZmlnLmVhc2luZygodGltZSAtIGNvbnRyb2xsZXIuc3RhcnRUaW1lIC0gY29uZmlnLmRlbGF5KSAvIGNvbmZpZy5kdXJhdGlvbikgKiAodG8gLSBmcm9tKTtcbiAgICAgICAgICBlbmRPZkFuaW1hdGlvbiA9IHRpbWUgPj0gY29udHJvbGxlci5zdGFydFRpbWUgKyBjb25maWcuZGVsYXkgKyBjb25maWcuZHVyYXRpb247XG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlY2F5KSB7XG4gICAgICAgICAgLyoqIERlY2F5IGVhc2luZyAqL1xuICAgICAgICAgIHBvc2l0aW9uID0gZnJvbSArIHZlbG9jaXR5IC8gKDEgLSAwLjk5OCkgKiAoMSAtIE1hdGguZXhwKC0oMSAtIDAuOTk4KSAqICh0aW1lIC0gY29udHJvbGxlci5zdGFydFRpbWUpKSk7XG4gICAgICAgICAgZW5kT2ZBbmltYXRpb24gPSBNYXRoLmFicyhhbmltYXRpb24ubGFzdFBvc2l0aW9uIC0gcG9zaXRpb24pIDwgMC4xO1xuICAgICAgICAgIGlmIChlbmRPZkFuaW1hdGlvbikgdG8gPSBwb3NpdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogU3ByaW5nIGVhc2luZyAqL1xuICAgICAgICAgIGxhc3RUaW1lID0gYW5pbWF0aW9uLmxhc3RUaW1lICE9PSB2b2lkIDAgPyBhbmltYXRpb24ubGFzdFRpbWUgOiB0aW1lO1xuICAgICAgICAgIHZlbG9jaXR5ID0gYW5pbWF0aW9uLmxhc3RWZWxvY2l0eSAhPT0gdm9pZCAwID8gYW5pbWF0aW9uLmxhc3RWZWxvY2l0eSA6IGNvbmZpZy5pbml0aWFsVmVsb2NpdHk7IC8vIElmIHdlIGxvc3QgYSBsb3Qgb2YgZnJhbWVzIGp1c3QganVtcCB0byB0aGUgZW5kLlxuXG4gICAgICAgICAgaWYgKHRpbWUgPiBsYXN0VGltZSArIDY0KSBsYXN0VGltZSA9IHRpbWU7IC8vIGh0dHA6Ly9nYWZmZXJvbmdhbWVzLmNvbS9nYW1lLXBoeXNpY3MvZml4LXlvdXItdGltZXN0ZXAvXG5cbiAgICAgICAgICBsZXQgbnVtU3RlcHMgPSBNYXRoLmZsb29yKHRpbWUgLSBsYXN0VGltZSk7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVN0ZXBzOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBmb3JjZSA9IC1jb25maWcudGVuc2lvbiAqIChwb3NpdGlvbiAtIHRvKTtcbiAgICAgICAgICAgIGxldCBkYW1waW5nID0gLWNvbmZpZy5mcmljdGlvbiAqIHZlbG9jaXR5O1xuICAgICAgICAgICAgbGV0IGFjY2VsZXJhdGlvbiA9IChmb3JjZSArIGRhbXBpbmcpIC8gY29uZmlnLm1hc3M7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IHZlbG9jaXR5ICsgYWNjZWxlcmF0aW9uICogMSAvIDEwMDA7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICsgdmVsb2NpdHkgKiAxIC8gMTAwMDtcbiAgICAgICAgICB9IC8vIENvbmRpdGlvbnMgZm9yIHN0b3BwaW5nIHRoZSBzcHJpbmcgYW5pbWF0aW9uXG5cblxuICAgICAgICAgIGxldCBpc092ZXJzaG9vdGluZyA9IGNvbmZpZy5jbGFtcCAmJiBjb25maWcudGVuc2lvbiAhPT0gMCA/IGZyb20gPCB0byA/IHBvc2l0aW9uID4gdG8gOiBwb3NpdGlvbiA8IHRvIDogZmFsc2U7XG4gICAgICAgICAgbGV0IGlzVmVsb2NpdHkgPSBNYXRoLmFicyh2ZWxvY2l0eSkgPD0gY29uZmlnLnByZWNpc2lvbjtcbiAgICAgICAgICBsZXQgaXNEaXNwbGFjZW1lbnQgPSBjb25maWcudGVuc2lvbiAhPT0gMCA/IE1hdGguYWJzKHRvIC0gcG9zaXRpb24pIDw9IGNvbmZpZy5wcmVjaXNpb24gOiB0cnVlO1xuICAgICAgICAgIGVuZE9mQW5pbWF0aW9uID0gaXNPdmVyc2hvb3RpbmcgfHwgaXNWZWxvY2l0eSAmJiBpc0Rpc3BsYWNlbWVudDtcbiAgICAgICAgICBhbmltYXRpb24ubGFzdFZlbG9jaXR5ID0gdmVsb2NpdHk7XG4gICAgICAgICAgYW5pbWF0aW9uLmxhc3RUaW1lID0gdGltZTtcbiAgICAgICAgfSAvLyBUcmFpbHMgYXJlbid0IGRvbmUgdW50aWwgdGhlaXIgcGFyZW50cyBjb25jbHVkZVxuXG5cbiAgICAgICAgaWYgKGlzQW5pbWF0ZWQgJiYgIWNvbmZpZy50b1ZhbHVlc1t2YWxJZHhdLmRvbmUpIGVuZE9mQW5pbWF0aW9uID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGVuZE9mQW5pbWF0aW9uKSB7XG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgZW5kIHVwIHdpdGggYSByb3VuZCB2YWx1ZVxuICAgICAgICAgIGlmIChhbmltYXRpb24udmFsdWUgIT09IHRvKSBwb3NpdGlvbiA9IHRvO1xuICAgICAgICAgIGFuaW1hdGlvbi5kb25lID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlzRG9uZSA9IGZhbHNlO1xuXG4gICAgICAgIGFuaW1hdGlvbi51cGRhdGVWYWx1ZShwb3NpdGlvbik7XG4gICAgICAgIGFuaW1hdGlvbi5sYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICAgIH0gLy8gS2VlcCB0cmFjayBvZiB1cGRhdGVkIHZhbHVlcyBvbmx5IHdoZW4gbmVjZXNzYXJ5XG5cblxuICAgICAgaWYgKGNvbnRyb2xsZXIucHJvcHMub25GcmFtZSB8fCAhY29udHJvbGxlci5wcm9wcy5uYXRpdmUpIGNvbnRyb2xsZXIuYW5pbWF0ZWRQcm9wc1tjb25maWcubmFtZV0gPSBjb25maWcuaW50ZXJwb2xhdGlvbi5nZXRWYWx1ZSgpO1xuICAgIH0gLy8gVXBkYXRlIGNhbGxiYWNrcyBpbiB0aGUgZW5kIG9mIHRoZSBmcmFtZVxuXG5cbiAgICBpZiAoY29udHJvbGxlci5wcm9wcy5vbkZyYW1lIHx8ICFjb250cm9sbGVyLnByb3BzLm5hdGl2ZSkge1xuICAgICAgaWYgKCFjb250cm9sbGVyLnByb3BzLm5hdGl2ZSAmJiBjb250cm9sbGVyLm9uVXBkYXRlKSBjb250cm9sbGVyLm9uVXBkYXRlKCk7XG4gICAgICBpZiAoY29udHJvbGxlci5wcm9wcy5vbkZyYW1lKSBjb250cm9sbGVyLnByb3BzLm9uRnJhbWUoY29udHJvbGxlci5hbmltYXRlZFByb3BzKTtcbiAgICB9IC8vIEVpdGhlciBjYWxsIG9uRW5kIG9yIG5leHQgZnJhbWVcblxuXG4gICAgaWYgKGlzRG9uZSkge1xuICAgICAgY29udHJvbGxlcnMuZGVsZXRlKGNvbnRyb2xsZXIpO1xuICAgICAgY29udHJvbGxlci5kZWJvdW5jZWRPbkVuZCh7XG4gICAgICAgIGZpbmlzaGVkOiB0cnVlLFxuICAgICAgICBub0NoYW5nZVxuICAgICAgfSk7XG4gICAgfVxuICB9IC8vIExvb3Agb3ZlciBhcyBsb25nIGFzIHRoZXJlIGFyZSBjb250cm9sbGVycyAuLi5cblxuXG4gIGlmIChjb250cm9sbGVycy5zaXplKSByZXF1ZXN0RnJhbWUoZnJhbWVMb29wKTtlbHNlIGFjdGl2ZSA9IGZhbHNlO1xufTtcblxuY29uc3QgYWRkQ29udHJvbGxlciA9IGNvbnRyb2xsZXIgPT4ge1xuICBpZiAoIWNvbnRyb2xsZXJzLmhhcyhjb250cm9sbGVyKSkge1xuICAgIGNvbnRyb2xsZXJzLmFkZChjb250cm9sbGVyKTtcbiAgICBpZiAoIWFjdGl2ZSkgcmVxdWVzdEZyYW1lKGZyYW1lTG9vcCk7XG4gICAgYWN0aXZlID0gdHJ1ZTtcbiAgfVxufTtcblxuY29uc3QgcmVtb3ZlQ29udHJvbGxlciA9IGNvbnRyb2xsZXIgPT4ge1xuICBpZiAoY29udHJvbGxlcnMuaGFzKGNvbnRyb2xsZXIpKSB7XG4gICAgY29udHJvbGxlcnMuZGVsZXRlKGNvbnRyb2xsZXIpO1xuICB9XG59O1xuXG5jbGFzcyBDb250cm9sbGVyIHtcbiAgY29uc3RydWN0b3IocHJvcHMsIGNvbmZpZykge1xuICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkge1xuICAgICAgY29uZmlnID0ge1xuICAgICAgICBuYXRpdmU6IHRydWUsXG4gICAgICAgIGludGVycG9sYXRlVG86IHRydWUsXG4gICAgICAgIGF1dG9TdGFydDogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmdldFZhbHVlcyA9ICgpID0+IHRoaXMucHJvcHMubmF0aXZlID8gdGhpcy5pbnRlcnBvbGF0aW9ucyA6IHRoaXMuYW5pbWF0ZWRQcm9wcztcblxuICAgIHRoaXMuZGVwZW5kZW50cyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5oYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdGhpcy5wcm9wcyA9IHt9O1xuICAgIHRoaXMubWVyZ2VkID0ge307XG4gICAgdGhpcy5hbmltYXRpb25zID0ge307XG4gICAgdGhpcy5pbnRlcnBvbGF0aW9ucyA9IHt9O1xuICAgIHRoaXMuYW5pbWF0ZWRQcm9wcyA9IHt9O1xuICAgIHRoaXMuY29uZmlncyA9IFtdO1xuICAgIHRoaXMuZnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdGFydFRpbWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5sYXN0VGltZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVwZGF0ZShfZXh0ZW5kcyh7fSwgcHJvcHMsIGNvbmZpZykpO1xuICB9XG5cbiAgdXBkYXRlKHByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IF9leHRlbmRzKHt9LCB0aGlzLnByb3BzLCBwcm9wcyk7XG5cbiAgICBsZXQgX3JlZiA9IHRoaXMucHJvcHMuaW50ZXJwb2xhdGVUbyA/IGludGVycG9sYXRlVG8odGhpcy5wcm9wcykgOiB0aGlzLnByb3BzLFxuICAgICAgICBfcmVmJGZyb20gPSBfcmVmLmZyb20sXG4gICAgICAgIGZyb20gPSBfcmVmJGZyb20gPT09IHZvaWQgMCA/IHt9IDogX3JlZiRmcm9tLFxuICAgICAgICBfcmVmJHRvID0gX3JlZi50byxcbiAgICAgICAgdG8gPSBfcmVmJHRvID09PSB2b2lkIDAgPyB7fSA6IF9yZWYkdG8sXG4gICAgICAgIF9yZWYkY29uZmlnID0gX3JlZi5jb25maWcsXG4gICAgICAgIGNvbmZpZyA9IF9yZWYkY29uZmlnID09PSB2b2lkIDAgPyB7fSA6IF9yZWYkY29uZmlnLFxuICAgICAgICBfcmVmJGRlbGF5ID0gX3JlZi5kZWxheSxcbiAgICAgICAgZGVsYXkgPSBfcmVmJGRlbGF5ID09PSB2b2lkIDAgPyAwIDogX3JlZiRkZWxheSxcbiAgICAgICAgcmV2ZXJzZSA9IF9yZWYucmV2ZXJzZSxcbiAgICAgICAgYXR0YWNoID0gX3JlZi5hdHRhY2gsXG4gICAgICAgIHJlc2V0ID0gX3JlZi5yZXNldCxcbiAgICAgICAgaW1tZWRpYXRlID0gX3JlZi5pbW1lZGlhdGUsXG4gICAgICAgIGF1dG9TdGFydCA9IF9yZWYuYXV0b1N0YXJ0LFxuICAgICAgICByZWYgPSBfcmVmLnJlZjsgLy8gUmV2ZXJzZSB2YWx1ZXMgd2hlbiByZXF1ZXN0ZWRcblxuXG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHZhciBfcmVmMiA9IFt0bywgZnJvbV07XG4gICAgICBmcm9tID0gX3JlZjJbMF07XG4gICAgICB0byA9IF9yZWYyWzFdO1xuICAgIH1cblxuICAgIHRoaXMuaGFzQ2hhbmdlZCA9IGZhbHNlOyAvLyBBdHRhY2htZW50IGhhbmRsaW5nLCB0cmFpbGVkIHNwcmluZ3MgY2FuIFwiYXR0YWNoXCIgdGhlbXNlbHZlcyB0byBhIHByZXZpb3VzIHNwcmluZ1xuXG4gICAgbGV0IHRhcmdldCA9IGF0dGFjaCAmJiBhdHRhY2godGhpcyk7IC8vIFJlc2V0IG1lcmdlZCBwcm9wcyB3aGVuIG5lY2Vzc2FyeVxuXG4gICAgbGV0IGV4dHJhID0gcmVzZXQgPyB7fSA6IHRoaXMubWVyZ2VkOyAvLyBUaGlzIHdpbGwgY29sbGVjdCBhbGwgcHJvcHMgdGhhdCB3ZXJlIGV2ZXIgc2V0XG5cbiAgICB0aGlzLm1lcmdlZCA9IF9leHRlbmRzKHt9LCBmcm9tLCBleHRyYSwgdG8pOyAvLyBSZWR1Y2VzIGlucHV0IHsgbmFtZTogdmFsdWUgfSBwYWlycyBpbnRvIGFuaW1hdGVkIHZhbHVlc1xuXG4gICAgdGhpcy5hbmltYXRpb25zID0gT2JqZWN0LmVudHJpZXModGhpcy5tZXJnZWQpLnJlZHVjZSgoYWNjLCBfcmVmMywgaSkgPT4ge1xuICAgICAgbGV0IG5hbWUgPSBfcmVmM1swXSxcbiAgICAgICAgICB2YWx1ZSA9IF9yZWYzWzFdO1xuICAgICAgLy8gSXNzdWUgY2FjaGVkIGVudHJpZXMsIGV4Y2VwdCBvbiByZXNldFxuICAgICAgbGV0IGVudHJ5ID0gIXJlc2V0ICYmIGFjY1tuYW1lXSB8fCB7fTsgLy8gRmlndXJlIG91dCB3aGF0IHRoZSB2YWx1ZSBpcyBzdXBwb3NlZCB0byBiZVxuXG4gICAgICBjb25zdCBpc051bWJlciA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoJyMnKSAmJiAhL1xcZC8udGVzdCh2YWx1ZSkgJiYgIWNvbG9yTmFtZXNbdmFsdWVdO1xuICAgICAgY29uc3QgaXNBcnJheSA9ICFpc051bWJlciAmJiAhaXNTdHJpbmcgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gICAgICBsZXQgZnJvbVZhbHVlID0gZnJvbVtuYW1lXSAhPT0gdW5kZWZpbmVkID8gZnJvbVtuYW1lXSA6IHZhbHVlO1xuICAgICAgbGV0IHRvVmFsdWUgPSBpc051bWJlciB8fCBpc0FycmF5ID8gdmFsdWUgOiBpc1N0cmluZyA/IHZhbHVlIDogMTtcbiAgICAgIGxldCB0b0NvbmZpZyA9IGNhbGxQcm9wKGNvbmZpZywgbmFtZSk7XG4gICAgICBpZiAodGFyZ2V0KSB0b1ZhbHVlID0gdGFyZ2V0LmFuaW1hdGlvbnNbbmFtZV0ucGFyZW50OyAvLyBEZXRlY3QgY2hhbmdlcywgYW5pbWF0ZWQgdmFsdWVzIHdpbGwgYmUgY2hlY2tlZCBpbiB0aGUgcmFmLWxvb3BcblxuICAgICAgaWYgKHRvQ29uZmlnLmRlY2F5ICE9PSB2b2lkIDAgfHwgIXNoYWxsb3dFcXVhbChlbnRyeS5jaGFuZ2VzLCB2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5oYXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHBhcmVudCwgaW50ZXJwb2xhdGlvbiQkMTtcbiAgICAgICAgaWYgKGlzTnVtYmVyIHx8IGlzU3RyaW5nKSBwYXJlbnQgPSBpbnRlcnBvbGF0aW9uJCQxID0gZW50cnkucGFyZW50IHx8IG5ldyBBbmltYXRlZFZhbHVlKGZyb21WYWx1ZSk7ZWxzZSBpZiAoaXNBcnJheSkgcGFyZW50ID0gaW50ZXJwb2xhdGlvbiQkMSA9IGVudHJ5LnBhcmVudCB8fCBuZXcgQW5pbWF0ZWRBcnJheShmcm9tVmFsdWUpO2Vsc2Uge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSBlbnRyeS5pbnRlcnBvbGF0aW9uICYmIGVudHJ5LmludGVycG9sYXRpb24uY2FsYyhlbnRyeS5wYXJlbnQudmFsdWUpO1xuXG4gICAgICAgICAgaWYgKGVudHJ5LnBhcmVudCkge1xuICAgICAgICAgICAgcGFyZW50ID0gZW50cnkucGFyZW50O1xuICAgICAgICAgICAgcGFyZW50LnNldFZhbHVlKDAsIGZhbHNlKTtcbiAgICAgICAgICB9IGVsc2UgcGFyZW50ID0gbmV3IEFuaW1hdGVkVmFsdWUoMCk7XG5cbiAgICAgICAgICBjb25zdCByYW5nZSA9IHtcbiAgICAgICAgICAgIG91dHB1dDogW3ByZXYgIT09IHZvaWQgMCA/IHByZXYgOiBmcm9tVmFsdWUsIHZhbHVlXVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoZW50cnkuaW50ZXJwb2xhdGlvbikge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiQkMSA9IGVudHJ5LmludGVycG9sYXRpb247XG4gICAgICAgICAgICBlbnRyeS5pbnRlcnBvbGF0aW9uLnVwZGF0ZUNvbmZpZyhyYW5nZSk7XG4gICAgICAgICAgfSBlbHNlIGludGVycG9sYXRpb24kJDEgPSBwYXJlbnQuaW50ZXJwb2xhdGUocmFuZ2UpO1xuICAgICAgICB9IC8vIFNldCBpbW1lZGlhdGUgdmFsdWVzXG5cbiAgICAgICAgaWYgKGNhbGxQcm9wKGltbWVkaWF0ZSwgbmFtZSkpIHBhcmVudC5zZXRWYWx1ZSh2YWx1ZSwgZmFsc2UpOyAvLyBSZXNldCBhbmltYXRlZCB2YWx1ZXNcblxuICAgICAgICBjb25zdCBhbmltYXRlZFZhbHVlcyA9IHRvQXJyYXkocGFyZW50LmdldFBheWxvYWQoKSk7XG4gICAgICAgIGFuaW1hdGVkVmFsdWVzLmZvckVhY2godmFsdWUgPT4gdmFsdWUucHJlcGFyZSh0aGlzKSk7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgYWNjLCB7XG4gICAgICAgICAgW25hbWVdOiBfZXh0ZW5kcyh7fSwgZW50cnksIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uOiBpbnRlcnBvbGF0aW9uJCQxLFxuICAgICAgICAgICAgYW5pbWF0ZWRWYWx1ZXMsXG4gICAgICAgICAgICBjaGFuZ2VzOiB2YWx1ZSxcbiAgICAgICAgICAgIGZyb21WYWx1ZXM6IHRvQXJyYXkocGFyZW50LmdldFZhbHVlKCkpLFxuICAgICAgICAgICAgdG9WYWx1ZXM6IHRvQXJyYXkodGFyZ2V0ID8gdG9WYWx1ZS5nZXRQYXlsb2FkKCkgOiB0b1ZhbHVlKSxcbiAgICAgICAgICAgIGltbWVkaWF0ZTogY2FsbFByb3AoaW1tZWRpYXRlLCBuYW1lKSxcbiAgICAgICAgICAgIGRlbGF5OiB3aXRoRGVmYXVsdCh0b0NvbmZpZy5kZWxheSwgZGVsYXkgfHwgMCksXG4gICAgICAgICAgICBpbml0aWFsVmVsb2NpdHk6IHdpdGhEZWZhdWx0KHRvQ29uZmlnLnZlbG9jaXR5LCAwKSxcbiAgICAgICAgICAgIGNsYW1wOiB3aXRoRGVmYXVsdCh0b0NvbmZpZy5jbGFtcCwgZmFsc2UpLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB3aXRoRGVmYXVsdCh0b0NvbmZpZy5wcmVjaXNpb24sIDAuMDEpLFxuICAgICAgICAgICAgdGVuc2lvbjogd2l0aERlZmF1bHQodG9Db25maWcudGVuc2lvbiwgMTcwKSxcbiAgICAgICAgICAgIGZyaWN0aW9uOiB3aXRoRGVmYXVsdCh0b0NvbmZpZy5mcmljdGlvbiwgMjYpLFxuICAgICAgICAgICAgbWFzczogd2l0aERlZmF1bHQodG9Db25maWcubWFzcywgMSksXG4gICAgICAgICAgICBkdXJhdGlvbjogdG9Db25maWcuZHVyYXRpb24sXG4gICAgICAgICAgICBlYXNpbmc6IHdpdGhEZWZhdWx0KHRvQ29uZmlnLmVhc2luZywgdCA9PiB0KSxcbiAgICAgICAgICAgIGRlY2F5OiB0b0NvbmZpZy5kZWNheVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHJldHVybiBhY2M7XG4gICAgfSwgdGhpcy5hbmltYXRpb25zKTtcblxuICAgIGlmICh0aGlzLmhhc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuY29uZmlncyA9IGdldFZhbHVlcyQxKHRoaXMuYW5pbWF0aW9ucyk7XG4gICAgICB0aGlzLmFuaW1hdGVkUHJvcHMgPSB7fTtcbiAgICAgIHRoaXMuaW50ZXJwb2xhdGlvbnMgPSB7fTtcblxuICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuYW5pbWF0aW9ucykge1xuICAgICAgICB0aGlzLmludGVycG9sYXRpb25zW2tleV0gPSB0aGlzLmFuaW1hdGlvbnNba2V5XS5pbnRlcnBvbGF0aW9uO1xuICAgICAgICB0aGlzLmFuaW1hdGVkUHJvcHNba2V5XSA9IHRoaXMuYW5pbWF0aW9uc1trZXldLmludGVycG9sYXRpb24uZ2V0VmFsdWUoKTtcbiAgICAgIH1cbiAgICB9IC8vIFRPRE86IGNsZWFuIHVwIHJlZiBpbiBjb250cm9sbGVyXG5cblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzdGFydCA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBzdGFydFtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKCFyZWYgJiYgKGF1dG9TdGFydCB8fCBzdGFydC5sZW5ndGgpKSB0aGlzLnN0YXJ0KC4uLnN0YXJ0KTtcbiAgICBjb25zdCBvbkVuZCA9IHN0YXJ0WzBdLFxuICAgICAgICAgIG9uVXBkYXRlID0gc3RhcnRbMV07XG4gICAgdGhpcy5vbkVuZCA9IHR5cGVvZiBvbkVuZCA9PT0gJ2Z1bmN0aW9uJyAmJiBvbkVuZDtcbiAgICB0aGlzLm9uVXBkYXRlID0gb25VcGRhdGU7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVzKCk7XG4gIH1cblxuICBzdGFydChvbkVuZCwgb25VcGRhdGUpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IG5vdygpO1xuICAgIGlmICh0aGlzLmlzQWN0aXZlKSB0aGlzLnN0b3AoKTtcbiAgICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLm9uRW5kID0gdHlwZW9mIG9uRW5kID09PSAnZnVuY3Rpb24nICYmIG9uRW5kO1xuICAgIHRoaXMub25VcGRhdGUgPSBvblVwZGF0ZTtcbiAgICBpZiAodGhpcy5wcm9wcy5vblN0YXJ0KSB0aGlzLnByb3BzLm9uU3RhcnQoKTtcbiAgICBhZGRDb250cm9sbGVyKHRoaXMpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXMgPT4gdGhpcy5yZXNvbHZlID0gcmVzKTtcbiAgfVxuXG4gIHN0b3AoZmluaXNoZWQpIHtcbiAgICBpZiAoZmluaXNoZWQgPT09IHZvaWQgMCkge1xuICAgICAgZmluaXNoZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBjb2xsZWN0ZWQgY2hhbmdlcyBzaW5jZSB0aGUgYW5pbWF0aW9uIGhhcyBiZWVuIHN0b3BwZWQgY29sZCB0dXJrZXlcbiAgICBpZiAoZmluaXNoZWQpIGdldFZhbHVlcyQxKHRoaXMuYW5pbWF0aW9ucykuZm9yRWFjaChhID0+IGEuY2hhbmdlcyA9IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5kZWJvdW5jZWRPbkVuZCh7XG4gICAgICBmaW5pc2hlZFxuICAgIH0pO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICByZW1vdmVDb250cm9sbGVyKHRoaXMpO1xuICAgIHRoaXMucHJvcHMgPSB7fTtcbiAgICB0aGlzLm1lcmdlZCA9IHt9O1xuICAgIHRoaXMuYW5pbWF0aW9ucyA9IHt9O1xuICAgIHRoaXMuaW50ZXJwb2xhdGlvbnMgPSB7fTtcbiAgICB0aGlzLmFuaW1hdGVkUHJvcHMgPSB7fTtcbiAgICB0aGlzLmNvbmZpZ3MgPSBbXTtcbiAgfVxuXG4gIGRlYm91bmNlZE9uRW5kKHJlc3VsdCkge1xuICAgIHJlbW92ZUNvbnRyb2xsZXIodGhpcyk7XG4gICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIGNvbnN0IG9uRW5kID0gdGhpcy5vbkVuZDtcbiAgICB0aGlzLm9uRW5kID0gbnVsbDtcbiAgICBpZiAob25FbmQpIG9uRW5kKHJlc3VsdCk7XG4gICAgaWYgKHRoaXMucmVzb2x2ZSkgdGhpcy5yZXNvbHZlKCk7XG4gICAgdGhpcy5yZXNvbHZlID0gbnVsbDtcbiAgfVxuXG59XG5cbmNsYXNzIEFuaW1hdGVkUHJvcHMgZXh0ZW5kcyBBbmltYXRlZE9iamVjdFdpdGhDaGlsZHJlbiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzLCBjYWxsYmFjaykge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKHByb3BzLnN0eWxlKSBwcm9wcyA9IF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgc3R5bGU6IGNyZWF0ZUFuaW1hdGVkU3R5bGUocHJvcHMuc3R5bGUpXG4gICAgfSk7XG4gICAgdGhpcy5wYXlsb2FkID0gcHJvcHM7XG4gICAgdGhpcy51cGRhdGUgPSBjYWxsYmFjaztcbiAgICB0aGlzLmF0dGFjaCgpO1xuICB9XG5cbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5pbWF0ZWRDb21wb25lbnQoQ29tcG9uZW50KSB7XG4gIGNsYXNzIEFuaW1hdGVkQ29tcG9uZW50IGV4dGVuZHMgUmVhY3RfX2RlZmF1bHQuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgc3VwZXIoKTtcblxuICAgICAgdGhpcy5jYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubm9kZSkge1xuICAgICAgICAgIGNvbnN0IGRpZFVwZGF0ZSA9IGFwcGx5QW5pbWF0ZWRWYWx1ZXMuZm4odGhpcy5ub2RlLCB0aGlzLnByb3BzQW5pbWF0ZWQuZ2V0QW5pbWF0ZWRWYWx1ZSgpLCB0aGlzKTtcbiAgICAgICAgICBpZiAoZGlkVXBkYXRlID09PSBmYWxzZSkgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmF0dGFjaFByb3BzKHByb3BzKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMucHJvcHNBbmltYXRlZCAmJiB0aGlzLnByb3BzQW5pbWF0ZWQuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgc2V0TmF0aXZlUHJvcHMocHJvcHMpIHtcbiAgICAgIGNvbnN0IGRpZFVwZGF0ZSA9IGFwcGx5QW5pbWF0ZWRWYWx1ZXMuZm4odGhpcy5ub2RlLCBwcm9wcywgdGhpcyk7XG4gICAgICBpZiAoZGlkVXBkYXRlID09PSBmYWxzZSkgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH0gLy8gVGhlIHN5c3RlbSBpcyBiZXN0IGRlc2lnbmVkIHdoZW4gc2V0TmF0aXZlUHJvcHMgaXMgaW1wbGVtZW50ZWQuIEl0IGlzXG4gICAgLy8gYWJsZSB0byBhdm9pZCByZS1yZW5kZXJpbmcgYW5kIGRpcmVjdGx5IHNldCB0aGUgYXR0cmlidXRlcyB0aGF0XG4gICAgLy8gY2hhbmdlZC4gSG93ZXZlciwgc2V0TmF0aXZlUHJvcHMgY2FuIG9ubHkgYmUgaW1wbGVtZW50ZWQgb24gbGVhZlxuICAgIC8vIG5hdGl2ZSBjb21wb25lbnRzLiBJZiB5b3Ugd2FudCB0byBhbmltYXRlIGEgY29tcG9zaXRlIGNvbXBvbmVudCwgeW91XG4gICAgLy8gbmVlZCB0byByZS1yZW5kZXIgaXQuIEluIHRoaXMgY2FzZSwgd2UgaGF2ZSBhIGZhbGxiYWNrIHRoYXQgdXNlc1xuICAgIC8vIGZvcmNlVXBkYXRlLlxuXG5cbiAgICBhdHRhY2hQcm9wcyhfcmVmKSB7XG4gICAgICBsZXQgZm9yd2FyZFJlZiA9IF9yZWYuZm9yd2FyZFJlZixcbiAgICAgICAgICBuZXh0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBbXCJmb3J3YXJkUmVmXCJdKTtcblxuICAgICAgY29uc3Qgb2xkUHJvcHNBbmltYXRlZCA9IHRoaXMucHJvcHNBbmltYXRlZDtcbiAgICAgIHRoaXMucHJvcHNBbmltYXRlZCA9IG5ldyBBbmltYXRlZFByb3BzKG5leHRQcm9wcywgdGhpcy5jYWxsYmFjayk7IC8vIFdoZW4geW91IGNhbGwgZGV0YWNoLCBpdCByZW1vdmVzIHRoZSBlbGVtZW50IGZyb20gdGhlIHBhcmVudCBsaXN0XG4gICAgICAvLyBvZiBjaGlsZHJlbi4gSWYgaXQgZ29lcyB0byAwLCB0aGVuIHRoZSBwYXJlbnQgYWxzbyBkZXRhY2hlcyBpdHNlbGZcbiAgICAgIC8vIGFuZCBzbyBvbi5cbiAgICAgIC8vIEFuIG9wdGltaXphdGlvbiBpcyB0byBhdHRhY2ggdGhlIG5ldyBlbGVtZW50cyBhbmQgVEhFTiBkZXRhY2ggdGhlIG9sZFxuICAgICAgLy8gb25lcyBpbnN0ZWFkIG9mIGRldGFjaGluZyBhbmQgVEhFTiBhdHRhY2hpbmcuXG4gICAgICAvLyBUaGlzIHdheSB0aGUgaW50ZXJtZWRpYXRlIHN0YXRlIGlzbid0IHRvIGdvIHRvIDAgYW5kIHRyaWdnZXJcbiAgICAgIC8vIHRoaXMgZXhwZW5zaXZlIHJlY3Vyc2l2ZSBkZXRhY2hpbmcgdG8gdGhlbiByZS1hdHRhY2ggZXZlcnl0aGluZyBvblxuICAgICAgLy8gdGhlIHZlcnkgbmV4dCBvcGVyYXRpb24uXG5cbiAgICAgIG9sZFByb3BzQW5pbWF0ZWQgJiYgb2xkUHJvcHNBbmltYXRlZC5kZXRhY2goKTtcbiAgICB9XG5cbiAgICBzaG91bGRDb21wb25lbnRVcGRhdGUocHJvcHMpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICAgICAgICBuZXh0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgW1wic3R5bGVcIl0pO1xuXG4gICAgICBjb25zdCBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBjdXJyZW50U3R5bGUgPSBfdGhpcyRwcm9wcy5zdHlsZSxcbiAgICAgICAgICAgIGN1cnJlbnRQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF90aGlzJHByb3BzLCBbXCJzdHlsZVwiXSk7XG5cbiAgICAgIGlmICghc2hhbGxvd0VxdWFsKGN1cnJlbnRQcm9wcywgbmV4dFByb3BzKSB8fCAhc2hhbGxvd0VxdWFsKGN1cnJlbnRTdHlsZSwgc3R5bGUpKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoUHJvcHMocHJvcHMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IF90aGlzJHByb3BzQW5pbWF0ZWQkZyA9IHRoaXMucHJvcHNBbmltYXRlZC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgc2Nyb2xsVG9wID0gX3RoaXMkcHJvcHNBbmltYXRlZCRnLnNjcm9sbFRvcCxcbiAgICAgICAgICAgIHNjcm9sbExlZnQgPSBfdGhpcyRwcm9wc0FuaW1hdGVkJGcuc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIGFuaW1hdGVkUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wc0FuaW1hdGVkJGcsIFtcInNjcm9sbFRvcFwiLCBcInNjcm9sbExlZnRcIl0pO1xuXG4gICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHt9LCBhbmltYXRlZFByb3BzLCB7XG4gICAgICAgIHJlZjogbm9kZSA9PiB0aGlzLm5vZGUgPSBoYW5kbGVSZWYobm9kZSwgdGhpcy5wcm9wcy5mb3J3YXJkUmVmKVxuICAgICAgfSkpO1xuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQW5pbWF0ZWRDb21wb25lbnQsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIGZvcndhcmRSZWY6IHJlZlxuICB9KSkpO1xufVxuXG5jb25zdCBjb25maWcgPSB7XG4gIGRlZmF1bHQ6IHtcbiAgICB0ZW5zaW9uOiAxNzAsXG4gICAgZnJpY3Rpb246IDI2XG4gIH0sXG4gIGdlbnRsZToge1xuICAgIHRlbnNpb246IDEyMCxcbiAgICBmcmljdGlvbjogMTRcbiAgfSxcbiAgd29iYmx5OiB7XG4gICAgdGVuc2lvbjogMTgwLFxuICAgIGZyaWN0aW9uOiAxMlxuICB9LFxuICBzdGlmZjoge1xuICAgIHRlbnNpb246IDIxMCxcbiAgICBmcmljdGlvbjogMjBcbiAgfSxcbiAgc2xvdzoge1xuICAgIHRlbnNpb246IDI4MCxcbiAgICBmcmljdGlvbjogNjBcbiAgfSxcbiAgbW9sYXNzZXM6IHtcbiAgICB0ZW5zaW9uOiAyODAsXG4gICAgZnJpY3Rpb246IDEyMFxuICB9XG59O1xuXG5jbGFzcyBTcHJpbmcgZXh0ZW5kcyBSZWFjdF9fZGVmYXVsdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsYXN0UHJvcHM6IHtcbiAgICAgICAgZnJvbToge30sXG4gICAgICAgIHRvOiB7fVxuICAgICAgfSxcbiAgICAgIHByb3BzQ2hhbmdlZDogZmFsc2UsXG4gICAgICBpbnRlcm5hbDogZmFsc2VcbiAgICB9O1xuICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyKG51bGwsIG51bGwpO1xuICAgIHRoaXMuZGlkVXBkYXRlID0gZmFsc2U7XG4gICAgdGhpcy5kaWRJbmplY3QgPSBmYWxzZTtcbiAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcblxuICAgIHRoaXMuc3RhcnQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgICBsZXQgd2FzTW91bnRlZCA9IHRoaXMubW91bnRlZDtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zdGFydChwcm9wcyA9PiB0aGlzLmZpbmlzaChfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgd2FzTW91bnRlZFxuICAgICAgfSkpLCB0aGlzLnVwZGF0ZSk7XG4gICAgfTtcblxuICAgIHRoaXMuc3RvcCA9ICgpID0+IHRoaXMuY29udHJvbGxlci5zdG9wKHRydWUpO1xuXG4gICAgdGhpcy51cGRhdGUgPSAoKSA9PiB0aGlzLm1vdW50ZWQgJiYgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpbnRlcm5hbDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5maW5pc2ggPSAoX3JlZikgPT4ge1xuICAgICAgbGV0IGZpbmlzaGVkID0gX3JlZi5maW5pc2hlZCxcbiAgICAgICAgICBub0NoYW5nZSA9IF9yZWYubm9DaGFuZ2UsXG4gICAgICAgICAgd2FzTW91bnRlZCA9IF9yZWYud2FzTW91bnRlZDtcbiAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAodGhpcy5tb3VudGVkICYmIGZpbmlzaGVkKSB7XG4gICAgICAgIC8vIE9ubHkgY2FsbCBvblJlc3QgaWYgZWl0aGVyIHdlICp3ZXJlKiBtb3VudGVkLCBvciB3aGVuIHRoZXJlIHdlcmUgY2hhbmdlc1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblJlc3QgJiYgKHdhc01vdW50ZWQgfHwgIW5vQ2hhbmdlKSkgdGhpcy5wcm9wcy5vblJlc3QodGhpcy5jb250cm9sbGVyLm1lcmdlZCk7IC8vIFJlc3RvcmUgZW5kLXN0YXRlXG5cbiAgICAgICAgaWYgKHRoaXMubW91bnRlZCAmJiB0aGlzLmRpZEluamVjdCkge1xuICAgICAgICAgIHRoaXMuYWZ0ZXJJbmplY3QgPSBjb252ZXJ0VmFsdWVzKHRoaXMucHJvcHMpO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaW50ZXJuYWw6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSAvLyBJZiB3ZSBoYXZlIGFuIGluamVjdCBvciB2YWx1ZXMgdG8gYXBwbHkgYWZ0ZXIgdGhlIGFuaW1hdGlvbiB3ZSBwaW5nIGhlcmVcblxuXG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQgJiYgKHRoaXMuZGlkSW5qZWN0IHx8IHRoaXMucHJvcHMuYWZ0ZXIpKSB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpbnRlcm5hbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaWRJbmplY3QgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgLy8gY29tcG9uZW50RGlkVXBkYXRlIGlzbid0IGNhbGxlZCBvbiBtb3VudCwgd2UgY2FsbCBpdCBoZXJlIHRvIHN0YXJ0IGFuaW1hdGluZ1xuICAgIHRoaXMuY29tcG9uZW50RGlkVXBkYXRlKCk7XG4gICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIC8vIFN0b3AgYWxsIG9uZ29pbmcgYW5pbXRpb25zXG4gICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5zdG9wKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBfcmVmMikge1xuICAgIGxldCBpbnRlcm5hbCA9IF9yZWYyLmludGVybmFsLFxuICAgICAgICBsYXN0UHJvcHMgPSBfcmVmMi5sYXN0UHJvcHM7XG4gICAgLy8gVGhlIGZvbGxvd2luZyBpcyBhIHRlc3QgYWdhaW5zdCBwcm9wcyB0aGF0IGNvdWxkIGFsdGVyIHRoZSBhbmltYXRpb25cbiAgICBjb25zdCBmcm9tID0gcHJvcHMuZnJvbSxcbiAgICAgICAgICB0byA9IHByb3BzLnRvLFxuICAgICAgICAgIHJlc2V0ID0gcHJvcHMucmVzZXQsXG4gICAgICAgICAgZm9yY2UgPSBwcm9wcy5mb3JjZTtcbiAgICBjb25zdCBwcm9wc0NoYW5nZWQgPSAhc2hhbGxvd0VxdWFsKHRvLCBsYXN0UHJvcHMudG8pIHx8ICFzaGFsbG93RXF1YWwoZnJvbSwgbGFzdFByb3BzLmZyb20pIHx8IHJlc2V0ICYmICFpbnRlcm5hbCB8fCBmb3JjZSAmJiAhaW50ZXJuYWw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BzQ2hhbmdlZCxcbiAgICAgIGxhc3RQcm9wczogcHJvcHMsXG4gICAgICBpbnRlcm5hbDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICBjb25zdCBwcm9wc0NoYW5nZWQgPSB0aGlzLnN0YXRlLnByb3BzQ2hhbmdlZDsgLy8gSW5qZWN0IHBoYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gSGFuZGxlIGluamVjdGVkIGZyYW1lcywgZm9yIGluc3RhbmNlIHRhcmdldHMvd2ViL2ZpeC1hdXRvXG4gICAgLy8gQW4gaW5qZWN0IHdpbGwgcmV0dXJuIGFuIGludGVybWVkaWFyeSBSZWFjdCBub2RlIHdoaWNoIG1lYXN1cmVzIGl0c2VsZiBvdXRcbiAgICAvLyAuLiBhbmQgcmV0dXJucyBhIGNhbGxiYWNrIHdoZW4gdGhlIHZhbHVlcyBzb3VnaHQgYWZ0ZXIgYXJlIHJlYWR5LCB1c3VhbGx5IFwiYXV0b1wiLlxuXG4gICAgaWYgKHRoaXMucHJvcHMuaW5qZWN0ICYmIHByb3BzQ2hhbmdlZCAmJiAhdGhpcy5pbmplY3RQcm9wcykge1xuICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLnByb3BzLmluamVjdCh0aGlzLnByb3BzLCBpbmplY3RQcm9wcyA9PiB7XG4gICAgICAgIC8vIFRoZSBpbmplY3QgZnJhbWUgaGFzIHJlbmRlcmVkLCBub3cgbGV0J3MgdXBkYXRlIGFuaW1hdGlvbnMuLi5cbiAgICAgICAgdGhpcy5pbmplY3RQcm9wcyA9IGluamVjdFByb3BzO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpbnRlcm5hbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pOyAvLyBSZW5kZXIgb3V0IGluamVjdGVkIGZyYW1lXG5cbiAgICAgIGlmIChmcmFtZSkgcmV0dXJuIGZyYW1lO1xuICAgIH0gLy8gVXBkYXRlIHBoYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgIGlmICh0aGlzLmluamVjdFByb3BzIHx8IHByb3BzQ2hhbmdlZCkge1xuICAgICAgLy8gV2UgY2FuIHBvdGVudGlhbGx5IGNhdXNlIHNldFN0YXRlLCBidXQgd2UncmUgaW5zaWRlIHJlbmRlciwgdGhlIGZsYWcgcHJldmVudHMgdGhhdFxuICAgICAgdGhpcy5kaWRJbmplY3QgPSBmYWxzZTsgLy8gVXBkYXRlIGFuaW1hdGlvbnMsIHRoaXMgdHVybnMgZnJvbS90byBwcm9wcyBpbnRvIEFuaW1hdGVkVmFsdWVzXG4gICAgICAvLyBBbiB1cGRhdGUgY2FuIG9jY3VyIG9uIGluamVjdGVkIHByb3BzLCBvciB3aGVuIG93bi1wcm9wcyBoYXZlIGNoYW5nZWQuXG5cbiAgICAgIGlmICh0aGlzLmluamVjdFByb3BzKSB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci51cGRhdGUodGhpcy5pbmplY3RQcm9wcyk7IC8vIGRpZEluamVjdCBpcyBuZWVkZWQsIGJlY2F1c2UgdGhlcmUgd2lsbCBiZSBhIDNyZCBzdGFnZSwgd2hlcmUgdGhlIG9yaWdpbmFsIHZhbHVlc1xuICAgICAgICAvLyAuLiB3aWxsIGJlIHJlc3RvcmVkIGFmdGVyIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuIFdoZW4gc29tZW9uZSBhbmltYXRlcyB0b3dhcmRzXG4gICAgICAgIC8vIC4uIFwiYXV0b1wiLCB0aGUgZW5kLXJlc3VsdCBzaG91bGQgYmUgXCJhdXRvXCIsIG5vdCBcIjE5OTlweFwiLCB3aGljaCB3b3VsZCBibG9jayBuZXN0ZWRcbiAgICAgICAgLy8gLi4gaGVpZ2h0L3dpZHRoIGNoYW5nZXMuXG5cbiAgICAgICAgdGhpcy5kaWRJbmplY3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChwcm9wc0NoYW5nZWQpIHRoaXMuY29udHJvbGxlci51cGRhdGUodGhpcy5wcm9wcyk7IC8vIEZsYWcgYW4gdXBkYXRlIHRoYXQgb2NjdXJlZCwgY29tcG9uZW50RGlkVXBkYXRlIHdpbGwgc3RhcnQgdGhlIGFuaW1hdGlvbiBsYXRlciBvblxuXG5cbiAgICAgIHRoaXMuZGlkVXBkYXRlID0gdHJ1ZTtcbiAgICAgIHRoaXMuYWZ0ZXJJbmplY3QgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmluamVjdFByb3BzID0gdW5kZWZpbmVkO1xuICAgIH0gLy8gUmVuZGVyIHBoYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUmVuZGVyIG91dCByYXcgdmFsdWVzIG9yIEFuaW1hdGVkVmFsdWVzIGRlcGVuZGluZyBvbiBcIm5hdGl2ZVwiXG5cblxuICAgIGxldCB2YWx1ZXMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5jb250cm9sbGVyLmdldFZhbHVlcygpLCB0aGlzLmFmdGVySW5qZWN0KTtcblxuICAgIGlmICh0aGlzLmZpbmlzaGVkKSB2YWx1ZXMgPSBfZXh0ZW5kcyh7fSwgdmFsdWVzLCB0aGlzLnByb3BzLmFmdGVyKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGggPyBjaGlsZHJlbih2YWx1ZXMpIDogbnVsbDtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAvLyBUaGUgYW5pbWF0aW9uIGhhcyB0byBzdGFydCAqYWZ0ZXIqIHJlbmRlciwgc2luY2UgYXQgdGhhdCBwb2ludCB0aGUgc2NlbmVcbiAgICAvLyAuLiBncmFwaCBzaG91bGQgYmUgZXN0YWJsaXNoZWQsIHNvIHdlIGRvIGl0IGhlcmUuIFVuZm9ydHVuYXRlbGx5LCBub24tbmF0aXZlXG4gICAgLy8gLi4gYW5pbWF0aW9ucyBhcyB3ZWxsIGFzIFwiYXV0b1wiLWluamVjdHMgY2FsbCBmb3JjZVVwZGF0ZSwgc28gaXQncyBjYXVzaW5nIGEgbG9vcC5cbiAgICAvLyAuLiBkaWRVcGRhdGUgcHJldmVudHMgdGhhdCBhcyBpdCBnZXRzIHNldCBvbmx5IG9uIHByb3AgY2hhbmdlcy5cbiAgICBpZiAodGhpcy5kaWRVcGRhdGUpIHRoaXMuc3RhcnQoKTtcbiAgICB0aGlzLmRpZFVwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbn1cblNwcmluZy5kZWZhdWx0UHJvcHMgPSB7XG4gIGZyb206IHt9LFxuICB0bzoge30sXG4gIGNvbmZpZzogY29uZmlnLmRlZmF1bHQsXG4gIG5hdGl2ZTogZmFsc2UsXG4gIGltbWVkaWF0ZTogZmFsc2UsXG4gIHJlc2V0OiBmYWxzZSxcbiAgZm9yY2U6IGZhbHNlLFxuICBpbmplY3Q6IGJ1Z2ZpeGVzXG59O1xuXG5jbGFzcyBUcmFpbCBleHRlbmRzIFJlYWN0X19kZWZhdWx0LlB1cmVDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMuZmlyc3QgPSB0cnVlO1xuICAgIHRoaXMuaW5zdGFuY2VzID0gbmV3IFNldCgpO1xuXG4gICAgdGhpcy5ob29rID0gKGluc3RhbmNlLCBpbmRleCwgbGVuZ3RoLCByZXZlcnNlKSA9PiB7XG4gICAgICAvLyBBZGQgaW5zdGFuY2UgdG8gc2V0XG4gICAgICB0aGlzLmluc3RhbmNlcy5hZGQoaW5zdGFuY2UpOyAvLyBSZXR1cm4gdW5kZWZpbmVkIG9uIHRoZSBmaXJzdCBpbmRleCBhbmQgZnJvbSB0aGVuIG9uIHRoZSBwcmV2aW91cyBpbnN0YW5jZVxuXG4gICAgICBpZiAocmV2ZXJzZSA/IGluZGV4ID09PSBsZW5ndGggLSAxIDogaW5kZXggPT09IDApIHJldHVybiB1bmRlZmluZWQ7ZWxzZSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmluc3RhbmNlcylbcmV2ZXJzZSA/IGluZGV4ICsgMSA6IGluZGV4IC0gMV07XG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgaXRlbXMgPSBfdGhpcyRwcm9wcy5pdGVtcyxcbiAgICAgICAgICBfY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICBfdGhpcyRwcm9wcyRmcm9tID0gX3RoaXMkcHJvcHMuZnJvbSxcbiAgICAgICAgICBmcm9tID0gX3RoaXMkcHJvcHMkZnJvbSA9PT0gdm9pZCAwID8ge30gOiBfdGhpcyRwcm9wcyRmcm9tLFxuICAgICAgICAgIGluaXRpYWwgPSBfdGhpcyRwcm9wcy5pbml0aWFsLFxuICAgICAgICAgIHJldmVyc2UgPSBfdGhpcyRwcm9wcy5yZXZlcnNlLFxuICAgICAgICAgIGtleXMgPSBfdGhpcyRwcm9wcy5rZXlzLFxuICAgICAgICAgIGRlbGF5ID0gX3RoaXMkcHJvcHMuZGVsYXksXG4gICAgICAgICAgb25SZXN0ID0gX3RoaXMkcHJvcHMub25SZXN0LFxuICAgICAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3RoaXMkcHJvcHMsIFtcIml0ZW1zXCIsIFwiY2hpbGRyZW5cIiwgXCJmcm9tXCIsIFwiaW5pdGlhbFwiLCBcInJldmVyc2VcIiwgXCJrZXlzXCIsIFwiZGVsYXlcIiwgXCJvblJlc3RcIl0pO1xuXG4gICAgY29uc3QgYXJyYXkgPSB0b0FycmF5KGl0ZW1zKTtcbiAgICByZXR1cm4gdG9BcnJheShhcnJheSkubWFwKChpdGVtLCBpKSA9PiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFNwcmluZywgX2V4dGVuZHMoe1xuICAgICAgb25SZXN0OiBpID09PSAwID8gb25SZXN0IDogbnVsbCxcbiAgICAgIGtleTogdHlwZW9mIGtleXMgPT09ICdmdW5jdGlvbicgPyBrZXlzKGl0ZW0pIDogdG9BcnJheShrZXlzKVtpXSxcbiAgICAgIGZyb206IHRoaXMuZmlyc3QgJiYgaW5pdGlhbCAhPT0gdm9pZCAwID8gaW5pdGlhbCB8fCB7fSA6IGZyb21cbiAgICB9LCBwcm9wcywge1xuICAgICAgZGVsYXk6IGkgPT09IDAgJiYgZGVsYXkgfHwgdW5kZWZpbmVkLFxuICAgICAgYXR0YWNoOiBpbnN0YW5jZSA9PiB0aGlzLmhvb2soaW5zdGFuY2UsIGksIGFycmF5Lmxlbmd0aCwgcmV2ZXJzZSksXG4gICAgICBjaGlsZHJlbjogcHJvcHMgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZCA9IF9jaGlsZHJlbihpdGVtLCBpKTtcblxuICAgICAgICByZXR1cm4gY2hpbGQgPyBjaGlsZChwcm9wcykgOiBudWxsO1xuICAgICAgfVxuICAgIH0pKSk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgdGhpcy5maXJzdCA9IGZhbHNlO1xuICAgIGlmIChwcmV2UHJvcHMuaXRlbXMgIT09IHRoaXMucHJvcHMuaXRlbXMpIHRoaXMuaW5zdGFuY2VzLmNsZWFyKCk7XG4gIH1cblxufVxuVHJhaWwuZGVmYXVsdFByb3BzID0ge1xuICBrZXlzOiBpdGVtID0+IGl0ZW1cbn07XG5cbmNvbnN0IERFRkFVTFQgPSAnX19kZWZhdWx0JztcblxuY2xhc3MgS2V5ZnJhbWVzSW1wbCBleHRlbmRzIFJlYWN0X19kZWZhdWx0LlB1cmVDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIF90aGlzID0gdGhpcztcbiAgICB0aGlzLmd1aWQgPSAwO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBwcm9wczoge30sXG4gICAgICByZXNvbHZlOiAoKSA9PiBudWxsLFxuICAgICAgbGFzdDogdHJ1ZSxcbiAgICAgIGluZGV4OiAwXG4gICAgfTtcblxuICAgIHRoaXMubmV4dCA9IGZ1bmN0aW9uIChwcm9wcywgbGFzdCwgaW5kZXgpIHtcbiAgICAgIGlmIChsYXN0ID09PSB2b2lkIDApIHtcbiAgICAgICAgbGFzdCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICAgIH1cblxuICAgICAgX3RoaXMucnVubmluZyA9IHRydWU7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIF90aGlzLm1vdW50ZWQgJiYgX3RoaXMuc2V0U3RhdGUoc3RhdGUgPT4gKHtcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIGxhc3QsXG4gICAgICAgICAgaW5kZXhcbiAgICAgICAgfSksICgpID0+IF90aGlzLnJ1bm5pbmcgPSBmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNvbXBvbmVudERpZFVwZGF0ZSh7fSk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2aW91cykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgY29uc3QgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHN0YXRlcyA9IF90aGlzJHByb3BzLnN0YXRlcyxcbiAgICAgICAgICBmID0gX3RoaXMkcHJvcHMuZmlsdGVyLFxuICAgICAgICAgIHN0YXRlID0gX3RoaXMkcHJvcHMuc3RhdGU7XG5cbiAgICBpZiAocHJldmlvdXMuc3RhdGUgIT09IHRoaXMucHJvcHMuc3RhdGUgfHwgdGhpcy5wcm9wcy5yZXNldCAmJiAhdGhpcy5ydW5uaW5nIHx8ICFzaGFsbG93RXF1YWwoc3RhdGVzW3N0YXRlXSwgcHJldmlvdXMuc3RhdGVzW3ByZXZpb3VzLnN0YXRlXSkpIHtcbiAgICAgIGlmIChzdGF0ZXMgJiYgc3RhdGUgJiYgc3RhdGVzW3N0YXRlXSkge1xuICAgICAgICBjb25zdCBsb2NhbElkID0gKyt0aGlzLmd1aWQ7XG4gICAgICAgIGNvbnN0IHNsb3RzID0gc3RhdGVzW3N0YXRlXTtcblxuICAgICAgICBpZiAoc2xvdHMpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzbG90cykpIHtcbiAgICAgICAgICAgIGxldCBxID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgbGV0IGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgbGV0IHNsb3QgPSBzbG90c1tpbmRleF07XG4gICAgICAgICAgICAgIGxldCBsYXN0ID0gaW5kZXggPT09IHNsb3RzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgIHEgPSBxLnRoZW4oKCkgPT4gbG9jYWxJZCA9PT0gdGhpcy5ndWlkICYmIHRoaXMubmV4dChmKHNsb3QpLCBsYXN0LCBpbmRleCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNsb3RzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgICAgc2xvdHMoIC8vIG5leHRcbiAgICAgICAgICAgIGZ1bmN0aW9uIChwcm9wcywgbGFzdCkge1xuICAgICAgICAgICAgICBpZiAobGFzdCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgbGFzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSWQgPT09IF90aGlzMi5ndWlkICYmIF90aGlzMi5uZXh0KGYocHJvcHMpLCBsYXN0LCBpbmRleCsrKTtcbiAgICAgICAgICAgIH0sIC8vIGNhbmNlbFxuICAgICAgICAgICAgKCkgPT4gcmVxdWVzdEZyYW1lKCgpID0+IHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5pbnN0YW5jZS5zdG9wKCkpLCAvLyBvd25wcm9wc1xuICAgICAgICAgICAgdGhpcy5wcm9wcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmV4dChmKHN0YXRlc1tzdGF0ZV0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgX3RoaXMkc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICAgIHByb3BzID0gX3RoaXMkc3RhdGUucHJvcHMsXG4gICAgICAgICAgcmVzb2x2ZSA9IF90aGlzJHN0YXRlLnJlc29sdmUsXG4gICAgICAgICAgbGFzdCA9IF90aGlzJHN0YXRlLmxhc3QsXG4gICAgICAgICAgaW5kZXggPSBfdGhpcyRzdGF0ZS5pbmRleDtcbiAgICBpZiAoIXByb3BzIHx8IE9iamVjdC5rZXlzKHByb3BzKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgbGV0IF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIHN0YXRlID0gX3RoaXMkcHJvcHMyLnN0YXRlLFxuICAgICAgICBmaWx0ZXIgPSBfdGhpcyRwcm9wczIuZmlsdGVyLFxuICAgICAgICBzdGF0ZXMgPSBfdGhpcyRwcm9wczIuc3RhdGVzLFxuICAgICAgICBjb25maWcgPSBfdGhpcyRwcm9wczIuY29uZmlnLFxuICAgICAgICBDb21wb25lbnQgPSBfdGhpcyRwcm9wczIucHJpbWl0aXZlLFxuICAgICAgICBfb25SZXN0ID0gX3RoaXMkcHJvcHMyLm9uUmVzdCxcbiAgICAgICAgZm9yd2FyZFJlZiA9IF90aGlzJHByb3BzMi5mb3J3YXJkUmVmLFxuICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3RoaXMkcHJvcHMyLCBbXCJzdGF0ZVwiLCBcImZpbHRlclwiLCBcInN0YXRlc1wiLCBcImNvbmZpZ1wiLCBcInByaW1pdGl2ZVwiLCBcIm9uUmVzdFwiLCBcImZvcndhcmRSZWZcIl0pOyAvLyBBcnJheWVkIGNvbmZpZ3MgbmVlZCBhbiBpbmRleCB0byBwcm9jZXNzXG5cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIGNvbmZpZyA9IGNvbmZpZ1tpbmRleF07XG4gICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgICByZWY6IF9yZWYgPT4gdGhpcy5pbnN0YW5jZSA9IGhhbmRsZVJlZihfcmVmLCBmb3J3YXJkUmVmKSxcbiAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgfSwgcmVzdCwgcHJvcHMsIHtcbiAgICAgIG9uUmVzdDogYXJncyA9PiB7XG4gICAgICAgIHJlc29sdmUoYXJncyk7XG4gICAgICAgIGlmIChfb25SZXN0ICYmIGxhc3QpIF9vblJlc3QoYXJncyk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbn1cblxuS2V5ZnJhbWVzSW1wbC5kZWZhdWx0UHJvcHMgPSB7XG4gIHN0YXRlOiBERUZBVUxUXG59O1xuY29uc3QgS2V5ZnJhbWVzID0gUmVhY3RfX2RlZmF1bHQuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChLZXlmcmFtZXNJbXBsLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgZm9yd2FyZFJlZjogcmVmXG59KSkpO1xuXG5LZXlmcmFtZXMuY3JlYXRlID0gcHJpbWl0aXZlID0+IGZ1bmN0aW9uIChzdGF0ZXMsIGZpbHRlcikge1xuICBpZiAoZmlsdGVyID09PSB2b2lkIDApIHtcbiAgICBmaWx0ZXIgPSBzdGF0ZXMgPT4gc3RhdGVzO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzdGF0ZXMgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShzdGF0ZXMpKSBzdGF0ZXMgPSB7XG4gICAgW0RFRkFVTFRdOiBzdGF0ZXNcbiAgfTtcbiAgcmV0dXJuIHByb3BzID0+IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoS2V5ZnJhbWVzSW1wbCwgX2V4dGVuZHMoe1xuICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxuICAgIHN0YXRlczogc3RhdGVzLFxuICAgIGZpbHRlcjogZmlsdGVyXG4gIH0sIHByb3BzKSk7XG59O1xuXG5LZXlmcmFtZXMuU3ByaW5nID0gc3RhdGVzID0+IEtleWZyYW1lcy5jcmVhdGUoU3ByaW5nKShzdGF0ZXMsIGludGVycG9sYXRlVG8pO1xuXG5LZXlmcmFtZXMuVHJhaWwgPSBzdGF0ZXMgPT4gS2V5ZnJhbWVzLmNyZWF0ZShUcmFpbCkoc3RhdGVzLCBpbnRlcnBvbGF0ZVRvKTtcblxubGV0IGd1aWQgPSAwO1xuXG5sZXQgZ2V0ID0gcHJvcHMgPT4ge1xuICBsZXQgaXRlbXMgPSBwcm9wcy5pdGVtcyxcbiAgICAgIGtleXMgPSBwcm9wcy5rZXlzLFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHByb3BzLCBbXCJpdGVtc1wiLCBcImtleXNcIl0pO1xuXG4gIGl0ZW1zID0gdG9BcnJheShpdGVtcyAhPT0gdm9pZCAwID8gaXRlbXMgOiBudWxsKTtcbiAga2V5cyA9IHR5cGVvZiBrZXlzID09PSAnZnVuY3Rpb24nID8gaXRlbXMubWFwKGtleXMpIDogdG9BcnJheShrZXlzKTsgLy8gTWFrZSBzdXJlIG51bWVyaWMga2V5cyBhcmUgaW50ZXJwcmV0ZWQgYXMgU3RyaW5ncyAoNSAhPT0gXCI1XCIpXG5cbiAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICBpdGVtcyxcbiAgICBrZXlzOiBrZXlzLm1hcChrZXkgPT4gU3RyaW5nKGtleSkpXG4gIH0sIHJlc3QpO1xufTtcblxuY2xhc3MgVHJhbnNpdGlvbiBleHRlbmRzIFJlYWN0X19kZWZhdWx0LlB1cmVDb21wb25lbnQge1xuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwcmV2UHJvcHMpIHtcbiAgICBzdXBlcihwcmV2UHJvcHMpO1xuXG4gICAgdGhpcy5kZXN0cm95SXRlbSA9IChpdGVtLCBrZXksIHN0YXRlKSA9PiB2YWx1ZXMgPT4ge1xuICAgICAgY29uc3QgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgb25SZXN0ID0gX3RoaXMkcHJvcHMub25SZXN0LFxuICAgICAgICAgICAgb25EZXN0cm95ZWQgPSBfdGhpcyRwcm9wcy5vbkRlc3Ryb3llZDtcblxuICAgICAgaWYgKHRoaXMubW91bnRlZCkge1xuICAgICAgICBvbkRlc3Ryb3llZCAmJiBvbkRlc3Ryb3llZChpdGVtKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgoX3JlZikgPT4ge1xuICAgICAgICAgIGxldCBkZWxldGVkID0gX3JlZi5kZWxldGVkO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWxldGVkOiBkZWxldGVkLmZpbHRlcih0ID0+IHQua2V5ICE9PSBrZXkpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9uUmVzdCAmJiBvblJlc3QoaXRlbSwgc3RhdGUsIHZhbHVlcyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBmaXJzdDogdHJ1ZSxcbiAgICAgIHRyYW5zaXRpb25zOiBbXSxcbiAgICAgIGN1cnJlbnQ6IHt9LFxuICAgICAgZGVsZXRlZDogW10sXG4gICAgICBwcmV2UHJvcHNcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgX3JlZjIpIHtcbiAgICBsZXQgZmlyc3QgPSBfcmVmMi5maXJzdCxcbiAgICAgICAgcHJldlByb3BzID0gX3JlZjIucHJldlByb3BzLFxuICAgICAgICBzdGF0ZSA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYyLCBbXCJmaXJzdFwiLCBcInByZXZQcm9wc1wiXSk7XG5cbiAgICBsZXQgX2dldCA9IGdldChwcm9wcyksXG4gICAgICAgIGl0ZW1zID0gX2dldC5pdGVtcyxcbiAgICAgICAga2V5cyA9IF9nZXQua2V5cyxcbiAgICAgICAgaW5pdGlhbCA9IF9nZXQuaW5pdGlhbCxcbiAgICAgICAgZnJvbSA9IF9nZXQuZnJvbSxcbiAgICAgICAgZW50ZXIgPSBfZ2V0LmVudGVyLFxuICAgICAgICBsZWF2ZSA9IF9nZXQubGVhdmUsXG4gICAgICAgIHVwZGF0ZSA9IF9nZXQudXBkYXRlLFxuICAgICAgICBfZ2V0JHRyYWlsID0gX2dldC50cmFpbCxcbiAgICAgICAgdHJhaWwgPSBfZ2V0JHRyYWlsID09PSB2b2lkIDAgPyAwIDogX2dldCR0cmFpbCxcbiAgICAgICAgdW5pcXVlID0gX2dldC51bmlxdWUsXG4gICAgICAgIGNvbmZpZyA9IF9nZXQuY29uZmlnO1xuXG4gICAgbGV0IF9nZXQyID0gZ2V0KHByZXZQcm9wcyksXG4gICAgICAgIF9rZXlzID0gX2dldDIua2V5cyxcbiAgICAgICAgX2l0ZW1zID0gX2dldDIuaXRlbXM7XG5cbiAgICBsZXQgY3VycmVudCA9IF9leHRlbmRzKHt9LCBzdGF0ZS5jdXJyZW50KTtcblxuICAgIGxldCBkZWxldGVkID0gWy4uLnN0YXRlLmRlbGV0ZWRdOyAvLyBDb21wYXJlIG5leHQga2V5cyB3aXRoIGN1cnJlbnQga2V5c1xuXG4gICAgbGV0IGN1cnJlbnRLZXlzID0gT2JqZWN0LmtleXMoY3VycmVudCk7XG4gICAgbGV0IGN1cnJlbnRTZXQgPSBuZXcgU2V0KGN1cnJlbnRLZXlzKTtcbiAgICBsZXQgbmV4dFNldCA9IG5ldyBTZXQoa2V5cyk7XG4gICAgbGV0IGFkZGVkID0ga2V5cy5maWx0ZXIoaXRlbSA9PiAhY3VycmVudFNldC5oYXMoaXRlbSkpO1xuICAgIGxldCByZW1vdmVkID0gc3RhdGUudHJhbnNpdGlvbnMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGVzdHJveWVkICYmICFuZXh0U2V0LmhhcyhpdGVtLm9yaWdpbmFsS2V5KSkubWFwKGkgPT4gaS5vcmlnaW5hbEtleSk7XG4gICAgbGV0IHVwZGF0ZWQgPSBrZXlzLmZpbHRlcihpdGVtID0+IGN1cnJlbnRTZXQuaGFzKGl0ZW0pKTtcbiAgICBsZXQgZGVsYXkgPSAwO1xuICAgIGFkZGVkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIC8vIEluIHVuaXF1ZSBtb2RlLCByZW1vdmUgZmFkaW5nIG91dCB0cmFuc2l0aW9ucyBpZiB0aGVpciBrZXkgY29tZXMgaW4gYWdhaW5cbiAgICAgIGlmICh1bmlxdWUgJiYgZGVsZXRlZC5maW5kKGQgPT4gZC5vcmlnaW5hbEtleSA9PT0ga2V5KSkgZGVsZXRlZCA9IGRlbGV0ZWQuZmlsdGVyKHQgPT4gdC5vcmlnaW5hbEtleSAhPT0ga2V5KTtcbiAgICAgIGNvbnN0IGtleUluZGV4ID0ga2V5cy5pbmRleE9mKGtleSk7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXNba2V5SW5kZXhdO1xuICAgICAgY29uc3Qgc3RhdGUgPSAnZW50ZXInO1xuICAgICAgY3VycmVudFtrZXldID0ge1xuICAgICAgICBzdGF0ZSxcbiAgICAgICAgb3JpZ2luYWxLZXk6IGtleSxcbiAgICAgICAga2V5OiB1bmlxdWUgPyBTdHJpbmcoa2V5KSA6IGd1aWQrKyxcbiAgICAgICAgaXRlbSxcbiAgICAgICAgdHJhaWw6IGRlbGF5ID0gZGVsYXkgKyB0cmFpbCxcbiAgICAgICAgY29uZmlnOiBjYWxsUHJvcChjb25maWcsIGl0ZW0sIHN0YXRlKSxcbiAgICAgICAgZnJvbTogY2FsbFByb3AoZmlyc3QgPyBpbml0aWFsICE9PSB2b2lkIDAgPyBpbml0aWFsIHx8IHt9IDogZnJvbSA6IGZyb20sIGl0ZW0pLFxuICAgICAgICB0bzogY2FsbFByb3AoZW50ZXIsIGl0ZW0pXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJlbW92ZWQuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3Qga2V5SW5kZXggPSBfa2V5cy5pbmRleE9mKGtleSk7XG5cbiAgICAgIGNvbnN0IGl0ZW0gPSBfaXRlbXNba2V5SW5kZXhdO1xuICAgICAgY29uc3Qgc3RhdGUgPSAnbGVhdmUnO1xuICAgICAgZGVsZXRlZC5wdXNoKF9leHRlbmRzKHt9LCBjdXJyZW50W2tleV0sIHtcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGRlc3Ryb3llZDogdHJ1ZSxcbiAgICAgICAgbGVmdDogX2tleXNbTWF0aC5tYXgoMCwga2V5SW5kZXggLSAxKV0sXG4gICAgICAgIHJpZ2h0OiBfa2V5c1tNYXRoLm1pbihfa2V5cy5sZW5ndGgsIGtleUluZGV4ICsgMSldLFxuICAgICAgICB0cmFpbDogZGVsYXkgPSBkZWxheSArIHRyYWlsLFxuICAgICAgICBjb25maWc6IGNhbGxQcm9wKGNvbmZpZywgaXRlbSwgc3RhdGUpLFxuICAgICAgICB0bzogY2FsbFByb3AobGVhdmUsIGl0ZW0pXG4gICAgICB9KSk7XG4gICAgICBkZWxldGUgY3VycmVudFtrZXldO1xuICAgIH0pO1xuICAgIHVwZGF0ZWQuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3Qga2V5SW5kZXggPSBrZXlzLmluZGV4T2Yoa2V5KTtcbiAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1trZXlJbmRleF07XG4gICAgICBjb25zdCBzdGF0ZSA9ICd1cGRhdGUnO1xuICAgICAgY3VycmVudFtrZXldID0gX2V4dGVuZHMoe30sIGN1cnJlbnRba2V5XSwge1xuICAgICAgICBpdGVtLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgdHJhaWw6IGRlbGF5ID0gZGVsYXkgKyB0cmFpbCxcbiAgICAgICAgY29uZmlnOiBjYWxsUHJvcChjb25maWcsIGl0ZW0sIHN0YXRlKSxcbiAgICAgICAgdG86IGNhbGxQcm9wKHVwZGF0ZSwgaXRlbSlcbiAgICAgIH0pO1xuICAgIH0pOyAvLyBUaGlzIHRyaWVzIHRvIHJlc3RvcmUgb3JkZXIgZm9yIGRlbGV0ZWQgaXRlbXMgYnkgZmluZGluZyB0aGVpciBsYXN0IGtub3duIHNpYmxpbmdzXG5cbiAgICBsZXQgb3V0ID0ga2V5cy5tYXAoa2V5ID0+IGN1cnJlbnRba2V5XSk7XG4gICAgZGVsZXRlZC5mb3JFYWNoKChfcmVmMykgPT4ge1xuICAgICAgbGV0IGxlZnQgPSBfcmVmMy5sZWZ0LFxuICAgICAgICAgIHJpZ2h0ID0gX3JlZjMucmlnaHQsXG4gICAgICAgICAgdHJhbnNpdGlvbiA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYzLCBbXCJsZWZ0XCIsIFwicmlnaHRcIl0pO1xuXG4gICAgICBsZXQgcG9zOyAvLyBXYXMgaXQgdGhlIGVsZW1lbnQgb24gdGhlIGxlZnQsIGlmIHllcywgbW92ZSB0aGVyZSAuLi5cblxuICAgICAgaWYgKChwb3MgPSBvdXQuZmluZEluZGV4KHQgPT4gdC5vcmlnaW5hbEtleSA9PT0gbGVmdCkpICE9PSAtMSkgcG9zICs9IDE7IC8vIE9yIGhvdyBhYm91dCB0aGUgZWxlbWVudCBvbiB0aGUgcmlnaHQgLi4uXG5cbiAgICAgIGlmIChwb3MgPT09IC0xKSBwb3MgPSBvdXQuZmluZEluZGV4KHQgPT4gdC5vcmlnaW5hbEtleSA9PT0gcmlnaHQpOyAvLyBNYXliZSB3ZSdsbCBmaW5kIGl0IGluIHRoZSBsaXN0IG9mIGRlbGV0ZWQgaXRlbXNcblxuICAgICAgaWYgKHBvcyA9PT0gLTEpIHBvcyA9IGRlbGV0ZWQuZmluZEluZGV4KHQgPT4gdC5vcmlnaW5hbEtleSA9PT0gbGVmdCk7IC8vIENoZWNraW5nIHJpZ2h0IHNpZGUgYXMgd2VsbFxuXG4gICAgICBpZiAocG9zID09PSAtMSkgcG9zID0gZGVsZXRlZC5maW5kSW5kZXgodCA9PiB0Lm9yaWdpbmFsS2V5ID09PSByaWdodCk7IC8vIEFuZCBpZiBub3RoaW5nIGVsc2UgaGVscHMsIG1vdmUgaXQgdG8gdGhlIHN0YXJ0IMKvXFxfKOODhClfL8KvXG5cbiAgICAgIHBvcyA9IE1hdGgubWF4KDAsIHBvcyk7XG4gICAgICBvdXQgPSBbLi4ub3V0LnNsaWNlKDAsIHBvcyksIHRyYW5zaXRpb24sIC4uLm91dC5zbGljZShwb3MpXTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlyc3Q6IGZpcnN0ICYmIGFkZGVkLmxlbmd0aCA9PT0gMCxcbiAgICAgIHRyYW5zaXRpb25zOiBvdXQsXG4gICAgICBjdXJyZW50LFxuICAgICAgZGVsZXRlZCxcbiAgICAgIHByZXZQcm9wczogcHJvcHNcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgaW5pdGlhbCA9IF90aGlzJHByb3BzMi5pbml0aWFsLFxuICAgICAgICAgIF90aGlzJHByb3BzMiRmcm9tID0gX3RoaXMkcHJvcHMyLmZyb20sXG4gICAgICAgICAgX3RoaXMkcHJvcHMyJGVudGVyID0gX3RoaXMkcHJvcHMyLmVudGVyLFxuICAgICAgICAgIF90aGlzJHByb3BzMiRsZWF2ZSA9IF90aGlzJHByb3BzMi5sZWF2ZSxcbiAgICAgICAgICBfdGhpcyRwcm9wczIkdXBkYXRlID0gX3RoaXMkcHJvcHMyLnVwZGF0ZSxcbiAgICAgICAgICBvbkRlc3Ryb3llZCA9IF90aGlzJHByb3BzMi5vbkRlc3Ryb3llZCxcbiAgICAgICAgICBrZXlzID0gX3RoaXMkcHJvcHMyLmtleXMsXG4gICAgICAgICAgaXRlbXMgPSBfdGhpcyRwcm9wczIuaXRlbXMsXG4gICAgICAgICAgb25GcmFtZSA9IF90aGlzJHByb3BzMi5vbkZyYW1lLFxuICAgICAgICAgIG9uUmVzdCA9IF90aGlzJHByb3BzMi5vblJlc3QsXG4gICAgICAgICAgb25TdGFydCA9IF90aGlzJHByb3BzMi5vblN0YXJ0LFxuICAgICAgICAgIHRyYWlsID0gX3RoaXMkcHJvcHMyLnRyYWlsLFxuICAgICAgICAgIGNvbmZpZyA9IF90aGlzJHByb3BzMi5jb25maWcsXG4gICAgICAgICAgX2NoaWxkcmVuID0gX3RoaXMkcHJvcHMyLmNoaWxkcmVuLFxuICAgICAgICAgIHVuaXF1ZSA9IF90aGlzJHByb3BzMi51bmlxdWUsXG4gICAgICAgICAgcmVzZXQgPSBfdGhpcyRwcm9wczIucmVzZXQsXG4gICAgICAgICAgZXh0cmEgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wczIsIFtcImluaXRpYWxcIiwgXCJmcm9tXCIsIFwiZW50ZXJcIiwgXCJsZWF2ZVwiLCBcInVwZGF0ZVwiLCBcIm9uRGVzdHJveWVkXCIsIFwia2V5c1wiLCBcIml0ZW1zXCIsIFwib25GcmFtZVwiLCBcIm9uUmVzdFwiLCBcIm9uU3RhcnRcIiwgXCJ0cmFpbFwiLCBcImNvbmZpZ1wiLCBcImNoaWxkcmVuXCIsIFwidW5pcXVlXCIsIFwicmVzZXRcIl0pO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUudHJhbnNpdGlvbnMubWFwKChfcmVmNCwgaSkgPT4ge1xuICAgICAgbGV0IHN0YXRlID0gX3JlZjQuc3RhdGUsXG4gICAgICAgICAga2V5ID0gX3JlZjQua2V5LFxuICAgICAgICAgIGl0ZW0gPSBfcmVmNC5pdGVtLFxuICAgICAgICAgIGZyb20gPSBfcmVmNC5mcm9tLFxuICAgICAgICAgIHRvID0gX3JlZjQudG8sXG4gICAgICAgICAgdHJhaWwgPSBfcmVmNC50cmFpbCxcbiAgICAgICAgICBjb25maWcgPSBfcmVmNC5jb25maWcsXG4gICAgICAgICAgZGVzdHJveWVkID0gX3JlZjQuZGVzdHJveWVkO1xuICAgICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoS2V5ZnJhbWVzLCBfZXh0ZW5kcyh7XG4gICAgICAgIHJlc2V0OiByZXNldCAmJiBzdGF0ZSA9PT0gJ2VudGVyJyxcbiAgICAgICAgcHJpbWl0aXZlOiBTcHJpbmcsXG4gICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgZmlsdGVyOiBpbnRlcnBvbGF0ZVRvLFxuICAgICAgICBzdGF0ZXM6IHtcbiAgICAgICAgICBbc3RhdGVdOiB0b1xuICAgICAgICB9LFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgb25SZXN0OiBkZXN0cm95ZWQgPyB0aGlzLmRlc3Ryb3lJdGVtKGl0ZW0sIGtleSwgc3RhdGUpIDogb25SZXN0ICYmICh2YWx1ZXMgPT4gb25SZXN0KGl0ZW0sIHN0YXRlLCB2YWx1ZXMpKSxcbiAgICAgICAgb25TdGFydDogb25TdGFydCAmJiAoKCkgPT4gb25TdGFydChpdGVtLCBzdGF0ZSkpLFxuICAgICAgICBvbkZyYW1lOiBvbkZyYW1lICYmICh2YWx1ZXMgPT4gb25GcmFtZShpdGVtLCBzdGF0ZSwgdmFsdWVzKSksXG4gICAgICAgIGRlbGF5OiB0cmFpbCxcbiAgICAgICAgY29uZmlnOiBjb25maWdcbiAgICAgIH0sIGV4dHJhLCB7XG4gICAgICAgIGZyb206IGZyb20sXG4gICAgICAgIGNoaWxkcmVuOiBwcm9wcyA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBfY2hpbGRyZW4oaXRlbSwgc3RhdGUsIGkpO1xuXG4gICAgICAgICAgcmV0dXJuIGNoaWxkID8gY2hpbGQocHJvcHMpIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbn1cblRyYW5zaXRpb24uZGVmYXVsdFByb3BzID0ge1xuICBrZXlzOiBpdGVtID0+IGl0ZW0sXG4gIHVuaXF1ZTogZmFsc2UsXG4gIHJlc2V0OiBmYWxzZVxufTtcblxuY29uc3QgZG9tRWxlbWVudHMgPSBbJ2EnLCAnYWJicicsICdhZGRyZXNzJywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdhdWRpbycsICdiJywgJ2Jhc2UnLCAnYmRpJywgJ2JkbycsICdiaWcnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYW52YXMnLCAnY2FwdGlvbicsICdjaXRlJywgJ2NvZGUnLCAnY29sJywgJ2NvbGdyb3VwJywgJ2RhdGEnLCAnZGF0YWxpc3QnLCAnZGQnLCAnZGVsJywgJ2RldGFpbHMnLCAnZGZuJywgJ2RpYWxvZycsICdkaXYnLCAnZGwnLCAnZHQnLCAnZW0nLCAnZW1iZWQnLCAnZmllbGRzZXQnLCAnZmlnY2FwdGlvbicsICdmaWd1cmUnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaScsICdpZnJhbWUnLCAnaW1nJywgJ2lucHV0JywgJ2lucycsICdrYmQnLCAna2V5Z2VuJywgJ2xhYmVsJywgJ2xlZ2VuZCcsICdsaScsICdsaW5rJywgJ21haW4nLCAnbWFwJywgJ21hcmsnLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGEnLCAnbWV0ZXInLCAnbmF2JywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdvbCcsICdvcHRncm91cCcsICdvcHRpb24nLCAnb3V0cHV0JywgJ3AnLCAncGFyYW0nLCAncGljdHVyZScsICdwcmUnLCAncHJvZ3Jlc3MnLCAncScsICdycCcsICdydCcsICdydWJ5JywgJ3MnLCAnc2FtcCcsICdzY3JpcHQnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc21hbGwnLCAnc291cmNlJywgJ3NwYW4nLCAnc3Ryb25nJywgJ3N0eWxlJywgJ3N1YicsICdzdW1tYXJ5JywgJ3N1cCcsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aW1lJywgJ3RpdGxlJywgJ3RyJywgJ3RyYWNrJywgJ3UnLCAndWwnLCAndmFyJywgJ3ZpZGVvJywgJ3dicicsIC8vIFNWR1xuJ2NpcmNsZScsICdjbGlwUGF0aCcsICdkZWZzJywgJ2VsbGlwc2UnLCAnZm9yZWlnbk9iamVjdCcsICdnJywgJ2ltYWdlJywgJ2xpbmUnLCAnbGluZWFyR3JhZGllbnQnLCAnbWFzaycsICdwYXRoJywgJ3BhdHRlcm4nLCAncG9seWdvbicsICdwb2x5bGluZScsICdyYWRpYWxHcmFkaWVudCcsICdyZWN0JywgJ3N0b3AnLCAnc3ZnJywgJ3RleHQnLCAndHNwYW4nXTtcbmNvbnN0IGV4dGVuZGVkQW5pbWF0ZWQgPSBkb21FbGVtZW50cy5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICBhY2NbZWxlbWVudF0gPSBjcmVhdGVBbmltYXRlZENvbXBvbmVudChlbGVtZW50KTtcbiAgcmV0dXJuIGFjYztcbn0sIGNyZWF0ZUFuaW1hdGVkQ29tcG9uZW50KTtcblxuZXhwb3J0cy5TcHJpbmcgPSBTcHJpbmc7XG5leHBvcnRzLktleWZyYW1lcyA9IEtleWZyYW1lcztcbmV4cG9ydHMuVHJhbnNpdGlvbiA9IFRyYW5zaXRpb247XG5leHBvcnRzLlRyYWlsID0gVHJhaWw7XG5leHBvcnRzLkNvbnRyb2xsZXIgPSBDb250cm9sbGVyO1xuZXhwb3J0cy5jb25maWcgPSBjb25maWc7XG5leHBvcnRzLmFuaW1hdGVkID0gZXh0ZW5kZWRBbmltYXRlZDtcbmV4cG9ydHMuaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZSQxO1xuZXhwb3J0cy5HbG9iYWxzID0gR2xvYmFscztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///823\n")},473:module=>{"use strict";eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\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\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = \"production\" !== 'production';\n\nvar warning = function() {};\n\nif (__DEV__) {\n var printWarning = function printWarning(format, args) {\n var len = arguments.length;\n args = new Array(len > 1 ? len - 1 : 0);\n for (var key = 1; key < len; key++) {\n args[key - 1] = arguments[key];\n }\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n }\n\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '`warning(condition, format, ...args)` requires a warning ' +\n 'message argument'\n );\n }\n if (!condition) {\n printWarning.apply(null, [format].concat(args));\n }\n };\n}\n\nmodule.exports = warning;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDczLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zbWFsbC1jdC8uL25vZGVfbW9kdWxlcy93YXJuaW5nL3dhcm5pbmcuanM/ZDk2ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIF9fREVWX18gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nO1xuXG52YXIgd2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChfX0RFVl9fKSB7XG4gIHZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbiBwcmludFdhcm5pbmcoZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAxID8gbGVuIC0gMSA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDE7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMV0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICtcbiAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KTtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9XG5cbiAgd2FybmluZyA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAyID8gbGVuIC0gMiA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDI7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMl0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgK1xuICAgICAgICAgICdtZXNzYWdlIGFyZ3VtZW50J1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHByaW50V2FybmluZy5hcHBseShudWxsLCBbZm9ybWF0XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///473\n")},363:e=>{"use strict";e.exports=React},533:e=>{"use strict";e.exports=ReactDOM},462:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ _extends)\n/* harmony export */ });\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYyLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NtYWxsLWN0Ly4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanM/NGIwOSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///462\n')},366:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ _objectWithoutPropertiesLoose)\n/* harmony export */ });\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY2LmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc21hbGwtY3QvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcz82OTYxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///366\n')}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(n,{a:n}),n},__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(342)})();