You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

25 lines
180 KiB
JavaScript

"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
exports.id = "vendor-chunks/react-router";
exports.ids = ["vendor-chunks/react-router"];
exports.modules = {
/***/ "(ssr)/./node_modules/react-router/dist/index.js":
/*!*************************************************!*\
!*** ./node_modules/react-router/dist/index.js ***!
\*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbortedDeferredError: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.AbortedDeferredError),\n/* harmony export */ Await: () => (/* binding */ Await),\n/* harmony export */ MemoryRouter: () => (/* binding */ MemoryRouter),\n/* harmony export */ Navigate: () => (/* binding */ Navigate),\n/* harmony export */ NavigationType: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.Action),\n/* harmony export */ Outlet: () => (/* binding */ Outlet),\n/* harmony export */ Route: () => (/* binding */ Route),\n/* harmony export */ Router: () => (/* binding */ Router),\n/* harmony export */ RouterProvider: () => (/* binding */ RouterProvider),\n/* harmony export */ Routes: () => (/* binding */ Routes),\n/* harmony export */ UNSAFE_DataRouterContext: () => (/* binding */ DataRouterContext),\n/* harmony export */ UNSAFE_DataRouterStateContext: () => (/* binding */ DataRouterStateContext),\n/* harmony export */ UNSAFE_LocationContext: () => (/* binding */ LocationContext),\n/* harmony export */ UNSAFE_NavigationContext: () => (/* binding */ NavigationContext),\n/* harmony export */ UNSAFE_RouteContext: () => (/* binding */ RouteContext),\n/* harmony export */ UNSAFE_mapRouteProperties: () => (/* binding */ mapRouteProperties),\n/* harmony export */ UNSAFE_useRouteId: () => (/* binding */ useRouteId),\n/* harmony export */ UNSAFE_useRoutesImpl: () => (/* binding */ useRoutesImpl),\n/* harmony export */ createMemoryRouter: () => (/* binding */ createMemoryRouter),\n/* harmony export */ createPath: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.createPath),\n/* harmony export */ createRoutesFromChildren: () => (/* binding */ createRoutesFromChildren),\n/* harmony export */ createRoutesFromElements: () => (/* binding */ createRoutesFromChildren),\n/* harmony export */ defer: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.defer),\n/* harmony export */ generatePath: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.generatePath),\n/* harmony export */ isRouteErrorResponse: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.isRouteErrorResponse),\n/* harmony export */ json: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.json),\n/* harmony export */ matchPath: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.matchPath),\n/* harmony export */ matchRoutes: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.matchRoutes),\n/* harmony export */ parsePath: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.parsePath),\n/* harmony export */ redirect: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.redirect),\n/* harmony export */ redirectDocument: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.redirectDocument),\n/* harmony export */ renderMatches: () => (/* binding */ renderMatches),\n/* harmony export */ resolvePath: () => (/* reexport safe */ _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.resolvePath),\n/* harmony export */ unstable_useBlocker: () => (/* binding */ useBlocker),\n/* harmony export */ useActionData: () => (/* binding */ useActionData),\n/* harmony export */ useAsyncError: () => (/* binding */ useAsyncError),\n/* harmony export */ useAsyncValue: () => (/* binding */ useAsyncValue),\n/* harmony export */ useHref: () => (/* binding */ useHref),\n/* harmony export */ useInRouterContext: () => (/* binding */ useInRouterContext),\n/* harmony export */ useLoaderData: () => (/* binding */ useLoaderData),\n/* harmony export */ useLocation: () => (/* binding */ useLocation),\n/* harmony export */ useMatch: () => (/* binding */ useMatch),\n/* harmony export */ useMatches: () => (/* binding */ useMatches),\n/* harmony export */ useNavigate: () => (/* binding */ useNavigate),\n/* harmony export */ useNavigation: () => (/* binding */ useNavigation),\n/* harmony export */ useNavigationType: () => (/* binding */ useNavigationType),\n/* harmony export */ useOutlet: () => (/* binding */ useOutlet),\n/* harmony export */ useOutletContext: () => (/* binding */ useOutletContext),\n/* harmony export */ useParams: () => (/* binding */ useParams),\n/* harmony export */ useResolvedPath: () => (/* binding */ useResolvedPath),\n/* harmony export */ useRevalidator: () => (/* binding */ useRevalidator),\n/* harmony export */ useRouteError: () => (/* binding */ useRouteError),\n/* harmony export */ useRouteLoaderData: () => (/* binding */ useRouteLoaderData),\n/* harmony export */ useRoutes: () => (/* binding */ useRoutes)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _remix_run_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @remix-run/router */ \"(ssr)/./node_modules/@remix-run/router/dist/router.js\");\n/**\n * React Router v6.15.0\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */ \n\n\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 for(var key in source){\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nconst DataRouterContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createContext(null);\nif (true) {\n DataRouterContext.displayName = \"DataRouter\";\n}\nconst DataRouterStateContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createContext(null);\nif (true) {\n DataRouterStateContext.displayName = \"DataRouterState\";\n}\nconst AwaitContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createContext(null);\nif (true) {\n AwaitContext.displayName = \"Await\";\n}\n/**\n * A Navigator is a \"location changer\"; it's how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level <Router> API\n * where both the location and a navigator must be provided separately in order\n * to avoid \"tearing\" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */ const NavigationContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createContext(null);\nif (true) {\n NavigationContext.displayName = \"Navigation\";\n}\nconst LocationContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createContext(null);\nif (true) {\n LocationContext.displayName = \"Location\";\n}\nconst RouteContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false\n});\nif (true) {\n RouteContext.displayName = \"Route\";\n}\nconst RouteErrorContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createContext(null);\nif (true) {\n RouteErrorContext.displayName = \"RouteError\";\n}\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/hooks/use-href\n */ function useHref(to, _temp) {\n let { relative } = _temp === void 0 ? {} : _temp;\n !useInRouterContext() ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, // router loaded. We can help them understand how to avoid that.\n \"useHref() may be used only in the context of a <Router> component.\") : 0 : void 0;\n let { basename, navigator } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(NavigationContext);\n let { hash, pathname, search } = useResolvedPath(to, {\n relative\n });\n let joinedPathname = pathname;\n // If we're operating within a basename, prepend it to the pathname prior\n // to creating the href. If this is a root navigation, then just use the raw\n // basename which allows the basename to have full control over the presence\n // of a trailing slash on root links\n if (basename !== \"/\") {\n joinedPathname = pathname === \"/\" ? basename : (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.joinPaths)([\n basename,\n pathname\n ]);\n }\n return navigator.createHref({\n pathname: joinedPathname,\n search,\n hash\n });\n}\n/**\n * Returns true if this component is a descendant of a <Router>.\n *\n * @see https://reactrouter.com/hooks/use-in-router-context\n */ function useInRouterContext() {\n return react__WEBPACK_IMPORTED_MODULE_0__.useContext(LocationContext) != null;\n}\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/hooks/use-location\n */ function useLocation() {\n !useInRouterContext() ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, // router loaded. We can help them understand how to avoid that.\n \"useLocation() may be used only in the context of a <Router> component.\") : 0 : void 0;\n return react__WEBPACK_IMPORTED_MODULE_0__.useContext(LocationContext).location;\n}\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/hooks/use-navigation-type\n */ function useNavigationType() {\n return react__WEBPACK_IMPORTED_MODULE_0__.useContext(LocationContext).navigationType;\n}\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * <NavLink>.\n *\n * @see https://reactrouter.com/hooks/use-match\n */ function useMatch(pattern) {\n !useInRouterContext() ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, // router loaded. We can help them understand how to avoid that.\n \"useMatch() may be used only in the context of a <Router> component.\") : 0 : void 0;\n let { pathname } = useLocation();\n return react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>(0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.matchPath)(pattern, pathname), [\n pathname,\n pattern\n ]);\n}\n/**\n * The interface for the navigate() function returned from useNavigate().\n */ const navigateEffectWarning = \"You should call navigate() in a React.useEffect(), not when \" + \"your component is first rendered.\";\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(cb) {\n let isStatic = react__WEBPACK_IMPORTED_MODULE_0__.useContext(NavigationContext).static;\n if (!isStatic) {\n // We should be able to get rid of this once react 18.3 is released\n // See: https://github.com/facebook/react/pull/26395\n // eslint-disable-next-line react-hooks/rules-of-hooks\n react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect(cb);\n }\n}\n/**\n * Returns an imperative method for changing the location. Used by <Link>s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/hooks/use-navigate\n */ function useNavigate() {\n let { isDataRoute } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(RouteContext);\n // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\nfunction useNavigateUnstable() {\n !useInRouterContext() ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, // router loaded. We can help them understand how to avoid that.\n \"useNavigate() may be used only in the context of a <Router> component.\") : 0 : void 0;\n let dataRouterContext = react__WEBPACK_IMPORTED_MODULE_0__.useContext(DataRouterContext);\n let { basename, navigator } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(NavigationContext);\n let { matches } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let routePathnamesJson = JSON.stringify((0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_getPathContributingMatches)(matches).map((match)=>match.pathnameBase));\n let activeRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(false);\n useIsomorphicLayoutEffect(()=>{\n activeRef.current = true;\n });\n let navigate = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function(to, options) {\n if (options === void 0) {\n options = {};\n }\n true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(activeRef.current, navigateEffectWarning) : 0;\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our history listener yet\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n let path = (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.resolveTo)(to, JSON.parse(routePathnamesJson), locationPathname, options.relative === \"path\");\n // If we're operating within a basename, prepend it to the pathname prior\n // to handing off to history (but only if we're not in a data router,\n // otherwise it'll prepend the basename inside of the router).\n // If this is a root navigation, then we navigate to the raw basename\n // which allows the basename to have full control over the presence of a\n // trailing slash on root links\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.joinPaths)([\n basename,\n path.pathname\n ]);\n }\n (!!options.replace ? navigator.replace : navigator.push)(path, options.state, options);\n }, [\n basename,\n navigator,\n routePathnamesJson,\n locationPathname,\n dataRouterContext\n ]);\n return navigate;\n}\nconst OutletContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createContext(null);\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/hooks/use-outlet-context\n */ function useOutletContext() {\n return react__WEBPACK_IMPORTED_MODULE_0__.useContext(OutletContext);\n}\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by <Outlet> to render child routes.\n *\n * @see https://reactrouter.com/hooks/use-outlet\n */ function useOutlet(context) {\n let outlet = react__WEBPACK_IMPORTED_MODULE_0__.useContext(RouteContext).outlet;\n if (outlet) {\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(OutletContext.Provider, {\n value: context\n }, outlet);\n }\n return outlet;\n}\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/hooks/use-params\n */ function useParams() {\n let { matches } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? routeMatch.params : {};\n}\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/hooks/use-resolved-path\n */ function useResolvedPath(to, _temp2) {\n let { relative } = _temp2 === void 0 ? {} : _temp2;\n let { matches } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let routePathnamesJson = JSON.stringify((0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_getPathContributingMatches)(matches).map((match)=>match.pathnameBase));\n return react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>(0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.resolveTo)(to, JSON.parse(routePathnamesJson), locationPathname, relative === \"path\"), [\n to,\n routePathnamesJson,\n locationPathname,\n relative\n ]);\n}\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an <Outlet> to render their child route's\n * element.\n *\n * @see https://reactrouter.com/hooks/use-routes\n */ function useRoutes(routes, locationArg) {\n return useRoutesImpl(routes, locationArg);\n}\n// Internal implementation with accept optional param for RouterProvider usage\nfunction useRoutesImpl(routes, locationArg, dataRouterState) {\n !useInRouterContext() ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, // router loaded. We can help them understand how to avoid that.\n \"useRoutes() may be used only in the context of a <Router> component.\") : 0 : void 0;\n let { navigator } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(NavigationContext);\n let { matches: parentMatches } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n let parentRoute = routeMatch && routeMatch.route;\n if (true) {\n // You won't get a warning about 2 different <Routes> under a <Route>\n // without a trailing *, but this is a best-effort warning anyway since we\n // cannot even give the warning unless they land at the parent route.\n //\n // Example:\n //\n // <Routes>\n // {/* This route path MUST end with /* because otherwise\n // it will never match /blog/post/123 */}\n // <Route path=\"blog\" element={<Blog />} />\n // <Route path=\"blog/feed\" element={<BlogFeed />} />\n // </Routes>\n //\n // function Blog() {\n // return (\n // <Routes>\n // <Route path=\"post/:id\" element={<Post />} />\n // </Routes>\n // );\n // }\n let parentPath = parentRoute && parentRoute.path || \"\";\n warningOnce(parentPathname, !parentRoute || parentPath.endsWith(\"*\"), \"You rendered descendant <Routes> (or called `useRoutes()`) at \" + ('\"' + parentPathname + '\" (under <Route path=\"' + parentPath + '\">) but the ') + 'parent route path has no trailing \"*\". This means if you navigate ' + \"deeper, the parent won't match anymore and therefore the child \" + \"routes will never render.\\n\\n\" + ('Please change the parent <Route path=\"' + parentPath + '\"> to <Route ') + ('path=\"' + (parentPath === \"/\" ? \"*\" : parentPath + \"/*\") + '\">.'));\n }\n let locationFromContext = useLocation();\n let location;\n if (locationArg) {\n var _parsedLocationArg$pa;\n let parsedLocationArg = typeof locationArg === \"string\" ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.parsePath)(locationArg) : locationArg;\n !(parentPathnameBase === \"/\" || ((_parsedLocationArg$pa = parsedLocationArg.pathname) == null ? void 0 : _parsedLocationArg$pa.startsWith(parentPathnameBase))) ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"When overriding the location using `<Routes location>` or `useRoutes(routes, location)`, \" + \"the location pathname must begin with the portion of the URL pathname that was \" + ('matched by all parent routes. The current pathname base is \"' + parentPathnameBase + '\" ') + ('but pathname \"' + parsedLocationArg.pathname + '\" was given in the `location` prop.')) : 0 : void 0;\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n let pathname = location.pathname || \"/\";\n let remainingPathname = parentPathnameBase === \"/\" ? pathname : pathname.slice(parentPathnameBase.length) || \"/\";\n let matches = (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.matchRoutes)(routes, {\n pathname: remainingPathname\n });\n if (true) {\n true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(parentRoute || matches != null, 'No routes matched location \"' + location.pathname + location.search + location.hash + '\" ') : 0;\n true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(matches == null || matches[matches.length - 1].route.element !== undefined || matches[matches.length - 1].route.Component !== undefined, 'Matched leaf route at location \"' + location.pathname + location.search + location.hash + '\" ' + \"does not have an element or Component. This means it will render an <Outlet /> with a \" + 'null value by default resulting in an \"empty\" page.') : 0;\n }\n let renderedMatches = _renderMatches(matches && matches.map((match)=>Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.joinPaths)([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathname).pathname : match.pathname\n ]),\n pathnameBase: match.pathnameBase === \"/\" ? parentPathnameBase : (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.joinPaths)([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathnameBase).pathname : match.pathnameBase\n ])\n })), parentMatches, dataRouterState);\n // When a user passes in a `locationArg`, the associated routes need to\n // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n // to use the scoped location instead of the global location.\n if (locationArg && renderedMatches) {\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(LocationContext.Provider, {\n value: {\n location: _extends({\n pathname: \"/\",\n search: \"\",\n hash: \"\",\n state: null,\n key: \"default\"\n }, location),\n navigationType: _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.Action.Pop\n }\n }, renderedMatches);\n }\n return renderedMatches;\n}\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.isRouteErrorResponse)(error) ? error.status + \" \" + error.statusText : error instanceof Error ? error.message : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = {\n padding: \"0.5rem\",\n backgroundColor: lightgrey\n };\n let codeStyles = {\n padding: \"2px 4px\",\n backgroundColor: lightgrey\n };\n let devInfo = null;\n if (true) {\n console.error(\"Error handled by React Router default ErrorBoundary:\", error);\n devInfo = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\", null, \"\\uD83D\\uDCBF Hey developer \\uD83D\\uDC4B\"), /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\", null, \"You can provide a way better UX than this when your app throws errors by providing your own \", /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"code\", {\n style: codeStyles\n }, \"ErrorBoundary\"), \" or\", \" \", /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"code\", {\n style: codeStyles\n }, \"errorElement\"), \" prop on your route.\"));\n }\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h2\", null, \"Unexpected Application Error!\"), /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h3\", {\n style: {\n fontStyle: \"italic\"\n }\n }, message), stack ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"pre\", {\n style: preStyles\n }, stack) : null, devInfo);\n}\nconst defaultErrorElement = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(DefaultErrorComponent, null);\nclass RenderErrorBoundary extends react__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(props){\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error: error\n };\n }\n static getDerivedStateFromProps(props, state) {\n // When we get into an error state, the user will likely click \"back\" to the\n // previous page that didn't have an error. Because this wraps the entire\n // application, that will have no effect--the error page continues to display.\n // This gives us a mechanism to recover from the error when the location changes.\n //\n // Whether we're in an error state or not, we update the location in state\n // so that when we are in an error state, it gets reset when a new location\n // comes in and the user recovers from the error.\n if (state.location !== props.location || state.revalidation !== \"idle\" && props.revalidation === \"idle\") {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation\n };\n }\n // If we're not changing locations, preserve the location but still surface\n // any new errors that may come through. We retain the existing error, we do\n // this because the error provided from the app state may be cleared without\n // the location changing.\n return {\n error: props.error || state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(\"React Router caught the following error during render\", error, errorInfo);\n }\n render() {\n return this.state.error ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(RouteContext.Provider, {\n value: this.props.routeContext\n }, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(RouteErrorContext.Provider, {\n value: this.state.error,\n children: this.props.component\n })) : this.props.children;\n }\n}\nfunction RenderedRoute(_ref) {\n let { routeContext, match, children } = _ref;\n let dataRouterContext = react__WEBPACK_IMPORTED_MODULE_0__.useContext(DataRouterContext);\n // Track how deep we got in our render pass to emulate SSR componentDidCatch\n // in a DataStaticRouter\n if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(RouteContext.Provider, {\n value: routeContext\n }, children);\n}\nfunction _renderMatches(matches, parentMatches, dataRouterState) {\n var _dataRouterState2;\n if (parentMatches === void 0) {\n parentMatches = [];\n }\n if (dataRouterState === void 0) {\n dataRouterState = null;\n }\n if (matches == null) {\n var _dataRouterState;\n if ((_dataRouterState = dataRouterState) != null && _dataRouterState.errors) {\n // Don't bail if we have data router errors so we can render them in the\n // boundary. Use the pre-matched (or shimmed) matches\n matches = dataRouterState.matches;\n } else {\n return null;\n }\n }\n let renderedMatches = matches;\n // If we have data errors, trim matches to the highest error boundary\n let errors = (_dataRouterState2 = dataRouterState) == null ? void 0 : _dataRouterState2.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex((m)=>m.route.id && (errors == null ? void 0 : errors[m.route.id]));\n !(errorIndex >= 0) ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"Could not find a matching route for errors on route IDs: \" + Object.keys(errors).join(\",\")) : 0 : void 0;\n renderedMatches = renderedMatches.slice(0, Math.min(renderedMatches.length, errorIndex + 1));\n }\n return renderedMatches.reduceRight((outlet, match, index)=>{\n let error = match.route.id ? errors == null ? void 0 : errors[match.route.id] : null;\n // Only data routers handle errors\n let errorElement = null;\n if (dataRouterState) {\n errorElement = match.route.errorElement || defaultErrorElement;\n }\n let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = ()=>{\n let children;\n if (error) {\n children = errorElement;\n } else if (match.route.Component) {\n // Note: This is a de-optimized path since React won't re-use the\n // ReactElement since it's identity changes with each new\n // React.createElement call. We keep this so folks can use\n // `<Route Component={...}>` in `<Routes>` but generally `Component`\n // usage is only advised in `RouterProvider` when we can convert it to\n // `element` ahead of time.\n children = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(match.route.Component, null);\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(RenderedRoute, {\n match: match,\n routeContext: {\n outlet,\n matches,\n isDataRoute: dataRouterState != null\n },\n children: children\n });\n };\n // Only wrap in an error boundary within data router usages when we have an\n // ErrorBoundary/errorElement on this route. Otherwise let it bubble up to\n // an ancestor ErrorBoundary/errorElement\n return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(RenderErrorBoundary, {\n location: dataRouterState.location,\n revalidation: dataRouterState.revalidation,\n component: errorElement,\n error: error,\n children: getChildren(),\n routeContext: {\n outlet: null,\n matches,\n isDataRoute: true\n }\n }) : getChildren();\n }, null);\n}\nvar DataRouterHook = /*#__PURE__*/ function(DataRouterHook) {\n DataRouterHook[\"UseBlocker\"] = \"useBlocker\";\n DataRouterHook[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterHook[\"UseNavigateStable\"] = \"useNavigate\";\n return DataRouterHook;\n}(DataRouterHook || {});\nvar DataRouterStateHook = /*#__PURE__*/ function(DataRouterStateHook) {\n DataRouterStateHook[\"UseBlocker\"] = \"useBlocker\";\n DataRouterStateHook[\"UseLoaderData\"] = \"useLoaderData\";\n DataRouterStateHook[\"UseActionData\"] = \"useActionData\";\n DataRouterStateHook[\"UseRouteError\"] = \"useRouteError\";\n DataRouterStateHook[\"UseNavigation\"] = \"useNavigation\";\n DataRouterStateHook[\"UseRouteLoaderData\"] = \"useRouteLoaderData\";\n DataRouterStateHook[\"UseMatches\"] = \"useMatches\";\n DataRouterStateHook[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterStateHook[\"UseNavigateStable\"] = \"useNavigate\";\n DataRouterStateHook[\"UseRouteId\"] = \"useRouteId\";\n return DataRouterStateHook;\n}(DataRouterStateHook || {});\nfunction getDataRouterConsoleError(hookName) {\n return hookName + \" must be used within a data router. See https://reactrouter.com/routers/picking-a-router.\";\n}\nfunction useDataRouterContext(hookName) {\n let ctx = react__WEBPACK_IMPORTED_MODULE_0__.useContext(DataRouterContext);\n !ctx ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, getDataRouterConsoleError(hookName)) : 0 : void 0;\n return ctx;\n}\nfunction useDataRouterState(hookName) {\n let state = react__WEBPACK_IMPORTED_MODULE_0__.useContext(DataRouterStateContext);\n !state ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, getDataRouterConsoleError(hookName)) : 0 : void 0;\n return state;\n}\nfunction useRouteContext(hookName) {\n let route = react__WEBPACK_IMPORTED_MODULE_0__.useContext(RouteContext);\n !route ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, getDataRouterConsoleError(hookName)) : 0 : void 0;\n return route;\n}\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName) {\n let route = useRouteContext(hookName);\n let thisRoute = route.matches[route.matches.length - 1];\n !thisRoute.route.id ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, hookName + ' can only be used on routes that contain a unique \"id\"') : 0 : void 0;\n return thisRoute.route.id;\n}\n/**\n * Returns the ID for the nearest contextual route\n */ function useRouteId() {\n return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */ function useNavigation() {\n let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n return state.navigation;\n}\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */ function useRevalidator() {\n let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n return react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>({\n revalidate: dataRouterContext.router.revalidate,\n state: state.revalidation\n }), [\n dataRouterContext.router.revalidate,\n state.revalidation\n ]);\n}\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */ function useMatches() {\n let { matches, loaderData } = useDataRouterState(DataRouterStateHook.UseMatches);\n return react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>matches.map((match)=>{\n let { pathname, params } = match;\n // Note: This structure matches that created by createUseMatchesMatch\n // in the @remix-run/router , so if you change this please also change\n // that :) Eventually we'll DRY this up\n return {\n id: match.route.id,\n pathname,\n params,\n data: loaderData[match.route.id],\n handle: match.route.handle\n };\n }), [\n matches,\n loaderData\n ]);\n}\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */ function useLoaderData() {\n let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n if (state.errors && state.errors[routeId] != null) {\n console.error(\"You cannot `useLoaderData` in an errorElement (routeId: \" + routeId + \")\");\n return undefined;\n }\n return state.loaderData[routeId];\n}\n/**\n * Returns the loaderData for the given routeId\n */ function useRouteLoaderData(routeId) {\n let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n return state.loaderData[routeId];\n}\n/**\n * Returns the action data for the nearest ancestor Route action\n */ function useActionData() {\n let state = useDataRouterState(DataRouterStateHook.UseActionData);\n let route = react__WEBPACK_IMPORTED_MODULE_0__.useContext(RouteContext);\n !route ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"useActionData must be used inside a RouteContext\") : 0 : void 0;\n return Object.values((state == null ? void 0 : state.actionData) || {})[0];\n}\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error. This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */ function useRouteError() {\n var _state$errors;\n let error = react__WEBPACK_IMPORTED_MODULE_0__.useContext(RouteErrorContext);\n let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n // If this was a render error, we put it in a RouteError context inside\n // of RenderErrorBoundary\n if (error) {\n return error;\n }\n // Otherwise look for errors from our data router state\n return (_state$errors = state.errors) == null ? void 0 : _state$errors[routeId];\n}\n/**\n * Returns the happy-path data from the nearest ancestor <Await /> value\n */ function useAsyncValue() {\n let value = react__WEBPACK_IMPORTED_MODULE_0__.useContext(AwaitContext);\n return value == null ? void 0 : value._data;\n}\n/**\n * Returns the error from the nearest ancestor <Await /> value\n */ function useAsyncError() {\n let value = react__WEBPACK_IMPORTED_MODULE_0__.useContext(AwaitContext);\n return value == null ? void 0 : value._error;\n}\nlet blockerId = 0;\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation. Mostly used to avoid\n * using half-filled form data. This does not handle hard-reloads or\n * cross-origin navigations.\n */ function useBlocker(shouldBlock) {\n let { router, basename } = useDataRouterContext(DataRouterHook.UseBlocker);\n let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n let [blockerKey, setBlockerKey] = react__WEBPACK_IMPORTED_MODULE_0__.useState(\"\");\n let blockerFunction = react__WEBPACK_IMPORTED_MODULE_0__.useCallback((arg)=>{\n if (typeof shouldBlock !== \"function\") {\n return !!shouldBlock;\n }\n if (basename === \"/\") {\n return shouldBlock(arg);\n }\n // If they provided us a function and we've got an active basename, strip\n // it from the locations we expose to the user to match the behavior of\n // useLocation\n let { currentLocation, nextLocation, historyAction } = arg;\n return shouldBlock({\n currentLocation: _extends({}, currentLocation, {\n pathname: (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.stripBasename)(currentLocation.pathname, basename) || currentLocation.pathname\n }),\n nextLocation: _extends({}, nextLocation, {\n pathname: (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.stripBasename)(nextLocation.pathname, basename) || nextLocation.pathname\n }),\n historyAction\n });\n }, [\n basename,\n shouldBlock\n ]);\n // This effect is in charge of blocker key assignment and deletion (which is\n // tightly coupled to the key)\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n let key = String(++blockerId);\n setBlockerKey(key);\n return ()=>router.deleteBlocker(key);\n }, [\n router\n ]);\n // This effect handles assigning the blockerFunction. This is to handle\n // unstable blocker function identities, and happens only after the prior\n // effect so we don't get an orphaned blockerFunction in the router with a\n // key of \"\". Until then we just have the IDLE_BLOCKER.\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n if (blockerKey !== \"\") {\n router.getBlocker(blockerKey, blockerFunction);\n }\n }, [\n router,\n blockerKey,\n blockerFunction\n ]);\n // Prefer the blocker from `state` not `router.state` since DataRouterContext\n // is memoized so this ensures we update on blocker state updates\n return blockerKey && state.blockers.has(blockerKey) ? state.blockers.get(blockerKey) : _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.IDLE_BLOCKER;\n}\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */ function useNavigateStable() {\n let { router } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n let activeRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(false);\n useIsomorphicLayoutEffect(()=>{\n activeRef.current = true;\n });\n let navigate = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function(to, options) {\n if (options === void 0) {\n options = {};\n }\n true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(activeRef.current, navigateEffectWarning) : 0;\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our router subscriber yet\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, _extends({\n fromRouteId: id\n }, options));\n }\n }, [\n router,\n id\n ]);\n return navigate;\n}\nconst alreadyWarned = {};\nfunction warningOnce(key, cond, message) {\n if (!cond && !alreadyWarned[key]) {\n alreadyWarned[key] = true;\n true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(false, message) : 0;\n }\n}\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn't exist in `React`:\n * import { startTransition } from \"react\"\n * import * as React from from \"react\";\n \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from \"react\";\n \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from \"react\";\n const START_TRANSITION = \"startTransition\";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/ const START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = react__WEBPACK_IMPORTED_MODULE_0__[START_TRANSITION];\n/**\n * Given a Remix Router instance, render the appropriate UI\n */ function RouterProvider(_ref) {\n let { fallbackElement, router, future } = _ref;\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n let [state, setStateImpl] = react__WEBPACK_IMPORTED_MODULE_0__.useState(router.state);\n let { v7_startTransition } = future || {};\n let setState = react__WEBPACK_IMPORTED_MODULE_0__.useCallback((newState)=>{\n v7_startTransition && startTransitionImpl ? startTransitionImpl(()=>setStateImpl(newState)) : setStateImpl(newState);\n }, [\n setStateImpl,\n v7_startTransition\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect(()=>router.subscribe(setState), [\n router,\n setState\n ]);\n let navigator = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>{\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: (n)=>router.navigate(n),\n push: (to, state, opts)=>router.navigate(to, {\n state,\n preventScrollReset: opts == null ? void 0 : opts.preventScrollReset\n }),\n replace: (to, state, opts)=>router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts == null ? void 0 : opts.preventScrollReset\n })\n };\n }, [\n router\n ]);\n let basename = router.basename || \"/\";\n let dataRouterContext = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>({\n router,\n navigator,\n static: false,\n basename\n }), [\n router,\n navigator,\n basename\n ]);\n // The fragment and {null} here are important! We need them to keep React 18's\n // useId happy when we are server-rendering since we may have a <script> here\n // containing the hydrated server-side staticContext (from StaticRouterProvider).\n // useId relies on the component tree structure to generate deterministic id's\n // so we need to ensure it remains the same on the client even though\n // we don't need the <script> tag\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(DataRouterContext.Provider, {\n value: dataRouterContext\n }, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(DataRouterStateContext.Provider, {\n value: state\n }, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(Router, {\n basename: basename,\n location: state.location,\n navigationType: state.historyAction,\n navigator: navigator\n }, state.initialized ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(DataRoutes, {\n routes: router.routes,\n state: state\n }) : fallbackElement))), null);\n}\nfunction DataRoutes(_ref2) {\n let { routes, state } = _ref2;\n return useRoutesImpl(routes, undefined, state);\n}\n/**\n * A <Router> that stores all entries in memory.\n *\n * @see https://reactrouter.com/router-components/memory-router\n */ function MemoryRouter(_ref3) {\n let { basename, children, initialEntries, initialIndex, future } = _ref3;\n let historyRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef();\n if (historyRef.current == null) {\n historyRef.current = (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.createMemoryHistory)({\n initialEntries,\n initialIndex,\n v5Compat: true\n });\n }\n let history = historyRef.current;\n let [state, setStateImpl] = react__WEBPACK_IMPORTED_MODULE_0__.useState({\n action: history.action,\n location: history.location\n });\n let { v7_startTransition } = future || {};\n let setState = react__WEBPACK_IMPORTED_MODULE_0__.useCallback((newState)=>{\n v7_startTransition && startTransitionImpl ? startTransitionImpl(()=>setStateImpl(newState)) : setStateImpl(newState);\n }, [\n setStateImpl,\n v7_startTransition\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect(()=>history.listen(setState), [\n history,\n setState\n ]);\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\n/**\n * Changes the current location.\n *\n * Note: This API is mostly useful in React.Component subclasses that are not\n * able to use hooks. In functional components, we recommend you use the\n * `useNavigate` hook instead.\n *\n * @see https://reactrouter.com/components/navigate\n */ function Navigate(_ref4) {\n let { to, replace, state, relative } = _ref4;\n !useInRouterContext() ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, // the router loaded. We can help them understand how to avoid that.\n \"<Navigate> may be used only in the context of a <Router> component.\") : 0 : void 0;\n true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(!react__WEBPACK_IMPORTED_MODULE_0__.useContext(NavigationContext).static, \"<Navigate> must not be used on the initial render in a <StaticRouter>. \" + \"This is a no-op, but you should modify your code so the <Navigate> is \" + \"only ever rendered in response to some user interaction or state change.\") : 0;\n let { matches } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let navigate = useNavigate();\n // Resolve the path outside of the effect so that when effects run twice in\n // StrictMode they navigate to the same place\n let path = (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.resolveTo)(to, (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_getPathContributingMatches)(matches).map((match)=>match.pathnameBase), locationPathname, relative === \"path\");\n let jsonPath = JSON.stringify(path);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>navigate(JSON.parse(jsonPath), {\n replace,\n state,\n relative\n }), [\n navigate,\n jsonPath,\n relative,\n replace,\n state\n ]);\n return null;\n}\n/**\n * Renders the child route's element, if there is one.\n *\n * @see https://reactrouter.com/components/outlet\n */ function Outlet(props) {\n return useOutlet(props.context);\n}\n/**\n * Declares an element that should be rendered at a certain URL path.\n *\n * @see https://reactrouter.com/components/route\n */ function Route(_props) {\n true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"A <Route> is only ever to be used as the child of <Routes> element, \" + \"never rendered directly. Please wrap your <Route> in a <Routes>.\") : 0;\n}\n/**\n * Provides location context for the rest of the app.\n *\n * Note: You usually won't render a <Router> directly. Instead, you'll render a\n * router that is more specific to your environment such as a <BrowserRouter>\n * in web browsers or a <StaticRouter> for server rendering.\n *\n * @see https://reactrouter.com/router-components/router\n */ function Router(_ref5) {\n let { basename: basenameProp = \"/\", children = null, location: locationProp, navigationType = _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.Action.Pop, navigator, static: staticProp = false } = _ref5;\n !!useInRouterContext() ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"You cannot render a <Router> inside another <Router>.\" + \" You should never have more than one in your app.\") : 0 : void 0;\n // Preserve trailing slashes on basename, so we can let the user control\n // the enforcement of trailing slashes throughout the app\n let basename = basenameProp.replace(/^\\/*/, \"/\");\n let navigationContext = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>({\n basename,\n navigator,\n static: staticProp\n }), [\n basename,\n navigator,\n staticProp\n ]);\n if (typeof locationProp === \"string\") {\n locationProp = (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.parsePath)(locationProp);\n }\n let { pathname = \"/\", search = \"\", hash = \"\", state = null, key = \"default\" } = locationProp;\n let locationContext = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>{\n let trailingPathname = (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.stripBasename)(pathname, basename);\n if (trailingPathname == null) {\n return null;\n }\n return {\n location: {\n pathname: trailingPathname,\n search,\n hash,\n state,\n key\n },\n navigationType\n };\n }, [\n basename,\n pathname,\n search,\n hash,\n state,\n key,\n navigationType\n ]);\n true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(locationContext != null, '<Router basename=\"' + basename + '\"> is not able to match the URL ' + ('\"' + pathname + search + hash + '\" because it does not start with the ') + \"basename, so the <Router> won't render anything.\") : 0;\n if (locationContext == null) {\n return null;\n }\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(NavigationContext.Provider, {\n value: navigationContext\n }, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(LocationContext.Provider, {\n children: children,\n value: locationContext\n }));\n}\n/**\n * A container for a nested tree of <Route> elements that renders the branch\n * that best matches the current location.\n *\n * @see https://reactrouter.com/components/routes\n */ function Routes(_ref6) {\n let { children, location } = _ref6;\n return useRoutes(createRoutesFromChildren(children), location);\n}\n/**\n * Component to use for rendering lazily loaded data from returning defer()\n * in a loader function\n */ function Await(_ref7) {\n let { children, errorElement, resolve } = _ref7;\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(AwaitErrorBoundary, {\n resolve: resolve,\n errorElement: errorElement\n }, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(ResolveAwait, null, children));\n}\nvar AwaitRenderStatus = /*#__PURE__*/ function(AwaitRenderStatus) {\n AwaitRenderStatus[AwaitRenderStatus[\"pending\"] = 0] = \"pending\";\n AwaitRenderStatus[AwaitRenderStatus[\"success\"] = 1] = \"success\";\n AwaitRenderStatus[AwaitRenderStatus[\"error\"] = 2] = \"error\";\n return AwaitRenderStatus;\n}(AwaitRenderStatus || {});\nconst neverSettledPromise = new Promise(()=>{});\nclass AwaitErrorBoundary extends react__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor(props){\n super(props);\n this.state = {\n error: null\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(\"<Await> caught the following error during render\", error, errorInfo);\n }\n render() {\n let { children, errorElement, resolve } = this.props;\n let promise = null;\n let status = AwaitRenderStatus.pending;\n if (!(resolve instanceof Promise)) {\n // Didn't get a promise - provide as a resolved promise\n status = AwaitRenderStatus.success;\n promise = Promise.resolve();\n Object.defineProperty(promise, \"_tracked\", {\n get: ()=>true\n });\n Object.defineProperty(promise, \"_data\", {\n get: ()=>resolve\n });\n } else if (this.state.error) {\n // Caught a render error, provide it as a rejected promise\n status = AwaitRenderStatus.error;\n let renderError = this.state.error;\n promise = Promise.reject().catch(()=>{}); // Avoid unhandled rejection warnings\n Object.defineProperty(promise, \"_tracked\", {\n get: ()=>true\n });\n Object.defineProperty(promise, \"_error\", {\n get: ()=>renderError\n });\n } else if (resolve._tracked) {\n // Already tracked promise - check contents\n promise = resolve;\n status = promise._error !== undefined ? AwaitRenderStatus.error : promise._data !== undefined ? AwaitRenderStatus.success : AwaitRenderStatus.pending;\n } else {\n // Raw (untracked) promise - track it\n status = AwaitRenderStatus.pending;\n Object.defineProperty(resolve, \"_tracked\", {\n get: ()=>true\n });\n promise = resolve.then((data)=>Object.defineProperty(resolve, \"_data\", {\n get: ()=>data\n }), (error)=>Object.defineProperty(resolve, \"_error\", {\n get: ()=>error\n }));\n }\n if (status === AwaitRenderStatus.error && promise._error instanceof _remix_run_router__WEBPACK_IMPORTED_MODULE_1__.AbortedDeferredError) {\n // Freeze the UI by throwing a never resolved promise\n throw neverSettledPromise;\n }\n if (status === AwaitRenderStatus.error && !errorElement) {\n // No errorElement, throw to the nearest route-level error boundary\n throw promise._error;\n }\n if (status === AwaitRenderStatus.error) {\n // Render via our errorElement\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(AwaitContext.Provider, {\n value: promise,\n children: errorElement\n });\n }\n if (status === AwaitRenderStatus.success) {\n // Render children with resolved value\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(AwaitContext.Provider, {\n value: promise,\n children: children\n });\n }\n // Throw to the suspense boundary\n throw promise;\n }\n}\n/**\n * @private\n * Indirection to leverage useAsyncValue for a render-prop API on <Await>\n */ function ResolveAwait(_ref8) {\n let { children } = _ref8;\n let data = useAsyncValue();\n let toRender = typeof children === \"function\" ? children(data) : children;\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, toRender);\n}\n///////////////////////////////////////////////////////////////////////////////\n// UTILS\n///////////////////////////////////////////////////////////////////////////////\n/**\n * Creates a route config from a React \"children\" object, which is usually\n * either a `<Route>` element or an array of them. Used internally by\n * `<Routes>` to create a route config from its children.\n *\n * @see https://reactrouter.com/utils/create-routes-from-children\n */ function createRoutesFromChildren(children, parentPath) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n let routes = [];\n react__WEBPACK_IMPORTED_MODULE_0__.Children.forEach(children, (element, index)=>{\n if (!/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(element)) {\n // Ignore non-elements. This allows people to more easily inline\n // conditionals in their route config.\n return;\n }\n let treePath = [\n ...parentPath,\n index\n ];\n if (element.type === react__WEBPACK_IMPORTED_MODULE_0__.Fragment) {\n // Transparently support React.Fragment and its children.\n routes.push.apply(routes, createRoutesFromChildren(element.props.children, treePath));\n return;\n }\n !(element.type === Route) ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"[\" + (typeof element.type === \"string\" ? element.type : element.type.name) + \"] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>\") : 0 : void 0;\n !(!element.props.index || !element.props.children) ? true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"An index route cannot have child routes.\") : 0 : void 0;\n let route = {\n id: element.props.id || treePath.join(\"-\"),\n caseSensitive: element.props.caseSensitive,\n element: element.props.element,\n Component: element.props.Component,\n index: element.props.index,\n path: element.props.path,\n loader: element.props.loader,\n action: element.props.action,\n errorElement: element.props.errorElement,\n ErrorBoundary: element.props.ErrorBoundary,\n hasErrorBoundary: element.props.ErrorBoundary != null || element.props.errorElement != null,\n shouldRevalidate: element.props.shouldRevalidate,\n handle: element.props.handle,\n lazy: element.props.lazy\n };\n if (element.props.children) {\n route.children = createRoutesFromChildren(element.props.children, treePath);\n }\n routes.push(route);\n });\n return routes;\n}\n/**\n * Renders the result of `matchRoutes()` into a React element.\n */ function renderMatches(matches) {\n return _renderMatches(matches);\n}\nfunction mapRouteProperties(route) {\n let updates = {\n // Note: this check also occurs in createRoutesFromChildren so update\n // there if you change this -- please and thank you!\n hasErrorBoundary: route.ErrorBoundary != null || route.errorElement != null\n };\n if (route.Component) {\n if (true) {\n if (route.element) {\n true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(false, \"You should not include both `Component` and `element` on your route - \" + \"`Component` will be used.\") : 0;\n }\n }\n Object.assign(updates, {\n element: /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(route.Component),\n Component: undefined\n });\n }\n if (route.ErrorBoundary) {\n if (true) {\n if (route.errorElement) {\n true ? (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(false, \"You should not include both `ErrorBoundary` and `errorElement` on your route - \" + \"`ErrorBoundary` will be used.\") : 0;\n }\n }\n Object.assign(updates, {\n errorElement: /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(route.ErrorBoundary),\n ErrorBoundary: undefined\n });\n }\n return updates;\n}\nfunction createMemoryRouter(routes, opts) {\n return (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.createRouter)({\n basename: opts == null ? void 0 : opts.basename,\n future: _extends({}, opts == null ? void 0 : opts.future, {\n v7_prependBasename: true\n }),\n history: (0,_remix_run_router__WEBPACK_IMPORTED_MODULE_1__.createMemoryHistory)({\n initialEntries: opts == null ? void 0 : opts.initialEntries,\n initialIndex: opts == null ? void 0 : opts.initialIndex\n }),\n hydrationData: opts == null ? void 0 : opts.hydrationData,\n routes,\n mapRouteProperties\n }).initialize();\n}\n //# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2Rpc3QvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7OztDQVNDLEdBQzhCO0FBQ3NQO0FBQ3pEO0FBRTVOLFNBQVN3QjtJQUNQQSxXQUFXQyxPQUFPQyxNQUFNLEdBQUdELE9BQU9DLE1BQU0sQ0FBQ0MsSUFBSSxLQUFLLFNBQVVDLE1BQU07UUFDaEUsSUFBSyxJQUFJQyxJQUFJLEdBQUdBLElBQUlDLFVBQVVDLE1BQU0sRUFBRUYsSUFBSztZQUN6QyxJQUFJRyxTQUFTRixTQUFTLENBQUNELEVBQUU7WUFDekIsSUFBSyxJQUFJSSxPQUFPRCxPQUFRO2dCQUN0QixJQUFJUCxPQUFPUyxTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDSixRQUFRQyxNQUFNO29CQUNyREwsTUFBTSxDQUFDSyxJQUFJLEdBQUdELE1BQU0sQ0FBQ0MsSUFBSTtnQkFDM0I7WUFDRjtRQUNGO1FBQ0EsT0FBT0w7SUFDVDtJQUNBLE9BQU9KLFNBQVNhLEtBQUssQ0FBQyxJQUFJLEVBQUVQO0FBQzlCO0FBRUEsOEVBQThFO0FBQzlFLDJCQUEyQjtBQUMzQixNQUFNUSxvQkFBb0IsV0FBVyxHQUFFdEMsZ0RBQW1CLENBQUM7QUFDM0QsSUFBSXdDLElBQXFDLEVBQUU7SUFDekNGLGtCQUFrQkcsV0FBVyxHQUFHO0FBQ2xDO0FBQ0EsTUFBTUMseUJBQXlCLFdBQVcsR0FBRTFDLGdEQUFtQixDQUFDO0FBQ2hFLElBQUl3QyxJQUFxQyxFQUFFO0lBQ3pDRSx1QkFBdUJELFdBQVcsR0FBRztBQUN2QztBQUNBLE1BQU1FLGVBQWUsV0FBVyxHQUFFM0MsZ0RBQW1CLENBQUM7QUFDdEQsSUFBSXdDLElBQXFDLEVBQUU7SUFDekNHLGFBQWFGLFdBQVcsR0FBRztBQUM3QjtBQUVBOzs7Ozs7OztDQVFDLEdBRUQsTUFB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SSxnREFBbUIsQ0FBQzBILE1BQU1ZLFNBQVM7WUFDekRBLFdBQVdEO1FBQ2I7SUFDRjtJQUNBLElBQUlYLE1BQU1vRCxhQUFhLEVBQUU7UUFDdkIsSUFBSXRJLElBQXFDLEVBQUU7WUFDekMsSUFBSWtGLE1BQU1tRCxZQUFZLEVBQUU7Z0JBcHpDOUIsS0FxekM2QyxHQUFHeEssaUVBQWNBLENBQUMsT0FBTyxvRkFBb0YsbUNBQW1DLENBQU07WUFDN0w7UUFDRjtRQUNBb0IsT0FBT0MsTUFBTSxDQUFDNlMsU0FBUztZQUNyQjFKLGNBQWMsV0FBVyxHQUFFN0ssZ0RBQW1CLENBQUMwSCxNQUFNb0QsYUFBYTtZQUNsRUEsZUFBZXpDO1FBQ2pCO0lBQ0Y7SUFDQSxPQUFPa007QUFDVDtBQUNBLFNBQVNDLG1CQUFtQnZOLE1BQU0sRUFBRXVKLElBQUk7SUFDdEMsT0FBT3pQLCtEQUFZQSxDQUFDO1FBQ2xCeUMsVUFBVWdOLFFBQVEsT0FBTyxLQUFLLElBQUlBLEtBQUtoTixRQUFRO1FBQy9DeU0sUUFBUXpPLFNBQVMsQ0FBQyxHQUFHZ1AsUUFBUSxPQUFPLEtBQUssSUFBSUEsS0FBS1AsTUFBTSxFQUFFO1lBQ3hEd0Usb0JBQW9CO1FBQ3RCO1FBQ0FyRCxTQUFTdlEsc0VBQW1CQSxDQUFDO1lBQzNCbVEsZ0JBQWdCUixRQUFRLE9BQU8sS0FBSyxJQUFJQSxLQUFLUSxjQUFjO1lBQzNEQyxjQUFjVCxRQUFRLE9BQU8sS0FBSyxJQUFJQSxLQUFLUyxZQUFZO1FBQ3pEO1FBQ0F5RCxlQUFlbEUsUUFBUSxPQUFPLEtBQUssSUFBSUEsS0FBS2tFLGFBQWE7UUFDekR6TjtRQUNBcU47SUFDRixHQUFHSyxVQUFVO0FBQ2Y7QUFFZzNCLENBQ2gzQixpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9uZXh0Y2hhdC8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXIvZGlzdC9pbmRleC5qcz8yYTFmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVhY3QgUm91dGVyIHY2LjE1LjBcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVU5TQUZFX2ludmFyaWFudCwgam9pblBhdGhzLCBtYXRjaFBhdGgsIFVOU0FGRV9nZXRQYXRoQ29udHJpYnV0aW5nTWF0Y2hlcywgVU5TQUZFX3dhcm5pbmcsIHJlc29sdmVUbywgcGFyc2VQYXRoLCBtYXRjaFJvdXRlcywgQWN0aW9uLCBzdHJpcEJhc2VuYW1lLCBJRExFX0JMT0NLRVIsIGlzUm91dGVFcnJvclJlc3BvbnNlLCBjcmVhdGVNZW1vcnlIaXN0b3J5LCBBYm9ydGVkRGVmZXJyZWRFcnJvciwgY3JlYXRlUm91dGVyIH0gZnJvbSAnQHJlbWl4LXJ1bi9yb3V0ZXInO1xuZXhwb3J0IHsgQWJvcnRlZERlZmVycmVkRXJyb3IsIEFjdGlvbiBhcyBOYXZpZ2F0aW9uVHlwZSwgY3JlYXRlUGF0aCwgZGVmZXIsIGdlbmVyYXRlUGF0aCwgaXNSb3V0ZUVycm9yUmVzcG9uc2UsIGpzb24sIG1hdGNoUGF0aCwgbWF0Y2hSb3V0ZXMsIHBhcnNlUGF0aCwgcmVkaXJlY3QsIHJlZGlyZWN0RG9jdW1lbnQsIHJlc29sdmVQYXRoIH0gZnJvbSAnQHJlbWl4LXJ1bi9yb3V0ZXInO1xuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuLy8gQ3JlYXRlIHJlYWN0LXNwZWNpZmljIHR5cGVzIGZyb20gdGhlIGFnbm9zdGljIHR5cGVzIGluIEByZW1peC1ydW4vcm91dGVyIHRvXG4vLyBleHBvcnQgZnJvbSByZWFjdC1yb3V0ZXJcbmNvbnN0IERhdGFSb3V0ZXJDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIERhdGFSb3V0ZXJDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJEYXRhUm91dGVyXCI7XG59XG5jb25zdCBEYXRhUm91dGVyU3RhdGVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQuZGlzcGxheU5hbWUgPSBcIkRhdGFSb3V0ZXJTdGF0ZVwiO1xufVxuY29uc3QgQXdhaXRDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIEF3YWl0Q29udGV4dC5kaXNwbGF5TmFtZSA9IFwiQXdhaXRcIjtcbn1cblxuLyoqXG4gKiBBIE5hdmlnYXRvciBpcyBhIFwibG9jYXRpb24gY2hhbmdlclwiOyBpdCdzIGhvdyB5b3UgZ2V0IHRvIGRpZmZlcmVudCBsb2NhdGlvbnMuXG4gKlxuICogRXZlcnkgaGlzdG9yeSBpbnN0YW5jZSBjb25mb3JtcyB0byB0aGUgTmF2aWdhdG9yIGludGVyZmFjZSwgYnV0IHRoZVxuICogZGlzdGluY3Rpb24gaXMgdXNlZnVsIHByaW1hcmlseSB3aGVuIGl0IGNvbWVzIHRvIHRoZSBsb3ctbGV2ZWwgPFJvdXRlcj4gQVBJXG4gKiB3aGVyZSBib3RoIHRoZSBsb2NhdGlvbiBhbmQgYSBuYXZpZ2F0b3IgbXVzdCBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGluIG9yZGVyXG4gKiB0byBhdm9pZCBcInRlYXJpbmdcIiB0aGF0IG1heSBvY2N1ciBpbiBhIHN1c3BlbnNlLWVuYWJsZWQgYXBwIGlmIHRoZSBhY3Rpb25cbiAqIGFuZC9vciBsb2NhdGlvbiB3ZXJlIHRvIGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgaGlzdG9yeSBpbnN0YW5jZS5cbiAqL1xuXG5jb25zdCBOYXZpZ2F0aW9uQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBOYXZpZ2F0aW9uQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiTmF2aWdhdGlvblwiO1xufVxuY29uc3QgTG9jYXRpb25Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIExvY2F0aW9uQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiTG9jYXRpb25cIjtcbn1cbmNvbnN0IFJvdXRlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgb3V0bGV0OiBudWxsLFxuICBtYXRjaGVzOiBbXSxcbiAgaXNEYXRhUm91dGU6IGZhbHNlXG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgUm91dGVDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJSb3V0ZVwiO1xufVxuY29uc3QgUm91dGVFcnJvckNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgUm91dGVFcnJvckNvbnRleHQuZGlzcGxheU5hbWUgPSBcIlJvdXRlRXJyb3JcIjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmdWxsIGhyZWYgZm9yIHRoZSBnaXZlbiBcInRvXCIgdmFsdWUuIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZ1xuICogY3VzdG9tIGxpbmtzIHRoYXQgYXJlIGFsc28gYWNjZXNzaWJsZSBhbmQgcHJlc2VydmUgcmlnaHQtY2xpY2sgYmVoYXZpb3IuXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9ob29rcy91c2UtaHJlZlxuICovXG5mdW5jdGlvbiB1c2VIcmVmKHRvLCBfdGVtcCkge1xuICBsZXQge1xuICAgIHJlbGF0aXZlXG4gIH0gPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDtcbiAgIXVzZUluUm91dGVyQ29udGV4dCgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgLy8gVE9ETzogVGhpcyBlcnJvciBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZXkgc29tZWhvdyBoYXZlIDIgdmVyc2lvbnMgb2YgdGhlXG4gIC8vIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgXCJ1c2VIcmVmKCkgbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgbGV0IHtcbiAgICBiYXNlbmFtZSxcbiAgICBuYXZpZ2F0b3JcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpO1xuICBsZXQge1xuICAgIGhhc2gsXG4gICAgcGF0aG5hbWUsXG4gICAgc2VhcmNoXG4gIH0gPSB1c2VSZXNvbHZlZFBhdGgodG8sIHtcbiAgICByZWxhdGl2ZVxuICB9KTtcbiAgbGV0IGpvaW5lZFBhdGhuYW1lID0gcGF0aG5hbWU7XG5cbiAgLy8gSWYgd2UncmUgb3BlcmF0aW5nIHdpdGhpbiBhIGJhc2VuYW1lLCBwcmVwZW5kIGl0IHRvIHRoZSBwYXRobmFtZSBwcmlvclxuICAvLyB0byBjcmVhdGluZyB0aGUgaHJlZi4gIElmIHRoaXMgaXMgYSByb290IG5hdmlnYXRpb24sIHRoZW4ganVzdCB1c2UgdGhlIHJhd1xuICAvLyBiYXNlbmFtZSB3aGljaCBhbGxvd3MgdGhlIGJhc2VuYW1lIHRvIGhhdmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIHByZXNlbmNlXG4gIC8vIG9mIGEgdHJhaWxpbmcgc2xhc2ggb24gcm9vdCBsaW5rc1xuICBpZiAoYmFzZW5hbWUgIT09IFwiL1wiKSB7XG4gICAgam9pbmVkUGF0aG5hbWUgPSBwYXRobmFtZSA9PT0gXCIvXCIgPyBiYXNlbmFtZSA6IGpvaW5QYXRocyhbYmFzZW5hbWUsIHBhdGhuYW1lXSk7XG4gIH1cbiAgcmV0dXJuIG5hdmlnYXRvci5jcmVhdGVIcmVmKHtcbiAgICBwYXRobmFtZTogam9pbmVkUGF0aG5hbWUsXG4gICAgc2VhcmNoLFxuICAgIGhhc2hcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGlzIGEgZGVzY2VuZGFudCBvZiBhIDxSb3V0ZXI+LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLWluLXJvdXRlci1jb250ZXh0XG4gKi9cbmZ1bmN0aW9uIHVzZUluUm91dGVyQ29udGV4dCgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KSAhPSBudWxsO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2JqZWN0LCB3aGljaCByZXByZXNlbnRzIHRoZSBjdXJyZW50IFVSTCBpbiB3ZWJcbiAqIGJyb3dzZXJzLlxuICpcbiAqIE5vdGU6IElmIHlvdSdyZSB1c2luZyB0aGlzIGl0IG1heSBtZWFuIHlvdSdyZSBkb2luZyBzb21lIG9mIHlvdXIgb3duXG4gKiBcInJvdXRpbmdcIiBpbiB5b3VyIGFwcCwgYW5kIHdlJ2QgbGlrZSB0byBrbm93IHdoYXQgeW91ciB1c2UgY2FzZSBpcy4gV2UgbWF5XG4gKiBiZSBhYmxlIHRvIHByb3ZpZGUgc29tZXRoaW5nIGhpZ2hlci1sZXZlbCB0byBiZXR0ZXIgc3VpdCB5b3VyIG5lZWRzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLWxvY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIHVzZUxvY2F0aW9uKCkge1xuICAhdXNlSW5Sb3V0ZXJDb250ZXh0KCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCAvLyBUT0RPOiBUaGlzIGVycm9yIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhleSBzb21laG93IGhhdmUgMiB2ZXJzaW9ucyBvZiB0aGVcbiAgLy8gcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICBcInVzZUxvY2F0aW9uKCkgbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KS5sb2NhdGlvbjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gYWN0aW9uIHdoaWNoIGRlc2NyaWJlcyBob3cgdGhlIHJvdXRlciBjYW1lIHRvXG4gKiB0aGUgY3VycmVudCBsb2NhdGlvbiwgZWl0aGVyIGJ5IGEgcG9wLCBwdXNoLCBvciByZXBsYWNlIG9uIHRoZSBoaXN0b3J5IHN0YWNrLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLW5hdmlnYXRpb24tdHlwZVxuICovXG5mdW5jdGlvbiB1c2VOYXZpZ2F0aW9uVHlwZSgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KS5uYXZpZ2F0aW9uVHlwZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgUGF0aE1hdGNoIG9iamVjdCBpZiB0aGUgZ2l2ZW4gcGF0dGVybiBtYXRjaGVzIHRoZSBjdXJyZW50IFVSTC5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBjb21wb25lbnRzIHRoYXQgbmVlZCB0byBrbm93IFwiYWN0aXZlXCIgc3RhdGUsIGUuZy5cbiAqIDxOYXZMaW5rPi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1tYXRjaFxuICovXG5mdW5jdGlvbiB1c2VNYXRjaChwYXR0ZXJuKSB7XG4gICF1c2VJblJvdXRlckNvbnRleHQoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAvLyByb3V0ZXIgbG9hZGVkLiBXZSBjYW4gaGVscCB0aGVtIHVuZGVyc3RhbmQgaG93IHRvIGF2b2lkIHRoYXQuXG4gIFwidXNlTWF0Y2goKSBtYXkgYmUgdXNlZCBvbmx5IGluIHRoZSBjb250ZXh0IG9mIGEgPFJvdXRlcj4gY29tcG9uZW50LlwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBsZXQge1xuICAgIHBhdGhuYW1lXG4gIH0gPSB1c2VMb2NhdGlvbigpO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBtYXRjaFBhdGgocGF0dGVybiwgcGF0aG5hbWUpLCBbcGF0aG5hbWUsIHBhdHRlcm5dKTtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgbmF2aWdhdGUoKSBmdW5jdGlvbiByZXR1cm5lZCBmcm9tIHVzZU5hdmlnYXRlKCkuXG4gKi9cblxuY29uc3QgbmF2aWdhdGVFZmZlY3RXYXJuaW5nID0gXCJZb3Ugc2hvdWxkIGNhbGwgbmF2aWdhdGUoKSBpbiBhIFJlYWN0LnVzZUVmZmVjdCgpLCBub3Qgd2hlbiBcIiArIFwieW91ciBjb21wb25lbnQgaXMgZmlyc3QgcmVuZGVyZWQuXCI7XG5cbi8vIE11dGUgd2FybmluZ3MgZm9yIGNhbGxzIHRvIHVzZU5hdmlnYXRlIGluIFNTUiBlbnZpcm9ubWVudHNcbmZ1bmN0aW9uIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoY2IpIHtcbiAgbGV0IGlzU3RhdGljID0gUmVhY3QudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCkuc3RhdGljO1xuICBpZiAoIWlzU3RhdGljKSB7XG4gICAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IHJpZCBvZiB0aGlzIG9uY2UgcmVhY3QgMTguMyBpcyByZWxlYXNlZFxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjYzOTVcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoY2IpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBpbXBlcmF0aXZlIG1ldGhvZCBmb3IgY2hhbmdpbmcgdGhlIGxvY2F0aW9uLiBVc2VkIGJ5IDxMaW5rPnMsIGJ1dFxuICogbWF5IGFsc28gYmUgdXNlZCBieSBvdGhlciBlbGVtZW50cyB0byBjaGFuZ2UgdGhlIGxvY2F0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLW5hdmlnYXRlXG4gKi9cbmZ1bmN0aW9uIHVzZU5hdmlnYXRlKCkge1xuICBsZXQge1xuICAgIGlzRGF0YVJvdXRlXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIC8vIENvbmRpdGlvbmFsIHVzYWdlIGlzIE9LIGhlcmUgYmVjYXVzZSB0aGUgdXNhZ2Ugb2YgYSBkYXRhIHJvdXRlciBpcyBzdGF0aWNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzXG4gIHJldHVybiBpc0RhdGFSb3V0ZSA/IHVzZU5hdmlnYXRlU3RhYmxlKCkgOiB1c2VOYXZpZ2F0ZVVuc3RhYmxlKCk7XG59XG5mdW5jdGlvbiB1c2VOYXZpZ2F0ZVVuc3RhYmxlKCkge1xuICAhdXNlSW5Sb3V0ZXJDb250ZXh0KCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCAvLyBUT0RPOiBUaGlzIGVycm9yIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhleSBzb21laG93IGhhdmUgMiB2ZXJzaW9ucyBvZiB0aGVcbiAgLy8gcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICBcInVzZU5hdmlnYXRlKCkgbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgbGV0IGRhdGFSb3V0ZXJDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChEYXRhUm91dGVyQ29udGV4dCk7XG4gIGxldCB7XG4gICAgYmFzZW5hbWUsXG4gICAgbmF2aWdhdG9yXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgbGV0IHtcbiAgICBtYXRjaGVzXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIGxldCB7XG4gICAgcGF0aG5hbWU6IGxvY2F0aW9uUGF0aG5hbWVcbiAgfSA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCByb3V0ZVBhdGhuYW1lc0pzb24gPSBKU09OLnN0cmluZ2lmeShVTlNBRkVfZ2V0UGF0aENvbnRyaWJ1dGluZ01hdGNoZXMobWF0Y2hlcykubWFwKG1hdGNoID0+IG1hdGNoLnBhdGhuYW1lQmFzZSkpO1xuICBsZXQgYWN0aXZlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgYWN0aXZlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9KTtcbiAgbGV0IG5hdmlnYXRlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHRvLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhhY3RpdmVSZWYuY3VycmVudCwgbmF2aWdhdGVFZmZlY3RXYXJuaW5nKSA6IHZvaWQgMDtcblxuICAgIC8vIFNob3J0IGNpcmN1aXQgaGVyZSBzaW5jZSBpZiB0aGlzIGhhcHBlbnMgb24gZmlyc3QgcmVuZGVyIHRoZSBuYXZpZ2F0ZVxuICAgIC8vIGlzIHVzZWxlc3MgYmVjYXVzZSB3ZSBoYXZlbid0IHdpcmVkIHVwIG91ciBoaXN0b3J5IGxpc3RlbmVyIHlldFxuICAgIGlmICghYWN0aXZlUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHRvID09PSBcIm51bWJlclwiKSB7XG4gICAgICBuYXZpZ2F0b3IuZ28odG8pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcGF0aCA9IHJlc29sdmVUbyh0bywgSlNPTi5wYXJzZShyb3V0ZVBhdGhuYW1lc0pzb24pLCBsb2NhdGlvblBhdGhuYW1lLCBvcHRpb25zLnJlbGF0aXZlID09PSBcInBhdGhcIik7XG5cbiAgICAvLyBJZiB3ZSdyZSBvcGVyYXRpbmcgd2l0aGluIGEgYmFzZW5hbWUsIHByZXBlbmQgaXQgdG8gdGhlIHBhdGhuYW1lIHByaW9yXG4gICAgLy8gdG8gaGFuZGluZyBvZmYgdG8gaGlzdG9yeSAoYnV0IG9ubHkgaWYgd2UncmUgbm90IGluIGEgZGF0YSByb3V0ZXIsXG4gICAgLy8gb3RoZXJ3aXNlIGl0J2xsIHByZXBlbmQgdGhlIGJhc2VuYW1lIGluc2lkZSBvZiB0aGUgcm91dGVyKS5cbiAgICAvLyBJZiB0aGlzIGlzIGEgcm9vdCBuYXZpZ2F0aW9uLCB0aGVuIHdlIG5hdmlnYXRlIHRvIHRoZSByYXcgYmFzZW5hbWVcbiAgICAvLyB3aGljaCBhbGxvd3MgdGhlIGJhc2VuYW1lIHRvIGhhdmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIHByZXNlbmNlIG9mIGFcbiAgICAvLyB0cmFpbGluZyBzbGFzaCBvbiByb290IGxpbmtzXG4gICAgaWYgKGRhdGFSb3V0ZXJDb250ZXh0ID09IG51bGwgJiYgYmFzZW5hbWUgIT09IFwiL1wiKSB7XG4gICAgICBwYXRoLnBhdGhuYW1lID0gcGF0aC5wYXRobmFtZSA9PT0gXCIvXCIgPyBiYXNlbmFtZSA6IGpvaW5QYXRocyhbYmFzZW5hbWUsIHBhdGgucGF0aG5hbWVdKTtcbiAgICB9XG4gICAgKCEhb3B0aW9ucy5yZXBsYWNlID8gbmF2aWdhdG9yLnJlcGxhY2UgOiBuYXZpZ2F0b3IucHVzaCkocGF0aCwgb3B0aW9ucy5zdGF0ZSwgb3B0aW9ucyk7XG4gIH0sIFtiYXNlbmFtZSwgbmF2aWdhdG9yLCByb3V0ZVBhdGhuYW1lc0pzb24sIGxvY2F0aW9uUGF0aG5hbWUsIGRhdGFSb3V0ZXJDb250ZXh0XSk7XG4gIHJldHVybiBuYXZpZ2F0ZTtcbn1cbmNvbnN0IE91dGxldENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb250ZXh0IChpZiBwcm92aWRlZCkgZm9yIHRoZSBjaGlsZCByb3V0ZSBhdCB0aGlzIGxldmVsIG9mIHRoZSByb3V0ZVxuICogaGllcmFyY2h5LlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9ob29rcy91c2Utb3V0bGV0LWNvbnRleHRcbiAqL1xuZnVuY3Rpb24gdXNlT3V0bGV0Q29udGV4dCgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoT3V0bGV0Q29udGV4dCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZWxlbWVudCBmb3IgdGhlIGNoaWxkIHJvdXRlIGF0IHRoaXMgbGV2ZWwgb2YgdGhlIHJvdXRlXG4gKiBoaWVyYXJjaHkuIFVzZWQgaW50ZXJuYWxseSBieSA8T3V0bGV0PiB0byByZW5kZXIgY2hpbGQgcm91dGVzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLW91dGxldFxuICovXG5mdW5jdGlvbiB1c2VPdXRsZXQoY29udGV4dCkge1xuICBsZXQgb3V0bGV0ID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpLm91dGxldDtcbiAgaWYgKG91dGxldCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdXRsZXRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogY29udGV4dFxuICAgIH0sIG91dGxldCk7XG4gIH1cbiAgcmV0dXJuIG91dGxldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgb2YgdGhlIGR5bmFtaWMgcGFyYW1zIGZyb20gdGhlIGN1cnJlbnRcbiAqIFVSTCB0aGF0IHdlcmUgbWF0Y2hlZCBieSB0aGUgcm91dGUgcGF0aC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1wYXJhbXNcbiAqL1xuZnVuY3Rpb24gdXNlUGFyYW1zKCkge1xuICBsZXQge1xuICAgIG1hdGNoZXNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgbGV0IHJvdXRlTWF0Y2ggPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV07XG4gIHJldHVybiByb3V0ZU1hdGNoID8gcm91dGVNYXRjaC5wYXJhbXMgOiB7fTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGdpdmVuIGB0b2AgdmFsdWUgYWdhaW5zdCB0aGUgY3VycmVudCBsb2NhdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1yZXNvbHZlZC1wYXRoXG4gKi9cbmZ1bmN0aW9uIHVzZVJlc29sdmVkUGF0aCh0bywgX3RlbXAyKSB7XG4gIGxldCB7XG4gICAgcmVsYXRpdmVcbiAgfSA9IF90ZW1wMiA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDI7XG4gIGxldCB7XG4gICAgbWF0Y2hlc1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQge1xuICAgIHBhdGhuYW1lOiBsb2NhdGlvblBhdGhuYW1lXG4gIH0gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgcm91dGVQYXRobmFtZXNKc29uID0gSlNPTi5zdHJpbmdpZnkoVU5TQUZFX2dldFBhdGhDb250cmlidXRpbmdNYXRjaGVzKG1hdGNoZXMpLm1hcChtYXRjaCA9PiBtYXRjaC5wYXRobmFtZUJhc2UpKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gcmVzb2x2ZVRvKHRvLCBKU09OLnBhcnNlKHJvdXRlUGF0aG5hbWVzSnNvbiksIGxvY2F0aW9uUGF0aG5hbWUsIHJlbGF0aXZlID09PSBcInBhdGhcIiksIFt0bywgcm91dGVQYXRobmFtZXNKc29uLCBsb2NhdGlvblBhdGhuYW1lLCByZWxhdGl2ZV0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnQgb2YgdGhlIHJvdXRlIHRoYXQgbWF0Y2hlZCB0aGUgY3VycmVudCBsb2NhdGlvbiwgcHJlcGFyZWRcbiAqIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dCB0byByZW5kZXIgdGhlIHJlbWFpbmRlciBvZiB0aGUgcm91dGUgdHJlZS4gUm91dGVcbiAqIGVsZW1lbnRzIGluIHRoZSB0cmVlIG11c3QgcmVuZGVyIGFuIDxPdXRsZXQ+IHRvIHJlbmRlciB0aGVpciBjaGlsZCByb3V0ZSdzXG4gKiBlbGVtZW50LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLXJvdXRlc1xuICovXG5mdW5jdGlvbiB1c2VSb3V0ZXMocm91dGVzLCBsb2NhdGlvbkFyZykge1xuICByZXR1cm4gdXNlUm91dGVzSW1wbChyb3V0ZXMsIGxvY2F0aW9uQXJnKTtcbn1cblxuLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gd2l0aCBhY2NlcHQgb3B0aW9uYWwgcGFyYW0gZm9yIFJvdXRlclByb3ZpZGVyIHVzYWdlXG5mdW5jdGlvbiB1c2VSb3V0ZXNJbXBsKHJvdXRlcywgbG9jYXRpb25BcmcsIGRhdGFSb3V0ZXJTdGF0ZSkge1xuICAhdXNlSW5Sb3V0ZXJDb250ZXh0KCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCAvLyBUT0RPOiBUaGlzIGVycm9yIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhleSBzb21laG93IGhhdmUgMiB2ZXJzaW9ucyBvZiB0aGVcbiAgLy8gcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICBcInVzZVJvdXRlcygpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGxldCB7XG4gICAgbmF2aWdhdG9yXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgbGV0IHtcbiAgICBtYXRjaGVzOiBwYXJlbnRNYXRjaGVzXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIGxldCByb3V0ZU1hdGNoID0gcGFyZW50TWF0Y2hlc1twYXJlbnRNYXRjaGVzLmxlbmd0aCAtIDFdO1xuICBsZXQgcGFyZW50UGFyYW1zID0gcm91dGVNYXRjaCA/IHJvdXRlTWF0Y2gucGFyYW1zIDoge307XG4gIGxldCBwYXJlbnRQYXRobmFtZSA9IHJvdXRlTWF0Y2ggPyByb3V0ZU1hdGNoLnBhdGhuYW1lIDogXCIvXCI7XG4gIGxldCBwYXJlbnRQYXRobmFtZUJhc2UgPSByb3V0ZU1hdGNoID8gcm91dGVNYXRjaC5wYXRobmFtZUJhc2UgOiBcIi9cIjtcbiAgbGV0IHBhcmVudFJvdXRlID0gcm91dGVNYXRjaCAmJiByb3V0ZU1hdGNoLnJvdXRlO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgLy8gWW91IHdvbid0IGdldCBhIHdhcm5pbmcgYWJvdXQgMiBkaWZmZXJlbnQgPFJvdXRlcz4gdW5kZXIgYSA8Um91dGU+XG4gICAgLy8gd2l0aG91dCBhIHRyYWlsaW5nICosIGJ1dCB0aGlzIGlzIGEgYmVzdC1lZmZvcnQgd2FybmluZyBhbnl3YXkgc2luY2Ugd2VcbiAgICAvLyBjYW5ub3QgZXZlbiBnaXZlIHRoZSB3YXJuaW5nIHVubGVzcyB0aGV5IGxhbmQgYXQgdGhlIHBhcmVudCByb3V0ZS5cbiAgICAvL1xuICAgIC8vIEV4YW1wbGU6XG4gICAgLy9cbiAgICAvLyA8Um91dGVzPlxuICAgIC8vICAgey8qIFRoaXMgcm91dGUgcGF0aCBNVVNUIGVuZCB3aXRoIC8qIGJlY2F1c2Ugb3RoZXJ3aXNlXG4gICAgLy8gICAgICAgaXQgd2lsbCBuZXZlciBtYXRjaCAvYmxvZy9wb3N0LzEyMyAqL31cbiAgICAvLyAgIDxSb3V0ZSBwYXRoPVwiYmxvZ1wiIGVsZW1lbnQ9ezxCbG9nIC8+fSAvPlxuICAgIC8vICAgPFJvdXRlIHBhdGg9XCJibG9nL2ZlZWRcIiBlbGVtZW50PXs8QmxvZ0ZlZWQgLz59IC8+XG4gICAgLy8gPC9Sb3V0ZXM+XG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiBCbG9nKCkge1xuICAgIC8vICAgcmV0dXJuIChcbiAgICAvLyAgICAgPFJvdXRlcz5cbiAgICAvLyAgICAgICA8Um91dGUgcGF0aD1cInBvc3QvOmlkXCIgZWxlbWVudD17PFBvc3QgLz59IC8+XG4gICAgLy8gICAgIDwvUm91dGVzPlxuICAgIC8vICAgKTtcbiAgICAvLyB9XG4gICAgbGV0IHBhcmVudFBhdGggPSBwYXJlbnRSb3V0ZSAmJiBwYXJlbnRSb3V0ZS5wYXRoIHx8IFwiXCI7XG4gICAgd2FybmluZ09uY2UocGFyZW50UGF0aG5hbWUsICFwYXJlbnRSb3V0ZSB8fCBwYXJlbnRQYXRoLmVuZHNXaXRoKFwiKlwiKSwgXCJZb3UgcmVuZGVyZWQgZGVzY2VuZGFudCA8Um91dGVzPiAob3IgY2FsbGVkIGB1c2VSb3V0ZXMoKWApIGF0IFwiICsgKFwiXFxcIlwiICsgcGFyZW50UGF0aG5hbWUgKyBcIlxcXCIgKHVuZGVyIDxSb3V0ZSBwYXRoPVxcXCJcIiArIHBhcmVudFBhdGggKyBcIlxcXCI+KSBidXQgdGhlIFwiKSArIFwicGFyZW50IHJvdXRlIHBhdGggaGFzIG5vIHRyYWlsaW5nIFxcXCIqXFxcIi4gVGhpcyBtZWFucyBpZiB5b3UgbmF2aWdhdGUgXCIgKyBcImRlZXBlciwgdGhlIHBhcmVudCB3b24ndCBtYXRjaCBhbnltb3JlIGFuZCB0aGVyZWZvcmUgdGhlIGNoaWxkIFwiICsgXCJyb3V0ZXMgd2lsbCBuZXZlciByZW5kZXIuXFxuXFxuXCIgKyAoXCJQbGVhc2UgY2hhbmdlIHRoZSBwYXJlbnQgPFJvdXRlIHBhdGg9XFxcIlwiICsgcGFyZW50UGF0aCArIFwiXFxcIj4gdG8gPFJvdXRlIFwiKSArIChcInBhdGg9XFxcIlwiICsgKHBhcmVudFBhdGggPT09IFwiL1wiID8gXCIqXCIgOiBwYXJlbnRQYXRoICsgXCIvKlwiKSArIFwiXFxcIj4uXCIpKTtcbiAgfVxuICBsZXQgbG9jYXRpb25Gcm9tQ29udGV4dCA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBsb2NhdGlvbjtcbiAgaWYgKGxvY2F0aW9uQXJnKSB7XG4gICAgdmFyIF9wYXJzZWRMb2NhdGlvbkFyZyRwYTtcbiAgICBsZXQgcGFyc2VkTG9jYXRpb25BcmcgPSB0eXBlb2YgbG9jYXRpb25BcmcgPT09IFwic3RyaW5nXCIgPyBwYXJzZVBhdGgobG9jYXRpb25BcmcpIDogbG9jYXRpb25Bcmc7XG4gICAgIShwYXJlbnRQYXRobmFtZUJhc2UgPT09IFwiL1wiIHx8ICgoX3BhcnNlZExvY2F0aW9uQXJnJHBhID0gcGFyc2VkTG9jYXRpb25BcmcucGF0aG5hbWUpID09IG51bGwgPyB2b2lkIDAgOiBfcGFyc2VkTG9jYXRpb25BcmckcGEuc3RhcnRzV2l0aChwYXJlbnRQYXRobmFtZUJhc2UpKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcIldoZW4gb3ZlcnJpZGluZyB0aGUgbG9jYXRpb24gdXNpbmcgYDxSb3V0ZXMgbG9jYXRpb24+YCBvciBgdXNlUm91dGVzKHJvdXRlcywgbG9jYXRpb24pYCwgXCIgKyBcInRoZSBsb2NhdGlvbiBwYXRobmFtZSBtdXN0IGJlZ2luIHdpdGggdGhlIHBvcnRpb24gb2YgdGhlIFVSTCBwYXRobmFtZSB0aGF0IHdhcyBcIiArIChcIm1hdGNoZWQgYnkgYWxsIHBhcmVudCByb3V0ZXMuIFRoZSBjdXJyZW50IHBhdGhuYW1lIGJhc2UgaXMgXFxcIlwiICsgcGFyZW50UGF0aG5hbWVCYXNlICsgXCJcXFwiIFwiKSArIChcImJ1dCBwYXRobmFtZSBcXFwiXCIgKyBwYXJzZWRMb2NhdGlvbkFyZy5wYXRobmFtZSArIFwiXFxcIiB3YXMgZ2l2ZW4gaW4gdGhlIGBsb2NhdGlvbmAgcHJvcC5cIikpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgbG9jYXRpb24gPSBwYXJzZWRMb2NhdGlvbkFyZztcbiAgfSBlbHNlIHtcbiAgICBsb2NhdGlvbiA9IGxvY2F0aW9uRnJvbUNvbnRleHQ7XG4gIH1cbiAgbGV0IHBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWUgfHwgXCIvXCI7XG4gIGxldCByZW1haW5pbmdQYXRobmFtZSA9IHBhcmVudFBhdGhuYW1lQmFzZSA9PT0gXCIvXCIgPyBwYXRobmFtZSA6IHBhdGhuYW1lLnNsaWNlKHBhcmVudFBhdGhuYW1lQmFzZS5sZW5ndGgpIHx8IFwiL1wiO1xuICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKHJvdXRlcywge1xuICAgIHBhdGhuYW1lOiByZW1haW5pbmdQYXRobmFtZVxuICB9KTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKHBhcmVudFJvdXRlIHx8IG1hdGNoZXMgIT0gbnVsbCwgXCJObyByb3V0ZXMgbWF0Y2hlZCBsb2NhdGlvbiBcXFwiXCIgKyBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaCArIGxvY2F0aW9uLmhhc2ggKyBcIlxcXCIgXCIpIDogdm9pZCAwO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKG1hdGNoZXMgPT0gbnVsbCB8fCBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0ucm91dGUuZWxlbWVudCAhPT0gdW5kZWZpbmVkIHx8IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXS5yb3V0ZS5Db21wb25lbnQgIT09IHVuZGVmaW5lZCwgXCJNYXRjaGVkIGxlYWYgcm91dGUgYXQgbG9jYXRpb24gXFxcIlwiICsgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2ggKyBsb2NhdGlvbi5oYXNoICsgXCJcXFwiIFwiICsgXCJkb2VzIG5vdCBoYXZlIGFuIGVsZW1lbnQgb3IgQ29tcG9uZW50LiBUaGlzIG1lYW5zIGl0IHdpbGwgcmVuZGVyIGFuIDxPdXRsZXQgLz4gd2l0aCBhIFwiICsgXCJudWxsIHZhbHVlIGJ5IGRlZmF1bHQgcmVzdWx0aW5nIGluIGFuIFxcXCJlbXB0eVxcXCIgcGFnZS5cIikgOiB2b2lkIDA7XG4gIH1cbiAgbGV0IHJlbmRlcmVkTWF0Y2hlcyA9IF9yZW5kZXJNYXRjaGVzKG1hdGNoZXMgJiYgbWF0Y2hlcy5tYXAobWF0Y2ggPT4gT2JqZWN0LmFzc2lnbih7fSwgbWF0Y2gsIHtcbiAgICBwYXJhbXM6IE9iamVjdC5hc3NpZ24oe30sIHBhcmVudFBhcmFtcywgbWF0Y2gucGFyYW1zKSxcbiAgICBwYXRobmFtZTogam9pblBhdGhzKFtwYXJlbnRQYXRobmFtZUJhc2UsXG4gICAgLy8gUmUtZW5jb2RlIHBhdGhuYW1lcyB0aGF0IHdlcmUgZGVjb2RlZCBpbnNpZGUgbWF0Y2hSb3V0ZXNcbiAgICBuYXZpZ2F0b3IuZW5jb2RlTG9jYXRpb24gPyBuYXZpZ2F0b3IuZW5jb2RlTG9jYXRpb24obWF0Y2gucGF0aG5hbWUpLnBhdGhuYW1lIDogbWF0Y2gucGF0aG5hbWVdKSxcbiAgICBwYXRobmFtZUJhc2U6IG1hdGNoLnBhdGhuYW1lQmFzZSA9PT0gXCIvXCIgPyBwYXJlbnRQYXRobmFtZUJhc2UgOiBqb2luUGF0aHMoW3BhcmVudFBhdGhuYW1lQmFzZSxcbiAgICAvLyBSZS1lbmNvZGUgcGF0aG5hbWVzIHRoYXQgd2VyZSBkZWNvZGVkIGluc2lkZSBtYXRjaFJvdXRlc1xuICAgIG5hdmlnYXRvci5lbmNvZGVMb2NhdGlvbiA/IG5hdmlnYXRvci5lbmNvZGVMb2NhdGlvbihtYXRjaC5wYXRobmFtZUJhc2UpLnBhdGhuYW1lIDogbWF0Y2gucGF0aG5hbWVCYXNlXSlcbiAgfSkpLCBwYXJlbnRNYXRjaGVzLCBkYXRhUm91dGVyU3RhdGUpO1xuXG4gIC8vIFdoZW4gYSB1c2VyIHBhc3NlcyBpbiBhIGBsb2NhdGlvbkFyZ2AsIHRoZSBhc3NvY2lhdGVkIHJvdXRlcyBuZWVkIHRvXG4gIC8vIGJlIHdyYXBwZWQgaW4gYSBuZXcgYExvY2F0aW9uQ29udGV4dC5Qcm92aWRlcmAgaW4gb3JkZXIgZm9yIGB1c2VMb2NhdGlvbmBcbiAgLy8gdG8gdXNlIHRoZSBzY29wZWQgbG9jYXRpb24gaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIGxvY2F0aW9uLlxuICBpZiAobG9jYXRpb25BcmcgJiYgcmVuZGVyZWRNYXRjaGVzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2F0aW9uQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgbG9jYXRpb246IF9leHRlbmRzKHtcbiAgICAgICAgICBwYXRobmFtZTogXCIvXCIsXG4gICAgICAgICAgc2VhcmNoOiBcIlwiLFxuICAgICAgICAgIGhhc2g6IFwiXCIsXG4gICAgICAgICAgc3RhdGU6IG51bGwsXG4gICAgICAgICAga2V5OiBcImRlZmF1bHRcIlxuICAgICAgICB9LCBsb2NhdGlvbiksXG4gICAgICAgIG5hdmlnYXRpb25UeXBlOiBBY3Rpb24uUG9wXG4gICAgICB9XG4gICAgfSwgcmVuZGVyZWRNYXRjaGVzKTtcbiAgfVxuICByZXR1cm4gcmVuZGVyZWRNYXRjaGVzO1xufVxuZnVuY3Rpb24gRGVmYXVsdEVycm9yQ29tcG9uZW50KCkge1xuICBsZXQgZXJyb3IgPSB1c2VSb3V0ZUVycm9yKCk7XG4gIGxldCBtZXNzYWdlID0gaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpID8gZXJyb3Iuc3RhdHVzICsgXCIgXCIgKyBlcnJvci5zdGF0dXNUZXh0IDogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBKU09OLnN0cmluZ2lmeShlcnJvcik7XG4gIGxldCBzdGFjayA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IG51bGw7XG4gIGxldCBsaWdodGdyZXkgPSBcInJnYmEoMjAwLDIwMCwyMDAsIDAuNSlcIjtcbiAgbGV0IHByZVN0eWxlcyA9IHtcbiAgICBwYWRkaW5nOiBcIjAuNXJlbVwiLFxuICAgIGJhY2tncm91bmRDb2xvcjogbGlnaHRncmV5XG4gIH07XG4gIGxldCBjb2RlU3R5bGVzID0ge1xuICAgIHBhZGRpbmc6IFwiMnB4IDRweFwiLFxuICAgIGJhY2tncm91bmRDb2xvcjogbGlnaHRncmV5XG4gIH07XG4gIGxldCBkZXZJbmZvID0gbnVsbDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBoYW5kbGVkIGJ5IFJlYWN0IFJvdXRlciBkZWZhdWx0IEVycm9yQm91bmRhcnk6XCIsIGVycm9yKTtcbiAgICBkZXZJbmZvID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBcIlxcdUQ4M0RcXHVEQ0JGIEhleSBkZXZlbG9wZXIgXFx1RDgzRFxcdURDNEJcIiksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBcIllvdSBjYW4gcHJvdmlkZSBhIHdheSBiZXR0ZXIgVVggdGhhbiB0aGlzIHdoZW4geW91ciBhcHAgdGhyb3dzIGVycm9ycyBieSBwcm92aWRpbmcgeW91ciBvd24gXCIsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7XG4gICAgICBzdHlsZTogY29kZVN0eWxlc1xuICAgIH0sIFwiRXJyb3JCb3VuZGFyeVwiKSwgXCIgb3JcIiwgXCIgXCIsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7XG4gICAgICBzdHlsZTogY29kZVN0eWxlc1xuICAgIH0sIFwiZXJyb3JFbGVtZW50XCIpLCBcIiBwcm9wIG9uIHlvdXIgcm91dGUuXCIpKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaDJcIiwgbnVsbCwgXCJVbmV4cGVjdGVkIEFwcGxpY2F0aW9uIEVycm9yIVwiKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIGZvbnRTdHlsZTogXCJpdGFsaWNcIlxuICAgIH1cbiAgfSwgbWVzc2FnZSksIHN0YWNrID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIiwge1xuICAgIHN0eWxlOiBwcmVTdHlsZXNcbiAgfSwgc3RhY2spIDogbnVsbCwgZGV2SW5mbyk7XG59XG5jb25zdCBkZWZhdWx0RXJyb3JFbGVtZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGVmYXVsdEVycm9yQ29tcG9uZW50LCBudWxsKTtcbmNsYXNzIFJlbmRlckVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbG9jYXRpb246IHByb3BzLmxvY2F0aW9uLFxuICAgICAgcmV2YWxpZGF0aW9uOiBwcm9wcy5yZXZhbGlkYXRpb24sXG4gICAgICBlcnJvcjogcHJvcHMuZXJyb3JcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGVycm9yXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgIC8vIFdoZW4gd2UgZ2V0IGludG8gYW4gZXJyb3Igc3RhdGUsIHRoZSB1c2VyIHdpbGwgbGlrZWx5IGNsaWNrIFwiYmFja1wiIHRvIHRoZVxuICAgIC8vIHByZXZpb3VzIHBhZ2UgdGhhdCBkaWRuJ3QgaGF2ZSBhbiBlcnJvci4gQmVjYXVzZSB0aGlzIHdyYXBzIHRoZSBlbnRpcmVcbiAgICAvLyBhcHBsaWNhdGlvbiwgdGhhdCB3aWxsIGhhdmUgbm8gZWZmZWN0LS10aGUgZXJyb3IgcGFnZSBjb250aW51ZXMgdG8gZGlzcGxheS5cbiAgICAvLyBUaGlzIGdpdmVzIHVzIGEgbWVjaGFuaXNtIHRvIHJlY292ZXIgZnJvbSB0aGUgZXJyb3Igd2hlbiB0aGUgbG9jYXRpb24gY2hhbmdlcy5cbiAgICAvL1xuICAgIC8vIFdoZXRoZXIgd2UncmUgaW4gYW4gZXJyb3Igc3RhdGUgb3Igbm90LCB3ZSB1cGRhdGUgdGhlIGxvY2F0aW9uIGluIHN0YXRlXG4gICAgLy8gc28gdGhhdCB3aGVuIHdlIGFyZSBpbiBhbiBlcnJvciBzdGF0ZSwgaXQgZ2V0cyByZXNldCB3aGVuIGEgbmV3IGxvY2F0aW9uXG4gICAgLy8gY29tZXMgaW4gYW5kIHRoZSB1c2VyIHJlY292ZXJzIGZyb20gdGhlIGVycm9yLlxuICAgIGlmIChzdGF0ZS5sb2NhdGlvbiAhPT0gcHJvcHMubG9jYXRpb24gfHwgc3RhdGUucmV2YWxpZGF0aW9uICE9PSBcImlkbGVcIiAmJiBwcm9wcy5yZXZhbGlkYXRpb24gPT09IFwiaWRsZVwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogcHJvcHMuZXJyb3IsXG4gICAgICAgIGxvY2F0aW9uOiBwcm9wcy5sb2NhdGlvbixcbiAgICAgICAgcmV2YWxpZGF0aW9uOiBwcm9wcy5yZXZhbGlkYXRpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgd2UncmUgbm90IGNoYW5naW5nIGxvY2F0aW9ucywgcHJlc2VydmUgdGhlIGxvY2F0aW9uIGJ1dCBzdGlsbCBzdXJmYWNlXG4gICAgLy8gYW55IG5ldyBlcnJvcnMgdGhhdCBtYXkgY29tZSB0aHJvdWdoLiBXZSByZXRhaW4gdGhlIGV4aXN0aW5nIGVycm9yLCB3ZSBkb1xuICAgIC8vIHRoaXMgYmVjYXVzZSB0aGUgZXJyb3IgcHJvdmlkZWQgZnJvbSB0aGUgYXBwIHN0YXRlIG1heSBiZSBjbGVhcmVkIHdpdGhvdXRcbiAgICAvLyB0aGUgbG9jYXRpb24gY2hhbmdpbmcuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiBwcm9wcy5lcnJvciB8fCBzdGF0ZS5lcnJvcixcbiAgICAgIGxvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICAgIHJldmFsaWRhdGlvbjogcHJvcHMucmV2YWxpZGF0aW9uIHx8IHN0YXRlLnJldmFsaWRhdGlvblxuICAgIH07XG4gIH1cbiAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGVycm9ySW5mbykge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJSZWFjdCBSb3V0ZXIgY2F1Z2h0IHRoZSBmb2xsb3dpbmcgZXJyb3IgZHVyaW5nIHJlbmRlclwiLCBlcnJvciwgZXJyb3JJbmZvKTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZXJyb3IgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLnByb3BzLnJvdXRlQ29udGV4dFxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlRXJyb3JDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogdGhpcy5zdGF0ZS5lcnJvcixcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnByb3BzLmNvbXBvbmVudFxuICAgIH0pKSA6IHRoaXMucHJvcHMuY2hpbGRyZW47XG4gIH1cbn1cbmZ1bmN0aW9uIFJlbmRlcmVkUm91dGUoX3JlZikge1xuICBsZXQge1xuICAgIHJvdXRlQ29udGV4dCxcbiAgICBtYXRjaCxcbiAgICBjaGlsZHJlblxuICB9ID0gX3JlZjtcbiAgbGV0IGRhdGFSb3V0ZXJDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChEYXRhUm91dGVyQ29udGV4dCk7XG5cbiAgLy8gVHJhY2sgaG93IGRlZXAgd2UgZ290IGluIG91ciByZW5kZXIgcGFzcyB0byBlbXVsYXRlIFNTUiBjb21wb25lbnREaWRDYXRjaFxuICAvLyBpbiBhIERhdGFTdGF0aWNSb3V0ZXJcbiAgaWYgKGRhdGFSb3V0ZXJDb250ZXh0ICYmIGRhdGFSb3V0ZXJDb250ZXh0LnN0YXRpYyAmJiBkYXRhUm91dGVyQ29udGV4dC5zdGF0aWNDb250ZXh0ICYmIChtYXRjaC5yb3V0ZS5lcnJvckVsZW1lbnQgfHwgbWF0Y2gucm91dGUuRXJyb3JCb3VuZGFyeSkpIHtcbiAgICBkYXRhUm91dGVyQ29udGV4dC5zdGF0aWNDb250ZXh0Ll9kZWVwZXN0UmVuZGVyZWRCb3VuZGFyeUlkID0gbWF0Y2gucm91dGUuaWQ7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiByb3V0ZUNvbnRleHRcbiAgfSwgY2hpbGRyZW4pO1xufVxuZnVuY3Rpb24gX3JlbmRlck1hdGNoZXMobWF0Y2hlcywgcGFyZW50TWF0Y2hlcywgZGF0YVJvdXRlclN0YXRlKSB7XG4gIHZhciBfZGF0YVJvdXRlclN0YXRlMjtcbiAgaWYgKHBhcmVudE1hdGNoZXMgPT09IHZvaWQgMCkge1xuICAgIHBhcmVudE1hdGNoZXMgPSBbXTtcbiAgfVxuICBpZiAoZGF0YVJvdXRlclN0YXRlID09PSB2b2lkIDApIHtcbiAgICBkYXRhUm91dGVyU3RhdGUgPSBudWxsO1xuICB9XG4gIGlmIChtYXRjaGVzID09IG51bGwpIHtcbiAgICB2YXIgX2RhdGFSb3V0ZXJTdGF0ZTtcbiAgICBpZiAoKF9kYXRhUm91dGVyU3RhdGUgPSBkYXRhUm91dGVyU3RhdGUpICE9IG51bGwgJiYgX2RhdGFSb3V0ZXJTdGF0ZS5lcnJvcnMpIHtcbiAgICAgIC8vIERvbid0IGJhaWwgaWYgd2UgaGF2ZSBkYXRhIHJvdXRlciBlcnJvcnMgc28gd2UgY2FuIHJlbmRlciB0aGVtIGluIHRoZVxuICAgICAgLy8gYm91bmRhcnkuICBVc2UgdGhlIHByZS1tYXRjaGVkIChvciBzaGltbWVkKSBtYXRjaGVzXG4gICAgICBtYXRjaGVzID0gZGF0YVJvdXRlclN0YXRlLm1hdGNoZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBsZXQgcmVuZGVyZWRNYXRjaGVzID0gbWF0Y2hlcztcblxuICAvLyBJZiB3ZSBoYXZlIGRhdGEgZXJyb3JzLCB0cmltIG1hdGNoZXMgdG8gdGhlIGhpZ2hlc3QgZXJyb3IgYm91bmRhcnlcbiAgbGV0IGVycm9ycyA9IChfZGF0YVJvdXRlclN0YXRlMiA9IGRhdGFSb3V0ZXJTdGF0ZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhUm91dGVyU3RhdGUyLmVycm9ycztcbiAgaWYgKGVycm9ycyAhPSBudWxsKSB7XG4gICAgbGV0IGVycm9ySW5kZXggPSByZW5kZXJlZE1hdGNoZXMuZmluZEluZGV4KG0gPT4gbS5yb3V0ZS5pZCAmJiAoZXJyb3JzID09IG51bGwgPyB2b2lkIDAgOiBlcnJvcnNbbS5yb3V0ZS5pZF0pKTtcbiAgICAhKGVycm9ySW5kZXggPj0gMCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcIkNvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgcm91dGUgZm9yIGVycm9ycyBvbiByb3V0ZSBJRHM6IFwiICsgT2JqZWN0LmtleXMoZXJyb3JzKS5qb2luKFwiLFwiKSkgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICByZW5kZXJlZE1hdGNoZXMgPSByZW5kZXJlZE1hdGNoZXMuc2xpY2UoMCwgTWF0aC5taW4ocmVuZGVyZWRNYXRjaGVzLmxlbmd0aCwgZXJyb3JJbmRleCArIDEpKTtcbiAgfVxuICByZXR1cm4gcmVuZGVyZWRNYXRjaGVzLnJlZHVjZVJpZ2h0KChvdXRsZXQsIG1hdGNoLCBpbmRleCkgPT4ge1xuICAgIGxldCBlcnJvciA9IG1hdGNoLnJvdXRlLmlkID8gZXJyb3JzID09IG51bGwgPyB2b2lkIDAgOiBlcnJvcnNbbWF0Y2gucm91dGUuaWRdIDogbnVsbDtcbiAgICAvLyBPbmx5IGRhdGEgcm91dGVycyBoYW5kbGUgZXJyb3JzXG4gICAgbGV0IGVycm9yRWxlbWVudCA9IG51bGw7XG4gICAgaWYgKGRhdGFSb3V0ZXJTdGF0ZSkge1xuICAgICAgZXJyb3JFbGVtZW50ID0gbWF0Y2gucm91dGUuZXJyb3JFbGVtZW50IHx8IGRlZmF1bHRFcnJvckVsZW1lbnQ7XG4gICAgfVxuICAgIGxldCBtYXRjaGVzID0gcGFyZW50TWF0Y2hlcy5jb25jYXQocmVuZGVyZWRNYXRjaGVzLnNsaWNlKDAsIGluZGV4ICsgMSkpO1xuICAgIGxldCBnZXRDaGlsZHJlbiA9ICgpID0+IHtcbiAgICAgIGxldCBjaGlsZHJlbjtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjaGlsZHJlbiA9IGVycm9yRWxlbWVudDtcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2gucm91dGUuQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIE5vdGU6IFRoaXMgaXMgYSBkZS1vcHRpbWl6ZWQgcGF0aCBzaW5jZSBSZWFjdCB3b24ndCByZS11c2UgdGhlXG4gICAgICAgIC8vIFJlYWN0RWxlbWVudCBzaW5jZSBpdCdzIGlkZW50aXR5IGNoYW5nZXMgd2l0aCBlYWNoIG5ld1xuICAgICAgICAvLyBSZWFjdC5jcmVhdGVFbGVtZW50IGNhbGwuICBXZSBrZWVwIHRoaXMgc28gZm9sa3MgY2FuIHVzZVxuICAgICAgICAvLyBgPFJvdXRlIENvbXBvbmVudD17Li4ufT5gIGluIGA8Um91dGVzPmAgYnV0IGdlbmVyYWxseSBgQ29tcG9uZW50YFxuICAgICAgICAvLyB1c2FnZSBpcyBvbmx5IGFkdmlzZWQgaW4gYFJvdXRlclByb3ZpZGVyYCB3aGVuIHdlIGNhbiBjb252ZXJ0IGl0IHRvXG4gICAgICAgIC8vIGBlbGVtZW50YCBhaGVhZCBvZiB0aW1lLlxuICAgICAgICBjaGlsZHJlbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KG1hdGNoLnJvdXRlLkNvbXBvbmVudCwgbnVsbCk7XG4gICAgICB9IGVsc2UgaWYgKG1hdGNoLnJvdXRlLmVsZW1lbnQpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBtYXRjaC5yb3V0ZS5lbGVtZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGRyZW4gPSBvdXRsZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVuZGVyZWRSb3V0ZSwge1xuICAgICAgICBtYXRjaDogbWF0Y2gsXG4gICAgICAgIHJvdXRlQ29udGV4dDoge1xuICAgICAgICAgIG91dGxldCxcbiAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgIGlzRGF0YVJvdXRlOiBkYXRhUm91dGVyU3RhdGUgIT0gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gT25seSB3cmFwIGluIGFuIGVycm9yIGJvdW5kYXJ5IHdpdGhpbiBkYXRhIHJvdXRlciB1c2FnZXMgd2hlbiB3ZSBoYXZlIGFuXG4gICAgLy8gRXJyb3JCb3VuZGFyeS9lcnJvckVsZW1lbnQgb24gdGhpcyByb3V0ZS4gIE90aGVyd2lzZSBsZXQgaXQgYnViYmxlIHVwIHRvXG4gICAgLy8gYW4gYW5jZXN0b3IgRXJyb3JCb3VuZGFyeS9lcnJvckVsZW1lbnRcbiAgICByZXR1cm4gZGF0YVJvdXRlclN0YXRlICYmIChtYXRjaC5yb3V0ZS5FcnJvckJvdW5kYXJ5IHx8IG1hdGNoLnJvdXRlLmVycm9yRWxlbWVudCB8fCBpbmRleCA9PT0gMCkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZW5kZXJFcnJvckJvdW5kYXJ5LCB7XG4gICAgICBsb2NhdGlvbjogZGF0YVJvdXRlclN0YXRlLmxvY2F0aW9uLFxuICAgICAgcmV2YWxpZGF0aW9uOiBkYXRhUm91dGVyU3RhdGUucmV2YWxpZGF0aW9uLFxuICAgICAgY29tcG9uZW50OiBlcnJvckVsZW1lbnQsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgICBjaGlsZHJlbjogZ2V0Q2hpbGRyZW4oKSxcbiAgICAgIHJvdXRlQ29udGV4dDoge1xuICAgICAgICBvdXRsZXQ6IG51bGwsXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIGlzRGF0YVJvdXRlOiB0cnVlXG4gICAgICB9XG4gICAgfSkgOiBnZXRDaGlsZHJlbigpO1xuICB9LCBudWxsKTtcbn1cbnZhciBEYXRhUm91dGVySG9vayA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoRGF0YVJvdXRlckhvb2spIHtcbiAgRGF0YVJvdXRlckhvb2tbXCJVc2VCbG9ja2VyXCJdID0gXCJ1c2VCbG9ja2VyXCI7XG4gIERhdGFSb3V0ZXJIb29rW1wiVXNlUmV2YWxpZGF0b3JcIl0gPSBcInVzZVJldmFsaWRhdG9yXCI7XG4gIERhdGFSb3V0ZXJIb29rW1wiVXNlTmF2aWdhdGVTdGFibGVcIl0gPSBcInVzZU5hdmlnYXRlXCI7XG4gIHJldHVybiBEYXRhUm91dGVySG9vaztcbn0oRGF0YVJvdXRlckhvb2sgfHwge30pO1xudmFyIERhdGFSb3V0ZXJTdGF0ZUhvb2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKERhdGFSb3V0ZXJTdGF0ZUhvb2spIHtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZUJsb2NrZXJcIl0gPSBcInVzZUJsb2NrZXJcIjtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZUxvYWRlckRhdGFcIl0gPSBcInVzZUxvYWRlckRhdGFcIjtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZUFjdGlvbkRhdGFcIl0gPSBcInVzZUFjdGlvbkRhdGFcIjtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZVJvdXRlRXJyb3JcIl0gPSBcInVzZVJvdXRlRXJyb3JcIjtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZU5hdmlnYXRpb25cIl0gPSBcInVzZU5hdmlnYXRpb25cIjtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZVJvdXRlTG9hZGVyRGF0YVwiXSA9IFwidXNlUm91dGVMb2FkZXJEYXRhXCI7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VNYXRjaGVzXCJdID0gXCJ1c2VNYXRjaGVzXCI7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VSZXZhbGlkYXRvclwiXSA9IFwidXNlUmV2YWxpZGF0b3JcIjtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZU5hdmlnYXRlU3RhYmxlXCJdID0gXCJ1c2VOYXZpZ2F0ZVwiO1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlUm91dGVJZFwiXSA9IFwidXNlUm91dGVJZFwiO1xuICByZXR1cm4gRGF0YVJvdXRlclN0YXRlSG9vaztcbn0oRGF0YVJvdXRlclN0YXRlSG9vayB8fCB7fSk7XG5mdW5jdGlvbiBnZXREYXRhUm91dGVyQ29uc29sZUVycm9yKGhvb2tOYW1lKSB7XG4gIHJldHVybiBob29rTmFtZSArIFwiIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBkYXRhIHJvdXRlci4gIFNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9yb3V0ZXJzL3BpY2tpbmctYS1yb3V0ZXIuXCI7XG59XG5mdW5jdGlvbiB1c2VEYXRhUm91dGVyQ29udGV4dChob29rTmFtZSkge1xuICBsZXQgY3R4ID0gUmVhY3QudXNlQ29udGV4dChEYXRhUm91dGVyQ29udGV4dCk7XG4gICFjdHggPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBnZXREYXRhUm91dGVyQ29uc29sZUVycm9yKGhvb2tOYW1lKSkgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGN0eDtcbn1cbmZ1bmN0aW9uIHVzZURhdGFSb3V0ZXJTdGF0ZShob29rTmFtZSkge1xuICBsZXQgc3RhdGUgPSBSZWFjdC51c2VDb250ZXh0KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICAhc3RhdGUgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBnZXREYXRhUm91dGVyQ29uc29sZUVycm9yKGhvb2tOYW1lKSkgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gdXNlUm91dGVDb250ZXh0KGhvb2tOYW1lKSB7XG4gIGxldCByb3V0ZSA9IFJlYWN0LnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgIXJvdXRlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHJldHVybiByb3V0ZTtcbn1cblxuLy8gSW50ZXJuYWwgdmVyc2lvbiB3aXRoIGhvb2tOYW1lLWF3YXJlIGRlYnVnZ2luZ1xuZnVuY3Rpb24gdXNlQ3VycmVudFJvdXRlSWQoaG9va05hbWUpIHtcbiAgbGV0IHJvdXRlID0gdXNlUm91dGVDb250ZXh0KGhvb2tOYW1lKTtcbiAgbGV0IHRoaXNSb3V0ZSA9IHJvdXRlLm1hdGNoZXNbcm91dGUubWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgIXRoaXNSb3V0ZS5yb3V0ZS5pZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIGhvb2tOYW1lICsgXCIgY2FuIG9ubHkgYmUgdXNlZCBvbiByb3V0ZXMgdGhhdCBjb250YWluIGEgdW5pcXVlIFxcXCJpZFxcXCJcIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIHRoaXNSb3V0ZS5yb3V0ZS5pZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBJRCBmb3IgdGhlIG5lYXJlc3QgY29udGV4dHVhbCByb3V0ZVxuICovXG5mdW5jdGlvbiB1c2VSb3V0ZUlkKCkge1xuICByZXR1cm4gdXNlQ3VycmVudFJvdXRlSWQoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VSb3V0ZUlkKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IG5hdmlnYXRpb24sIGRlZmF1bHRpbmcgdG8gYW4gXCJpZGxlXCIgbmF2aWdhdGlvbiB3aGVuXG4gKiBubyBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzXG4gKi9cbmZ1bmN0aW9uIHVzZU5hdmlnYXRpb24oKSB7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZU5hdmlnYXRpb24pO1xuICByZXR1cm4gc3RhdGUubmF2aWdhdGlvbjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmV2YWxpZGF0ZSBmdW5jdGlvbiBmb3IgbWFudWFsbHkgdHJpZ2dlcmluZyByZXZhbGlkYXRpb24sIGFzIHdlbGxcbiAqIGFzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFueSBtYW51YWwgcmV2YWxpZGF0aW9uc1xuICovXG5mdW5jdGlvbiB1c2VSZXZhbGlkYXRvcigpIHtcbiAgbGV0IGRhdGFSb3V0ZXJDb250ZXh0ID0gdXNlRGF0YVJvdXRlckNvbnRleHQoRGF0YVJvdXRlckhvb2suVXNlUmV2YWxpZGF0b3IpO1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VSZXZhbGlkYXRvcik7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgcmV2YWxpZGF0ZTogZGF0YVJvdXRlckNvbnRleHQucm91dGVyLnJldmFsaWRhdGUsXG4gICAgc3RhdGU6IHN0YXRlLnJldmFsaWRhdGlvblxuICB9KSwgW2RhdGFSb3V0ZXJDb250ZXh0LnJvdXRlci5yZXZhbGlkYXRlLCBzdGF0ZS5yZXZhbGlkYXRpb25dKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3RpdmUgcm91dGUgbWF0Y2hlcywgdXNlZnVsIGZvciBhY2Nlc3NpbmcgbG9hZGVyRGF0YSBmb3JcbiAqIHBhcmVudC9jaGlsZCByb3V0ZXMgb3IgdGhlIHJvdXRlIFwiaGFuZGxlXCIgcHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gdXNlTWF0Y2hlcygpIHtcbiAgbGV0IHtcbiAgICBtYXRjaGVzLFxuICAgIGxvYWRlckRhdGFcbiAgfSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZU1hdGNoZXMpO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBtYXRjaGVzLm1hcChtYXRjaCA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcGFyYW1zXG4gICAgfSA9IG1hdGNoO1xuICAgIC8vIE5vdGU6IFRoaXMgc3RydWN0dXJlIG1hdGNoZXMgdGhhdCBjcmVhdGVkIGJ5IGNyZWF0ZVVzZU1hdGNoZXNNYXRjaFxuICAgIC8vIGluIHRoZSBAcmVtaXgtcnVuL3JvdXRlciAsIHNvIGlmIHlvdSBjaGFuZ2UgdGhpcyBwbGVhc2UgYWxzbyBjaGFuZ2VcbiAgICAvLyB0aGF0IDopICBFdmVudHVhbGx5IHdlJ2xsIERSWSB0aGlzIHVwXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBtYXRjaC5yb3V0ZS5pZCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcGFyYW1zLFxuICAgICAgZGF0YTogbG9hZGVyRGF0YVttYXRjaC5yb3V0ZS5pZF0sXG4gICAgICBoYW5kbGU6IG1hdGNoLnJvdXRlLmhhbmRsZVxuICAgIH07XG4gIH0pLCBbbWF0Y2hlcywgbG9hZGVyRGF0YV0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxvYWRlciBkYXRhIGZvciB0aGUgbmVhcmVzdCBhbmNlc3RvciBSb3V0ZSBsb2FkZXJcbiAqL1xuZnVuY3Rpb24gdXNlTG9hZGVyRGF0YSgpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlTG9hZGVyRGF0YSk7XG4gIGxldCByb3V0ZUlkID0gdXNlQ3VycmVudFJvdXRlSWQoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VMb2FkZXJEYXRhKTtcbiAgaWYgKHN0YXRlLmVycm9ycyAmJiBzdGF0ZS5lcnJvcnNbcm91dGVJZF0gIT0gbnVsbCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgY2Fubm90IGB1c2VMb2FkZXJEYXRhYCBpbiBhbiBlcnJvckVsZW1lbnQgKHJvdXRlSWQ6IFwiICsgcm91dGVJZCArIFwiKVwiKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sb2FkZXJEYXRhW3JvdXRlSWRdO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxvYWRlckRhdGEgZm9yIHRoZSBnaXZlbiByb3V0ZUlkXG4gKi9cbmZ1bmN0aW9uIHVzZVJvdXRlTG9hZGVyRGF0YShyb3V0ZUlkKSB7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZVJvdXRlTG9hZGVyRGF0YSk7XG4gIHJldHVybiBzdGF0ZS5sb2FkZXJEYXRhW3JvdXRlSWRdO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGlvbiBkYXRhIGZvciB0aGUgbmVhcmVzdCBhbmNlc3RvciBSb3V0ZSBhY3Rpb25cbiAqL1xuZnVuY3Rpb24gdXNlQWN0aW9uRGF0YSgpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlQWN0aW9uRGF0YSk7XG4gIGxldCByb3V0ZSA9IFJlYWN0LnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgIXJvdXRlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgXCJ1c2VBY3Rpb25EYXRhIG11c3QgYmUgdXNlZCBpbnNpZGUgYSBSb3V0ZUNvbnRleHRcIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoKHN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBzdGF0ZS5hY3Rpb25EYXRhKSB8fCB7fSlbMF07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmVhcmVzdCBhbmNlc3RvciBSb3V0ZSBlcnJvciwgd2hpY2ggY291bGQgYmUgYSBsb2FkZXIvYWN0aW9uXG4gKiBlcnJvciBvciBhIHJlbmRlciBlcnJvci4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20geW91clxuICogRXJyb3JCb3VuZGFyeS9lcnJvckVsZW1lbnQgdG8gZGlzcGxheSBhIHByb3BlciBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiB1c2VSb3V0ZUVycm9yKCkge1xuICB2YXIgX3N0YXRlJGVycm9ycztcbiAgbGV0IGVycm9yID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUVycm9yQ29udGV4dCk7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZVJvdXRlRXJyb3IpO1xuICBsZXQgcm91dGVJZCA9IHVzZUN1cnJlbnRSb3V0ZUlkKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlUm91dGVFcnJvcik7XG5cbiAgLy8gSWYgdGhpcyB3YXMgYSByZW5kZXIgZXJyb3IsIHdlIHB1dCBpdCBpbiBhIFJvdXRlRXJyb3IgY29udGV4dCBpbnNpZGVcbiAgLy8gb2YgUmVuZGVyRXJyb3JCb3VuZGFyeVxuICBpZiAoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICAvLyBPdGhlcndpc2UgbG9vayBmb3IgZXJyb3JzIGZyb20gb3VyIGRhdGEgcm91dGVyIHN0YXRlXG4gIHJldHVybiAoX3N0YXRlJGVycm9ycyA9IHN0YXRlLmVycm9ycykgPT0gbnVsbCA/IHZvaWQgMCA6IF9zdGF0ZSRlcnJvcnNbcm91dGVJZF07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaGFwcHktcGF0aCBkYXRhIGZyb20gdGhlIG5lYXJlc3QgYW5jZXN0b3IgPEF3YWl0IC8+IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHVzZUFzeW5jVmFsdWUoKSB7XG4gIGxldCB2YWx1ZSA9IFJlYWN0LnVzZUNvbnRleHQoQXdhaXRDb250ZXh0KTtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB2b2lkIDAgOiB2YWx1ZS5fZGF0YTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlcnJvciBmcm9tIHRoZSBuZWFyZXN0IGFuY2VzdG9yIDxBd2FpdCAvPiB2YWx1ZVxuICovXG5mdW5jdGlvbiB1c2VBc3luY0Vycm9yKCkge1xuICBsZXQgdmFsdWUgPSBSZWFjdC51c2VDb250ZXh0KEF3YWl0Q29udGV4dCk7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdm9pZCAwIDogdmFsdWUuX2Vycm9yO1xufVxubGV0IGJsb2NrZXJJZCA9IDA7XG5cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGJsb2NrIG5hdmlnYXRpb25zIHdpdGhpbiB0aGUgU1BBIGFuZCBwcmVzZW50IHRoZVxuICogdXNlciBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gY29uZmlybSB0aGUgbmF2aWdhdGlvbi4gIE1vc3RseSB1c2VkIHRvIGF2b2lkXG4gKiB1c2luZyBoYWxmLWZpbGxlZCBmb3JtIGRhdGEuICBUaGlzIGRvZXMgbm90IGhhbmRsZSBoYXJkLXJlbG9hZHMgb3JcbiAqIGNyb3NzLW9yaWdpbiBuYXZpZ2F0aW9ucy5cbiAqL1xuZnVuY3Rpb24gdXNlQmxvY2tlcihzaG91bGRCbG9jaykge1xuICBsZXQge1xuICAgIHJvdXRlcixcbiAgICBiYXNlbmFtZVxuICB9ID0gdXNlRGF0YVJvdXRlckNvbnRleHQoRGF0YVJvdXRlckhvb2suVXNlQmxvY2tlcik7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZUJsb2NrZXIpO1xuICBsZXQgW2Jsb2NrZXJLZXksIHNldEJsb2NrZXJLZXldID0gUmVhY3QudXNlU3RhdGUoXCJcIik7XG4gIGxldCBibG9ja2VyRnVuY3Rpb24gPSBSZWFjdC51c2VDYWxsYmFjayhhcmcgPT4ge1xuICAgIGlmICh0eXBlb2Ygc2hvdWxkQmxvY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuICEhc2hvdWxkQmxvY2s7XG4gICAgfVxuICAgIGlmIChiYXNlbmFtZSA9PT0gXCIvXCIpIHtcbiAgICAgIHJldHVybiBzaG91bGRCbG9jayhhcmcpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXkgcHJvdmlkZWQgdXMgYSBmdW5jdGlvbiBhbmQgd2UndmUgZ290IGFuIGFjdGl2ZSBiYXNlbmFtZSwgc3RyaXBcbiAgICAvLyBpdCBmcm9tIHRoZSBsb2NhdGlvbnMgd2UgZXhwb3NlIHRvIHRoZSB1c2VyIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvZlxuICAgIC8vIHVzZUxvY2F0aW9uXG4gICAgbGV0IHtcbiAgICAgIGN1cnJlbnRMb2NhdGlvbixcbiAgICAgIG5leHRMb2NhdGlvbixcbiAgICAgIGhpc3RvcnlBY3Rpb25cbiAgICB9ID0gYXJnO1xuICAgIHJldHVybiBzaG91bGRCbG9jayh7XG4gICAgICBjdXJyZW50TG9jYXRpb246IF9leHRlbmRzKHt9LCBjdXJyZW50TG9jYXRpb24sIHtcbiAgICAgICAgcGF0aG5hbWU6IHN0cmlwQmFzZW5hbWUoY3VycmVudExvY2F0aW9uLnBhdGhuYW1lLCBiYXNlbmFtZSkgfHwgY3VycmVudExvY2F0aW9uLnBhdGhuYW1lXG4gICAgICB9KSxcbiAgICAgIG5leHRMb2NhdGlvbjogX2V4dGVuZHMoe30sIG5leHRMb2NhdGlvbiwge1xuICAgICAgICBwYXRobmFtZTogc3RyaXBCYXNlbmFtZShuZXh0TG9jYXRpb24ucGF0aG5hbWUsIGJhc2VuYW1lKSB8fCBuZXh0TG9jYXRpb24ucGF0aG5hbWVcbiAgICAgIH0pLFxuICAgICAgaGlzdG9yeUFjdGlvblxuICAgIH0pO1xuICB9LCBbYmFzZW5hbWUsIHNob3VsZEJsb2NrXSk7XG5cbiAgLy8gVGhpcyBlZmZlY3QgaXMgaW4gY2hhcmdlIG9mIGJsb2NrZXIga2V5IGFzc2lnbm1lbnQgYW5kIGRlbGV0aW9uICh3aGljaCBpc1xuICAvLyB0aWdodGx5IGNvdXBsZWQgdG8gdGhlIGtleSlcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQga2V5ID0gU3RyaW5nKCsrYmxvY2tlcklkKTtcbiAgICBzZXRCbG9ja2VyS2V5KGtleSk7XG4gICAgcmV0dXJuICgpID0+IHJvdXRlci5kZWxldGVCbG9ja2VyKGtleSk7XG4gIH0sIFtyb3V0ZXJdKTtcblxuICAvLyBUaGlzIGVmZmVjdCBoYW5kbGVzIGFzc2lnbmluZyB0aGUgYmxvY2tlckZ1bmN0aW9uLiAgVGhpcyBpcyB0byBoYW5kbGVcbiAgLy8gdW5zdGFibGUgYmxvY2tlciBmdW5jdGlvbiBpZGVudGl0aWVzLCBhbmQgaGFwcGVucyBvbmx5IGFmdGVyIHRoZSBwcmlvclxuICAvLyBlZmZlY3Qgc28gd2UgZG9uJ3QgZ2V0IGFuIG9ycGhhbmVkIGJsb2NrZXJGdW5jdGlvbiBpbiB0aGUgcm91dGVyIHdpdGggYVxuICAvLyBrZXkgb2YgXCJcIi4gIFVudGlsIHRoZW4gd2UganVzdCBoYXZlIHRoZSBJRExFX0JMT0NLRVIuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGJsb2NrZXJLZXkgIT09IFwiXCIpIHtcbiAgICAgIHJvdXRlci5nZXRCbG9ja2VyKGJsb2NrZXJLZXksIGJsb2NrZXJGdW5jdGlvbik7XG4gICAgfVxuICB9LCBbcm91dGVyLCBibG9ja2VyS2V5LCBibG9ja2VyRnVuY3Rpb25dKTtcblxuICAvLyBQcmVmZXIgdGhlIGJsb2NrZXIgZnJvbSBgc3RhdGVgIG5vdCBgcm91dGVyLnN0YXRlYCBzaW5jZSBEYXRhUm91dGVyQ29udGV4dFxuICAvLyBpcyBtZW1vaXplZCBzbyB0aGlzIGVuc3VyZXMgd2UgdXBkYXRlIG9uIGJsb2NrZXIgc3RhdGUgdXBkYXRlc1xuICByZXR1cm4gYmxvY2tlcktleSAmJiBzdGF0ZS5ibG9ja2Vycy5oYXMoYmxvY2tlcktleSkgPyBzdGF0ZS5ibG9ja2Vycy5nZXQoYmxvY2tlcktleSkgOiBJRExFX0JMT0NLRVI7XG59XG5cbi8qKlxuICogU3RhYmxlIHZlcnNpb24gb2YgdXNlTmF2aWdhdGUgdGhhdCBpcyB1c2VkIHdoZW4gd2UgYXJlIGluIHRoZSBjb250ZXh0IG9mXG4gKiBhIFJvdXRlclByb3ZpZGVyLlxuICovXG5mdW5jdGlvbiB1c2VOYXZpZ2F0ZVN0YWJsZSgpIHtcbiAgbGV0IHtcbiAgICByb3V0ZXJcbiAgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0KERhdGFSb3V0ZXJIb29rLlVzZU5hdmlnYXRlU3RhYmxlKTtcbiAgbGV0IGlkID0gdXNlQ3VycmVudFJvdXRlSWQoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VOYXZpZ2F0ZVN0YWJsZSk7XG4gIGxldCBhY3RpdmVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBhY3RpdmVSZWYuY3VycmVudCA9IHRydWU7XG4gIH0pO1xuICBsZXQgbmF2aWdhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodG8sIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKGFjdGl2ZVJlZi5jdXJyZW50LCBuYXZpZ2F0ZUVmZmVjdFdhcm5pbmcpIDogdm9pZCAwO1xuXG4gICAgLy8gU2hvcnQgY2lyY3VpdCBoZXJlIHNpbmNlIGlmIHRoaXMgaGFwcGVucyBvbiBmaXJzdCByZW5kZXIgdGhlIG5hdmlnYXRlXG4gICAgLy8gaXMgdXNlbGVzcyBiZWNhdXNlIHdlIGhhdmVuJ3Qgd2lyZWQgdXAgb3VyIHJvdXRlciBzdWJzY3JpYmVyIHlldFxuICAgIGlmICghYWN0aXZlUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHRvID09PSBcIm51bWJlclwiKSB7XG4gICAgICByb3V0ZXIubmF2aWdhdGUodG8pO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3V0ZXIubmF2aWdhdGUodG8sIF9leHRlbmRzKHtcbiAgICAgICAgZnJvbVJvdXRlSWQ6IGlkXG4gICAgICB9LCBvcHRpb25zKSk7XG4gICAgfVxuICB9LCBbcm91dGVyLCBpZF0pO1xuICByZXR1cm4gbmF2aWdhdGU7XG59XG5jb25zdCBhbHJlYWR5V2FybmVkID0ge307XG5mdW5jdGlvbiB3YXJuaW5nT25jZShrZXksIGNvbmQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kICYmICFhbHJlYWR5V2FybmVkW2tleV0pIHtcbiAgICBhbHJlYWR5V2FybmVkW2tleV0gPSB0cnVlO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKGZhbHNlLCBtZXNzYWdlKSA6IHZvaWQgMDtcbiAgfVxufVxuXG4vKipcbiAgV2VicGFjayArIFJlYWN0IDE3IGZhaWxzIHRvIGNvbXBpbGUgb24gYW55IG9mIHRoZSBmb2xsb3dpbmcgYmVjYXVzZSB3ZWJwYWNrXG4gIGNvbXBsYWlucyB0aGF0IGBzdGFydFRyYW5zaXRpb25gIGRvZXNuJ3QgZXhpc3QgaW4gYFJlYWN0YDpcbiAgKiBpbXBvcnQgeyBzdGFydFRyYW5zaXRpb24gfSBmcm9tIFwicmVhY3RcIlxuICAqIGltcG9ydCAqIGFzIFJlYWN0IGZyb20gZnJvbSBcInJlYWN0XCI7XG4gICAgXCJzdGFydFRyYW5zaXRpb25cIiBpbiBSZWFjdCA/IFJlYWN0LnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBzZXRTdGF0ZSgpKSA6IHNldFN0YXRlKClcbiAgKiBpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIGZyb20gXCJyZWFjdFwiO1xuICAgIFwic3RhcnRUcmFuc2l0aW9uXCIgaW4gUmVhY3QgPyBSZWFjdFtcInN0YXJ0VHJhbnNpdGlvblwiXSgoKSA9PiBzZXRTdGF0ZSgpKSA6IHNldFN0YXRlKClcblxuICBNb3ZpbmcgaXQgdG8gYSBjb25zdGFudCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc29sdmVzIHRoZSBXZWJwYWNrL1JlYWN0IDE3IGlzc3VlOlxuICAqIGltcG9ydCAqIGFzIFJlYWN0IGZyb20gZnJvbSBcInJlYWN0XCI7XG4gICAgY29uc3QgU1RBUlRfVFJBTlNJVElPTiA9IFwic3RhcnRUcmFuc2l0aW9uXCI7XG4gICAgU1RBUlRfVFJBTlNJVElPTiBpbiBSZWFjdCA/IFJlYWN0W1NUQVJUX1RSQU5TSVRJT05dKCgpID0+IHNldFN0YXRlKCkpIDogc2V0U3RhdGUoKVxuXG4gIEhvd2V2ZXIsIHRoYXQgaW50cm9kdWNlcyB3ZWJwYWNrL3RlcnNlciBtaW5pZmljYXRpb24gaXNzdWVzIGluIHByb2R1Y3Rpb24gYnVpbGRzXG4gIGluIFJlYWN0IDE4IHdoZXJlIG1pbmlmaWNhdGlvbi9vYmZ1c2NhdGlvbiBlbmRzIHVwIHJlbW92aW5nIHRoZSBjYWxsIG9mXG4gIFJlYWN0LnN0YXJ0VHJhbnNpdGlvbiBlbnRpcmVseSBmcm9tIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSB0ZXJuYXJ5LiAgR3JhYmJpbmdcbiAgdGhpcyBleHBvcnRlZCByZWZlcmVuY2Ugb25jZSB1cCBmcm9udCByZXNvbHZlcyB0aGF0IGlzc3VlLlxuXG4gIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVtaXgtcnVuL3JlYWN0LXJvdXRlci9pc3N1ZXMvMTA1NzlcbiovXG5jb25zdCBTVEFSVF9UUkFOU0lUSU9OID0gXCJzdGFydFRyYW5zaXRpb25cIjtcbmNvbnN0IHN0YXJ0VHJhbnNpdGlvbkltcGwgPSBSZWFjdFtTVEFSVF9UUkFOU0lUSU9OXTtcblxuLyoqXG4gKiBHaXZlbiBhIFJlbWl4IFJvdXRlciBpbnN0YW5jZSwgcmVuZGVyIHRoZSBhcHByb3ByaWF0ZSBVSVxuICovXG5mdW5jdGlvbiBSb3V0ZXJQcm92aWRlcihfcmVmKSB7XG4gIGxldCB7XG4gICAgZmFsbGJhY2tFbGVtZW50LFxuICAgIHJvdXRlcixcbiAgICBmdXR1cmVcbiAgfSA9IF9yZWY7XG4gIC8vIE5lZWQgdG8gdXNlIGEgbGF5b3V0IGVmZmVjdCBoZXJlIHNvIHdlIGFyZSBzdWJzY3JpYmVkIGVhcmx5IGVub3VnaCB0b1xuICAvLyBwaWNrIHVwIG9uIGFueSByZW5kZXItZHJpdmVuIHJlZGlyZWN0cy9uYXZpZ2F0aW9ucyAodXNlRWZmZWN0LzxOYXZpZ2F0ZT4pXG4gIGxldCBbc3RhdGUsIHNldFN0YXRlSW1wbF0gPSBSZWFjdC51c2VTdGF0ZShyb3V0ZXIuc3RhdGUpO1xuICBsZXQge1xuICAgIHY3X3N0YXJ0VHJhbnNpdGlvblxuICB9ID0gZnV0dXJlIHx8IHt9O1xuICBsZXQgc2V0U3RhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhuZXdTdGF0ZSA9PiB7XG4gICAgdjdfc3RhcnRUcmFuc2l0aW9uICYmIHN0YXJ0VHJhbnNpdGlvbkltcGwgPyBzdGFydFRyYW5zaXRpb25JbXBsKCgpID0+IHNldFN0YXRlSW1wbChuZXdTdGF0ZSkpIDogc2V0U3RhdGVJbXBsKG5ld1N0YXRlKTtcbiAgfSwgW3NldFN0YXRlSW1wbCwgdjdfc3RhcnRUcmFuc2l0aW9uXSk7XG4gIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiByb3V0ZXIuc3Vic2NyaWJlKHNldFN0YXRlKSwgW3JvdXRlciwgc2V0U3RhdGVdKTtcbiAgbGV0IG5hdmlnYXRvciA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGVIcmVmOiByb3V0ZXIuY3JlYXRlSHJlZixcbiAgICAgIGVuY29kZUxvY2F0aW9uOiByb3V0ZXIuZW5jb2RlTG9jYXRpb24sXG4gICAgICBnbzogbiA9PiByb3V0ZXIubmF2aWdhdGUobiksXG4gICAgICBwdXNoOiAodG8sIHN0YXRlLCBvcHRzKSA9PiByb3V0ZXIubmF2aWdhdGUodG8sIHtcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5wcmV2ZW50U2Nyb2xsUmVzZXRcbiAgICAgIH0pLFxuICAgICAgcmVwbGFjZTogKHRvLCBzdGF0ZSwgb3B0cykgPT4gcm91dGVyLm5hdmlnYXRlKHRvLCB7XG4gICAgICAgIHJlcGxhY2U6IHRydWUsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQ6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMucHJldmVudFNjcm9sbFJlc2V0XG4gICAgICB9KVxuICAgIH07XG4gIH0sIFtyb3V0ZXJdKTtcbiAgbGV0IGJhc2VuYW1lID0gcm91dGVyLmJhc2VuYW1lIHx8IFwiL1wiO1xuICBsZXQgZGF0YVJvdXRlckNvbnRleHQgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgcm91dGVyLFxuICAgIG5hdmlnYXRvcixcbiAgICBzdGF0aWM6IGZhbHNlLFxuICAgIGJhc2VuYW1lXG4gIH0pLCBbcm91dGVyLCBuYXZpZ2F0b3IsIGJhc2VuYW1lXSk7XG5cbiAgLy8gVGhlIGZyYWdtZW50IGFuZCB7bnVsbH0gaGVyZSBhcmUgaW1wb3J0YW50ISAgV2UgbmVlZCB0aGVtIHRvIGtlZXAgUmVhY3QgMTgnc1xuICAvLyB1c2VJZCBoYXBweSB3aGVuIHdlIGFyZSBzZXJ2ZXItcmVuZGVyaW5nIHNpbmNlIHdlIG1heSBoYXZlIGEgPHNjcmlwdD4gaGVyZVxuICAvLyBjb250YWluaW5nIHRoZSBoeWRyYXRlZCBzZXJ2ZXItc2lkZSBzdGF0aWNDb250ZXh0IChmcm9tIFN0YXRpY1JvdXRlclByb3ZpZGVyKS5cbiAgLy8gdXNlSWQgcmVsaWVzIG9uIHRoZSBjb21wb25lbnQgdHJlZSBzdHJ1Y3R1cmUgdG8gZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBpZCdzXG4gIC8vIHNvIHdlIG5lZWQgdG8gZW5zdXJlIGl0IHJlbWFpbnMgdGhlIHNhbWUgb24gdGhlIGNsaWVudCBldmVuIHRob3VnaFxuICAvLyB3ZSBkb24ndCBuZWVkIHRoZSA8c2NyaXB0PiB0YWdcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEYXRhUm91dGVyQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBkYXRhUm91dGVyQ29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEYXRhUm91dGVyU3RhdGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHN0YXRlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlciwge1xuICAgIGJhc2VuYW1lOiBiYXNlbmFtZSxcbiAgICBsb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmhpc3RvcnlBY3Rpb24sXG4gICAgbmF2aWdhdG9yOiBuYXZpZ2F0b3JcbiAgfSwgc3RhdGUuaW5pdGlhbGl6ZWQgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEYXRhUm91dGVzLCB7XG4gICAgcm91dGVzOiByb3V0ZXIucm91dGVzLFxuICAgIHN0YXRlOiBzdGF0ZVxuICB9KSA6IGZhbGxiYWNrRWxlbWVudCkpKSwgbnVsbCk7XG59XG5mdW5jdGlvbiBEYXRhUm91dGVzKF9yZWYyKSB7XG4gIGxldCB7XG4gICAgcm91dGVzLFxuICAgIHN0YXRlXG4gIH0gPSBfcmVmMjtcbiAgcmV0dXJuIHVzZVJvdXRlc0ltcGwocm91dGVzLCB1bmRlZmluZWQsIHN0YXRlKTtcbn1cbi8qKlxuICogQSA8Um91dGVyPiB0aGF0IHN0b3JlcyBhbGwgZW50cmllcyBpbiBtZW1vcnkuXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9yb3V0ZXItY29tcG9uZW50cy9tZW1vcnktcm91dGVyXG4gKi9cbmZ1bmN0aW9uIE1lbW9yeVJvdXRlcihfcmVmMykge1xuICBsZXQge1xuICAgIGJhc2VuYW1lLFxuICAgIGNoaWxkcmVuLFxuICAgIGluaXRpYWxFbnRyaWVzLFxuICAgIGluaXRpYWxJbmRleCxcbiAgICBmdXR1cmVcbiAgfSA9IF9yZWYzO1xuICBsZXQgaGlzdG9yeVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBpZiAoaGlzdG9yeVJlZi5jdXJyZW50ID09IG51bGwpIHtcbiAgICBoaXN0b3J5UmVmLmN1cnJlbnQgPSBjcmVhdGVNZW1vcnlIaXN0b3J5KHtcbiAgICAgIGluaXRpYWxFbnRyaWVzLFxuICAgICAgaW5pdGlhbEluZGV4LFxuICAgICAgdjVDb21wYXQ6IHRydWVcbiAgICB9KTtcbiAgfVxuICBsZXQgaGlzdG9yeSA9IGhpc3RvcnlSZWYuY3VycmVudDtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVJbXBsXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICBhY3Rpb246IGhpc3RvcnkuYWN0aW9uLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uXG4gIH0pO1xuICBsZXQge1xuICAgIHY3X3N0YXJ0VHJhbnNpdGlvblxuICB9ID0gZnV0dXJlIHx8IHt9O1xuICBsZXQgc2V0U3RhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhuZXdTdGF0ZSA9PiB7XG4gICAgdjdfc3RhcnRUcmFuc2l0aW9uICYmIHN0YXJ0VHJhbnNpdGlvbkltcGwgPyBzdGFydFRyYW5zaXRpb25JbXBsKCgpID0+IHNldFN0YXRlSW1wbChuZXdTdGF0ZSkpIDogc2V0U3RhdGVJbXBsKG5ld1N0YXRlKTtcbiAgfSwgW3NldFN0YXRlSW1wbCwgdjdfc3RhcnRUcmFuc2l0aW9uXSk7XG4gIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiBoaXN0b3J5Lmxpc3RlbihzZXRTdGF0ZSksIFtoaXN0b3J5LCBzZXRTdGF0ZV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCB7XG4gICAgYmFzZW5hbWU6IGJhc2VuYW1lLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBsb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmFjdGlvbixcbiAgICBuYXZpZ2F0b3I6IGhpc3RvcnlcbiAgfSk7XG59XG4vKipcbiAqIENoYW5nZXMgdGhlIGN1cnJlbnQgbG9jYXRpb24uXG4gKlxuICogTm90ZTogVGhpcyBBUEkgaXMgbW9zdGx5IHVzZWZ1bCBpbiBSZWFjdC5Db21wb25lbnQgc3ViY2xhc3NlcyB0aGF0IGFyZSBub3RcbiAqIGFibGUgdG8gdXNlIGhvb2tzLiBJbiBmdW5jdGlvbmFsIGNvbXBvbmVudHMsIHdlIHJlY29tbWVuZCB5b3UgdXNlIHRoZVxuICogYHVzZU5hdmlnYXRlYCBob29rIGluc3RlYWQuXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9jb21wb25lbnRzL25hdmlnYXRlXG4gKi9cbmZ1bmN0aW9uIE5hdmlnYXRlKF9yZWY0KSB7XG4gIGxldCB7XG4gICAgdG8sXG4gICAgcmVwbGFjZSxcbiAgICBzdGF0ZSxcbiAgICByZWxhdGl2ZVxuICB9ID0gX3JlZjQ7XG4gICF1c2VJblJvdXRlckNvbnRleHQoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mXG4gIC8vIHRoZSByb3V0ZXIgbG9hZGVkLiBXZSBjYW4gaGVscCB0aGVtIHVuZGVyc3RhbmQgaG93IHRvIGF2b2lkIHRoYXQuXG4gIFwiPE5hdmlnYXRlPiBtYXkgYmUgdXNlZCBvbmx5IGluIHRoZSBjb250ZXh0IG9mIGEgPFJvdXRlcj4gY29tcG9uZW50LlwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyghUmVhY3QudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCkuc3RhdGljLCBcIjxOYXZpZ2F0ZT4gbXVzdCBub3QgYmUgdXNlZCBvbiB0aGUgaW5pdGlhbCByZW5kZXIgaW4gYSA8U3RhdGljUm91dGVyPi4gXCIgKyBcIlRoaXMgaXMgYSBuby1vcCwgYnV0IHlvdSBzaG91bGQgbW9kaWZ5IHlvdXIgY29kZSBzbyB0aGUgPE5hdmlnYXRlPiBpcyBcIiArIFwib25seSBldmVyIHJlbmRlcmVkIGluIHJlc3BvbnNlIHRvIHNvbWUgdXNlciBpbnRlcmFjdGlvbiBvciBzdGF0ZSBjaGFuZ2UuXCIpIDogdm9pZCAwO1xuICBsZXQge1xuICAgIG1hdGNoZXNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgbGV0IHtcbiAgICBwYXRobmFtZTogbG9jYXRpb25QYXRobmFtZVxuICB9ID0gdXNlTG9jYXRpb24oKTtcbiAgbGV0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcblxuICAvLyBSZXNvbHZlIHRoZSBwYXRoIG91dHNpZGUgb2YgdGhlIGVmZmVjdCBzbyB0aGF0IHdoZW4gZWZmZWN0cyBydW4gdHdpY2UgaW5cbiAgLy8gU3RyaWN0TW9kZSB0aGV5IG5hdmlnYXRlIHRvIHRoZSBzYW1lIHBsYWNlXG4gIGxldCBwYXRoID0gcmVzb2x2ZVRvKHRvLCBVTlNBRkVfZ2V0UGF0aENvbnRyaWJ1dGluZ01hdGNoZXMobWF0Y2hlcykubWFwKG1hdGNoID0+IG1hdGNoLnBhdGhuYW1lQmFzZSksIGxvY2F0aW9uUGF0aG5hbWUsIHJlbGF0aXZlID09PSBcInBhdGhcIik7XG4gIGxldCBqc29uUGF0aCA9IEpTT04uc3RyaW5naWZ5KHBhdGgpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gbmF2aWdhdGUoSlNPTi5wYXJzZShqc29uUGF0aCksIHtcbiAgICByZXBsYWNlLFxuICAgIHN0YXRlLFxuICAgIHJlbGF0aXZlXG4gIH0pLCBbbmF2aWdhdGUsIGpzb25QYXRoLCByZWxhdGl2ZSwgcmVwbGFjZSwgc3RhdGVdKTtcbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIFJlbmRlcnMgdGhlIGNoaWxkIHJvdXRlJ3MgZWxlbWVudCwgaWYgdGhlcmUgaXMgb25lLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vY29tcG9uZW50cy9vdXRsZXRcbiAqL1xuZnVuY3Rpb24gT3V0bGV0KHByb3BzKSB7XG4gIHJldHVybiB1c2VPdXRsZXQocHJvcHMuY29udGV4dCk7XG59XG4vKipcbiAqIERlY2xhcmVzIGFuIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgYXQgYSBjZXJ0YWluIFVSTCBwYXRoLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vY29tcG9uZW50cy9yb3V0ZVxuICovXG5mdW5jdGlvbiBSb3V0ZShfcHJvcHMpIHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgXCJBIDxSb3V0ZT4gaXMgb25seSBldmVyIHRvIGJlIHVzZWQgYXMgdGhlIGNoaWxkIG9mIDxSb3V0ZXM+IGVsZW1lbnQsIFwiICsgXCJuZXZlciByZW5kZXJlZCBkaXJlY3RseS4gUGxlYXNlIHdyYXAgeW91ciA8Um91dGU+IGluIGEgPFJvdXRlcz4uXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgO1xufVxuLyoqXG4gKiBQcm92aWRlcyBsb2NhdGlvbiBjb250ZXh0IGZvciB0aGUgcmVzdCBvZiB0aGUgYXBwLlxuICpcbiAqIE5vdGU6IFlvdSB1c3VhbGx5IHdvbid0IHJlbmRlciBhIDxSb3V0ZXI+IGRpcmVjdGx5LiBJbnN0ZWFkLCB5b3UnbGwgcmVuZGVyIGFcbiAqIHJvdXRlciB0aGF0IGlzIG1vcmUgc3BlY2lmaWMgdG8geW91ciBlbnZpcm9ubWVudCBzdWNoIGFzIGEgPEJyb3dzZXJSb3V0ZXI+XG4gKiBpbiB3ZWIgYnJvd3NlcnMgb3IgYSA8U3RhdGljUm91dGVyPiBmb3Igc2VydmVyIHJlbmRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3JvdXRlci1jb21wb25lbnRzL3JvdXRlclxuICovXG5mdW5jdGlvbiBSb3V0ZXIoX3JlZjUpIHtcbiAgbGV0IHtcbiAgICBiYXNlbmFtZTogYmFzZW5hbWVQcm9wID0gXCIvXCIsXG4gICAgY2hpbGRyZW4gPSBudWxsLFxuICAgIGxvY2F0aW9uOiBsb2NhdGlvblByb3AsXG4gICAgbmF2aWdhdGlvblR5cGUgPSBBY3Rpb24uUG9wLFxuICAgIG5hdmlnYXRvcixcbiAgICBzdGF0aWM6IHN0YXRpY1Byb3AgPSBmYWxzZVxuICB9ID0gX3JlZjU7XG4gICEhdXNlSW5Sb3V0ZXJDb250ZXh0KCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcIllvdSBjYW5ub3QgcmVuZGVyIGEgPFJvdXRlcj4gaW5zaWRlIGFub3RoZXIgPFJvdXRlcj4uXCIgKyBcIiBZb3Ugc2hvdWxkIG5ldmVyIGhhdmUgbW9yZSB0aGFuIG9uZSBpbiB5b3VyIGFwcC5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICAvLyBQcmVzZXJ2ZSB0cmFpbGluZyBzbGFzaGVzIG9uIGJhc2VuYW1lLCBzbyB3ZSBjYW4gbGV0IHRoZSB1c2VyIGNvbnRyb2xcbiAgLy8gdGhlIGVuZm9yY2VtZW50IG9mIHRyYWlsaW5nIHNsYXNoZXMgdGhyb3VnaG91dCB0aGUgYXBwXG4gIGxldCBiYXNlbmFtZSA9IGJhc2VuYW1lUHJvcC5yZXBsYWNlKC9eXFwvKi8sIFwiL1wiKTtcbiAgbGV0IG5hdmlnYXRpb25Db250ZXh0ID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGJhc2VuYW1lLFxuICAgIG5hdmlnYXRvcixcbiAgICBzdGF0aWM6IHN0YXRpY1Byb3BcbiAgfSksIFtiYXNlbmFtZSwgbmF2aWdhdG9yLCBzdGF0aWNQcm9wXSk7XG4gIGlmICh0eXBlb2YgbG9jYXRpb25Qcm9wID09PSBcInN0cmluZ1wiKSB7XG4gICAgbG9jYXRpb25Qcm9wID0gcGFyc2VQYXRoKGxvY2F0aW9uUHJvcCk7XG4gIH1cbiAgbGV0IHtcbiAgICBwYXRobmFtZSA9IFwiL1wiLFxuICAgIHNlYXJjaCA9IFwiXCIsXG4gICAgaGFzaCA9IFwiXCIsXG4gICAgc3RhdGUgPSBudWxsLFxuICAgIGtleSA9IFwiZGVmYXVsdFwiXG4gIH0gPSBsb2NhdGlvblByb3A7XG4gIGxldCBsb2NhdGlvbkNvbnRleHQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgdHJhaWxpbmdQYXRobmFtZSA9IHN0cmlwQmFzZW5hbWUocGF0aG5hbWUsIGJhc2VuYW1lKTtcbiAgICBpZiAodHJhaWxpbmdQYXRobmFtZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgIHBhdGhuYW1lOiB0cmFpbGluZ1BhdGhuYW1lLFxuICAgICAgICBzZWFyY2gsXG4gICAgICAgIGhhc2gsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBrZXlcbiAgICAgIH0sXG4gICAgICBuYXZpZ2F0aW9uVHlwZVxuICAgIH07XG4gIH0sIFtiYXNlbmFtZSwgcGF0aG5hbWUsIHNlYXJjaCwgaGFzaCwgc3RhdGUsIGtleSwgbmF2aWdhdGlvblR5cGVdKTtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX3dhcm5pbmcobG9jYXRpb25Db250ZXh0ICE9IG51bGwsIFwiPFJvdXRlciBiYXNlbmFtZT1cXFwiXCIgKyBiYXNlbmFtZSArIFwiXFxcIj4gaXMgbm90IGFibGUgdG8gbWF0Y2ggdGhlIFVSTCBcIiArIChcIlxcXCJcIiArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaCArIFwiXFxcIiBiZWNhdXNlIGl0IGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIFwiKSArIFwiYmFzZW5hbWUsIHNvIHRoZSA8Um91dGVyPiB3b24ndCByZW5kZXIgYW55dGhpbmcuXCIpIDogdm9pZCAwO1xuICBpZiAobG9jYXRpb25Db250ZXh0ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTmF2aWdhdGlvbkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbmF2aWdhdGlvbkNvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYXRpb25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgIHZhbHVlOiBsb2NhdGlvbkNvbnRleHRcbiAgfSkpO1xufVxuLyoqXG4gKiBBIGNvbnRhaW5lciBmb3IgYSBuZXN0ZWQgdHJlZSBvZiA8Um91dGU+IGVsZW1lbnRzIHRoYXQgcmVuZGVycyB0aGUgYnJhbmNoXG4gKiB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgY3VycmVudCBsb2NhdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2NvbXBvbmVudHMvcm91dGVzXG4gKi9cbmZ1bmN0aW9uIFJvdXRlcyhfcmVmNikge1xuICBsZXQge1xuICAgIGNoaWxkcmVuLFxuICAgIGxvY2F0aW9uXG4gIH0gPSBfcmVmNjtcbiAgcmV0dXJuIHVzZVJvdXRlcyhjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4pLCBsb2NhdGlvbik7XG59XG4vKipcbiAqIENvbXBvbmVudCB0byB1c2UgZm9yIHJlbmRlcmluZyBsYXppbHkgbG9hZGVkIGRhdGEgZnJvbSByZXR1cm5pbmcgZGVmZXIoKVxuICogaW4gYSBsb2FkZXIgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gQXdhaXQoX3JlZjcpIHtcbiAgbGV0IHtcbiAgICBjaGlsZHJlbixcbiAgICBlcnJvckVsZW1lbnQsXG4gICAgcmVzb2x2ZVxuICB9ID0gX3JlZjc7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBd2FpdEVycm9yQm91bmRhcnksIHtcbiAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgIGVycm9yRWxlbWVudDogZXJyb3JFbGVtZW50XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc29sdmVBd2FpdCwgbnVsbCwgY2hpbGRyZW4pKTtcbn1cbnZhciBBd2FpdFJlbmRlclN0YXR1cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoQXdhaXRSZW5kZXJTdGF0dXMpIHtcbiAgQXdhaXRSZW5kZXJTdGF0dXNbQXdhaXRSZW5kZXJTdGF0dXNbXCJwZW5kaW5nXCJdID0gMF0gPSBcInBlbmRpbmdcIjtcbiAgQXdhaXRSZW5kZXJTdGF0dXNbQXdhaXRSZW5kZXJTdGF0dXNbXCJzdWNjZXNzXCJdID0gMV0gPSBcInN1Y2Nlc3NcIjtcbiAgQXdhaXRSZW5kZXJTdGF0dXNbQXdhaXRSZW5kZXJTdGF0dXNbXCJlcnJvclwiXSA9IDJdID0gXCJlcnJvclwiO1xuICByZXR1cm4gQXdhaXRSZW5kZXJTdGF0dXM7XG59KEF3YWl0UmVuZGVyU3RhdHVzIHx8IHt9KTtcbmNvbnN0IG5ldmVyU2V0dGxlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgoKSA9PiB7fSk7XG5jbGFzcyBBd2FpdEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZXJyb3I6IG51bGxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JcbiAgICB9O1xuICB9XG4gIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBlcnJvckluZm8pIHtcbiAgICBjb25zb2xlLmVycm9yKFwiPEF3YWl0PiBjYXVnaHQgdGhlIGZvbGxvd2luZyBlcnJvciBkdXJpbmcgcmVuZGVyXCIsIGVycm9yLCBlcnJvckluZm8pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBsZXQge1xuICAgICAgY2hpbGRyZW4sXG4gICAgICBlcnJvckVsZW1lbnQsXG4gICAgICByZXNvbHZlXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHByb21pc2UgPSBudWxsO1xuICAgIGxldCBzdGF0dXMgPSBBd2FpdFJlbmRlclN0YXR1cy5wZW5kaW5nO1xuICAgIGlmICghKHJlc29sdmUgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgLy8gRGlkbid0IGdldCBhIHByb21pc2UgLSBwcm92aWRlIGFzIGEgcmVzb2x2ZWQgcHJvbWlzZVxuICAgICAgc3RhdHVzID0gQXdhaXRSZW5kZXJTdGF0dXMuc3VjY2VzcztcbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl90cmFja2VkXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl9kYXRhXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIC8vIENhdWdodCBhIHJlbmRlciBlcnJvciwgcHJvdmlkZSBpdCBhcyBhIHJlamVjdGVkIHByb21pc2VcbiAgICAgIHN0YXR1cyA9IEF3YWl0UmVuZGVyU3RhdHVzLmVycm9yO1xuICAgICAgbGV0IHJlbmRlckVycm9yID0gdGhpcy5zdGF0ZS5lcnJvcjtcbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlamVjdCgpLmNhdGNoKCgpID0+IHt9KTsgLy8gQXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbiB3YXJuaW5nc1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX3RyYWNrZWRcIiwge1xuICAgICAgICBnZXQ6ICgpID0+IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX2Vycm9yXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiByZW5kZXJFcnJvclxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyZXNvbHZlLl90cmFja2VkKSB7XG4gICAgICAvLyBBbHJlYWR5IHRyYWNrZWQgcHJvbWlzZSAtIGNoZWNrIGNvbnRlbnRzXG4gICAgICBwcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgIHN0YXR1cyA9IHByb21pc2UuX2Vycm9yICE9PSB1bmRlZmluZWQgPyBBd2FpdFJlbmRlclN0YXR1cy5lcnJvciA6IHByb21pc2UuX2RhdGEgIT09IHVuZGVmaW5lZCA/IEF3YWl0UmVuZGVyU3RhdHVzLnN1Y2Nlc3MgOiBBd2FpdFJlbmRlclN0YXR1cy5wZW5kaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSYXcgKHVudHJhY2tlZCkgcHJvbWlzZSAtIHRyYWNrIGl0XG4gICAgICBzdGF0dXMgPSBBd2FpdFJlbmRlclN0YXR1cy5wZW5kaW5nO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc29sdmUsIFwiX3RyYWNrZWRcIiwge1xuICAgICAgICBnZXQ6ICgpID0+IHRydWVcbiAgICAgIH0pO1xuICAgICAgcHJvbWlzZSA9IHJlc29sdmUudGhlbihkYXRhID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNvbHZlLCBcIl9kYXRhXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiBkYXRhXG4gICAgICB9KSwgZXJyb3IgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc29sdmUsIFwiX2Vycm9yXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiBlcnJvclxuICAgICAgfSkpO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSBBd2FpdFJlbmRlclN0YXR1cy5lcnJvciAmJiBwcm9taXNlLl9lcnJvciBpbnN0YW5jZW9mIEFib3J0ZWREZWZlcnJlZEVycm9yKSB7XG4gICAgICAvLyBGcmVlemUgdGhlIFVJIGJ5IHRocm93aW5nIGEgbmV2ZXIgcmVzb2x2ZWQgcHJvbWlzZVxuICAgICAgdGhyb3cgbmV2ZXJTZXR0bGVkUHJvbWlzZTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gQXdhaXRSZW5kZXJTdGF0dXMuZXJyb3IgJiYgIWVycm9yRWxlbWVudCkge1xuICAgICAgLy8gTm8gZXJyb3JFbGVtZW50LCB0aHJvdyB0byB0aGUgbmVhcmVzdCByb3V0ZS1sZXZlbCBlcnJvciBib3VuZGFyeVxuICAgICAgdGhyb3cgcHJvbWlzZS5fZXJyb3I7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IEF3YWl0UmVuZGVyU3RhdHVzLmVycm9yKSB7XG4gICAgICAvLyBSZW5kZXIgdmlhIG91ciBlcnJvckVsZW1lbnRcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBd2FpdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHByb21pc2UsXG4gICAgICAgIGNoaWxkcmVuOiBlcnJvckVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSBBd2FpdFJlbmRlclN0YXR1cy5zdWNjZXNzKSB7XG4gICAgICAvLyBSZW5kZXIgY2hpbGRyZW4gd2l0aCByZXNvbHZlZCB2YWx1ZVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEF3YWl0Q29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogcHJvbWlzZSxcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUaHJvdyB0byB0aGUgc3VzcGVuc2UgYm91bmRhcnlcbiAgICB0aHJvdyBwcm9taXNlO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEluZGlyZWN0aW9uIHRvIGxldmVyYWdlIHVzZUFzeW5jVmFsdWUgZm9yIGEgcmVuZGVyLXByb3AgQVBJIG9uIDxBd2FpdD5cbiAqL1xuZnVuY3Rpb24gUmVzb2x2ZUF3YWl0KF9yZWY4KSB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW5cbiAgfSA9IF9yZWY4O1xuICBsZXQgZGF0YSA9IHVzZUFzeW5jVmFsdWUoKTtcbiAgbGV0IHRvUmVuZGVyID0gdHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIgPyBjaGlsZHJlbihkYXRhKSA6IGNoaWxkcmVuO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHRvUmVuZGVyKTtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gVVRJTFNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBDcmVhdGVzIGEgcm91dGUgY29uZmlnIGZyb20gYSBSZWFjdCBcImNoaWxkcmVuXCIgb2JqZWN0LCB3aGljaCBpcyB1c3VhbGx5XG4gKiBlaXRoZXIgYSBgPFJvdXRlPmAgZWxlbWVudCBvciBhbiBhcnJheSBvZiB0aGVtLiBVc2VkIGludGVybmFsbHkgYnlcbiAqIGA8Um91dGVzPmAgdG8gY3JlYXRlIGEgcm91dGUgY29uZmlnIGZyb20gaXRzIGNoaWxkcmVuLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vdXRpbHMvY3JlYXRlLXJvdXRlcy1mcm9tLWNoaWxkcmVuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJvdXRlc0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgcGFyZW50UGF0aCkge1xuICBpZiAocGFyZW50UGF0aCA9PT0gdm9pZCAwKSB7XG4gICAgcGFyZW50UGF0aCA9IFtdO1xuICB9XG4gIGxldCByb3V0ZXMgPSBbXTtcbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAvLyBJZ25vcmUgbm9uLWVsZW1lbnRzLiBUaGlzIGFsbG93cyBwZW9wbGUgdG8gbW9yZSBlYXNpbHkgaW5saW5lXG4gICAgICAvLyBjb25kaXRpb25hbHMgaW4gdGhlaXIgcm91dGUgY29uZmlnLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdHJlZVBhdGggPSBbLi4ucGFyZW50UGF0aCwgaW5kZXhdO1xuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFJlYWN0LkZyYWdtZW50KSB7XG4gICAgICAvLyBUcmFuc3BhcmVudGx5IHN1cHBvcnQgUmVhY3QuRnJhZ21lbnQgYW5kIGl0cyBjaGlsZHJlbi5cbiAgICAgIHJvdXRlcy5wdXNoLmFwcGx5KHJvdXRlcywgY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuKGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIHRyZWVQYXRoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICEoZWxlbWVudC50eXBlID09PSBSb3V0ZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcIltcIiArICh0eXBlb2YgZWxlbWVudC50eXBlID09PSBcInN0cmluZ1wiID8gZWxlbWVudC50eXBlIDogZWxlbWVudC50eXBlLm5hbWUpICsgXCJdIGlzIG5vdCBhIDxSb3V0ZT4gY29tcG9uZW50LiBBbGwgY29tcG9uZW50IGNoaWxkcmVuIG9mIDxSb3V0ZXM+IG11c3QgYmUgYSA8Um91dGU+IG9yIDxSZWFjdC5GcmFnbWVudD5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAhKCFlbGVtZW50LnByb3BzLmluZGV4IHx8ICFlbGVtZW50LnByb3BzLmNoaWxkcmVuKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIFwiQW4gaW5kZXggcm91dGUgY2Fubm90IGhhdmUgY2hpbGQgcm91dGVzLlwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGxldCByb3V0ZSA9IHtcbiAgICAgIGlkOiBlbGVtZW50LnByb3BzLmlkIHx8IHRyZWVQYXRoLmpvaW4oXCItXCIpLFxuICAgICAgY2FzZVNlbnNpdGl2ZTogZWxlbWVudC5wcm9wcy5jYXNlU2Vuc2l0aXZlLFxuICAgICAgZWxlbWVudDogZWxlbWVudC5wcm9wcy5lbGVtZW50LFxuICAgICAgQ29tcG9uZW50OiBlbGVtZW50LnByb3BzLkNvbXBvbmVudCxcbiAgICAgIGluZGV4OiBlbGVtZW50LnByb3BzLmluZGV4LFxuICAgICAgcGF0aDogZWxlbWVudC5wcm9wcy5wYXRoLFxuICAgICAgbG9hZGVyOiBlbGVtZW50LnByb3BzLmxvYWRlcixcbiAgICAgIGFjdGlvbjogZWxlbWVudC5wcm9wcy5hY3Rpb24sXG4gICAgICBlcnJvckVsZW1lbnQ6IGVsZW1lbnQucHJvcHMuZXJyb3JFbGVtZW50LFxuICAgICAgRXJyb3JCb3VuZGFyeTogZWxlbWVudC5wcm9wcy5FcnJvckJvdW5kYXJ5LFxuICAgICAgaGFzRXJyb3JCb3VuZGFyeTogZWxlbWVudC5wcm9wcy5FcnJvckJvdW5kYXJ5ICE9IG51bGwgfHwgZWxlbWVudC5wcm9wcy5lcnJvckVsZW1lbnQgIT0gbnVsbCxcbiAgICAgIHNob3VsZFJldmFsaWRhdGU6IGVsZW1lbnQucHJvcHMuc2hvdWxkUmV2YWxpZGF0ZSxcbiAgICAgIGhhbmRsZTogZWxlbWVudC5wcm9wcy5oYW5kbGUsXG4gICAgICBsYXp5OiBlbGVtZW50LnByb3BzLmxhenlcbiAgICB9O1xuICAgIGlmIChlbGVtZW50LnByb3BzLmNoaWxkcmVuKSB7XG4gICAgICByb3V0ZS5jaGlsZHJlbiA9IGNyZWF0ZVJvdXRlc0Zyb21DaGlsZHJlbihlbGVtZW50LnByb3BzLmNoaWxkcmVuLCB0cmVlUGF0aCk7XG4gICAgfVxuICAgIHJvdXRlcy5wdXNoKHJvdXRlKTtcbiAgfSk7XG4gIHJldHVybiByb3V0ZXM7XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgcmVzdWx0IG9mIGBtYXRjaFJvdXRlcygpYCBpbnRvIGEgUmVhY3QgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIHJldHVybiBfcmVuZGVyTWF0Y2hlcyhtYXRjaGVzKTtcbn1cblxuZnVuY3Rpb24gbWFwUm91dGVQcm9wZXJ0aWVzKHJvdXRlKSB7XG4gIGxldCB1cGRhdGVzID0ge1xuICAgIC8vIE5vdGU6IHRoaXMgY2hlY2sgYWxzbyBvY2N1cnMgaW4gY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuIHNvIHVwZGF0ZVxuICAgIC8vIHRoZXJlIGlmIHlvdSBjaGFuZ2UgdGhpcyAtLSBwbGVhc2UgYW5kIHRoYW5rIHlvdSFcbiAgICBoYXNFcnJvckJvdW5kYXJ5OiByb3V0ZS5FcnJvckJvdW5kYXJ5ICE9IG51bGwgfHwgcm91dGUuZXJyb3JFbGVtZW50ICE9IG51bGxcbiAgfTtcbiAgaWYgKHJvdXRlLkNvbXBvbmVudCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmIChyb3V0ZS5lbGVtZW50KSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKGZhbHNlLCBcIllvdSBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBgQ29tcG9uZW50YCBhbmQgYGVsZW1lbnRgIG9uIHlvdXIgcm91dGUgLSBcIiArIFwiYENvbXBvbmVudGAgd2lsbCBiZSB1c2VkLlwiKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih1cGRhdGVzLCB7XG4gICAgICBlbGVtZW50OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChyb3V0ZS5Db21wb25lbnQpLFxuICAgICAgQ29tcG9uZW50OiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfVxuICBpZiAocm91dGUuRXJyb3JCb3VuZGFyeSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmIChyb3V0ZS5lcnJvckVsZW1lbnQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX3dhcm5pbmcoZmFsc2UsIFwiWW91IHNob3VsZCBub3QgaW5jbHVkZSBib3RoIGBFcnJvckJvdW5kYXJ5YCBhbmQgYGVycm9yRWxlbWVudGAgb24geW91ciByb3V0ZSAtIFwiICsgXCJgRXJyb3JCb3VuZGFyeWAgd2lsbCBiZSB1c2VkLlwiKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih1cGRhdGVzLCB7XG4gICAgICBlcnJvckVsZW1lbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KHJvdXRlLkVycm9yQm91bmRhcnkpLFxuICAgICAgRXJyb3JCb3VuZGFyeTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZXM7XG59XG5mdW5jdGlvbiBjcmVhdGVNZW1vcnlSb3V0ZXIocm91dGVzLCBvcHRzKSB7XG4gIHJldHVybiBjcmVhdGVSb3V0ZXIoe1xuICAgIGJhc2VuYW1lOiBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLmJhc2VuYW1lLFxuICAgIGZ1dHVyZTogX2V4dGVuZHMoe30sIG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuZnV0dXJlLCB7XG4gICAgICB2N19wcmVwZW5kQmFzZW5hbWU6IHRydWVcbiAgICB9KSxcbiAgICBoaXN0b3J5OiBjcmVhdGVNZW1vcnlIaXN0b3J5KHtcbiAgICAgIGluaXRpYWxFbnRyaWVzOiBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLmluaXRpYWxFbnRyaWVzLFxuICAgICAgaW5pdGlhbEluZGV4OiBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLmluaXRpYWxJbmRleFxuICAgIH0pLFxuICAgIGh5ZHJhdGlvbkRhdGE6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuaHlkcmF0aW9uRGF0YSxcbiAgICByb3V0ZXMsXG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzXG4gIH0pLmluaXRpYWxpemUoKTtcbn1cblxuZXhwb3J0IHsgQXdhaXQsIE1lbW9yeVJvdXRlciwgTmF2aWdhdGUsIE91dGxldCwgUm91dGUsIFJvdXRlciwgUm91dGVyUHJvdmlkZXIsIFJvdXRlcywgRGF0YVJvdXRlckNvbnRleHQgYXMgVU5TQUZFX0RhdGFSb3V0ZXJDb250ZXh0LCBEYXRhUm91dGVyU3RhdGVDb250ZXh0IGFzIFVOU0FGRV9EYXRhUm91dGVyU3RhdGVDb250ZXh0LCBMb2NhdGlvbkNvbnRleHQgYXMgVU5TQUZFX0xvY2F0aW9uQ29udGV4dCwgTmF2aWdhdGlvbkNvbnRleHQgYXMgVU5TQUZFX05hdmlnYXRpb25Db250ZXh0LCBSb3V0ZUNvbnRleHQgYXMgVU5TQUZFX1JvdXRlQ29udGV4dCwgbWFwUm91dGVQcm9wZXJ0aWVzIGFzIFVOU0FGRV9tYXBSb3V0ZVByb3BlcnRpZXMsIHVzZVJvdXRlSWQgYXMgVU5TQUZFX3VzZVJvdXRlSWQsIHVzZVJvdXRlc0ltcGwgYXMgVU5TQUZFX3VzZVJvdXRlc0ltcGwsIGNyZWF0ZU1lbW9yeVJvdXRlciwgY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuLCBjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4gYXMgY3JlYXRlUm91dGVzRnJvbUVsZW1lbnRzLCByZW5kZXJNYXRjaGVzLCB1c2VCbG9ja2VyIGFzIHVuc3RhYmxlX3VzZUJsb2NrZXIsIHVzZUFjdGlvbkRhdGEsIHVzZUFzeW5jRXJyb3IsIHVzZUFzeW5jVmFsdWUsIHVzZUhyZWYsIHVzZUluUm91dGVyQ29udGV4dCwgdXNlTG9hZGVyRGF0YSwgdXNlTG9jYXRpb24sIHVzZU1hdGNoLCB1c2VNYXRjaGVzLCB1c2VOYXZpZ2F0ZSwgdXNlTmF2aWdhdGlvbiwgdXNlTmF2aWdhdGlvblR5cGUsIHVzZU91dGxldCwgdXNlT3V0bGV0Q29udGV4dCwgdXNlUGFyYW1zLCB1c2VSZXNvbHZlZFBhdGgsIHVzZVJldmFsaWRhdG9yLCB1c2VSb3V0ZUVycm9yLCB1c2VSb3V0ZUxvYWRlckRhdGEsIHVzZVJvdXRlcyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iXSwibmFtZXMiOlsiUmVhY3QiLCJVTlNBRkVfaW52YXJpYW50Iiwiam9pblBhdGhzIiwibWF0Y2hQYXRoIiwiVU5TQUZFX2dldFBhdGhDb250cmlidXRpbmdNYXRjaGVzIiwiVU5TQUZFX3dhcm5pbmciLCJyZXNvbHZlVG8iLCJwYXJzZVBhdGgiLCJtYXRjaFJvdXRlcyIsIkFjdGlvbiIsInN0cmlwQmFzZW5hbWUiLCJJRExFX0JMT0NLRVIiLCJpc1JvdXRlRXJyb3JSZXNwb25zZSIsImNyZWF0ZU1lbW9yeUhpc3RvcnkiLCJBYm9ydGVkRGVmZXJyZWRFcnJvciIsImNyZWF0ZVJvdXRlciIsIk5hdmlnYXRpb25UeXBlIiwiY3JlYXRlUGF0aCIsImRlZmVyIiwiZ2VuZXJhdGVQYXRoIiwianNvbiIsInJlZGlyZWN0IiwicmVkaXJlY3REb2N1bWVudCIsInJlc29sdmVQYXRoIiwiX2V4dGVuZHMiLCJPYmplY3QiLCJhc3NpZ24iLCJiaW5kIiwidGFyZ2V0IiwiaSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImFwcGx5IiwiRGF0YVJvdXRlckNvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwicHJvY2VzcyIsImRpc3BsYXlOYW1lIiwiRGF0YVJvdXRlclN0YXRlQ29udGV4dCIsIkF3YWl0Q29udGV4dCIsIk5hdmlnYXRpb25Db250ZXh0IiwiTG9jYXRpb25Db250ZXh0IiwiUm91dGVDb250ZXh0Iiwib3V0bGV0IiwibWF0Y2hlcyIsImlzRGF0YVJvdXRlIiwiUm91dGVFcnJvckNvbnRleHQiLCJ1c2VIcmVmIiwidG8iLCJfdGVtcCIsInJlbGF0aXZlIiwidXNlSW5Sb3V0ZXJDb250ZXh0IiwiYmFzZW5hbWUiLCJuYXZpZ2F0b3IiLCJ1c2VDb250ZXh0IiwiaGFzaCIsInBhdGhuYW1lIiwic2VhcmNoIiwidXNlUmVzb2x2ZWRQYXRoIiwiam9pbmVkUGF0aG5hbWUiLCJjcmVhdGVIcmVmIiwidXNlTG9jYXRpb24iLCJsb2NhdGlvbiIsInVzZU5hdmlnYXRpb25UeXBlIiwibmF2aWdhdGlvblR5cGUiLCJ1c2VNYXRjaCIsInBhdHRlcm4iLCJ1c2VNZW1vIiwibmF2aWdhdGVFZmZlY3RXYXJuaW5nIiwidXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCIsImNiIiwiaXNTdGF0aWMiLCJzdGF0aWMiLCJ1c2VMYXlvdXRFZmZlY3QiLCJ1c2VOYXZpZ2F0ZSIsInVzZU5hdmlnYXRlU3RhYmxlIiwidXNlTmF2aWdhdGVVbnN0YWJsZSIsImRhdGFSb3V0ZXJDb250ZXh0IiwibG9jYXRpb25QYXRobmFtZSIsInJvdXRlUGF0aG5hbWVzSnNvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJtYXAiLCJtYXRjaCIsInBhdGhuYW1lQmFzZSIsImFjdGl2ZVJlZiIsInVzZVJlZiIsImN1cnJlbnQiLCJuYXZpZ2F0ZSIsInVzZUNhbGxiYWNrIiwib3B0aW9ucyIsImdvIiwicGF0aCIsInBhcnNlIiwicmVwbGFjZSIsInB1c2giLCJzdGF0ZSIsIk91dGxldENvbnRleHQiLCJ1c2VPdXRsZXRDb250ZXh0IiwidXNlT3V0bGV0IiwiY29udGV4dCIsImNyZWF0ZUVsZW1lbnQiLCJQcm92aWRlciIsInZhbHVlIiwidXNlUGFyYW1zIiwicm91dGVNYXRjaCIsInBhcmFtcyIsIl90ZW1wMiIsInVzZVJvdXRlcyIsInJvdXRlcyIsImxvY2F0aW9uQXJnIiwidXNlUm91dGVzSW1wbCIsImRhdGFSb3V0ZXJTdGF0ZSIsInBhcmVudE1hdGNoZXMiLCJwYXJlbnRQYXJhbXMiLCJwYXJlbnRQYXRobmFtZSIsInBhcmVudFBhdGhuYW1lQmFzZSIsInBhcmVudFJvdXRlIiwicm91dGUiLCJwYXJlbnRQYXRoIiwid2FybmluZ09uY2UiLCJlbmRzV2l0aCIsImxvY2F0aW9uRnJvbUNvbnRleHQiLCJfcGFyc2VkTG9jYXRpb25BcmckcGEiLCJwYXJzZWRMb2NhdGlvbkFyZyIsInN0YXJ0c1dpdGgiLCJyZW1haW5pbmdQYXRobmFtZSIsInNsaWNlIiwiZWxlbWVudCIsInVuZGVmaW5lZCIsIkNvbXBvbmVudCIsInJlbmRlcmVkTWF0Y2hlcyIsIl9yZW5kZXJNYXRjaGVzIiwiZW5jb2RlTG9jYXRpb24iLCJQb3AiLCJEZWZhdWx0RXJyb3JDb21wb25lbnQiLCJlcnJvciIsInVzZVJvdXRlRXJyb3IiLCJtZXNzYWdlIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsIkVycm9yIiwic3RhY2siLCJsaWdodGdyZXkiLCJwcmVTdHlsZXMiLCJwYWRkaW5nIiwiYmFja2dyb3VuZENvbG9yIiwiY29kZVN0eWxlcyIsImRldkluZm8iLCJjb25zb2xlIiwiRnJhZ21lbnQiLCJzdHlsZSIsImZvbnRTdHlsZSIsImRlZmF1bHRFcnJvckVsZW1lbnQiLCJSZW5kZXJFcnJvckJvdW5kYXJ5IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsInJldmFsaWRhdGlvbiIsImdldERlcml2ZWRTdGF0ZUZyb21FcnJvciIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsImNvbXBvbmVudERpZENhdGNoIiwiZXJyb3JJbmZvIiwicmVuZGVyIiwicm91dGVDb250ZXh0IiwiY2hpbGRyZW4iLCJjb21wb25lbnQiLCJSZW5kZXJlZFJvdXRlIiwiX3JlZiIsInN0YXRpY0NvbnRleHQiLCJlcnJvckVsZW1lbnQiLCJFcnJvckJvdW5kYXJ5IiwiX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQiLCJpZCIsIl9kYXRhUm91dGVyU3RhdGUyIiwiX2RhdGFSb3V0ZXJTdGF0ZSIsImVycm9ycyIsImVycm9ySW5kZXgiLCJmaW5kSW5kZXgiLCJtIiwia2V5cyIsImpvaW4iLCJNYXRoIiwibWluIiwicmVkdWNlUmlnaHQiLCJpbmRleCIsImNvbmNhdCIsImdldENoaWxkcmVuIiwiRGF0YVJvdXRlckhvb2siLCJEYXRhUm91dGVyU3RhdGVIb29rIiwiZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvciIsImhvb2tOYW1lIiwidXNlRGF0YVJvdXRlckNvbnRleHQiLCJjdHgiLCJ1c2VEYXRhUm91dGVyU3RhdGUiLCJ1c2VSb3V0ZUNvbnRleHQiLCJ1c2VDdXJyZW50Um91dGVJZCIsInRoaXNSb3V0ZSIsInVzZVJvdXRlSWQiLCJVc2VSb3V0ZUlkIiwidXNlTmF2aWdhdGlvbiIsIlVzZU5hdmlnYXRpb24iLCJuYXZpZ2F0aW9uIiwidXNlUmV2YWxpZGF0b3IiLCJVc2VSZXZhbGlkYXRvciIsInJldmFsaWRhdGUiLCJyb3V0ZXIiLCJ1c2VNYXRjaGVzIiwibG9hZGVyRGF0YSIsIlVzZU1hdGNoZXMiLCJkYXRhIiwiaGFuZGxlIiwidXNlTG9hZGVyRGF0YSIsIlVzZUxvYWRlckRhdGEiLCJyb3V0ZUlkIiwidXNlUm91dGVMb2FkZXJEYXRhIiwiVXNlUm91dGVMb2FkZXJEYXRhIiwidXNlQWN0aW9uRGF0YSIsIlVzZUFjdGlvbkRhdGEiLCJ2YWx1ZXMiLCJhY3Rpb25EYXRhIiwiX3N0YXRlJGVycm9ycyIsIlVzZVJvdXRlRXJyb3IiLCJ1c2VBc3luY1ZhbHVlIiwiX2RhdGEiLCJ1c2VBc3luY0Vycm9yIiwiX2Vycm9yIiwiYmxvY2tlcklkIiwidXNlQmxvY2tlciIsInNob3VsZEJsb2NrIiwiVXNlQmxvY2tlciIsImJsb2NrZXJLZXkiLCJzZXRCbG9ja2VyS2V5IiwidXNlU3RhdGUiLCJibG9ja2VyRnVuY3Rpb24iLCJhcmciLCJjdXJyZW50TG9jYXRpb24iLCJuZXh0TG9jYXRpb24iLCJoaXN0b3J5QWN0aW9uIiwidXNlRWZmZWN0IiwiU3RyaW5nIiwiZGVsZXRlQmxvY2tlciIsImdldEJsb2NrZXIiLCJibG9ja2VycyIsImhhcyIsImdldCIsIlVzZU5hdmlnYXRlU3RhYmxlIiwiZnJvbVJvdXRlSWQiLCJhbHJlYWR5V2FybmVkIiwiY29uZCIsIlNUQVJUX1RSQU5TSVRJT04iLCJzdGFydFRyYW5zaXRpb25JbXBsIiwiUm91dGVyUHJvdmlkZXIiLCJmYWxsYmFja0VsZW1lbnQiLCJmdXR1cmUiLCJzZXRTdGF0ZUltcGwiLCJ2N19zdGFydFRyYW5zaXRpb24iLCJzZXRTdGF0ZSIsIm5ld1N0YXRlIiwic3Vic2NyaWJlIiwibiIsIm9wdHMiLCJwcmV2ZW50U2Nyb2xsUmVzZXQiLCJSb3V0ZXIiLCJpbml0aWFsaXplZCIsIkRhdGFSb3V0ZXMiLCJfcmVmMiIsIk1lbW9yeVJvdXRlciIsIl9yZWYzIiwiaW5pdGlhbEVudHJpZXMiLCJpbml0aWFsSW5kZXgiLCJoaXN0b3J5UmVmIiwidjVDb21wYXQiLCJoaXN0b3J5IiwiYWN0aW9uIiwibGlzdGVuIiwiTmF2aWdhdGUiLCJfcmVmNCIsImpzb25QYXRoIiwiT3V0bGV0IiwiUm91dGUiLCJfcHJvcHMiLCJfcmVmNSIsImJhc2VuYW1lUHJvcCIsImxvY2F0aW9uUHJvcCIsInN0YXRpY1Byb3AiLCJuYXZpZ2F0aW9uQ29udGV4dCIsImxvY2F0aW9uQ29udGV4dCIsInRyYWlsaW5nUGF0aG5hbWUiLCJSb3V0ZXMiLCJfcmVmNiIsImNyZWF0ZVJvdXRlc0Zyb21DaGlsZHJlbiIsIkF3YWl0IiwiX3JlZjciLCJyZXNvbHZlIiwiQXdhaXRFcnJvckJvdW5kYXJ5IiwiUmVzb2x2ZUF3YWl0IiwiQXdhaXRSZW5kZXJTdGF0dXMiLCJuZXZlclNldHRsZWRQcm9taXNlIiwiUHJvbWlzZSIsInByb21pc2UiLCJwZW5kaW5nIiwic3VjY2VzcyIsImRlZmluZVByb3BlcnR5IiwicmVuZGVyRXJyb3IiLCJyZWplY3QiLCJjYXRjaCIsIl90cmFja2VkIiwidGhlbiIsIl9yZWY4IiwidG9SZW5kZXIiLCJDaGlsZHJlbiIsImZvckVhY2giLCJpc1ZhbGlkRWxlbWVudCIsInRyZWVQYXRoIiwidHlwZSIsIm5hbWUiLCJjYXNlU2Vuc2l0aXZlIiwibG9hZGVyIiwiaGFzRXJyb3JCb3VuZGFyeSIsInNob3VsZFJldmFsaWRhdGUiLCJsYXp5IiwicmVuZGVyTWF0Y2hlcyIsIm1hcFJvdXRlUHJvcGVydGllcyIsInVwZGF0ZXMiLCJjcmVhdGVNZW1vcnlSb3V0ZXIiLCJ2N19wcmVwZW5kQmFzZW5hbWUiLCJoeWRyYXRpb25EYXRhIiwiaW5pdGlhbGl6ZSIsIlVOU0FGRV9EYXRhUm91dGVyQ29udGV4dCIsIlVOU0FGRV9EYXRhUm91dGVyU3RhdGVDb250ZXh0IiwiVU5TQUZFX0xvY2F0aW9uQ29udGV4dCIsIlVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCIsIlVOU0FGRV9Sb3V0ZUNvbnRleHQiLCJVTlNBRkVfbWFwUm91dGVQcm9wZXJ0aWVzIiwiVU5TQUZFX3VzZVJvdXRlSWQiLCJVTlNBRkVfdXNlUm91dGVzSW1wbCIsImNyZWF0ZVJvdXRlc0Zyb21FbGVtZW50cyIsInVuc3RhYmxlX3VzZUJsb2NrZXIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/react-router/dist/index.js\n");
/***/ })
};
;