{"version":3,"sources":["webpack:///./node_modules/gatsby/node_modules/core-js/internals/redefine.js","webpack:///./node_modules/gatsby-link/index.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/native-weak-map.js","webpack:///./node_modules/gatsby-react-router-scroll/session-storage.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/to-absolute-index.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/to-object.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/engine-user-agent.js","webpack:///./node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack:///./.cache/normalize-page-path.js","webpack:///./.cache/find-path.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/has.js","webpack:///./node_modules/gatsby-react-router-scroll/use-scroll-restoration.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/create-property-descriptor.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/require-object-coercible.js","webpack:///./node_modules/mitt/dist/mitt.es.js","webpack:///./.cache/emitter.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/object-property-is-enumerable.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/copy-constructor-properties.js","webpack:///./node_modules/gatsby-react-router-scroll/index.js","webpack:///./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/shared.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/indexed-object.js","webpack:///./.cache/react-lifecycles-compat.js","webpack:///./node_modules/@reach/router/es/lib/history.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/engine-v8-version.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/create-non-enumerable-property.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/document-create-element.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/engine-is-node.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/internal-state.js","webpack:///./node_modules/gatsby-react-router-scroll/scroll-handler.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/uid.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/enum-bug-keys.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/hidden-keys.js","webpack:///./.cache/page-renderer.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/descriptors.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/fails.js","webpack:///./node_modules/@reach/router/es/lib/utils.js","webpack:///./.cache/api-runner-browser-plugins.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/array-includes.js","webpack:///./node_modules/@mikaelkristiansson/domready/ready.js","webpack:///./.cache/register-service-worker.js","webpack:///./.cache/_this_is_virtual_fs_path_/$virtual/async-requires.js","webpack:///./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/to-primitive.js","webpack:///./node_modules/invariant/browser.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/object-keys-internal.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/array-method-is-strict.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/global.js","webpack:///./node_modules/gatsby/node_modules/core-js/modules/es.array.reduce.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/ie8-dom-define.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/own-keys.js","webpack:///./node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack:///./.cache/route-announcer-props.js","webpack:///./.cache/navigation.js","webpack:///./node_modules/shallow-compare/es/index.js","webpack:///./.cache/ensure-resources.js","webpack:///./.cache/production-app.js","webpack:///./node_modules/@babel/runtime/helpers/inheritsLoose.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/to-length.js","webpack:///./.cache/gatsby-browser-entry.js","webpack:///./node_modules/gatsby/dist/internal-plugins/bundle-optimisations/polyfills/object-assign.js","webpack:///./node_modules/@reach/router/es/index.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/is-forced.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/export.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/to-indexed-object.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/classof-raw.js","webpack:///./node_modules/@babel/runtime/helpers/typeof.js","webpack:///./.cache/strip-prefix.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/is-object.js","webpack:///./node_modules/gatsby-link/parse-path.js","webpack:///./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack:///./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack:///./.cache/prefetch.js","webpack:///./.cache/loader.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/to-integer.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/path.js","webpack:///./node_modules/gatsby-remark-autolink-headers/gatsby-browser.js","webpack:///./node_modules/gatsby-react-router-scroll/scroll-container.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/set-global.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/shared-store.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/object-get-own-property-symbols.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/get-built-in.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/object-define-property.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/inspect-source.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/is-pure.js","webpack:///./.cache/public-page-renderer.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/an-object.js","webpack:///./.cache/create-react-context.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/array-reduce.js","webpack:///./node_modules/@babel/runtime/helpers/extends.js","webpack:///./.cache/public-page-renderer-prod.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/shared-key.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/a-function.js","webpack:///./.cache/api-runner-browser.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/array-method-uses-to-length.js","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/gatsby/node_modules/core-js/internals/object-get-own-property-names.js"],"names":["global","createNonEnumerableProperty","has","setGlobal","inspectSource","InternalStateModule","getInternalState","get","enforceInternalState","enforce","TEMPLATE","String","split","module","exports","O","key","value","options","state","unsafe","simple","enumerable","noTargetGet","source","join","Function","prototype","this","_interopRequireDefault","__esModule","withPrefix","withAssetPrefix","path","getGlobalPathPrefix","navigateTo","replace","push","navigate","default","_objectWithoutPropertiesLoose2","_assertThisInitialized2","_inheritsLoose2","_extends2","_propTypes","_react","_router","_utils","_parsePath","parsePath","isAbsolutePath","startsWith","prefix","_ref","_prefix","getGlobalBasePrefix","isLocalLink","base","endsWith","slice","rewriteLinkPath","relativeTo","current","resolve","absolutify","NavLinkPropTypes","activeClassName","string","activeStyle","object","partiallyActive","bool","GatsbyLinkLocationWrapper","props","createElement","Location","_ref2","location","GatsbyLink","_location","_React$Component","_this","call","defaultGetProps","_ref3","isPartiallyCurrent","isCurrent","className","filter","Boolean","style","IOSupported","window","IntersectionObserver","handleRef","bind","_proto","_prefetch","currentPath","pathname","rewrittenPath","to","newPathName","___loader","enqueue","componentDidUpdate","prevProps","prevState","componentDidMount","componentWillUnmount","io","_this$io","instance","el","unobserve","disconnect","ref","cb","_this2","innerRef","hasOwnProperty","entries","forEach","entry","target","isIntersecting","intersectionRatio","observe","render","_this3","_this$props","_this$props$getProps","getProps","_onClick","onClick","_onMouseEnter","onMouseEnter","rest","prefixedTo","Link","e","hovering","button","defaultPrevented","metaKey","altKey","ctrlKey","shiftKey","preventDefault","shouldReplace","encodeURI","___navigate","href","Component","propTypes","func","isRequired","showDeprecationWarning","functionName","altFunctionName","version","console","warn","_default","forwardRef","___push","___replace","WeakMap","test","SessionStorage","read","stateKey","getStateKey","sessionStorage","getItem","JSON","parse","save","storedValue","stringify","setItem","stateKeyBase","toInteger","max","Math","min","index","length","integer","requireObjectCoercible","argument","Object","getBuiltIn","_typeof","_getRequireWildcardCache","cache","obj","newObj","hasPropertyDescriptor","defineProperty","getOwnPropertyDescriptor","desc","set","undefined","charAt","pathCache","Map","matchPaths","trimPathname","rawPathname","decodeURIComponent","stripPrefix","__BASE_PATH__","URL","setMatchPaths","findMatchPath","trimmedPathname","cleanPath","pickPaths","map","matchPath","originalPath","pick","normalizePagePath","route","grabMatchParams","params","findPath","foundPath","it","useScrollRestoration","identifier","useLocation","useContext","_scrollHandler","ScrollContext","useRef","useLayoutEffect","position","scrollTo","onScroll","scrollTop","bitmap","configurable","writable","TypeError","emitter","all","create","on","type","handler","off","splice","indexOf","emit","evt","mitt","nativePropertyIsEnumerable","propertyIsEnumerable","NASHORN_BUG","1","f","V","descriptor","ownKeys","getOwnPropertyDescriptorModule","definePropertyModule","keys","i","ScrollContainer","ScrollHandler","_scrollContainer","_useScrollRestoration","excluded","sourceKeys","IS_PURE","store","mode","copyright","fails","classof","polyfill","_extends","assign","arguments","getLocation","_source$location","search","hash","origin","protocol","host","hostname","port","canUseDOM","decodeURI","history","createHistory","listeners","transitioning","resolveTransition","_onTransitionComplete","listen","listener","popstateListener","action","addEventListener","removeEventListener","fn","_ref$replace","go","Date","now","replaceState","pushState","transition","Promise","res","createMemorySource","initialPath","searchIndex","initialLocation","substr","stack","states","name","_","uri","_uri$split","_uri$split$","_uri$split2","_uri$split2$","newIndex","document","globalHistory","match","userAgent","process","versions","v8","DESCRIPTORS","createPropertyDescriptor","isObject","EXISTS","NATIVE_WEAK_MAP","objectHas","shared","sharedKey","hiddenKeys","wmget","wmhas","wmset","metadata","facade","STATE","getterFor","TYPE","_interopRequireWildcard","React","_sessionStorage","createContext","displayName","_len","args","Array","_key","apply","concat","_stateStorage","scrollListener","scrollY","windowScroll","shouldUpdateScroll","scrollToHash","node","getElementById","substring","scrollIntoView","prevRouterProps","routerProps","scrollPosition","_this$props$location","_this$props$location2","Provider","children","element","id","postfix","random","toString","propertyIsEnumerableModule","toIndexedObject","toPrimitive","IE8_DOM_DEFINE","nativeGetOwnPropertyDescriptor","P","error","PageRenderer","pageResources","json","pageContext","__params","pathContext","pageElement","apiRunner","loader","publicLoader","component","page","result","pop","exec","routes","default_","uriPathname","uriSegments","segmentize","isRootUri","ranked","rankRoutes","l","missed","routeSegments","routeSegment","uriSegment","isSplat","dynamicMatch","paramRe","reservedNames","_to$split","toPathname","toQuery","basePathname","toSegments","baseSegments","addQuery","allSegments","segments","segment","insertParams","_path$split","pathBase","_path$split$","query","constructedPath","_params$location","_params$location$sear","searchSplit","validateRedirect","from","isDynamic","sort","rankRoute","score","reduce","isRootSegment","SEGMENT_POINTS","a","b","q","shallowCompare","obj1","obj2","obj1Keys","every","plugin","require","toLength","toAbsoluteIndex","createMethod","IS_INCLUDES","$this","fromIndex","includes","ie10","navigator","appVersion","fns","doc","hack","documentElement","doScroll","loaded","readyState","shift","setTimeout","definition","serviceWorker","register","then","reg","installingWorker","installing","log","controller","___swUpdated","___failedResources","reload","catch","components","self","ReferenceError","input","PREFERRED_STRING","val","valueOf","condition","format","c","d","Error","argIndex","framesToPop","names","METHOD_NAME","method","check","globalThis","$","$reduce","left","arrayMethodIsStrict","arrayMethodUsesToLength","CHROME_VERSION","IS_NODE","STRICT_METHOD","USES_TO_LENGTH","proto","forced","callbackfn","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","anObject","getOwnPropertySymbols","RouteAnnouncerProps","top","width","height","padding","overflow","clip","whiteSpace","border","redirectMap","redirects","redirect","fromPath","maybeRedirect","toPath","onPreRouteUpdate","prevLocation","onRouteUpdate","timeoutId","loadPage","status","PageResourceStatus","clearTimeout","webpackCompilationHash","___webpackCompilationHash","postMessage","gatsbyApi","reachNavigate","results","getSavedScrollPosition","RouteAnnouncer","announcementRef","createRef","nextProps","requestAnimationFrame","pageName","title","pageHeadings","querySelectorAll","textContent","newAnnouncement","innerText","compareLocationProps","nextLocation","RouteUpdates","shouldComponentUpdate","Fragment","shallowDiffers","_i","EnsureResources","loadPageSync","getDerivedStateFromProps","loadResources","rawPath","setState","nextState","ProdLoader","asyncRequires","setLoader","setApiRunner","___emitter","apiRunnerAsync","RouteHandler","baseuri","basepath","DataContext","GatsbyRoot","staticQueryResults","getStaticQueryResults","LocationHandler","Consumer","pagePath","browserLoc","SiteRoot","App","renderer","ReactDOM","hydrate","domReady","subClass","superClass","constructor","__proto__","StaticQueryContext","_objectWithoutProperties","_classCallCheck","Constructor","_possibleConstructorReturn","_inherits","setPrototypeOf","createNamedContext","defaultValue","Ctx","LocationContext","context","LocationProvider","_temp","getContext","refs","unlisten","_props$history","componentDidCatch","info","isRedirect","_navigate","unmounted","defaultProps","ServerLocation","url","BaseContext","Router","baseContext","locationContext","RouterImpl","_React$PureComponent","_props","_navigate2","primary","_props$component","domProps","Children","toArray","array","child","createRoute","clone","cloneElement","FocusWrapper","FocusHandler","wrapperProps","PureComponent","FocusContext","requestFocus","FocusHandlerImpl","initialRender","focusHandlerCount","_React$Component2","_temp2","_this4","_len2","_key2","shouldFocus","focus","myURIChanged","navigatedUpToMe","contains","activeElement","_this5","_props2","_props2$component","Comp","outline","tabIndex","n","k","C","_ref4","_ref5","_ref6","_props$getProps","anchorProps","encodedHref","event","shouldNavigate","_location$state","restState","RedirectRequest","o","redirectTo","RedirectImpl","_React$Component3","_props3","_props3$replace","noThrow","resolvedTo","_props4","Redirect","_ref7","Match","_ref8","_ref9","_ref10","resolvedPath","useNavigate","useParams","useMatch","stripSlashes","str","elementPath","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","toLowerCase","redefine","copyConstructorProperties","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","sham","IndexedObject","Symbol","iterator","hashIndex","_inheritsLoose","_arrayLikeToArray","arr","len","arr2","_toConsumableArray","isArray","iter","minLen","supportedPrefetchStrategy","fakeLink","relList","supports","err","support","reject","link","setAttribute","onload","onerror","getElementsByTagName","getElementsByName","parentNode","appendChild","req","XMLHttpRequest","open","send","preFetched","prefetch","Success","preferDefault","m","createPageDataUrl","s","__PATH_PREFIX__","doFetch","onreadystatechange","toPageResources","pageData","componentChunkName","staticQueryHashes","BaseLoader","loadComponent","inFlightNetworkRequests","pageDb","inFlightDb","staticQueryDb","pageDataDb","prefetchTriggered","Set","prefetchCompleted","memoizedGet","inFlightPromise","response","delete","prefetchDisabled","some","fetchPageDataJson","loadObj","retries","responseText","jsonPayload","payload","notFound","loadPageDataJson","loadAppData","allData","finalResult","componentChunkPromise","createdAt","staticQueryBatchPromise","staticQueryHash","staticQueryResultsMap","shouldPrefetch","connection","effectiveType","saveData","doesConnectionSupportPrefetch","add","realPath","doPrefetch","pageDataUrl","prefetchHelper","crossOrigin","as","getResourceURLsForPathname","createComponentUrls","isPageNotFound","appData","___chunkMapping","chunk","chunkName","componentUrls","_loader","getResourcesForPathname","getResourcesForPathnameSync","ceil","floor","isNaN","offsetY","getTargetOffset","pageYOffset","body","clientTop","computedStyles","getComputedStyle","scrollMarginTop","getPropertyValue","getBoundingClientRect","parseInt","onInitialClientRender","pluginOptions","offset","_reactDom","scrollKey","ScrollContainerImplementation","findDOMNode","aFunction","variable","namespace","nativeDefineProperty","Attributes","functionToString","toObject","IS_RIGHT","that","argumentsLength","memo","right","ProdPageRenderer","InternalPageRenderer","uid","plugins","api","defaultReturn","argTransform","previous","next","thrower","ACCESSORS","argument0","argument1","g","internalObjectKeys","getOwnPropertyNames"],"mappings":"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","file":"app-59faa9989d677dd59195.js","sourcesContent":["var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n  var unsafe = options ? !!options.unsafe : false;\n  var simple = options ? !!options.enumerable : false;\n  var noTargetGet = options ? !!options.noTargetGet : false;\n  var state;\n  if (typeof value == 'function') {\n    if (typeof key == 'string' && !has(value, 'name')) {\n      createNonEnumerableProperty(value, 'name', key);\n    }\n    state = enforceInternalState(value);\n    if (!state.source) {\n      state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n    }\n  }\n  if (O === global) {\n    if (simple) O[key] = value;\n    else setGlobal(key, value);\n    return;\n  } else if (!unsafe) {\n    delete O[key];\n  } else if (!noTargetGet && O[key]) {\n    simple = true;\n  }\n  if (simple) O[key] = value;\n  else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n  return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.withPrefix = withPrefix;\nexports.withAssetPrefix = withAssetPrefix;\nexports.navigateTo = exports.replace = exports.push = exports.navigate = exports.default = void 0;\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutPropertiesLoose\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _router = require(\"@reach/router\");\n\nvar _utils = require(\"@reach/router/lib/utils\");\n\nvar _parsePath = require(\"./parse-path\");\n\nexports.parsePath = _parsePath.parsePath;\n\nvar isAbsolutePath = function isAbsolutePath(path) {\n  return path === null || path === void 0 ? void 0 : path.startsWith(\"/\");\n};\n\nfunction withPrefix(path, prefix) {\n  var _ref, _prefix;\n\n  if (prefix === void 0) {\n    prefix = getGlobalBasePrefix();\n  }\n\n  if (!isLocalLink(path)) {\n    return path;\n  }\n\n  if (path.startsWith(\"./\") || path.startsWith(\"../\")) {\n    return path;\n  }\n\n  var base = (_ref = (_prefix = prefix) !== null && _prefix !== void 0 ? _prefix : getGlobalPathPrefix()) !== null && _ref !== void 0 ? _ref : \"/\";\n  return \"\" + ((base === null || base === void 0 ? void 0 : base.endsWith(\"/\")) ? base.slice(0, -1) : base) + (path.startsWith(\"/\") ? path : \"/\" + path);\n} // These global values are wrapped in typeof clauses to ensure the values exist.\n// This is especially problematic in unit testing of this component.\n\n\nvar getGlobalPathPrefix = function getGlobalPathPrefix() {\n  return process.env.NODE_ENV !== \"production\" ? typeof __PATH_PREFIX__ !== \"undefined\" ? __PATH_PREFIX__ : undefined : __PATH_PREFIX__;\n};\n\nvar getGlobalBasePrefix = function getGlobalBasePrefix() {\n  return process.env.NODE_ENV !== \"production\" ? typeof __BASE_PATH__ !== \"undefined\" ? __BASE_PATH__ : undefined : __BASE_PATH__;\n};\n\nvar isLocalLink = function isLocalLink(path) {\n  return path && !path.startsWith(\"http://\") && !path.startsWith(\"https://\") && !path.startsWith(\"//\");\n};\n\nfunction withAssetPrefix(path) {\n  return withPrefix(path, getGlobalPathPrefix());\n}\n\nfunction absolutify(path, current) {\n  // If it's already absolute, return as-is\n  if (isAbsolutePath(path)) {\n    return path;\n  }\n\n  return (0, _utils.resolve)(path, current);\n}\n\nvar rewriteLinkPath = function rewriteLinkPath(path, relativeTo) {\n  if (typeof path === \"number\") {\n    return path;\n  }\n\n  if (!isLocalLink(path)) {\n    return path;\n  }\n\n  return isAbsolutePath(path) ? withPrefix(path) : absolutify(path, relativeTo);\n};\n\nvar NavLinkPropTypes = {\n  activeClassName: _propTypes.default.string,\n  activeStyle: _propTypes.default.object,\n  partiallyActive: _propTypes.default.bool\n}; // Set up IntersectionObserver\n\nvar createIntersectionObserver = function createIntersectionObserver(el, cb) {\n  var io = new window.IntersectionObserver(function (entries) {\n    entries.forEach(function (entry) {\n      if (el === entry.target) {\n        // Check if element is within viewport, remove listener, destroy observer, and run link callback.\n        // MSEdge doesn't currently support isIntersecting, so also test for  an intersectionRatio > 0\n        if (entry.isIntersecting || entry.intersectionRatio > 0) {\n          io.unobserve(el);\n          io.disconnect();\n          cb();\n        }\n      }\n    });\n  }); // Add element to the observer\n\n  io.observe(el);\n  return {\n    instance: io,\n    el: el\n  };\n};\n\nfunction GatsbyLinkLocationWrapper(props) {\n  return /*#__PURE__*/_react.default.createElement(_router.Location, null, function (_ref2) {\n    var location = _ref2.location;\n    return /*#__PURE__*/_react.default.createElement(GatsbyLink, (0, _extends2.default)({}, props, {\n      _location: location\n    }));\n  });\n}\n\nvar GatsbyLink = /*#__PURE__*/function (_React$Component) {\n  (0, _inheritsLoose2.default)(GatsbyLink, _React$Component);\n\n  function GatsbyLink(props) {\n    var _this;\n\n    _this = _React$Component.call(this, props) || this; // Default to no support for IntersectionObserver\n\n    _this.defaultGetProps = function (_ref3) {\n      var isPartiallyCurrent = _ref3.isPartiallyCurrent,\n          isCurrent = _ref3.isCurrent;\n\n      if (_this.props.partiallyActive ? isPartiallyCurrent : isCurrent) {\n        return {\n          className: [_this.props.className, _this.props.activeClassName].filter(Boolean).join(\" \"),\n          style: (0, _extends2.default)({}, _this.props.style, _this.props.activeStyle)\n        };\n      }\n\n      return null;\n    };\n\n    var IOSupported = false;\n\n    if (typeof window !== \"undefined\" && window.IntersectionObserver) {\n      IOSupported = true;\n    }\n\n    _this.state = {\n      IOSupported: IOSupported\n    };\n    _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n    return _this;\n  }\n\n  var _proto = GatsbyLink.prototype;\n\n  _proto._prefetch = function _prefetch() {\n    var currentPath = window.location.pathname; // reach router should have the correct state\n\n    if (this.props._location && this.props._location.pathname) {\n      currentPath = this.props._location.pathname;\n    }\n\n    var rewrittenPath = rewriteLinkPath(this.props.to, currentPath);\n    var newPathName = (0, _parsePath.parsePath)(rewrittenPath).pathname; // Prefech is used to speed up next navigations. When you use it on the current navigation,\n    // there could be a race-condition where Chrome uses the stale data instead of waiting for the network to complete\n\n    if (currentPath !== newPathName) {\n      ___loader.enqueue(newPathName);\n    }\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    // Preserve non IO functionality if no support\n    if (this.props.to !== prevProps.to && !this.state.IOSupported) {\n      this._prefetch();\n    }\n  };\n\n  _proto.componentDidMount = function componentDidMount() {\n    // Preserve non IO functionality if no support\n    if (!this.state.IOSupported) {\n      this._prefetch();\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (!this.io) {\n      return;\n    }\n\n    var _this$io = this.io,\n        instance = _this$io.instance,\n        el = _this$io.el;\n    instance.unobserve(el);\n    instance.disconnect();\n  };\n\n  _proto.handleRef = function handleRef(ref) {\n    var _this2 = this;\n\n    if (this.props.innerRef && this.props.innerRef.hasOwnProperty(\"current\")) {\n      this.props.innerRef.current = ref;\n    } else if (this.props.innerRef) {\n      this.props.innerRef(ref);\n    }\n\n    if (this.state.IOSupported && ref) {\n      // If IO supported and element reference found, setup Observer functionality\n      this.io = createIntersectionObserver(ref, function () {\n        _this2._prefetch();\n      });\n    }\n  };\n\n  _proto.render = function render() {\n    var _this3 = this;\n\n    var _this$props = this.props,\n        to = _this$props.to,\n        _this$props$getProps = _this$props.getProps,\n        getProps = _this$props$getProps === void 0 ? this.defaultGetProps : _this$props$getProps,\n        _onClick = _this$props.onClick,\n        _onMouseEnter = _this$props.onMouseEnter,\n        $activeClassName = _this$props.activeClassName,\n        $activeStyle = _this$props.activeStyle,\n        $innerRef = _this$props.innerRef,\n        partiallyActive = _this$props.partiallyActive,\n        state = _this$props.state,\n        replace = _this$props.replace,\n        _location = _this$props._location,\n        rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props, [\"to\", \"getProps\", \"onClick\", \"onMouseEnter\", \"activeClassName\", \"activeStyle\", \"innerRef\", \"partiallyActive\", \"state\", \"replace\", \"_location\"]);\n\n    if (process.env.NODE_ENV !== \"production\" && !isLocalLink(to)) {\n      console.warn(\"External link \" + to + \" was detected in a Link component. Use the Link component only for internal links. See: https://gatsby.dev/internal-links\");\n    }\n\n    var prefixedTo = rewriteLinkPath(to, _location.pathname);\n\n    if (!isLocalLink(prefixedTo)) {\n      return /*#__PURE__*/_react.default.createElement(\"a\", (0, _extends2.default)({\n        href: prefixedTo\n      }, rest));\n    }\n\n    return /*#__PURE__*/_react.default.createElement(_router.Link, (0, _extends2.default)({\n      to: prefixedTo,\n      state: state,\n      getProps: getProps,\n      innerRef: this.handleRef,\n      onMouseEnter: function onMouseEnter(e) {\n        if (_onMouseEnter) {\n          _onMouseEnter(e);\n        }\n\n        ___loader.hovering((0, _parsePath.parsePath)(prefixedTo).pathname);\n      },\n      onClick: function onClick(e) {\n        if (_onClick) {\n          _onClick(e);\n        }\n\n        if (e.button === 0 && // ignore right clicks\n        !_this3.props.target && // let browser handle \"target=_blank\"\n        !e.defaultPrevented && // onClick prevented default\n        !e.metaKey && // ignore clicks with modifier keys...\n        !e.altKey && !e.ctrlKey && !e.shiftKey) {\n          e.preventDefault();\n          var shouldReplace = replace;\n\n          var isCurrent = encodeURI(prefixedTo) === _location.pathname;\n\n          if (typeof replace !== \"boolean\" && isCurrent) {\n            shouldReplace = true;\n          } // Make sure the necessary scripts and data are\n          // loaded before continuing.\n\n\n          window.___navigate(prefixedTo, {\n            state: state,\n            replace: shouldReplace\n          });\n        }\n\n        return true;\n      }\n    }, rest));\n  };\n\n  return GatsbyLink;\n}(_react.default.Component);\n\nGatsbyLink.propTypes = (0, _extends2.default)({}, NavLinkPropTypes, {\n  onClick: _propTypes.default.func,\n  to: _propTypes.default.string.isRequired,\n  replace: _propTypes.default.bool,\n  state: _propTypes.default.object\n});\n\nvar showDeprecationWarning = function showDeprecationWarning(functionName, altFunctionName, version) {\n  return console.warn(\"The \\\"\" + functionName + \"\\\" method is now deprecated and will be removed in Gatsby v\" + version + \". Please use \\\"\" + altFunctionName + \"\\\" instead.\");\n};\n\nvar _default = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n  return /*#__PURE__*/_react.default.createElement(GatsbyLinkLocationWrapper, (0, _extends2.default)({\n    innerRef: ref\n  }, props));\n});\n\nexports.default = _default;\n\nvar navigate = function navigate(to, options) {\n  window.___navigate(rewriteLinkPath(to, window.location.pathname), options);\n};\n\nexports.navigate = navigate;\n\nvar push = function push(to) {\n  showDeprecationWarning(\"push\", \"navigate\", 3);\n\n  window.___push(rewriteLinkPath(to, window.location.pathname));\n};\n\nexports.push = push;\n\nvar replace = function replace(to) {\n  showDeprecationWarning(\"replace\", \"navigate\", 3);\n\n  window.___replace(rewriteLinkPath(to, window.location.pathname));\n}; // TODO: Remove navigateTo for Gatsby v3\n\n\nexports.replace = replace;\n\nvar navigateTo = function navigateTo(to) {\n  showDeprecationWarning(\"navigateTo\", \"navigate\", 3);\n  return push(to);\n};\n\nexports.navigateTo = navigateTo;","var global = require('../internals/global');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n","\"use strict\";\n\nexports.__esModule = true;\nexports.SessionStorage = void 0;\nvar STATE_KEY_PREFIX = \"@@scroll|\";\nvar GATSBY_ROUTER_SCROLL_STATE = \"___GATSBY_REACT_ROUTER_SCROLL\";\n\nvar SessionStorage = /*#__PURE__*/function () {\n  function SessionStorage() {}\n\n  var _proto = SessionStorage.prototype;\n\n  _proto.read = function read(location, key) {\n    var stateKey = this.getStateKey(location, key);\n\n    try {\n      var value = window.sessionStorage.getItem(stateKey);\n      return value ? JSON.parse(value) : 0;\n    } catch (e) {\n      if (process.env.NODE_ENV !== \"production\") {\n        console.warn(\"[gatsby-react-router-scroll] Unable to access sessionStorage; sessionStorage is not available.\");\n      }\n\n      if (window && window[GATSBY_ROUTER_SCROLL_STATE] && window[GATSBY_ROUTER_SCROLL_STATE][stateKey]) {\n        return window[GATSBY_ROUTER_SCROLL_STATE][stateKey];\n      }\n\n      return 0;\n    }\n  };\n\n  _proto.save = function save(location, key, value) {\n    var stateKey = this.getStateKey(location, key);\n    var storedValue = JSON.stringify(value);\n\n    try {\n      window.sessionStorage.setItem(stateKey, storedValue);\n    } catch (e) {\n      if (window && window[GATSBY_ROUTER_SCROLL_STATE]) {\n        window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n      } else {\n        window[GATSBY_ROUTER_SCROLL_STATE] = {};\n        window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n      }\n\n      if (process.env.NODE_ENV !== \"production\") {\n        console.warn(\"[gatsby-react-router-scroll] Unable to save state in sessionStorage; sessionStorage is not available.\");\n      }\n    }\n  };\n\n  _proto.getStateKey = function getStateKey(location, key) {\n    var stateKeyBase = \"\" + STATE_KEY_PREFIX + location.pathname;\n    return key === null || typeof key === \"undefined\" ? stateKeyBase : stateKeyBase + \"|\" + key;\n  };\n\n  return SessionStorage;\n}();\n\nexports.SessionStorage = SessionStorage;","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n  var integer = toInteger(index);\n  return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n  return Object(requireObjectCoercible(argument));\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var _typeof = require(\"@babel/runtime/helpers/typeof\");\n\nfunction _getRequireWildcardCache() {\n  if (typeof WeakMap !== \"function\") return null;\n  var cache = new WeakMap();\n\n  _getRequireWildcardCache = function _getRequireWildcardCache() {\n    return cache;\n  };\n\n  return cache;\n}\n\nfunction _interopRequireWildcard(obj) {\n  if (obj && obj.__esModule) {\n    return obj;\n  }\n\n  if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") {\n    return {\n      \"default\": obj\n    };\n  }\n\n  var cache = _getRequireWildcardCache();\n\n  if (cache && cache.has(obj)) {\n    return cache.get(obj);\n  }\n\n  var newObj = {};\n  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n\n      if (desc && (desc.get || desc.set)) {\n        Object.defineProperty(newObj, key, desc);\n      } else {\n        newObj[key] = obj[key];\n      }\n    }\n  }\n\n  newObj[\"default\"] = obj;\n\n  if (cache) {\n    cache.set(obj, newObj);\n  }\n\n  return newObj;\n}\n\nmodule.exports = _interopRequireWildcard;","export default path => {\n  if (path === undefined) {\n    return path\n  }\n  if (path === `/`) {\n    return `/`\n  }\n  if (path.charAt(path.length - 1) === `/`) {\n    return path.slice(0, -1)\n  }\n  return path\n}\n","import { pick } from \"@reach/router/lib/utils\"\nimport stripPrefix from \"./strip-prefix\"\nimport normalizePagePath from \"./normalize-page-path\"\n\nconst pathCache = new Map()\nlet matchPaths = []\n\nconst trimPathname = rawPathname => {\n  const pathname = decodeURIComponent(rawPathname)\n  // Remove the pathPrefix from the pathname.\n  const trimmedPathname = stripPrefix(pathname, __BASE_PATH__)\n    // Remove any hashfragment\n    .split(`#`)[0]\n    // Remove search query\n    .split(`?`)[0]\n\n  return trimmedPathname\n}\n\nfunction absolutify(path) {\n  // If it's already absolute, return as-is\n  if (\n    path.startsWith(`/`) ||\n    path.startsWith(`https://`) ||\n    path.startsWith(`http://`)\n  ) {\n    return path\n  }\n  // Calculate path relative to current location, adding a trailing slash to\n  // match behavior of @reach/router\n  return new URL(\n    path,\n    window.location.href + (window.location.href.endsWith(`/`) ? `` : `/`)\n  ).pathname\n}\n\n/**\n * Set list of matchPaths\n *\n * @param {Array<{path: string, matchPath: string}>} value collection of matchPaths\n */\nexport const setMatchPaths = value => {\n  matchPaths = value\n}\n\n/**\n * Return a matchpath url\n * if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n * `/foo?bar=far` => `/page1`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string|null}\n */\nexport const findMatchPath = rawPathname => {\n  const trimmedPathname = cleanPath(rawPathname)\n\n  const pickPaths = matchPaths.map(({ path, matchPath }) => {\n    return {\n      path: matchPath,\n      originalPath: path,\n    }\n  })\n\n  const path = pick(pickPaths, trimmedPathname)\n\n  if (path) {\n    return normalizePagePath(path.route.originalPath)\n  }\n\n  return null\n}\n\n/**\n * Return a matchpath params from reach/router rules\n * if `match-paths.json` contains `{ \":bar/*foo\" }`, and the path is /baz/zaz/zoo\n * then it returns\n *  { bar: baz, foo: zaz/zoo }\n *\n * @param {string} rawPathname A raw pathname\n * @return {object}\n */\nexport const grabMatchParams = rawPathname => {\n  const trimmedPathname = cleanPath(rawPathname)\n\n  const pickPaths = matchPaths.map(({ path, matchPath }) => {\n    return {\n      path: matchPath,\n      originalPath: path,\n    }\n  })\n\n  const path = pick(pickPaths, trimmedPathname)\n\n  if (path) {\n    return path.params\n  }\n\n  return {}\n}\n\n// Given a raw URL path, returns the cleaned version of it (trim off\n// `#` and query params), or if it matches an entry in\n// `match-paths.json`, its matched path is returned\n//\n// E.g. `/foo?bar=far` => `/foo`\n//\n// Or if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n// `/foo?bar=far` => `/page1`\nexport const findPath = rawPathname => {\n  const trimmedPathname = trimPathname(absolutify(rawPathname))\n  if (pathCache.has(trimmedPathname)) {\n    return pathCache.get(trimmedPathname)\n  }\n\n  let foundPath = findMatchPath(trimmedPathname)\n\n  if (!foundPath) {\n    foundPath = cleanPath(rawPathname)\n  }\n\n  pathCache.set(trimmedPathname, foundPath)\n\n  return foundPath\n}\n\n/**\n * Clean a url and converts /index.html => /\n * E.g. `/foo?bar=far` => `/foo`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string}\n */\nexport const cleanPath = rawPathname => {\n  const trimmedPathname = trimPathname(absolutify(rawPathname))\n\n  let foundPath = trimmedPathname\n  if (foundPath === `/index.html`) {\n    foundPath = `/`\n  }\n\n  foundPath = normalizePagePath(foundPath)\n\n  return foundPath\n}\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = useScrollRestoration;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nvar _react = require(\"react\");\n\nvar _router = require(\"@reach/router\");\n\nfunction useScrollRestoration(identifier) {\n  var location = (0, _router.useLocation)();\n  var state = (0, _react.useContext)(_scrollHandler.ScrollContext);\n  var ref = (0, _react.useRef)();\n  (0, _react.useLayoutEffect)(function () {\n    if (ref.current) {\n      var position = state.read(location, identifier);\n      ref.current.scrollTo(0, position || 0);\n    }\n  }, []);\n  return {\n    ref: ref,\n    onScroll: function onScroll() {\n      if (ref.current) {\n        state.save(location, identifier, ref.current.scrollTop);\n      }\n    }\n  };\n}","module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n  return it;\n};\n","//      \n// An event handler can take an optional event argument\n// and should not return a value\n                                          \n                                                               \n\n// An array of all currently registered event handlers for a type\n                                            \n                                                            \n// A map of event types and their corresponding event handlers.\n                        \n                                 \n                                   \n  \n\n/** Mitt: Tiny (~200b) functional event emitter / pubsub.\n *  @name mitt\n *  @returns {Mitt}\n */\nfunction mitt(all                 ) {\n\tall = all || Object.create(null);\n\n\treturn {\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t *\n\t\t * @param  {String} type\tType of event to listen for, or `\"*\"` for all events\n\t\t * @param  {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton: function on(type        , handler              ) {\n\t\t\t(all[type] || (all[type] = [])).push(handler);\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t *\n\t\t * @param  {String} type\tType of event to unregister `handler` from, or `\"*\"`\n\t\t * @param  {Function} handler Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff: function off(type        , handler              ) {\n\t\t\tif (all[type]) {\n\t\t\t\tall[type].splice(all[type].indexOf(handler) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `\"*\"` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * @param {String} type  The event type to invoke\n\t\t * @param {Any} [evt]  Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit: function emit(type        , evt     ) {\n\t\t\t(all[type] || []).slice().map(function (handler) { handler(evt); });\n\t\t\t(all['*'] || []).slice().map(function (handler) { handler(type, evt); });\n\t\t}\n\t};\n}\n\nexport default mitt;\n//# sourceMappingURL=mitt.es.js.map\n","import mitt from \"mitt\"\n\nconst emitter = mitt()\nexport default emitter\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n  var descriptor = getOwnPropertyDescriptor(this, V);\n  return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n  var keys = ownKeys(source);\n  var defineProperty = definePropertyModule.f;\n  var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n  }\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = exports.ScrollContainer = exports.ScrollContext = void 0;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nexports.ScrollContext = _scrollHandler.ScrollHandler;\n\nvar _scrollContainer = require(\"./scroll-container\");\n\nexports.ScrollContainer = _scrollContainer.ScrollContainer;\n\nvar _useScrollRestoration = require(\"./use-scroll-restoration\");\n\nexports.useScrollRestoration = _useScrollRestoration.useScrollRestoration;","function _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose;","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: '3.8.2',\n  mode: IS_PURE ? 'pure' : 'global',\n  copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\n});\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n  // eslint-disable-next-line no-prototype-builtins\n  return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n  return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","exports.polyfill = Component => Component\n","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar getLocation = function getLocation(source) {\n  var _source$location = source.location,\n      search = _source$location.search,\n      hash = _source$location.hash,\n      href = _source$location.href,\n      origin = _source$location.origin,\n      protocol = _source$location.protocol,\n      host = _source$location.host,\n      hostname = _source$location.hostname,\n      port = _source$location.port;\n  var pathname = source.location.pathname;\n\n\n  if (!pathname && href && canUseDOM) {\n    var url = new URL(href);\n    pathname = url.pathname;\n  }\n\n  return {\n    pathname: encodeURI(decodeURI(pathname)),\n    search: search,\n    hash: hash,\n    href: href,\n    origin: origin,\n    protocol: protocol,\n    host: host,\n    hostname: hostname,\n    port: port,\n    state: source.history.state,\n    key: source.history.state && source.history.state.key || \"initial\"\n  };\n};\n\nvar createHistory = function createHistory(source, options) {\n  var listeners = [];\n  var location = getLocation(source);\n  var transitioning = false;\n  var resolveTransition = function resolveTransition() {};\n\n  return {\n    get location() {\n      return location;\n    },\n\n    get transitioning() {\n      return transitioning;\n    },\n\n    _onTransitionComplete: function _onTransitionComplete() {\n      transitioning = false;\n      resolveTransition();\n    },\n    listen: function listen(listener) {\n      listeners.push(listener);\n\n      var popstateListener = function popstateListener() {\n        location = getLocation(source);\n        listener({ location: location, action: \"POP\" });\n      };\n\n      source.addEventListener(\"popstate\", popstateListener);\n\n      return function () {\n        source.removeEventListener(\"popstate\", popstateListener);\n        listeners = listeners.filter(function (fn) {\n          return fn !== listener;\n        });\n      };\n    },\n    navigate: function navigate(to) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          state = _ref.state,\n          _ref$replace = _ref.replace,\n          replace = _ref$replace === undefined ? false : _ref$replace;\n\n      if (typeof to === \"number\") {\n        source.history.go(to);\n      } else {\n        state = _extends({}, state, { key: Date.now() + \"\" });\n        // try...catch iOS Safari limits to 100 pushState calls\n        try {\n          if (transitioning || replace) {\n            source.history.replaceState(state, null, to);\n          } else {\n            source.history.pushState(state, null, to);\n          }\n        } catch (e) {\n          source.location[replace ? \"replace\" : \"assign\"](to);\n        }\n      }\n\n      location = getLocation(source);\n      transitioning = true;\n      var transition = new Promise(function (res) {\n        return resolveTransition = res;\n      });\n      listeners.forEach(function (listener) {\n        return listener({ location: location, action: \"PUSH\" });\n      });\n      return transition;\n    }\n  };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\nvar createMemorySource = function createMemorySource() {\n  var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n\n  var searchIndex = initialPath.indexOf(\"?\");\n  var initialLocation = {\n    pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n    search: searchIndex > -1 ? initialPath.substr(searchIndex) : \"\"\n  };\n  var index = 0;\n  var stack = [initialLocation];\n  var states = [null];\n\n  return {\n    get location() {\n      return stack[index];\n    },\n    addEventListener: function addEventListener(name, fn) {},\n    removeEventListener: function removeEventListener(name, fn) {},\n\n    history: {\n      get entries() {\n        return stack;\n      },\n      get index() {\n        return index;\n      },\n      get state() {\n        return states[index];\n      },\n      pushState: function pushState(state, _, uri) {\n        var _uri$split = uri.split(\"?\"),\n            pathname = _uri$split[0],\n            _uri$split$ = _uri$split[1],\n            search = _uri$split$ === undefined ? \"\" : _uri$split$;\n\n        index++;\n        stack.push({ pathname: pathname, search: search.length ? \"?\" + search : search });\n        states.push(state);\n      },\n      replaceState: function replaceState(state, _, uri) {\n        var _uri$split2 = uri.split(\"?\"),\n            pathname = _uri$split2[0],\n            _uri$split2$ = _uri$split2[1],\n            search = _uri$split2$ === undefined ? \"\" : _uri$split2$;\n\n        stack[index] = { pathname: pathname, search: search };\n        states[index] = state;\n      },\n      go: function go(to) {\n        var newIndex = index + to;\n\n        if (newIndex < 0 || newIndex > states.length - 1) {\n          return;\n        }\n\n        index = newIndex;\n      }\n    }\n  };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\nvar getSource = function getSource() {\n  return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate;\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport { globalHistory, navigate, createHistory, createMemorySource };","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n  match = v8.split('.');\n  version = match[0] + match[1];\n} else if (userAgent) {\n  match = userAgent.match(/Edge\\/(\\d+)/);\n  if (!match || match[1] >= 74) {\n    match = userAgent.match(/Chrome\\/(\\d+)/);\n    if (match) version = match[1];\n  }\n}\n\nmodule.exports = version && +version;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n  return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n  return EXISTS ? document.createElement(it) : {};\n};\n","var classof = require('../internals/classof-raw');\nvar global = require('../internals/global');\n\nmodule.exports = classof(global.process) == 'process';\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n  return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n  return function (it) {\n    var state;\n    if (!isObject(it) || (state = get(it)).type !== TYPE) {\n      throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n    } return state;\n  };\n};\n\nif (NATIVE_WEAK_MAP) {\n  var store = shared.state || (shared.state = new WeakMap());\n  var wmget = store.get;\n  var wmhas = store.has;\n  var wmset = store.set;\n  set = function (it, metadata) {\n    metadata.facade = it;\n    wmset.call(store, it, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return wmget.call(store, it) || {};\n  };\n  has = function (it) {\n    return wmhas.call(store, it);\n  };\n} else {\n  var STATE = sharedKey('state');\n  hiddenKeys[STATE] = true;\n  set = function (it, metadata) {\n    metadata.facade = it;\n    createNonEnumerableProperty(it, STATE, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return objectHas(it, STATE) ? it[STATE] : {};\n  };\n  has = function (it) {\n    return objectHas(it, STATE);\n  };\n}\n\nmodule.exports = {\n  set: set,\n  get: get,\n  has: has,\n  enforce: enforce,\n  getterFor: getterFor\n};\n","\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.ScrollHandler = exports.ScrollContext = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _sessionStorage = require(\"./session-storage\");\n\nvar ScrollContext = /*#__PURE__*/React.createContext(new _sessionStorage.SessionStorage());\nexports.ScrollContext = ScrollContext;\nScrollContext.displayName = \"GatsbyScrollContext\";\n\nvar ScrollHandler = /*#__PURE__*/function (_React$Component) {\n  (0, _inheritsLoose2.default)(ScrollHandler, _React$Component);\n\n  function ScrollHandler() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this._stateStorage = new _sessionStorage.SessionStorage();\n\n    _this.scrollListener = function () {\n      var key = _this.props.location.key;\n\n      if (key) {\n        _this._stateStorage.save(_this.props.location, key, window.scrollY);\n      }\n    };\n\n    _this.windowScroll = function (position, prevProps) {\n      if (_this.shouldUpdateScroll(prevProps, _this.props)) {\n        window.scrollTo(0, position);\n      }\n    };\n\n    _this.scrollToHash = function (hash, prevProps) {\n      var node = document.getElementById(hash.substring(1));\n\n      if (node && _this.shouldUpdateScroll(prevProps, _this.props)) {\n        node.scrollIntoView();\n      }\n    };\n\n    _this.shouldUpdateScroll = function (prevRouterProps, routerProps) {\n      var shouldUpdateScroll = _this.props.shouldUpdateScroll;\n\n      if (!shouldUpdateScroll) {\n        return true;\n      } // Hack to allow accessing this._stateStorage.\n\n\n      return shouldUpdateScroll.call((0, _assertThisInitialized2.default)(_this), prevRouterProps, routerProps);\n    };\n\n    return _this;\n  }\n\n  var _proto = ScrollHandler.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    window.addEventListener(\"scroll\", this.scrollListener);\n    var scrollPosition;\n    var _this$props$location = this.props.location,\n        key = _this$props$location.key,\n        hash = _this$props$location.hash;\n\n    if (key) {\n      scrollPosition = this._stateStorage.read(this.props.location, key);\n    }\n\n    if (scrollPosition) {\n      this.windowScroll(scrollPosition, undefined);\n    } else if (hash) {\n      this.scrollToHash(decodeURI(hash), undefined);\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    window.removeEventListener(\"scroll\", this.scrollListener);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var _this$props$location2 = this.props.location,\n        hash = _this$props$location2.hash,\n        key = _this$props$location2.key;\n    var scrollPosition;\n\n    if (key) {\n      scrollPosition = this._stateStorage.read(this.props.location, key);\n    }\n    /**  There are two pieces of state: the browser url and\n     * history state which keeps track of scroll position\n     * Native behaviour prescribes that we ought to restore scroll position\n     * when a user navigates back in their browser (this is the `POP` action)\n     * Currently, reach router has a bug that prevents this at https://github.com/reach/router/issues/228\n     * So we _always_ stick to the url as a source of truth — if the url\n     * contains a hash, we scroll to it\n     */\n\n\n    if (hash) {\n      this.scrollToHash(decodeURI(hash), prevProps);\n    } else {\n      this.windowScroll(scrollPosition, prevProps);\n    }\n  };\n\n  _proto.render = function render() {\n    return /*#__PURE__*/React.createElement(ScrollContext.Provider, {\n      value: this._stateStorage\n    }, this.props.children);\n  };\n\n  return ScrollHandler;\n}(React.Component);\n\nexports.ScrollHandler = ScrollHandler;\nScrollHandler.propTypes = {\n  shouldUpdateScroll: _propTypes.default.func,\n  children: _propTypes.default.element.isRequired,\n  location: _propTypes.default.object.isRequired\n};","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n  return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n  'constructor',\n  'hasOwnProperty',\n  'isPrototypeOf',\n  'propertyIsEnumerable',\n  'toLocaleString',\n  'toString',\n  'valueOf'\n];\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n  O = toIndexedObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return nativeGetOwnPropertyDescriptor(O, P);\n  } catch (error) { /* empty */ }\n  if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","module.exports = {};\n","import React, { createElement } from \"react\"\nimport PropTypes from \"prop-types\"\nimport { publicLoader } from \"./loader\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport { grabMatchParams } from \"./find-path\"\n\n// Renders page\nclass PageRenderer extends React.Component {\n  render() {\n    const props = {\n      ...this.props,\n      params: {\n        ...grabMatchParams(this.props.location.pathname),\n        ...this.props.pageResources.json.pageContext.__params,\n      },\n      pathContext: this.props.pageContext,\n    }\n\n    const [replacementElement] = apiRunner(`replaceComponentRenderer`, {\n      props: this.props,\n      loader: publicLoader,\n    })\n\n    const pageElement =\n      replacementElement ||\n      createElement(this.props.pageResources.component, {\n        ...props,\n        key: this.props.path || this.props.pageResources.page.path,\n      })\n\n    const wrappedPage = apiRunner(\n      `wrapPageElement`,\n      { element: pageElement, props },\n      pageElement,\n      ({ result }) => {\n        return { element: result, props }\n      }\n    ).pop()\n\n    return wrappedPage\n  }\n}\n\nPageRenderer.propTypes = {\n  location: PropTypes.object.isRequired,\n  pageResources: PropTypes.object.isRequired,\n  data: PropTypes.object,\n  pageContext: PropTypes.object.isRequired,\n}\n\nexport default PageRenderer\n","var fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n  return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (error) {\n    return true;\n  }\n};\n","import invariant from \"invariant\";\n\n////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\nvar startsWith = function startsWith(string, search) {\n  return string.substr(0, search.length) === search;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n//     static > dynamic > splat > root\n//\n// This way we don't have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n//     { path, default, value }\n//\n// And a returned match looks like:\n//\n//     { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\nvar pick = function pick(routes, uri) {\n  var match = void 0;\n  var default_ = void 0;\n\n  var _uri$split = uri.split(\"?\"),\n      uriPathname = _uri$split[0];\n\n  var uriSegments = segmentize(uriPathname);\n  var isRootUri = uriSegments[0] === \"\";\n  var ranked = rankRoutes(routes);\n\n  for (var i = 0, l = ranked.length; i < l; i++) {\n    var missed = false;\n    var route = ranked[i].route;\n\n    if (route.default) {\n      default_ = {\n        route: route,\n        params: {},\n        uri: uri\n      };\n      continue;\n    }\n\n    var routeSegments = segmentize(route.path);\n    var params = {};\n    var max = Math.max(uriSegments.length, routeSegments.length);\n    var index = 0;\n\n    for (; index < max; index++) {\n      var routeSegment = routeSegments[index];\n      var uriSegment = uriSegments[index];\n\n      if (isSplat(routeSegment)) {\n        // Hit a splat, just grab the rest, and return a match\n        // uri:   /files/documents/work\n        // route: /files/*\n        var param = routeSegment.slice(1) || \"*\";\n        params[param] = uriSegments.slice(index).map(decodeURIComponent).join(\"/\");\n        break;\n      }\n\n      if (uriSegment === undefined) {\n        // URI is shorter than the route, no match\n        // uri:   /users\n        // route: /users/:userId\n        missed = true;\n        break;\n      }\n\n      var dynamicMatch = paramRe.exec(routeSegment);\n\n      if (dynamicMatch && !isRootUri) {\n        var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n        !matchIsNotReserved ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Router> dynamic segment \\\"\" + dynamicMatch[1] + \"\\\" is a reserved name. Please use a different name in path \\\"\" + route.path + \"\\\".\") : invariant(false) : void 0;\n        var value = decodeURIComponent(uriSegment);\n        params[dynamicMatch[1]] = value;\n      } else if (routeSegment !== uriSegment) {\n        // Current segments don't match, not dynamic, not splat, so no match\n        // uri:   /users/123/settings\n        // route: /users/:id/profile\n        missed = true;\n        break;\n      }\n    }\n\n    if (!missed) {\n      match = {\n        route: route,\n        params: params,\n        uri: \"/\" + uriSegments.slice(0, index).join(\"/\")\n      };\n      break;\n    }\n  }\n\n  return match || default_ || null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\nvar match = function match(path, uri) {\n  return pick([{ path: path }], uri);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files.  Relative URIs\n// in the browser can feel awkward because not only can you be \"in a directory\"\n// you can be \"at a file\", too. For example\n//\n//     browserSpecResolve('foo', '/bar/') => /bar/foo\n//     browserSpecResolve('foo', '/bar') => /foo\n//\n// But on the command line of a file system, it's not as complicated, you can't\n// `cd` from a file, only directories.  This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n//     <Link to=\"deeper\"/>\n//     // instead of\n//     <Link to=`{${props.uri}/deeper}`/>\n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n//     cd deeper\n//     # not\n//     cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\nvar resolve = function resolve(to, base) {\n  // /foo/bar, /baz/qux => /foo/bar\n  if (startsWith(to, \"/\")) {\n    return to;\n  }\n\n  var _to$split = to.split(\"?\"),\n      toPathname = _to$split[0],\n      toQuery = _to$split[1];\n\n  var _base$split = base.split(\"?\"),\n      basePathname = _base$split[0];\n\n  var toSegments = segmentize(toPathname);\n  var baseSegments = segmentize(basePathname);\n\n  // ?a=b, /users?b=c => /users?a=b\n  if (toSegments[0] === \"\") {\n    return addQuery(basePathname, toQuery);\n  }\n\n  // profile, /users/789 => /users/789/profile\n  if (!startsWith(toSegments[0], \".\")) {\n    var pathname = baseSegments.concat(toSegments).join(\"/\");\n    return addQuery((basePathname === \"/\" ? \"\" : \"/\") + pathname, toQuery);\n  }\n\n  // ./         /users/123  =>  /users/123\n  // ../        /users/123  =>  /users\n  // ../..      /users/123  =>  /\n  // ../../one  /a/b/c/d    =>  /a/b/one\n  // .././one   /a/b/c/d    =>  /a/b/c/one\n  var allSegments = baseSegments.concat(toSegments);\n  var segments = [];\n  for (var i = 0, l = allSegments.length; i < l; i++) {\n    var segment = allSegments[i];\n    if (segment === \"..\") segments.pop();else if (segment !== \".\") segments.push(segment);\n  }\n\n  return addQuery(\"/\" + segments.join(\"/\"), toQuery);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\nvar insertParams = function insertParams(path, params) {\n  var _path$split = path.split(\"?\"),\n      pathBase = _path$split[0],\n      _path$split$ = _path$split[1],\n      query = _path$split$ === undefined ? \"\" : _path$split$;\n\n  var segments = segmentize(pathBase);\n  var constructedPath = \"/\" + segments.map(function (segment) {\n    var match = paramRe.exec(segment);\n    return match ? params[match[1]] : segment;\n  }).join(\"/\");\n  var _params$location = params.location;\n  _params$location = _params$location === undefined ? {} : _params$location;\n  var _params$location$sear = _params$location.search,\n      search = _params$location$sear === undefined ? \"\" : _params$location$sear;\n\n  var searchSplit = search.split(\"?\")[1] || \"\";\n  constructedPath = addQuery(constructedPath, query, searchSplit);\n  return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n  var filter = function filter(segment) {\n    return isDynamic(segment);\n  };\n  var fromString = segmentize(from).filter(filter).sort().join(\"/\");\n  var toString = segmentize(to).filter(filter).sort().join(\"/\");\n  return fromString === toString;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar paramRe = /^:(.+)/;\n\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n  return segment === \"\";\n};\nvar isDynamic = function isDynamic(segment) {\n  return paramRe.test(segment);\n};\nvar isSplat = function isSplat(segment) {\n  return segment && segment[0] === \"*\";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n  var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n    score += SEGMENT_POINTS;\n    if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n    return score;\n  }, 0);\n  return { route: route, score: score, index: index };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n  return routes.map(rankRoute).sort(function (a, b) {\n    return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n  });\n};\n\nvar segmentize = function segmentize(uri) {\n  return uri\n  // strip starting/ending slashes\n  .replace(/(^\\/+|\\/+$)/g, \"\").split(\"/\");\n};\n\nvar addQuery = function addQuery(pathname) {\n  for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    query[_key - 1] = arguments[_key];\n  }\n\n  query = query.filter(function (q) {\n    return q && q.length > 0;\n  });\n  return pathname + (query && query.length > 0 ? \"?\" + query.join(\"&\") : \"\");\n};\n\nvar reservedNames = [\"uri\", \"path\"];\n\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n  var obj1Keys = Object.keys(obj1);\n  return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n    return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n  });\n};\n\n////////////////////////////////////////////////////////////////////////////////\nexport { startsWith, pick, match, resolve, insertParams, validateRedirect, shallowCompare };","module.exports = [{\n      plugin: require('../node_modules/gatsby-remark-autolink-headers/gatsby-browser.js'),\n      options: {\"plugins\":[],\"offsetY\":0,\"className\":\"anchor\"},\n    }]\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIndexedObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) {\n      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\nmodule.exports = {\n  // `Array.prototype.includes` method\n  // https://tc39.es/ecma262/#sec-array.prototype.includes\n  includes: createMethod(true),\n  // `Array.prototype.indexOf` method\n  // https://tc39.es/ecma262/#sec-array.prototype.indexof\n  indexOf: createMethod(false)\n};\n","/*!\n * domready (c) Dustin Diaz 2014 - License MIT\n * ie10 fix - Mikael Kristiansson 2019\n */\n!(function(name, definition) {\n  if (typeof module != \"undefined\") module.exports = definition();\n  else if (typeof define == \"function\" && typeof define.amd == \"object\")\n    define(definition);\n  else this[name] = definition();\n})(\"domready\", function() {\n  var ie10 = false;\n  if (navigator.appVersion.indexOf(\"MSIE 10\") !== -1) {\n    ie10 = true;\n  }\n\n  var fns = [],\n    listener,\n    doc = typeof document === \"object\" && document,\n    hack = ie10\n      ? doc.documentElement.doScroll(\"left\")\n      : doc.documentElement.doScroll,\n    domContentLoaded = \"DOMContentLoaded\",\n    loaded =\n      doc && (hack ? /^loaded|^c/ : /^loaded|^i|^c/).test(doc.readyState);\n\n  if (!loaded && doc)\n    doc.addEventListener(\n      domContentLoaded,\n      (listener = function() {\n        doc.removeEventListener(domContentLoaded, listener);\n        loaded = 1;\n        while ((listener = fns.shift())) listener();\n      })\n    );\n\n  return function(fn) {\n    loaded ? setTimeout(fn, 0) : fns.push(fn);\n  };\n});\n","import { apiRunner } from \"./api-runner-browser\"\n\nif (\n  window.location.protocol !== `https:` &&\n  window.location.hostname !== `localhost`\n) {\n  console.error(\n    `Service workers can only be used over HTTPS, or on localhost for development`\n  )\n} else if (`serviceWorker` in navigator) {\n  navigator.serviceWorker\n    .register(`${__BASE_PATH__}/sw.js`)\n    .then(function (reg) {\n      reg.addEventListener(`updatefound`, () => {\n        apiRunner(`onServiceWorkerUpdateFound`, { serviceWorker: reg })\n        // The updatefound event implies that reg.installing is set; see\n        // https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event\n        const installingWorker = reg.installing\n        console.log(`installingWorker`, installingWorker)\n        installingWorker.addEventListener(`statechange`, () => {\n          switch (installingWorker.state) {\n            case `installed`:\n              if (navigator.serviceWorker.controller) {\n                // At this point, the old content will have been purged and the fresh content will\n                // have been added to the cache.\n\n                // We set a flag so Gatsby Link knows to refresh the page on next navigation attempt\n                window.___swUpdated = true\n                // We call the onServiceWorkerUpdateReady API so users can show update prompts.\n                apiRunner(`onServiceWorkerUpdateReady`, { serviceWorker: reg })\n\n                // If resources failed for the current page, reload.\n                if (window.___failedResources) {\n                  console.log(`resources failed, SW updated - reloading`)\n                  window.location.reload()\n                }\n              } else {\n                // At this point, everything has been precached.\n                // It's the perfect time to display a \"Content is cached for offline use.\" message.\n                console.log(`Content is now available offline!`)\n\n                // Post to service worker that install is complete.\n                // Delay to allow time for the event listener to be added --\n                // otherwise fetch is called too soon and resources aren't cached.\n                apiRunner(`onServiceWorkerInstalled`, { serviceWorker: reg })\n              }\n              break\n\n            case `redundant`:\n              console.error(`The installing service worker became redundant.`)\n              apiRunner(`onServiceWorkerRedundant`, { serviceWorker: reg })\n              break\n\n            case `activated`:\n              apiRunner(`onServiceWorkerActive`, { serviceWorker: reg })\n              break\n          }\n        })\n      })\n    })\n    .catch(function (e) {\n      console.error(`Error during service worker registration:`, e)\n    })\n}\n","// prefer default export if available\nconst preferDefault = m => (m && m.default) || m\n\nexports.components = {\n  \"component---src-pages-quickstarts-index-jsx\": () => import(\"./../../../src/pages/quickstarts/index.jsx\" /* webpackChunkName: \"component---src-pages-quickstarts-index-jsx\" */),\n  \"component---src-templates-doc-jsx\": () => import(\"./../../../src/templates/doc.jsx\" /* webpackChunkName: \"component---src-templates-doc-jsx\" */),\n  \"component---src-templates-main-jsx\": () => import(\"./../../../src/templates/main.jsx\" /* webpackChunkName: \"component---src-templates-main-jsx\" */)\n}\n\n","function _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nmodule.exports = _assertThisInitialized;","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (input, PREFERRED_STRING) {\n  if (!isObject(input)) return input;\n  var fn, val;\n  if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n  if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n  if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nmodule.exports = invariant;\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n  var O = toIndexedObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~indexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n  var method = [][METHOD_NAME];\n  return !!method && fails(function () {\n    // eslint-disable-next-line no-useless-call,no-throw-literal\n    method.call(null, argument || function () { throw 1; }, 1);\n  });\n};\n","var check = function (it) {\n  return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n  // eslint-disable-next-line no-undef\n  check(typeof globalThis == 'object' && globalThis) ||\n  check(typeof window == 'object' && window) ||\n  check(typeof self == 'object' && self) ||\n  check(typeof global == 'object' && global) ||\n  // eslint-disable-next-line no-new-func\n  (function () { return this; })() || Function('return this')();\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {\n  reduce: function reduce(callbackfn /* , initialValue */) {\n    return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n  return Object.defineProperty(createElement('div'), 'a', {\n    get: function () { return 7; }\n  }).a != 7;\n});\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n  var keys = getOwnPropertyNamesModule.f(anObject(it));\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","function _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault;","// This is extracted to separate module because it's shared\n// between browser and SSR code\nexport const RouteAnnouncerProps = {\n  id: `gatsby-announcer`,\n  style: {\n    position: `absolute`,\n    top: 0,\n    width: 1,\n    height: 1,\n    padding: 0,\n    overflow: `hidden`,\n    clip: `rect(0, 0, 0, 0)`,\n    whiteSpace: `nowrap`,\n    border: 0,\n  },\n  \"aria-live\": `assertive`,\n  \"aria-atomic\": `true`,\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport redirects from \"./redirects.json\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport emitter from \"./emitter\"\nimport { RouteAnnouncerProps } from \"./route-announcer-props\"\nimport { navigate as reachNavigate } from \"@reach/router\"\nimport { globalHistory } from \"@reach/router/lib/history\"\nimport { parsePath } from \"gatsby-link\"\n\n// Convert to a map for faster lookup in maybeRedirect()\nconst redirectMap = redirects.reduce((map, redirect) => {\n  map[redirect.fromPath] = redirect\n  return map\n}, {})\n\nfunction maybeRedirect(pathname) {\n  const redirect = redirectMap[pathname]\n\n  if (redirect != null) {\n    if (process.env.NODE_ENV !== `production`) {\n      if (!loader.isPageNotFound(pathname)) {\n        console.error(\n          `The route \"${pathname}\" matches both a page and a redirect; this is probably not intentional.`\n        )\n      }\n    }\n\n    window.___replace(redirect.toPath)\n    return true\n  } else {\n    return false\n  }\n}\n\nconst onPreRouteUpdate = (location, prevLocation) => {\n  if (!maybeRedirect(location.pathname)) {\n    apiRunner(`onPreRouteUpdate`, { location, prevLocation })\n  }\n}\n\nconst onRouteUpdate = (location, prevLocation) => {\n  if (!maybeRedirect(location.pathname)) {\n    apiRunner(`onRouteUpdate`, { location, prevLocation })\n    if (\n      process.env.GATSBY_EXPERIMENTAL_QUERY_ON_DEMAND &&\n      process.env.GATSBY_QUERY_ON_DEMAND_LOADING_INDICATOR === `true`\n    ) {\n      emitter.emit(`onRouteUpdate`, { location, prevLocation })\n    }\n  }\n}\n\nconst navigate = (to, options = {}) => {\n  // Support forward/backward navigation with numbers\n  // navigate(-2) (jumps back 2 history steps)\n  // navigate(2)  (jumps forward 2 history steps)\n  if (typeof to === `number`) {\n    globalHistory.navigate(to)\n    return\n  }\n\n  let { pathname } = parsePath(to)\n  const redirect = redirectMap[pathname]\n\n  // If we're redirecting, just replace the passed in pathname\n  // to the one we want to redirect to.\n  if (redirect) {\n    to = redirect.toPath\n    pathname = parsePath(to).pathname\n  }\n\n  // If we had a service worker update, no matter the path, reload window and\n  // reset the pathname whitelist\n  if (window.___swUpdated) {\n    window.location = pathname\n    return\n  }\n\n  // Start a timer to wait for a second before transitioning and showing a\n  // loader in case resources aren't around yet.\n  const timeoutId = setTimeout(() => {\n    emitter.emit(`onDelayedLoadPageResources`, { pathname })\n    apiRunner(`onRouteUpdateDelayed`, {\n      location: window.location,\n    })\n  }, 1000)\n\n  loader.loadPage(pathname).then(pageResources => {\n    // If no page resources, then refresh the page\n    // Do this, rather than simply `window.location.reload()`, so that\n    // pressing the back/forward buttons work - otherwise when pressing\n    // back, the browser will just change the URL and expect JS to handle\n    // the change, which won't always work since it might not be a Gatsby\n    // page.\n    if (!pageResources || pageResources.status === PageResourceStatus.Error) {\n      window.history.replaceState({}, ``, location.href)\n      window.location = pathname\n      clearTimeout(timeoutId)\n      return\n    }\n\n    // If the loaded page has a different compilation hash to the\n    // window, then a rebuild has occurred on the server. Reload.\n    if (process.env.NODE_ENV === `production` && pageResources) {\n      if (\n        pageResources.page.webpackCompilationHash !==\n        window.___webpackCompilationHash\n      ) {\n        // Purge plugin-offline cache\n        if (\n          `serviceWorker` in navigator &&\n          navigator.serviceWorker.controller !== null &&\n          navigator.serviceWorker.controller.state === `activated`\n        ) {\n          navigator.serviceWorker.controller.postMessage({\n            gatsbyApi: `clearPathResources`,\n          })\n        }\n\n        window.location = pathname\n      }\n    }\n    reachNavigate(to, options)\n    clearTimeout(timeoutId)\n  })\n}\n\nfunction shouldUpdateScroll(prevRouterProps, { location }) {\n  const { pathname, hash } = location\n  const results = apiRunner(`shouldUpdateScroll`, {\n    prevRouterProps,\n    // `pathname` for backwards compatibility\n    pathname,\n    routerProps: { location },\n    getSavedScrollPosition: args => [\n      0,\n      this._stateStorage.read(args, args.key),\n    ],\n  })\n  if (results.length > 0) {\n    // Use the latest registered shouldUpdateScroll result, this allows users to override plugin's configuration\n    // @see https://github.com/gatsbyjs/gatsby/issues/12038\n    return results[results.length - 1]\n  }\n\n  if (prevRouterProps) {\n    const {\n      location: { pathname: oldPathname },\n    } = prevRouterProps\n    if (oldPathname === pathname) {\n      // Scroll to element if it exists, if it doesn't, or no hash is provided,\n      // scroll to top.\n      return hash ? decodeURI(hash.slice(1)) : [0, 0]\n    }\n  }\n  return true\n}\n\nfunction init() {\n  // The \"scroll-behavior\" package expects the \"action\" to be on the location\n  // object so let's copy it over.\n  globalHistory.listen(args => {\n    args.location.action = args.action\n  })\n\n  window.___push = to => navigate(to, { replace: false })\n  window.___replace = to => navigate(to, { replace: true })\n  window.___navigate = (to, options) => navigate(to, options)\n\n  // Check for initial page-load redirect\n  maybeRedirect(window.location.pathname)\n}\n\nclass RouteAnnouncer extends React.Component {\n  constructor(props) {\n    super(props)\n    this.announcementRef = React.createRef()\n  }\n\n  componentDidUpdate(prevProps, nextProps) {\n    requestAnimationFrame(() => {\n      let pageName = `new page at ${this.props.location.pathname}`\n      if (document.title) {\n        pageName = document.title\n      }\n      const pageHeadings = document.querySelectorAll(`#gatsby-focus-wrapper h1`)\n      if (pageHeadings && pageHeadings.length) {\n        pageName = pageHeadings[0].textContent\n      }\n      const newAnnouncement = `Navigated to ${pageName}`\n      if (this.announcementRef.current) {\n        const oldAnnouncement = this.announcementRef.current.innerText\n        if (oldAnnouncement !== newAnnouncement) {\n          this.announcementRef.current.innerText = newAnnouncement\n        }\n      }\n    })\n  }\n\n  render() {\n    return <div {...RouteAnnouncerProps} ref={this.announcementRef}></div>\n  }\n}\n\nconst compareLocationProps = (prevLocation, nextLocation) => {\n  if (prevLocation.href !== nextLocation.href) {\n    return true\n  }\n\n  if (prevLocation?.state?.key !== nextLocation?.state?.key) {\n    return true\n  }\n\n  return false\n}\n\n// Fire on(Pre)RouteUpdate APIs\nclass RouteUpdates extends React.Component {\n  constructor(props) {\n    super(props)\n    onPreRouteUpdate(props.location, null)\n  }\n\n  componentDidMount() {\n    onRouteUpdate(this.props.location, null)\n  }\n\n  shouldComponentUpdate(prevProps) {\n    if (compareLocationProps(prevProps.location, this.props.location)) {\n      onPreRouteUpdate(this.props.location, prevProps.location)\n      return true\n    }\n    return false\n  }\n\n  componentDidUpdate(prevProps) {\n    if (compareLocationProps(prevProps.location, this.props.location)) {\n      onRouteUpdate(this.props.location, prevProps.location)\n    }\n  }\n\n  render() {\n    return (\n      <React.Fragment>\n        {this.props.children}\n        <RouteAnnouncer location={location} />\n      </React.Fragment>\n    )\n  }\n}\n\nRouteUpdates.propTypes = {\n  location: PropTypes.object.isRequired,\n}\n\nexport { init, shouldUpdateScroll, RouteUpdates }\n","// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(a, b) {\n  for (var i in a) {\n    if (!(i in b)) return true;\n  }for (var _i in b) {\n    if (a[_i] !== b[_i]) return true;\n  }return false;\n}\n\nexport default (function (instance, nextProps, nextState) {\n  return shallowDiffers(instance.props, nextProps) || shallowDiffers(instance.state, nextState);\n});","import React from \"react\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport shallowCompare from \"shallow-compare\"\n\nclass EnsureResources extends React.Component {\n  constructor(props) {\n    super()\n    const { location, pageResources } = props\n    this.state = {\n      location: { ...location },\n      pageResources: pageResources || loader.loadPageSync(location.pathname),\n    }\n  }\n\n  static getDerivedStateFromProps({ location }, prevState) {\n    if (prevState.location.href !== location.href) {\n      const pageResources = loader.loadPageSync(location.pathname)\n      return {\n        pageResources,\n        location: { ...location },\n      }\n    }\n\n    return {\n      location: { ...location },\n    }\n  }\n\n  loadResources(rawPath) {\n    loader.loadPage(rawPath).then(pageResources => {\n      if (pageResources && pageResources.status !== PageResourceStatus.Error) {\n        this.setState({\n          location: { ...window.location },\n          pageResources,\n        })\n      } else {\n        window.history.replaceState({}, ``, location.href)\n        window.location = rawPath\n      }\n    })\n  }\n\n  shouldComponentUpdate(nextProps, nextState) {\n    // Always return false if we're missing resources.\n    if (!nextState.pageResources) {\n      this.loadResources(nextProps.location.pathname)\n      return false\n    }\n\n    if (\n      process.env.BUILD_STAGE === `develop` &&\n      nextState.pageResources.stale\n    ) {\n      this.loadResources(nextProps.location.pathname)\n      return false\n    }\n\n    // Check if the component or json have changed.\n    if (this.state.pageResources !== nextState.pageResources) {\n      return true\n    }\n    if (\n      this.state.pageResources.component !== nextState.pageResources.component\n    ) {\n      return true\n    }\n\n    if (this.state.pageResources.json !== nextState.pageResources.json) {\n      return true\n    }\n    // Check if location has changed on a page using internal routing\n    // via matchPath configuration.\n    if (\n      this.state.location.key !== nextState.location.key &&\n      nextState.pageResources.page &&\n      (nextState.pageResources.page.matchPath ||\n        nextState.pageResources.page.path)\n    ) {\n      return true\n    }\n    return shallowCompare(this, nextProps, nextState)\n  }\n\n  render() {\n    if (process.env.NODE_ENV !== `production` && !this.state.pageResources) {\n      throw new Error(\n        `EnsureResources was not able to find resources for path: \"${this.props.location.pathname}\"\nThis typically means that an issue occurred building components for that path.\nRun \\`gatsby clean\\` to remove any cached elements.`\n      )\n    }\n\n    return this.props.children(this.state)\n  }\n}\n\nexport default EnsureResources\n","import { apiRunner, apiRunnerAsync } from \"./api-runner-browser\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Router, navigate, Location, BaseContext } from \"@reach/router\"\nimport { ScrollContext } from \"gatsby-react-router-scroll\"\nimport domReady from \"@mikaelkristiansson/domready\"\nimport { StaticQueryContext } from \"gatsby\"\nimport {\n  shouldUpdateScroll,\n  init as navigationInit,\n  RouteUpdates,\n} from \"./navigation\"\nimport emitter from \"./emitter\"\nimport PageRenderer from \"./page-renderer\"\nimport asyncRequires from \"$virtual/async-requires\"\nimport {\n  setLoader,\n  ProdLoader,\n  publicLoader,\n  PageResourceStatus,\n  getStaticQueryResults,\n} from \"./loader\"\nimport EnsureResources from \"./ensure-resources\"\nimport stripPrefix from \"./strip-prefix\"\n\n// Generated during bootstrap\nimport matchPaths from \"$virtual/match-paths.json\"\n\nconst loader = new ProdLoader(asyncRequires, matchPaths)\nsetLoader(loader)\nloader.setApiRunner(apiRunner)\n\nwindow.asyncRequires = asyncRequires\nwindow.___emitter = emitter\nwindow.___loader = publicLoader\n\nnavigationInit()\n\napiRunnerAsync(`onClientEntry`).then(() => {\n  // Let plugins register a service worker. The plugin just needs\n  // to return true.\n  if (apiRunner(`registerServiceWorker`).length > 0) {\n    require(`./register-service-worker`)\n  }\n\n  // In gatsby v2 if Router is used in page using matchPaths\n  // paths need to contain full path.\n  // For example:\n  //   - page have `/app/*` matchPath\n  //   - inside template user needs to use `/app/xyz` as path\n  // Resetting `basepath`/`baseuri` keeps current behaviour\n  // to not introduce breaking change.\n  // Remove this in v3\n  const RouteHandler = props => (\n    <BaseContext.Provider\n      value={{\n        baseuri: `/`,\n        basepath: `/`,\n      }}\n    >\n      <PageRenderer {...props} />\n    </BaseContext.Provider>\n  )\n\n  const DataContext = React.createContext({})\n\n  class GatsbyRoot extends React.Component {\n    render() {\n      const { children } = this.props\n      return (\n        <Location>\n          {({ location }) => (\n            <EnsureResources location={location}>\n              {({ pageResources, location }) => {\n                const staticQueryResults = getStaticQueryResults()\n                return (\n                  <StaticQueryContext.Provider value={staticQueryResults}>\n                    <DataContext.Provider value={{ pageResources, location }}>\n                      {children}\n                    </DataContext.Provider>\n                  </StaticQueryContext.Provider>\n                )\n              }}\n            </EnsureResources>\n          )}\n        </Location>\n      )\n    }\n  }\n\n  class LocationHandler extends React.Component {\n    render() {\n      return (\n        <DataContext.Consumer>\n          {({ pageResources, location }) => (\n            <RouteUpdates location={location}>\n              <ScrollContext\n                location={location}\n                shouldUpdateScroll={shouldUpdateScroll}\n              >\n                <Router\n                  basepath={__BASE_PATH__}\n                  location={location}\n                  id=\"gatsby-focus-wrapper\"\n                >\n                  <RouteHandler\n                    path={\n                      pageResources.page.path === `/404.html`\n                        ? stripPrefix(location.pathname, __BASE_PATH__)\n                        : encodeURI(\n                            pageResources.page.matchPath ||\n                              pageResources.page.path\n                          )\n                    }\n                    {...this.props}\n                    location={location}\n                    pageResources={pageResources}\n                    {...pageResources.json}\n                  />\n                </Router>\n              </ScrollContext>\n            </RouteUpdates>\n          )}\n        </DataContext.Consumer>\n      )\n    }\n  }\n\n  const { pagePath, location: browserLoc } = window\n\n  // Explicitly call navigate if the canonical path (window.pagePath)\n  // is different to the browser path (window.location.pathname). But\n  // only if NONE of the following conditions hold:\n  //\n  // - The url matches a client side route (page.matchPath)\n  // - it's a 404 page\n  // - it's the offline plugin shell (/offline-plugin-app-shell-fallback/)\n  if (\n    pagePath &&\n    __BASE_PATH__ + pagePath !== browserLoc.pathname &&\n    !(\n      loader.findMatchPath(stripPrefix(browserLoc.pathname, __BASE_PATH__)) ||\n      pagePath === `/404.html` ||\n      pagePath.match(/^\\/404\\/?$/) ||\n      pagePath.match(/^\\/offline-plugin-app-shell-fallback\\/?$/)\n    )\n  ) {\n    navigate(__BASE_PATH__ + pagePath + browserLoc.search + browserLoc.hash, {\n      replace: true,\n    })\n  }\n\n  publicLoader.loadPage(browserLoc.pathname).then(page => {\n    if (!page || page.status === PageResourceStatus.Error) {\n      throw new Error(\n        `page resources for ${browserLoc.pathname} not found. Not rendering React`\n      )\n    }\n\n    window.___webpackCompilationHash = page.page.webpackCompilationHash\n\n    const SiteRoot = apiRunner(\n      `wrapRootElement`,\n      { element: <LocationHandler /> },\n      <LocationHandler />,\n      ({ result }) => {\n        return { element: result }\n      }\n    ).pop()\n\n    const App = () => <GatsbyRoot>{SiteRoot}</GatsbyRoot>\n\n    const renderer = apiRunner(\n      `replaceHydrateFunction`,\n      undefined,\n      ReactDOM.hydrate\n    )[0]\n\n    domReady(() => {\n      renderer(\n        <App />,\n        typeof window !== `undefined`\n          ? document.getElementById(`___gatsby`)\n          : void 0,\n        () => {\n          apiRunner(`onInitialClientRender`)\n        }\n      )\n    })\n  })\n})\n","function _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}\n\nmodule.exports = _inheritsLoose;","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n  return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport Link, {\n  withPrefix,\n  withAssetPrefix,\n  navigate,\n  push,\n  replace,\n  navigateTo,\n  parsePath,\n} from \"gatsby-link\"\nimport { useScrollRestoration } from \"gatsby-react-router-scroll\"\nimport PageRenderer from \"./public-page-renderer\"\nimport loader from \"./loader\"\n\nconst prefetchPathname = loader.enqueue\n\nconst StaticQueryContext = React.createContext({})\n\nfunction StaticQueryDataRenderer({ staticQueryData, data, query, render }) {\n  const finalData = data\n    ? data.data\n    : staticQueryData[query] && staticQueryData[query].data\n\n  return (\n    <React.Fragment>\n      {finalData && render(finalData)}\n      {!finalData && <div>Loading (StaticQuery)</div>}\n    </React.Fragment>\n  )\n}\n\nconst StaticQuery = props => {\n  const { data, query, render, children } = props\n\n  return (\n    <StaticQueryContext.Consumer>\n      {staticQueryData => (\n        <StaticQueryDataRenderer\n          data={data}\n          query={query}\n          render={render || children}\n          staticQueryData={staticQueryData}\n        />\n      )}\n    </StaticQueryContext.Consumer>\n  )\n}\n\nconst useStaticQuery = query => {\n  if (\n    typeof React.useContext !== `function` &&\n    process.env.NODE_ENV === `development`\n  ) {\n    throw new Error(\n      `You're likely using a version of React that doesn't support Hooks\\n` +\n        `Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.`\n    )\n  }\n  const context = React.useContext(StaticQueryContext)\n\n  // query is a stringified number like `3303882` when wrapped with graphql, If a user forgets\n  // to wrap the query in a grqphql, then casting it to a Number results in `NaN` allowing us to\n  // catch the misuse of the API and give proper direction\n  if (isNaN(Number(query))) {\n    throw new Error(`useStaticQuery was called with a string but expects to be called using \\`graphql\\`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql\\`${query}\\`);\n`)\n  }\n\n  if (context[query]?.data) {\n    return context[query].data\n  } else {\n    throw new Error(\n      `The result of this StaticQuery could not be fetched.\\n\\n` +\n        `This is likely a bug in Gatsby and if refreshing the page does not fix it, ` +\n        `please open an issue in https://github.com/gatsbyjs/gatsby/issues`\n    )\n  }\n}\n\nStaticQuery.propTypes = {\n  data: PropTypes.object,\n  query: PropTypes.string.isRequired,\n  render: PropTypes.func,\n  children: PropTypes.func,\n}\n\nfunction graphql() {\n  throw new Error(\n    `It appears like Gatsby is misconfigured. Gatsby related \\`graphql\\` calls ` +\n      `are supposed to only be evaluated at compile time, and then compiled away. ` +\n      `Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n` +\n      `Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.`\n  )\n}\n\nexport {\n  Link,\n  withAssetPrefix,\n  withPrefix,\n  graphql,\n  parsePath,\n  navigate,\n  push, // TODO replace for v3\n  replace, // TODO remove replace for v3\n  navigateTo, // TODO: remove navigateTo for v3\n  useScrollRestoration,\n  StaticQueryContext,\n  StaticQuery,\n  PageRenderer,\n  useStaticQuery,\n  prefetchPathname,\n}\n","\"use strict\";\n\nmodule.exports = Object.assign;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/* eslint-disable jsx-a11y/anchor-has-content */\nimport React, { useContext } from \"react\";\nimport PropTypes from \"prop-types\";\nimport invariant from \"invariant\";\nimport createContext from \"create-react-context\";\nimport { polyfill } from \"react-lifecycles-compat\";\nimport { startsWith, pick, resolve, match, insertParams, validateRedirect, shallowCompare } from \"./lib/utils\";\nimport { globalHistory, navigate, createHistory, createMemorySource } from \"./lib/history\";\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n  var Ctx = createContext(defaultValue);\n  Ctx.displayName = name;\n  return Ctx;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\nvar LocationContext = createNamedContext(\"Location\");\n\n// sets up a listener if there isn't one already so apps don't need to be\n// wrapped in some top level provider\nvar Location = function Location(_ref) {\n  var children = _ref.children;\n  return React.createElement(\n    LocationContext.Consumer,\n    null,\n    function (context) {\n      return context ? children(context) : React.createElement(\n        LocationProvider,\n        null,\n        children\n      );\n    }\n  );\n};\n\nvar LocationProvider = function (_React$Component) {\n  _inherits(LocationProvider, _React$Component);\n\n  function LocationProvider() {\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, LocationProvider);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n      context: _this.getContext(),\n      refs: { unlisten: null }\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  LocationProvider.prototype.getContext = function getContext() {\n    var _props$history = this.props.history,\n        navigate = _props$history.navigate,\n        location = _props$history.location;\n\n    return { navigate: navigate, location: location };\n  };\n\n  LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n    if (isRedirect(error)) {\n      var _navigate = this.props.history.navigate;\n\n      _navigate(error.uri, { replace: true });\n    } else {\n      throw error;\n    }\n  };\n\n  LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    if (prevState.context.location !== this.state.context.location) {\n      this.props.history._onTransitionComplete();\n    }\n  };\n\n  LocationProvider.prototype.componentDidMount = function componentDidMount() {\n    var _this2 = this;\n\n    var refs = this.state.refs,\n        history = this.props.history;\n\n    history._onTransitionComplete();\n    refs.unlisten = history.listen(function () {\n      Promise.resolve().then(function () {\n        // TODO: replace rAF with react deferred update API when it's ready https://github.com/facebook/react/issues/13306\n        requestAnimationFrame(function () {\n          if (!_this2.unmounted) {\n            _this2.setState(function () {\n              return { context: _this2.getContext() };\n            });\n          }\n        });\n      });\n    });\n  };\n\n  LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n    var refs = this.state.refs;\n\n    this.unmounted = true;\n    refs.unlisten();\n  };\n\n  LocationProvider.prototype.render = function render() {\n    var context = this.state.context,\n        children = this.props.children;\n\n    return React.createElement(\n      LocationContext.Provider,\n      { value: context },\n      typeof children === \"function\" ? children(context) : children || null\n    );\n  };\n\n  return LocationProvider;\n}(React.Component);\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n  history: globalHistory\n};\nprocess.env.NODE_ENV !== \"production\" ? LocationProvider.propTypes = {\n  history: PropTypes.object.isRequired\n} : void 0;\nvar ServerLocation = function ServerLocation(_ref2) {\n  var url = _ref2.url,\n      children = _ref2.children;\n\n  var searchIndex = url.indexOf(\"?\");\n  var searchExists = searchIndex > -1;\n  var pathname = void 0;\n  var search = \"\";\n  var hash = \"\";\n\n  if (searchExists) {\n    pathname = url.substring(0, searchIndex);\n    search = url.substring(searchIndex);\n  } else {\n    pathname = url;\n  }\n\n  return React.createElement(\n    LocationContext.Provider,\n    {\n      value: {\n        location: {\n          pathname: pathname,\n          search: search,\n          hash: hash\n        },\n        navigate: function navigate() {\n          throw new Error(\"You can't call navigate on the server.\");\n        }\n      }\n    },\n    children\n  );\n};\n////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\nvar BaseContext = createNamedContext(\"Base\", { baseuri: \"/\", basepath: \"/\" });\n\n////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\nvar Router = function Router(props) {\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (baseContext) {\n      return React.createElement(\n        Location,\n        null,\n        function (locationContext) {\n          return React.createElement(RouterImpl, _extends({}, baseContext, locationContext, props));\n        }\n      );\n    }\n  );\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n  _inherits(RouterImpl, _React$PureComponent);\n\n  function RouterImpl() {\n    _classCallCheck(this, RouterImpl);\n\n    return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n  }\n\n  RouterImpl.prototype.render = function render() {\n    var _props = this.props,\n        location = _props.location,\n        _navigate2 = _props.navigate,\n        basepath = _props.basepath,\n        primary = _props.primary,\n        children = _props.children,\n        baseuri = _props.baseuri,\n        _props$component = _props.component,\n        component = _props$component === undefined ? \"div\" : _props$component,\n        domProps = _objectWithoutProperties(_props, [\"location\", \"navigate\", \"basepath\", \"primary\", \"children\", \"baseuri\", \"component\"]);\n\n    var routes = React.Children.toArray(children).reduce(function (array, child) {\n      var routes = createRoute(basepath)(child);\n      return array.concat(routes);\n    }, []);\n    var pathname = location.pathname;\n\n\n    var match = pick(routes, pathname);\n\n    if (match) {\n      var params = match.params,\n          uri = match.uri,\n          route = match.route,\n          element = match.route.value;\n\n      // remove the /* from the end for child routes relative paths\n\n      basepath = route.default ? basepath : route.path.replace(/\\*$/, \"\");\n\n      var props = _extends({}, params, {\n        uri: uri,\n        location: location,\n        navigate: function navigate(to, options) {\n          return _navigate2(resolve(to, uri), options);\n        }\n      });\n\n      var clone = React.cloneElement(element, props, element.props.children ? React.createElement(\n        Router,\n        { location: location, primary: primary },\n        element.props.children\n      ) : undefined);\n\n      // using 'div' for < 16.3 support\n      var FocusWrapper = primary ? FocusHandler : component;\n      // don't pass any props to 'div'\n      var wrapperProps = primary ? _extends({ uri: uri, location: location, component: component }, domProps) : domProps;\n\n      return React.createElement(\n        BaseContext.Provider,\n        { value: { baseuri: uri, basepath: basepath } },\n        React.createElement(\n          FocusWrapper,\n          wrapperProps,\n          clone\n        )\n      );\n    } else {\n      // Not sure if we want this, would require index routes at every level\n      // warning(\n      //   false,\n      //   `<Router basepath=\"${basepath}\">\\n\\nNothing matched:\\n\\t${\n      //     location.pathname\n      //   }\\n\\nPaths checked: \\n\\t${routes\n      //     .map(route => route.path)\n      //     .join(\n      //       \"\\n\\t\"\n      //     )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n      //   \\n\\tlet NotFound = () => <div>Not Found!</div>\n      //   \\n\\t<Router>\\n\\t  <NotFound default/>\\n\\t  {/* ... */}\\n\\t</Router>`\n      // );\n      return null;\n    }\n  };\n\n  return RouterImpl;\n}(React.PureComponent);\n\nRouterImpl.defaultProps = {\n  primary: true\n};\n\n\nvar FocusContext = createNamedContext(\"Focus\");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n  var uri = _ref3.uri,\n      location = _ref3.location,\n      component = _ref3.component,\n      domProps = _objectWithoutProperties(_ref3, [\"uri\", \"location\", \"component\"]);\n\n  return React.createElement(\n    FocusContext.Consumer,\n    null,\n    function (requestFocus) {\n      return React.createElement(FocusHandlerImpl, _extends({}, domProps, {\n        component: component,\n        requestFocus: requestFocus,\n        uri: uri,\n        location: location\n      }));\n    }\n  );\n};\n\n// don't focus on initial render\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n  _inherits(FocusHandlerImpl, _React$Component2);\n\n  function FocusHandlerImpl() {\n    var _temp2, _this4, _ret2;\n\n    _classCallCheck(this, FocusHandlerImpl);\n\n    for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n      if (!_this4.state.shouldFocus && node) {\n        node.focus();\n      }\n    }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n  }\n\n  FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n    var initial = prevState.uri == null;\n    if (initial) {\n      return _extends({\n        shouldFocus: true\n      }, nextProps);\n    } else {\n      var myURIChanged = nextProps.uri !== prevState.uri;\n      var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n      return _extends({\n        shouldFocus: myURIChanged || navigatedUpToMe\n      }, nextProps);\n    }\n  };\n\n  FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n    focusHandlerCount++;\n    this.focus();\n  };\n\n  FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n    focusHandlerCount--;\n    if (focusHandlerCount === 0) {\n      initialRender = true;\n    }\n  };\n\n  FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n      this.focus();\n    }\n  };\n\n  FocusHandlerImpl.prototype.focus = function focus() {\n    if (process.env.NODE_ENV === \"test\") {\n      // getting cannot read property focus of null in the tests\n      // and that bit of global `initialRender` state causes problems\n      // should probably figure it out!\n      return;\n    }\n\n    var requestFocus = this.props.requestFocus;\n\n\n    if (requestFocus) {\n      requestFocus(this.node);\n    } else {\n      if (initialRender) {\n        initialRender = false;\n      } else if (this.node) {\n        // React polyfills [autofocus] and it fires earlier than cDM,\n        // so we were stealing focus away, this line prevents that.\n        if (!this.node.contains(document.activeElement)) {\n          this.node.focus();\n        }\n      }\n    }\n  };\n\n  FocusHandlerImpl.prototype.render = function render() {\n    var _this5 = this;\n\n    var _props2 = this.props,\n        children = _props2.children,\n        style = _props2.style,\n        requestFocus = _props2.requestFocus,\n        _props2$component = _props2.component,\n        Comp = _props2$component === undefined ? \"div\" : _props2$component,\n        uri = _props2.uri,\n        location = _props2.location,\n        domProps = _objectWithoutProperties(_props2, [\"children\", \"style\", \"requestFocus\", \"component\", \"uri\", \"location\"]);\n\n    return React.createElement(\n      Comp,\n      _extends({\n        style: _extends({ outline: \"none\" }, style),\n        tabIndex: \"-1\",\n        ref: function ref(n) {\n          return _this5.node = n;\n        }\n      }, domProps),\n      React.createElement(\n        FocusContext.Provider,\n        { value: this.requestFocus },\n        this.props.children\n      )\n    );\n  };\n\n  return FocusHandlerImpl;\n}(React.Component);\n\npolyfill(FocusHandlerImpl);\n\nvar k = function k() {};\n\n////////////////////////////////////////////////////////////////////////////////\nvar forwardRef = React.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n  forwardRef = function forwardRef(C) {\n    return C;\n  };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n  var innerRef = _ref4.innerRef,\n      props = _objectWithoutProperties(_ref4, [\"innerRef\"]);\n\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref5) {\n      var basepath = _ref5.basepath,\n          baseuri = _ref5.baseuri;\n      return React.createElement(\n        Location,\n        null,\n        function (_ref6) {\n          var location = _ref6.location,\n              navigate = _ref6.navigate;\n\n          var to = props.to,\n              state = props.state,\n              replace = props.replace,\n              _props$getProps = props.getProps,\n              getProps = _props$getProps === undefined ? k : _props$getProps,\n              anchorProps = _objectWithoutProperties(props, [\"to\", \"state\", \"replace\", \"getProps\"]);\n\n          var href = resolve(to, baseuri);\n          var encodedHref = encodeURI(href);\n          var isCurrent = location.pathname === encodedHref;\n          var isPartiallyCurrent = startsWith(location.pathname, encodedHref);\n\n          return React.createElement(\"a\", _extends({\n            ref: ref || innerRef,\n            \"aria-current\": isCurrent ? \"page\" : undefined\n          }, anchorProps, getProps({ isCurrent: isCurrent, isPartiallyCurrent: isPartiallyCurrent, href: href, location: location }), {\n            href: href,\n            onClick: function onClick(event) {\n              if (anchorProps.onClick) anchorProps.onClick(event);\n              if (shouldNavigate(event)) {\n                event.preventDefault();\n                var shouldReplace = replace;\n                if (typeof replace !== \"boolean\" && isCurrent) {\n                  var _location$state = _extends({}, location.state),\n                      key = _location$state.key,\n                      restState = _objectWithoutProperties(_location$state, [\"key\"]);\n\n                  shouldReplace = shallowCompare(_extends({}, state), restState);\n                }\n                navigate(href, {\n                  state: state,\n                  replace: shouldReplace\n                });\n              }\n            }\n          }));\n        }\n      );\n    }\n  );\n});\n\nLink.displayName = \"Link\";\n\nprocess.env.NODE_ENV !== \"production\" ? Link.propTypes = {\n  to: PropTypes.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nfunction RedirectRequest(uri) {\n  this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n  return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n  throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n  _inherits(RedirectImpl, _React$Component3);\n\n  function RedirectImpl() {\n    _classCallCheck(this, RedirectImpl);\n\n    return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n  }\n\n  // Support React < 16 with this hook\n  RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n    var _props3 = this.props,\n        navigate = _props3.navigate,\n        to = _props3.to,\n        from = _props3.from,\n        _props3$replace = _props3.replace,\n        replace = _props3$replace === undefined ? true : _props3$replace,\n        state = _props3.state,\n        noThrow = _props3.noThrow,\n        baseuri = _props3.baseuri,\n        props = _objectWithoutProperties(_props3, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n    Promise.resolve().then(function () {\n      var resolvedTo = resolve(to, baseuri);\n      navigate(insertParams(resolvedTo, props), { replace: replace, state: state });\n    });\n  };\n\n  RedirectImpl.prototype.render = function render() {\n    var _props4 = this.props,\n        navigate = _props4.navigate,\n        to = _props4.to,\n        from = _props4.from,\n        replace = _props4.replace,\n        state = _props4.state,\n        noThrow = _props4.noThrow,\n        baseuri = _props4.baseuri,\n        props = _objectWithoutProperties(_props4, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n    var resolvedTo = resolve(to, baseuri);\n    if (!noThrow) redirectTo(insertParams(resolvedTo, props));\n    return null;\n  };\n\n  return RedirectImpl;\n}(React.Component);\n\nvar Redirect = function Redirect(props) {\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref7) {\n      var baseuri = _ref7.baseuri;\n      return React.createElement(\n        Location,\n        null,\n        function (locationContext) {\n          return React.createElement(RedirectImpl, _extends({}, locationContext, { baseuri: baseuri }, props));\n        }\n      );\n    }\n  );\n};\n\nprocess.env.NODE_ENV !== \"production\" ? Redirect.propTypes = {\n  from: PropTypes.string,\n  to: PropTypes.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nvar Match = function Match(_ref8) {\n  var path = _ref8.path,\n      children = _ref8.children;\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref9) {\n      var baseuri = _ref9.baseuri;\n      return React.createElement(\n        Location,\n        null,\n        function (_ref10) {\n          var navigate = _ref10.navigate,\n              location = _ref10.location;\n\n          var resolvedPath = resolve(path, baseuri);\n          var result = match(resolvedPath, location.pathname);\n          return children({\n            navigate: navigate,\n            location: location,\n            match: result ? _extends({}, result.params, {\n              uri: result.uri,\n              path: path\n            }) : null\n          });\n        }\n      );\n    }\n  );\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\nvar useLocation = function useLocation() {\n  var context = useContext(LocationContext);\n\n  if (!context) {\n    throw new Error(\"useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n  var context = useContext(LocationContext);\n\n  if (!context) {\n    throw new Error(\"useNavigate hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  return context.navigate;\n};\n\nvar useParams = function useParams() {\n  var context = useContext(BaseContext);\n\n  if (!context) {\n    throw new Error(\"useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  var location = useLocation();\n\n  var results = match(context.basepath, location.pathname);\n\n  return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n  if (!path) {\n    throw new Error(\"useMatch(path: string) requires an argument of a string to match against\");\n  }\n  var context = useContext(BaseContext);\n\n  if (!context) {\n    throw new Error(\"useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  var location = useLocation();\n\n  var resolvedPath = resolve(path, context.baseuri);\n  var result = match(resolvedPath, location.pathname);\n  return result ? _extends({}, result.params, {\n    uri: result.uri,\n    path: path\n  }) : null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar stripSlashes = function stripSlashes(str) {\n  return str.replace(/(^\\/+|\\/+$)/g, \"\");\n};\n\nvar createRoute = function createRoute(basepath) {\n  return function (element) {\n    if (!element) {\n      return null;\n    }\n\n    if (element.type === React.Fragment && element.props.children) {\n      return React.Children.map(element.props.children, createRoute(basepath));\n    }\n    !(element.props.path || element.props.default || element.type === Redirect) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Router>: Children of <Router> must have a `path` or `default` prop, or be a `<Redirect>`. None found on element type `\" + element.type + \"`\") : invariant(false) : void 0;\n\n    !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Redirect from=\\\"\" + element.props.from + \"\\\" to=\\\"\" + element.props.to + \"\\\"/> requires both \\\"from\\\" and \\\"to\\\" props when inside a <Router>.\") : invariant(false) : void 0;\n\n    !!(element.type === Redirect && !validateRedirect(element.props.from, element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Redirect from=\\\"\" + element.props.from + \" to=\\\"\" + element.props.to + \"\\\"/> has mismatched dynamic segments, ensure both paths have the exact same dynamic segments.\") : invariant(false) : void 0;\n\n    if (element.props.default) {\n      return { value: element, default: true };\n    }\n\n    var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n\n    var path = elementPath === \"/\" ? basepath : stripSlashes(basepath) + \"/\" + stripSlashes(elementPath);\n\n    return {\n      value: element,\n      default: element.props.default,\n      path: element.props.children ? stripSlashes(path) + \"/*\" : path\n    };\n  };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n  return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n};\n\n////////////////////////////////////////////////////////////////////////\nexport {  Link, Location, LocationProvider, Match, Redirect, Router, ServerLocation, createHistory, createMemorySource, isRedirect, navigate, redirectTo, globalHistory, match as matchPath, useLocation, useNavigate, useParams, useMatch , BaseContext };","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n  var value = data[normalize(feature)];\n  return value == POLYFILL ? true\n    : value == NATIVE ? false\n    : typeof detection == 'function' ? fails(detection)\n    : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n  return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n  options.target      - name of the target object\n  options.global      - target is the global object\n  options.stat        - export as static methods of target\n  options.proto       - export as prototype methods of target\n  options.real        - real prototype method for the `pure` version\n  options.forced      - export even if the native feature is available\n  options.bind        - bind methods to the target, required for the `pure` version\n  options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version\n  options.unsafe      - use the simple assignment of property instead of delete + defineProperty\n  options.sham        - add a flag to not completely full polyfills\n  options.enumerable  - export as enumerable property\n  options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n  var TARGET = options.target;\n  var GLOBAL = options.global;\n  var STATIC = options.stat;\n  var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n  if (GLOBAL) {\n    target = global;\n  } else if (STATIC) {\n    target = global[TARGET] || setGlobal(TARGET, {});\n  } else {\n    target = (global[TARGET] || {}).prototype;\n  }\n  if (target) for (key in source) {\n    sourceProperty = source[key];\n    if (options.noTargetGet) {\n      descriptor = getOwnPropertyDescriptor(target, key);\n      targetProperty = descriptor && descriptor.value;\n    } else targetProperty = target[key];\n    FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n    // contained in target\n    if (!FORCED && targetProperty !== undefined) {\n      if (typeof sourceProperty === typeof targetProperty) continue;\n      copyConstructorProperties(sourceProperty, targetProperty);\n    }\n    // add a flag to not completely full polyfills\n    if (options.sham || (targetProperty && targetProperty.sham)) {\n      createNonEnumerableProperty(sourceProperty, 'sham', true);\n    }\n    // extend global\n    redefine(target, key, sourceProperty, options);\n  }\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n  return IndexedObject(requireObjectCoercible(it));\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n","function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    module.exports = _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    module.exports = _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nmodule.exports = _typeof;","/**\n * Remove a prefix from a string. Return the input string if the given prefix\n * isn't found.\n */\n\nexport default function stripPrefix(str, prefix = ``) {\n  if (!prefix) {\n    return str\n  }\n\n  if (str === prefix) {\n    return `/`\n  }\n\n  if (str.startsWith(`${prefix}/`)) {\n    return str.slice(prefix.length)\n  }\n\n  return str\n}\n","module.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports.parsePath = parsePath;\n\nfunction parsePath(path) {\n  var pathname = path || \"/\";\n  var search = \"\";\n  var hash = \"\";\n  var hashIndex = pathname.indexOf(\"#\");\n\n  if (hashIndex !== -1) {\n    hash = pathname.substr(hashIndex);\n    pathname = pathname.substr(0, hashIndex);\n  }\n\n  var searchIndex = pathname.indexOf(\"?\");\n\n  if (searchIndex !== -1) {\n    search = pathname.substr(searchIndex);\n    pathname = pathname.substr(0, searchIndex);\n  }\n\n  return {\n    pathname: pathname,\n    search: search === \"?\" ? \"\" : search,\n    hash: hash === \"#\" ? \"\" : hash\n  };\n}","export default function _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}","export default function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n\n  return arr2;\n}","import arrayWithoutHoles from \"@babel/runtime/helpers/esm/arrayWithoutHoles\";\nimport iterableToArray from \"@babel/runtime/helpers/esm/iterableToArray\";\nimport unsupportedIterableToArray from \"@babel/runtime/helpers/esm/unsupportedIterableToArray\";\nimport nonIterableSpread from \"@babel/runtime/helpers/esm/nonIterableSpread\";\nexport default function _toConsumableArray(arr) {\n  return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"@babel/runtime/helpers/esm/arrayLikeToArray\";\nexport default function _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}","import arrayLikeToArray from \"@babel/runtime/helpers/esm/arrayLikeToArray\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","const support = function (feature) {\n  if (typeof document === `undefined`) {\n    return false\n  }\n  const fakeLink = document.createElement(`link`)\n  try {\n    if (fakeLink.relList && typeof fakeLink.relList.supports === `function`) {\n      return fakeLink.relList.supports(feature)\n    }\n  } catch (err) {\n    return false\n  }\n  return false\n}\n\nconst linkPrefetchStrategy = function (url, options) {\n  return new Promise((resolve, reject) => {\n    if (typeof document === `undefined`) {\n      reject()\n      return\n    }\n\n    const link = document.createElement(`link`)\n    link.setAttribute(`rel`, `prefetch`)\n    link.setAttribute(`href`, url)\n\n    Object.keys(options).forEach(key => {\n      link.setAttribute(key, options[key])\n    })\n\n    link.onload = resolve\n    link.onerror = reject\n\n    const parentElement =\n      document.getElementsByTagName(`head`)[0] ||\n      document.getElementsByName(`script`)[0].parentNode\n    parentElement.appendChild(link)\n  })\n}\n\nconst xhrPrefetchStrategy = function (url) {\n  return new Promise((resolve, reject) => {\n    const req = new XMLHttpRequest()\n    req.open(`GET`, url, true)\n\n    req.onload = () => {\n      if (req.status === 200) {\n        resolve()\n      } else {\n        reject()\n      }\n    }\n\n    req.send(null)\n  })\n}\n\nconst supportedPrefetchStrategy = support(`prefetch`)\n  ? linkPrefetchStrategy\n  : xhrPrefetchStrategy\n\nconst preFetched = {}\n\nconst prefetch = function (url, options) {\n  return new Promise(resolve => {\n    if (preFetched[url]) {\n      resolve()\n      return\n    }\n\n    supportedPrefetchStrategy(url, options)\n      .then(() => {\n        resolve()\n        preFetched[url] = true\n      })\n      .catch(() => {}) // 404s are logged to the console anyway\n  })\n}\n\nexport default prefetch\n","import prefetchHelper from \"./prefetch\"\nimport emitter from \"./emitter\"\nimport { setMatchPaths, findPath, findMatchPath } from \"./find-path\"\n\n/**\n * Available resource loading statuses\n */\nexport const PageResourceStatus = {\n  /**\n   * At least one of critical resources failed to load\n   */\n  Error: `error`,\n  /**\n   * Resources loaded successfully\n   */\n  Success: `success`,\n}\n\nconst preferDefault = m => (m && m.default) || m\n\nconst stripSurroundingSlashes = s => {\n  s = s[0] === `/` ? s.slice(1) : s\n  s = s.endsWith(`/`) ? s.slice(0, -1) : s\n  return s\n}\n\nconst createPageDataUrl = path => {\n  const fixedPath = path === `/` ? `index` : stripSurroundingSlashes(path)\n  return `${__PATH_PREFIX__}/page-data/${fixedPath}/page-data.json`\n}\n\nfunction doFetch(url, method = `GET`) {\n  return new Promise((resolve, reject) => {\n    const req = new XMLHttpRequest()\n    req.open(method, url, true)\n    req.onreadystatechange = () => {\n      if (req.readyState == 4) {\n        resolve(req)\n      }\n    }\n    req.send(null)\n  })\n}\n\nconst doesConnectionSupportPrefetch = () => {\n  if (\n    `connection` in navigator &&\n    typeof navigator.connection !== `undefined`\n  ) {\n    if ((navigator.connection.effectiveType || ``).includes(`2g`)) {\n      return false\n    }\n    if (navigator.connection.saveData) {\n      return false\n    }\n  }\n  return true\n}\n\nconst toPageResources = (pageData, component = null) => {\n  const page = {\n    componentChunkName: pageData.componentChunkName,\n    path: pageData.path,\n    webpackCompilationHash: pageData.webpackCompilationHash,\n    matchPath: pageData.matchPath,\n    staticQueryHashes: pageData.staticQueryHashes,\n  }\n\n  return {\n    component,\n    json: pageData.result,\n    page,\n  }\n}\n\nexport class BaseLoader {\n  constructor(loadComponent, matchPaths) {\n    // Map of pagePath -> Page. Where Page is an object with: {\n    //   status: PageResourceStatus.Success || PageResourceStatus.Error,\n    //   payload: PageResources, // undefined if PageResourceStatus.Error\n    // }\n    // PageResources is {\n    //   component,\n    //   json: pageData.result,\n    //   page: {\n    //     componentChunkName,\n    //     path,\n    //     webpackCompilationHash,\n    //     staticQueryHashes\n    //   },\n    //   staticQueryResults\n    // }\n    this.pageDb = new Map()\n    this.inFlightDb = new Map()\n    this.staticQueryDb = {}\n    this.pageDataDb = new Map()\n    this.prefetchTriggered = new Set()\n    this.prefetchCompleted = new Set()\n    this.loadComponent = loadComponent\n    setMatchPaths(matchPaths)\n  }\n\n  inFlightNetworkRequests = new Map()\n\n  memoizedGet(url) {\n    let inFlightPromise = this.inFlightNetworkRequests.get(url)\n\n    if (!inFlightPromise) {\n      inFlightPromise = doFetch(url, `GET`)\n      this.inFlightNetworkRequests.set(url, inFlightPromise)\n    }\n\n    // Prefer duplication with then + catch over .finally to prevent problems in ie11 + firefox\n    return inFlightPromise\n      .then(response => {\n        this.inFlightNetworkRequests.delete(url)\n        return response\n      })\n      .catch(err => {\n        this.inFlightNetworkRequests.delete(url)\n        throw err\n      })\n  }\n\n  setApiRunner(apiRunner) {\n    this.apiRunner = apiRunner\n    this.prefetchDisabled = apiRunner(`disableCorePrefetching`).some(a => a)\n  }\n\n  fetchPageDataJson(loadObj) {\n    const { pagePath, retries = 0 } = loadObj\n    const url = createPageDataUrl(pagePath)\n    return this.memoizedGet(url).then(req => {\n      const { status, responseText } = req\n\n      // Handle 200\n      if (status === 200) {\n        try {\n          const jsonPayload = JSON.parse(responseText)\n          if (jsonPayload.path === undefined) {\n            throw new Error(`not a valid pageData response`)\n          }\n\n          return Object.assign(loadObj, {\n            status: PageResourceStatus.Success,\n            payload: jsonPayload,\n          })\n        } catch (err) {\n          // continue regardless of error\n        }\n      }\n\n      // Handle 404\n      if (status === 404 || status === 200) {\n        // If the request was for a 404 page and it doesn't exist, we're done\n        if (pagePath === `/404.html`) {\n          return Object.assign(loadObj, {\n            status: PageResourceStatus.Error,\n          })\n        }\n\n        // Need some code here to cache the 404 request. In case\n        // multiple loadPageDataJsons result in 404s\n        return this.fetchPageDataJson(\n          Object.assign(loadObj, { pagePath: `/404.html`, notFound: true })\n        )\n      }\n\n      // handle 500 response (Unrecoverable)\n      if (status === 500) {\n        return Object.assign(loadObj, {\n          status: PageResourceStatus.Error,\n        })\n      }\n\n      // Handle everything else, including status === 0, and 503s. Should retry\n      if (retries < 3) {\n        return this.fetchPageDataJson(\n          Object.assign(loadObj, { retries: retries + 1 })\n        )\n      }\n\n      // Retried 3 times already, result is an error.\n      return Object.assign(loadObj, {\n        status: PageResourceStatus.Error,\n      })\n    })\n  }\n\n  loadPageDataJson(rawPath) {\n    const pagePath = findPath(rawPath)\n    if (this.pageDataDb.has(pagePath)) {\n      const pageData = this.pageDataDb.get(pagePath)\n      if (process.env.BUILD_STAGE !== `develop` || !pageData.stale) {\n        return Promise.resolve(pageData)\n      }\n    }\n\n    return this.fetchPageDataJson({ pagePath }).then(pageData => {\n      this.pageDataDb.set(pagePath, pageData)\n\n      return pageData\n    })\n  }\n\n  findMatchPath(rawPath) {\n    return findMatchPath(rawPath)\n  }\n\n  // TODO check all uses of this and whether they use undefined for page resources not exist\n  loadPage(rawPath) {\n    const pagePath = findPath(rawPath)\n    if (this.pageDb.has(pagePath)) {\n      const page = this.pageDb.get(pagePath)\n      if (process.env.BUILD_STAGE !== `develop` || !page.payload.stale) {\n        return Promise.resolve(page.payload)\n      }\n    }\n\n    if (this.inFlightDb.has(pagePath)) {\n      return this.inFlightDb.get(pagePath)\n    }\n\n    const inFlightPromise = Promise.all([\n      this.loadAppData(),\n      this.loadPageDataJson(pagePath),\n    ]).then(allData => {\n      const result = allData[1]\n      if (result.status === PageResourceStatus.Error) {\n        return {\n          status: PageResourceStatus.Error,\n        }\n      }\n\n      let pageData = result.payload\n      const { componentChunkName, staticQueryHashes = [] } = pageData\n\n      const finalResult = {}\n\n      const componentChunkPromise = this.loadComponent(componentChunkName).then(\n        component => {\n          finalResult.createdAt = new Date()\n          let pageResources\n          if (!component) {\n            finalResult.status = PageResourceStatus.Error\n          } else {\n            finalResult.status = PageResourceStatus.Success\n            if (result.notFound === true) {\n              finalResult.notFound = true\n            }\n            pageData = Object.assign(pageData, {\n              webpackCompilationHash: allData[0]\n                ? allData[0].webpackCompilationHash\n                : ``,\n            })\n            pageResources = toPageResources(pageData, component)\n          }\n          // undefined if final result is an error\n          return pageResources\n        }\n      )\n\n      const staticQueryBatchPromise = Promise.all(\n        staticQueryHashes.map(staticQueryHash => {\n          // Check for cache in case this static query result has already been loaded\n          if (this.staticQueryDb[staticQueryHash]) {\n            const jsonPayload = this.staticQueryDb[staticQueryHash]\n            return { staticQueryHash, jsonPayload }\n          }\n\n          return this.memoizedGet(\n            `${__PATH_PREFIX__}/page-data/sq/d/${staticQueryHash}.json`\n          ).then(req => {\n            const jsonPayload = JSON.parse(req.responseText)\n            return { staticQueryHash, jsonPayload }\n          })\n        })\n      ).then(staticQueryResults => {\n        const staticQueryResultsMap = {}\n\n        staticQueryResults.forEach(({ staticQueryHash, jsonPayload }) => {\n          staticQueryResultsMap[staticQueryHash] = jsonPayload\n          this.staticQueryDb[staticQueryHash] = jsonPayload\n        })\n\n        return staticQueryResultsMap\n      })\n\n      return Promise.all([componentChunkPromise, staticQueryBatchPromise]).then(\n        ([pageResources, staticQueryResults]) => {\n          let payload\n          if (pageResources) {\n            payload = { ...pageResources, staticQueryResults }\n            finalResult.payload = payload\n            emitter.emit(`onPostLoadPageResources`, {\n              page: payload,\n              pageResources: payload,\n            })\n          }\n\n          this.pageDb.set(pagePath, finalResult)\n\n          return payload\n        }\n      )\n    })\n\n    inFlightPromise\n      .then(response => {\n        this.inFlightDb.delete(pagePath)\n      })\n      .catch(error => {\n        this.inFlightDb.delete(pagePath)\n        throw error\n      })\n\n    this.inFlightDb.set(pagePath, inFlightPromise)\n\n    return inFlightPromise\n  }\n\n  // returns undefined if loading page ran into errors\n  loadPageSync(rawPath) {\n    const pagePath = findPath(rawPath)\n    if (this.pageDb.has(pagePath)) {\n      const pageData = this.pageDb.get(pagePath).payload\n      return pageData\n    }\n    return undefined\n  }\n\n  shouldPrefetch(pagePath) {\n    // Skip prefetching if we know user is on slow or constrained connection\n    if (!doesConnectionSupportPrefetch()) {\n      return false\n    }\n\n    // Check if the page exists.\n    if (this.pageDb.has(pagePath)) {\n      return false\n    }\n\n    return true\n  }\n\n  prefetch(pagePath) {\n    if (!this.shouldPrefetch(pagePath)) {\n      return false\n    }\n\n    // Tell plugins with custom prefetching logic that they should start\n    // prefetching this path.\n    if (!this.prefetchTriggered.has(pagePath)) {\n      this.apiRunner(`onPrefetchPathname`, { pathname: pagePath })\n      this.prefetchTriggered.add(pagePath)\n    }\n\n    // If a plugin has disabled core prefetching, stop now.\n    if (this.prefetchDisabled) {\n      return false\n    }\n\n    const realPath = findPath(pagePath)\n    // Todo make doPrefetch logic cacheable\n    // eslint-disable-next-line consistent-return\n    this.doPrefetch(realPath).then(() => {\n      if (!this.prefetchCompleted.has(pagePath)) {\n        this.apiRunner(`onPostPrefetchPathname`, { pathname: pagePath })\n        this.prefetchCompleted.add(pagePath)\n      }\n    })\n\n    return true\n  }\n\n  doPrefetch(pagePath) {\n    const pageDataUrl = createPageDataUrl(pagePath)\n    return prefetchHelper(pageDataUrl, {\n      crossOrigin: `anonymous`,\n      as: `fetch`,\n    }).then(() =>\n      // This was just prefetched, so will return a response from\n      // the cache instead of making another request to the server\n      this.loadPageDataJson(pagePath)\n    )\n  }\n\n  hovering(rawPath) {\n    this.loadPage(rawPath)\n  }\n\n  getResourceURLsForPathname(rawPath) {\n    const pagePath = findPath(rawPath)\n    const page = this.pageDataDb.get(pagePath)\n    if (page) {\n      const pageResources = toPageResources(page.payload)\n\n      return [\n        ...createComponentUrls(pageResources.page.componentChunkName),\n        createPageDataUrl(pagePath),\n      ]\n    } else {\n      return null\n    }\n  }\n\n  isPageNotFound(rawPath) {\n    const pagePath = findPath(rawPath)\n    const page = this.pageDb.get(pagePath)\n    return !page || page.notFound\n  }\n\n  loadAppData(retries = 0) {\n    return this.memoizedGet(`${__PATH_PREFIX__}/page-data/app-data.json`).then(\n      req => {\n        const { status, responseText } = req\n\n        let appData\n\n        if (status !== 200 && retries < 3) {\n          // Retry 3 times incase of non-200 responses\n          return this.loadAppData(retries + 1)\n        }\n\n        // Handle 200\n        if (status === 200) {\n          try {\n            const jsonPayload = JSON.parse(responseText)\n            if (jsonPayload.webpackCompilationHash === undefined) {\n              throw new Error(`not a valid app-data response`)\n            }\n\n            appData = jsonPayload\n          } catch (err) {\n            // continue regardless of error\n          }\n        }\n\n        return appData\n      }\n    )\n  }\n}\n\nconst createComponentUrls = componentChunkName =>\n  (window.___chunkMapping[componentChunkName] || []).map(\n    chunk => __PATH_PREFIX__ + chunk\n  )\n\nexport class ProdLoader extends BaseLoader {\n  constructor(asyncRequires, matchPaths) {\n    const loadComponent = chunkName =>\n      asyncRequires.components[chunkName]\n        ? asyncRequires.components[chunkName]()\n            .then(preferDefault)\n            // loader will handle the case when component is null\n            .catch(() => null)\n        : Promise.resolve()\n\n    super(loadComponent, matchPaths)\n  }\n\n  doPrefetch(pagePath) {\n    return super.doPrefetch(pagePath).then(result => {\n      if (result.status !== PageResourceStatus.Success) {\n        return Promise.resolve()\n      }\n      const pageData = result.payload\n      const chunkName = pageData.componentChunkName\n      const componentUrls = createComponentUrls(chunkName)\n      return Promise.all(componentUrls.map(prefetchHelper)).then(() => pageData)\n    })\n  }\n\n  loadPageDataJson(rawPath) {\n    return super.loadPageDataJson(rawPath).then(data => {\n      if (data.notFound) {\n        // check if html file exist using HEAD request:\n        // if it does we should navigate to it instead of showing 404\n        return doFetch(rawPath, `HEAD`).then(req => {\n          if (req.status === 200) {\n            // page (.html file) actually exist (or we asked for 404 )\n            // returning page resources status as errored to trigger\n            // regular browser navigation to given page\n            return {\n              status: PageResourceStatus.Error,\n            }\n          }\n\n          // if HEAD request wasn't 200, return notFound result\n          // and show 404 page\n          return data\n        })\n      }\n      return data\n    })\n  }\n}\n\nlet instance\n\nexport const setLoader = _loader => {\n  instance = _loader\n}\n\nexport const publicLoader = {\n  // Deprecated methods. As far as we're aware, these are only used by\n  // core gatsby and the offline plugin, however there's a very small\n  // chance they're called by others.\n  getResourcesForPathname: rawPath => {\n    console.warn(\n      `Warning: getResourcesForPathname is deprecated. Use loadPage instead`\n    )\n    return instance.i.loadPage(rawPath)\n  },\n  getResourcesForPathnameSync: rawPath => {\n    console.warn(\n      `Warning: getResourcesForPathnameSync is deprecated. Use loadPageSync instead`\n    )\n    return instance.i.loadPageSync(rawPath)\n  },\n  enqueue: rawPath => instance.prefetch(rawPath),\n\n  // Real methods\n  getResourceURLsForPathname: rawPath =>\n    instance.getResourceURLsForPathname(rawPath),\n  loadPage: rawPath => instance.loadPage(rawPath),\n  loadPageSync: rawPath => instance.loadPageSync(rawPath),\n  prefetch: rawPath => instance.prefetch(rawPath),\n  isPageNotFound: rawPath => instance.isPageNotFound(rawPath),\n  hovering: rawPath => instance.hovering(rawPath),\n  loadAppData: () => instance.loadAppData(),\n}\n\nexport default publicLoader\n\nexport function getStaticQueryResults() {\n  if (instance) {\n    return instance.staticQueryDb\n  } else {\n    return {}\n  }\n}\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.es/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n  return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","\"use strict\";\n\nvar offsetY = 0;\n\nvar getTargetOffset = function getTargetOffset(hash) {\n  var id = window.decodeURI(hash.replace(\"#\", \"\"));\n\n  if (id !== \"\") {\n    var element = document.getElementById(id);\n\n    if (element) {\n      var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;\n      var clientTop = document.documentElement.clientTop || document.body.clientTop || 0;\n      var computedStyles = window.getComputedStyle(element);\n      var scrollMarginTop = computedStyles.getPropertyValue(\"scroll-margin-top\") || computedStyles.getPropertyValue(\"scroll-snap-margin-top\") || \"0px\";\n      return element.getBoundingClientRect().top + scrollTop - parseInt(scrollMarginTop, 10) - clientTop - offsetY;\n    }\n  }\n\n  return null;\n};\n\nexports.onInitialClientRender = function (_, pluginOptions) {\n  if (pluginOptions.offsetY) {\n    offsetY = pluginOptions.offsetY;\n  }\n\n  requestAnimationFrame(function () {\n    var offset = getTargetOffset(window.location.hash);\n\n    if (offset !== null) {\n      window.scrollTo(0, offset);\n    }\n  });\n};\n\nexports.shouldUpdateScroll = function (_ref) {\n  var location = _ref.routerProps.location;\n  var offset = getTargetOffset(location.hash);\n  return offset !== null ? [0, offset] : true;\n};","\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.ScrollContainer = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nvar _router = require(\"@reach/router\");\n\n// TODO: In Gatsby v3, this file should be removed.\n// We are deprecating this in V2 in favor of useScrollRestoration\nvar propTypes = {\n  scrollKey: _propTypes.default.string.isRequired,\n  shouldUpdateScroll: _propTypes.default.func,\n  children: _propTypes.default.element.isRequired\n};\nvar hasNotWarnedDeprecation = true;\n\nvar ScrollContainerImplementation = /*#__PURE__*/function (_React$Component) {\n  (0, _inheritsLoose2.default)(ScrollContainerImplementation, _React$Component);\n\n  function ScrollContainerImplementation(props) {\n    var _this;\n\n    _this = _React$Component.call(this, props) || this;\n\n    if (process.env.NODE_ENV !== \"production\" && hasNotWarnedDeprecation) {\n      hasNotWarnedDeprecation = false;\n      console.log(\"Deprecation Warning:\\n\\n  Gatsby <ScrollContainer> is deprecated in Gatsby v2 and will be removed in Gatsby v3.\\n  Update to the React hook alternative useScrollRestoration, like this:.\\n  \\n  ```\\n  import React from 'react';\\n  import { useScrollRestoration } from 'gatsby-react-router-scroll';\\n\\n  function Component() {\\n    const scrollRestoration = useScrollRestoration('\" + _this.props.scrollKey + \"');\\n\\n    return <ul {...scrollRestoration} />;\\n  }\\n  ```\\n  \");\n    }\n\n    return _this;\n  }\n\n  var _proto = ScrollContainerImplementation.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    var _this2 = this;\n\n    // eslint-disable-next-line react/no-find-dom-node\n    var node = _reactDom.default.findDOMNode(this);\n\n    var _this$props = this.props,\n        location = _this$props.location,\n        scrollKey = _this$props.scrollKey;\n    if (!node) return;\n    node.addEventListener(\"scroll\", function () {\n      _this2.props.context.save(location, scrollKey, node.scrollTop);\n    });\n    var position = this.props.context.read(location, scrollKey);\n    node.scrollTo(0, position || 0);\n  };\n\n  _proto.render = function render() {\n    return this.props.children;\n  };\n\n  return ScrollContainerImplementation;\n}(React.Component);\n\nvar ScrollContainer = function ScrollContainer(props) {\n  return /*#__PURE__*/React.createElement(_router.Location, null, function (_ref) {\n    var location = _ref.location;\n    return /*#__PURE__*/React.createElement(_scrollHandler.ScrollContext.Consumer, null, function (context) {\n      return /*#__PURE__*/React.createElement(ScrollContainerImplementation, (0, _extends2.default)({}, props, {\n        context: context,\n        location: location\n      }));\n    });\n  });\n};\n\nexports.ScrollContainer = ScrollContainer;\nScrollContainer.propTypes = propTypes;","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nmodule.exports = function (key, value) {\n  try {\n    createNonEnumerableProperty(global, key, value);\n  } catch (error) {\n    global[key] = value;\n  } return value;\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","exports.f = Object.getOwnPropertySymbols;\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n  return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n  return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n    : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return nativeDefineProperty(O, P, Attributes);\n  } catch (error) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n","var store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n  store.inspectSource = function (it) {\n    return functionToString.call(it);\n  };\n}\n\nmodule.exports = store.inspectSource;\n","module.exports = false;\n","const preferDefault = m => (m && m.default) || m\n\nif (process.env.BUILD_STAGE === `develop`) {\n  module.exports = preferDefault(require(`./public-page-renderer-dev`))\n} else if (process.env.BUILD_STAGE === `build-javascript`) {\n  module.exports = preferDefault(require(`./public-page-renderer-prod`))\n} else {\n  module.exports = () => null\n}\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n  if (!isObject(it)) {\n    throw TypeError(String(it) + ' is not an object');\n  } return it;\n};\n","/*\n  Why commonjs and not ES imports/exports?\n\n  This module is used to alias `create-react-context` package, but drop the the actual implementation part\n  because Gatsby requires version of react that has implementatoin baked in.\n  \n  Package source is using ES modules:\n    - https://github.com/jamiebuilds/create-react-context/blob/v0.3.0/src/index.js\n  \n  But to build this package `babel-plugin-add-module-exports` is used ( https://www.npmjs.com/package/babel-plugin-add-module-exports).\n  Which result in both `module.exports` and `exports.default` being set to same thing.\n\n  We don't use that babel plugin so we only have `exports.default`.\n\n  This cause problems in various 3rd party react components that rely on `module.exports` being set.\n  See https://github.com/gatsbyjs/gatsby/issues/23645 for example of it.\n  \n  Instead of adding same babel plugin we mimic output here. Adding babel plugin just for this would:\n   a) unnecesairly slow down compilation for all other files (if we just apply it everywhere)\n   b) or complicate babel-loader configuration with overwrite specifically for this file\n*/\n\nconst { createContext } = require(`react`)\n\nmodule.exports = createContext\nmodule.exports.default = createContext\n","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n  return function (that, callbackfn, argumentsLength, memo) {\n    aFunction(callbackfn);\n    var O = toObject(that);\n    var self = IndexedObject(O);\n    var length = toLength(O.length);\n    var index = IS_RIGHT ? length - 1 : 0;\n    var i = IS_RIGHT ? -1 : 1;\n    if (argumentsLength < 2) while (true) {\n      if (index in self) {\n        memo = self[index];\n        index += i;\n        break;\n      }\n      index += i;\n      if (IS_RIGHT ? index < 0 : length <= index) {\n        throw TypeError('Reduce of empty array with no initial value');\n      }\n    }\n    for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n      memo = callbackfn(memo, self[index], index, O);\n    }\n    return memo;\n  };\n};\n\nmodule.exports = {\n  // `Array.prototype.reduce` method\n  // https://tc39.es/ecma262/#sec-array.prototype.reduce\n  left: createMethod(false),\n  // `Array.prototype.reduceRight` method\n  // https://tc39.es/ecma262/#sec-array.prototype.reduceright\n  right: createMethod(true)\n};\n","function _extends() {\n  module.exports = _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import React from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport loader from \"./loader\"\nimport InternalPageRenderer from \"./page-renderer\"\n\nconst ProdPageRenderer = ({ location }) => {\n  const pageResources = loader.loadPageSync(location.pathname)\n  if (!pageResources) {\n    return null\n  }\n  return React.createElement(InternalPageRenderer, {\n    location,\n    pageResources,\n    ...pageResources.json,\n  })\n}\n\nProdPageRenderer.propTypes = {\n  location: PropTypes.shape({\n    pathname: PropTypes.string.isRequired,\n  }).isRequired,\n}\n\nexport default ProdPageRenderer\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n  return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = function (it) {\n  if (typeof it != 'function') {\n    throw TypeError(String(it) + ' is not a function');\n  } return it;\n};\n","const plugins = require(`./api-runner-browser-plugins`)\nconst {\n  getResourcesForPathname,\n  getResourcesForPathnameSync,\n  getResourceURLsForPathname,\n  loadPage,\n  loadPageSync,\n} = require(`./loader`).publicLoader\n\nexports.apiRunner = (api, args = {}, defaultReturn, argTransform) => {\n  // Hooks for gatsby-cypress's API handler\n  if (process.env.CYPRESS_SUPPORT) {\n    if (window.___apiHandler) {\n      window.___apiHandler(api)\n    } else if (window.___resolvedAPIs) {\n      window.___resolvedAPIs.push(api)\n    } else {\n      window.___resolvedAPIs = [api]\n    }\n  }\n\n  let results = plugins.map(plugin => {\n    if (!plugin.plugin[api]) {\n      return undefined\n    }\n\n    // Deprecated April 2019. Use `loadPageSync` instead\n    args.getResourcesForPathnameSync = getResourcesForPathnameSync\n    // Deprecated April 2019. Use `loadPage` instead\n    args.getResourcesForPathname = getResourcesForPathname\n    args.getResourceURLsForPathname = getResourceURLsForPathname\n    args.loadPage = loadPage\n    args.loadPageSync = loadPageSync\n\n    const result = plugin.plugin[api](args, plugin.options)\n    if (result && argTransform) {\n      args = argTransform({ args, result, plugin })\n    }\n    return result\n  })\n\n  // Filter out undefined results.\n  results = results.filter(result => typeof result !== `undefined`)\n\n  if (results.length > 0) {\n    return results\n  } else if (defaultReturn) {\n    return [defaultReturn]\n  } else {\n    return []\n  }\n}\n\nexports.apiRunnerAsync = (api, args, defaultReturn) =>\n  plugins.reduce(\n    (previous, next) =>\n      next.plugin[api]\n        ? previous.then(() => next.plugin[api](args, next.options))\n        : previous,\n    Promise.resolve()\n  )\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\n\nvar defineProperty = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nmodule.exports = function (METHOD_NAME, options) {\n  if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n  if (!options) options = {};\n  var method = [][METHOD_NAME];\n  var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n  var argument0 = has(options, 0) ? options[0] : thrower;\n  var argument1 = has(options, 1) ? options[1] : undefined;\n\n  return cache[METHOD_NAME] = !!method && !fails(function () {\n    if (ACCESSORS && !DESCRIPTORS) return true;\n    var O = { length: -1 };\n\n    if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n    else O[1] = 1;\n\n    method.call(O, argument0, argument1);\n  });\n};\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return internalObjectKeys(O, hiddenKeys);\n};\n"],"sourceRoot":""}