@manyducks.co/dolla 2.0.0-alpha.6 → 2.0.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -7
- package/dist/index.js +139 -135
- package/dist/index.js.map +1 -1
- package/dist/jsx-dev-runtime.js +2 -2
- package/dist/jsx-runtime.js +2 -2
- package/dist/markup.d.ts +8 -0
- package/dist/nodes/html.d.ts +1 -1
- package/dist/{passthrough-CW8Ezjg-.js → passthrough-9kwwjgWk.js} +322 -287
- package/dist/passthrough-9kwwjgWk.js.map +1 -0
- package/dist/view.d.ts +16 -1
- package/notes/context-vars.md +21 -0
- package/notes/route-middleware.md +42 -0
- package/notes/scratch.md +37 -0
- package/package.json +1 -1
- package/dist/passthrough-CW8Ezjg-.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/views/default-crash-view.ts","../src/modules/http.ts","../src/modules/language.ts","../src/modules/render.ts","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/history/index.js","../src/routing.ts","../src/modules/router.ts","../src/modules/dolla.ts","../src/index.ts"],"sourcesContent":["import { cond, html } from \"../markup.js\";\n\n/**\n * Props passed to the crash view when a crash occurs.\n */\nexport type CrashViewProps = {\n /**\n * JavaScript Error object.\n */\n error: Error;\n\n /**\n * A string to identify the logger that reported this error.\n */\n loggerName: string;\n\n /**\n * Unique identifier to pinpoint the specific view that reported the crash.\n */\n uid?: string;\n};\n\nexport function DefaultCrashView(props: CrashViewProps) {\n return html`\n <div\n style=${{\n backgroundColor: \"#880000\",\n color: \"#fff\",\n padding: \"2rem\",\n position: \"fixed\",\n inset: 0,\n fontSize: \"20px\",\n }}\n >\n <h1 style=${{ marginBottom: \"0.5rem\" }}>The app has crashed</h1>\n <p style=${{ marginBottom: \"0.25rem\" }}>\n <span style=${{ fontFamily: \"monospace\" }}>${props.loggerName}</span>\n ${cond(props.uid, html`<span style=${{ fontFamily: \"monospace\", opacity: 0.5 }}> [uid: ${props.uid}]</span>`)}\n ${\" \"}says:\n </p>\n <blockquote\n style=${{\n backgroundColor: \"#991111\",\n padding: \"0.25em\",\n borderRadius: \"6px\",\n fontFamily: \"monospace\",\n marginBottom: \"1rem\",\n }}\n >\n <span\n style=${{\n display: \"inline-block\",\n backgroundColor: \"red\",\n padding: \"0.1em 0.4em\",\n marginRight: \"0.5em\",\n borderRadius: \"4px\",\n fontSize: \"0.9em\",\n fontWeight: \"bold\",\n }}\n >\n ${props.error.name}\n </span>\n ${props.error.message}\n </blockquote>\n\n <p>Please see the browser console for details.</p>\n </div>\n `;\n}\n","import { isObject } from \"../typeChecking.js\";\n\n/**\n * A simple HTTP client with middleware support. Middleware applies to all requests made through this store,\n * so it's the perfect way to handle things like auth headers and permission checks for API calls.\n */\nexport class HTTP {\n #middleware: HTTPMiddleware[] = [];\n #fetch = getDefaultFetch();\n\n /**\n * Adds a new middleware that will apply to subsequent requests.\n * Returns a function to remove this middleware.\n *\n * @param middleware - A middleware function that will intercept requests.\n */\n use(fn: HTTPMiddleware) {\n this.#middleware.push(fn);\n\n // Call returned function to remove this middleware for subsequent requests.\n return () => {\n this.#middleware.splice(this.#middleware.indexOf(fn), 1);\n };\n }\n\n async get<ResBody = unknown>(uri: string, options?: RequestOptions<never>) {\n return this.#request<ResBody, never>(\"get\", uri, options);\n }\n\n async put<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"put\", uri, options);\n }\n\n async patch<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"patch\", uri, options);\n }\n\n async post<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"post\", uri, options);\n }\n\n async delete<ResBody = unknown>(uri: string, options?: RequestOptions<never>) {\n return this.#request<ResBody, never>(\"delete\", uri, options);\n }\n\n async head<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"head\", uri, options);\n }\n\n async options<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"options\", uri, options);\n }\n\n async trace<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"trace\", uri, options);\n }\n\n async #request<ResBody, ReqBody>(method: string, uri: string, options?: RequestOptions<any>) {\n return makeRequest<ResBody, ReqBody>({\n ...options,\n method,\n uri,\n middleware: this.#middleware,\n fetch: this.#fetch,\n });\n }\n}\n\nfunction getDefaultFetch(): typeof window.fetch {\n if (typeof window !== \"undefined\" && window.fetch) {\n return window.fetch.bind(window);\n }\n\n if (typeof global !== \"undefined\" && global.fetch) {\n return global.fetch.bind(global);\n }\n\n throw new Error(\"Running in neither browser nor node. Please run this app in one of the supported environments.\");\n}\n\n/*====================*\\\n|| Request ||\n\\*====================*/\n\nexport type HTTPMiddleware = (\n request: HTTPRequest<unknown>,\n next: () => Promise<HTTPResponse<unknown>>,\n) => void | Promise<void>;\n\nexport interface RequestOptions<ReqBody> {\n /**\n * Body to send with the request.\n */\n body?: ReqBody;\n\n /**\n * Headers to send with the request.\n */\n headers?: Record<string, any> | Headers;\n\n /**\n * Query params to interpolate into the URL.\n */\n query?: Record<string, any> | URLSearchParams;\n}\n\nexport interface HTTPRequest<Body> {\n method: string;\n uri: string;\n readonly sameOrigin: boolean;\n headers: Headers;\n query: URLSearchParams;\n body: Body;\n}\n\nexport interface HTTPResponse<Body> {\n method: string;\n uri: string;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: Body;\n}\n\nexport class HTTPResponseError extends Error {\n response;\n\n constructor(response: HTTPResponse<any>) {\n const { status, statusText, method, uri } = response;\n const message = `${status} ${statusText}: Request failed (${method.toUpperCase()} ${uri})`;\n\n super(message);\n\n this.response = response;\n }\n}\n\ninterface MakeRequestConfig<ReqBody> extends RequestOptions<ReqBody> {\n method: string;\n uri: string;\n middleware: HTTPMiddleware[];\n fetch: typeof window.fetch;\n}\n\nasync function makeRequest<ResBody, ReqBody>(config: MakeRequestConfig<ReqBody>) {\n const { headers, query, fetch, middleware } = config;\n\n const request: HTTPRequest<ReqBody> = {\n method: config.method,\n uri: config.uri,\n get sameOrigin() {\n return !request.uri.startsWith(\"http\");\n },\n query: new URLSearchParams(),\n headers: new Headers(),\n body: config.body!,\n };\n\n // Read headers into request\n if (headers) {\n if (headers instanceof Map || headers instanceof Headers) {\n headers.forEach((value, key) => {\n request.headers.set(key, value);\n });\n } else if (headers != null && typeof headers === \"object\" && !Array.isArray(headers)) {\n for (const name in headers) {\n const value = headers[name];\n if (value instanceof Date) {\n request.headers.set(name, value.toISOString());\n } else if (value != null) {\n request.headers.set(name, String(value));\n }\n }\n } else {\n throw new TypeError(`Unknown headers type. Got: ${headers}`);\n }\n }\n\n // Read query params into request\n if (query) {\n if (query instanceof Map || query instanceof URLSearchParams) {\n query.forEach((value, key) => {\n request.query.set(key, value);\n });\n } else if (query != null && typeof query === \"object\" && !Array.isArray(query)) {\n for (const name in query) {\n const value = query[name];\n if (value instanceof Date) {\n request.query.set(name, value.toISOString());\n } else if (value != null) {\n request.query.set(name, String(value));\n }\n }\n } else {\n throw new TypeError(`Unknown query params type. Got: ${query}`);\n }\n }\n\n let response: HTTPResponse<ResBody>;\n\n // This is the function that performs the actual request after the final middleware.\n const handler = async () => {\n const query = request.query.toString();\n const fullURL = query.length > 0 ? request.uri + \"?\" + query : request.uri;\n\n let reqBody: BodyInit;\n\n if (!request.headers.has(\"content-type\") && isObject(request.body)) {\n // Auto-detect JSON bodies and encode as a string with correct headers.\n request.headers.set(\"content-type\", \"application/json\");\n reqBody = JSON.stringify(request.body);\n } else {\n reqBody = request.body as BodyInit;\n }\n\n const fetched = await fetch(fullURL, {\n method: request.method,\n headers: request.headers,\n body: reqBody,\n });\n\n // Auto-parse response body based on content-type header\n const headers = Object.fromEntries<string>(fetched.headers.entries());\n const contentType = headers[\"content-type\"];\n\n let body: ResBody;\n\n if (contentType?.includes(\"application/json\")) {\n body = await fetched.json();\n } else if (contentType?.includes(\"application/x-www-form-urlencoded\")) {\n body = (await fetched.formData()) as ResBody;\n } else {\n body = (await fetched.text()) as ResBody;\n }\n\n response = {\n method: request.method,\n uri: request.uri,\n status: fetched.status,\n statusText: fetched.statusText,\n headers: headers,\n body,\n };\n };\n\n if (middleware.length > 0) {\n const mount = (index = 0) => {\n const current = middleware[index];\n const next = middleware[index + 1] ? mount(index + 1) : handler;\n\n return async () =>\n current(request, async () => {\n await next();\n return response;\n });\n };\n\n await mount()();\n } else {\n await handler();\n }\n\n if (response!.status < 200 || response!.status >= 400) {\n throw new HTTPResponseError(response!);\n }\n\n return response!;\n}\n","import { createState, derive, isState, toState, type State } from \"../state.js\";\nimport { isFunction, isObject, isString } from \"../typeChecking.js\";\nimport type { Stringable } from \"../types.js\";\nimport { deepEqual } from \"../utils.js\";\nimport type { Dolla, Logger } from \"./dolla.js\";\n\n// ----- Types ----- //\n\n// TODO: Is there a good way to represent infinitely nested recursive types?\n/**\n * An object where values are either a translated string or another nested Translation object.\n */\ntype LocalizedStrings = Record<\n string,\n string | Record<string, string | Record<string, string | Record<string, string>>>\n>;\n\nexport interface LanguageConfig {\n name: string;\n\n /**\n * Path to a JSON file with translated strings for this language.\n */\n path?: string;\n\n /**\n * A callback function that returns a Promise that resolves to the translation object for this language.\n */\n fetch?: () => Promise<LocalizedStrings>;\n}\n\nexport type LanguageSetupOptions = {\n /**\n * Default language to load on startup\n */\n initialLanguage?: string | null;\n\n languages: LanguageConfig[];\n};\n\n// ----- Code ----- //\n\nclass Localization {\n dolla: Dolla;\n config: LanguageConfig;\n strings?: LocalizedStrings;\n\n constructor(config: LanguageConfig, dolla: Dolla) {\n this.config = config;\n this.dolla = dolla;\n }\n\n async load(): Promise<LocalizedStrings> {\n if (this.strings == null) {\n if (isFunction(this.config.fetch)) {\n const strings = await this.config.fetch();\n if (isObject(strings)) {\n this.strings = strings as LocalizedStrings;\n } else {\n throw new Error(`Fetch function did not return an object of language strings: ${strings}`);\n }\n } else if (isString(this.config.path)) {\n const res = await this.dolla.http.get(this.config.path);\n if (res.status >= 200 && res.status < 300) {\n if (isObject(res.body)) {\n this.strings = res.body as LocalizedStrings;\n } else {\n throw new Error(\n `Language path '${this.config.path}' did not return an object of language strings: ${res.body}`,\n );\n }\n } else {\n throw new Error(`HTTP request failed.`);\n }\n }\n }\n\n if (this.strings == null) {\n throw new Error(`Language could not be loaded.`);\n } else {\n return this.strings;\n }\n }\n}\n\nexport class Language {\n #dolla: Dolla;\n #logger: Logger;\n #localizations = new Map<string, Localization>();\n #cache: [key: string, values: Record<string, Stringable | State<Stringable>> | undefined, readable: State<string>][] =\n [];\n\n #initialLanguage = \"auto\";\n\n $current: State<string | undefined>;\n #setCurrent;\n #$strings;\n #setStrings;\n\n constructor(dolla: Dolla) {\n this.#dolla = dolla;\n this.#logger = dolla.createLogger(\"dolla/language\");\n\n const [$current, setCurrent] = createState<string>();\n const [$strings, setStrings] = createState<LocalizedStrings>();\n\n this.$current = $current;\n this.#setCurrent = setCurrent;\n this.#$strings = $strings;\n this.#setStrings = setStrings;\n\n /**\n * Load language before the app mounts.\n */\n dolla.beforeMount(async () => {\n if (this.#localizations.size > 0) {\n await this.setLanguage(this.#initialLanguage);\n }\n });\n }\n\n get supportedLanguages() {\n return [...this.#localizations.keys()];\n }\n\n setup(options: LanguageSetupOptions) {\n // Convert languages into Language instances.\n options.languages.forEach((entry) => {\n this.#localizations.set(entry.name, new Localization(entry, this.#dolla));\n });\n\n // Check that initialLanguage is actually registered.\n if (options.initialLanguage && options.initialLanguage !== \"auto\") {\n const isRegistered = options.languages.some((entry) => entry.name === options.initialLanguage);\n if (!isRegistered) {\n throw new Error(`Initial language '${options.initialLanguage}' has no registered translation.`);\n }\n this.#initialLanguage = options.initialLanguage;\n }\n\n this.#logger.info(\n `${this.#localizations.size} language${this.#localizations.size === 1 ? \"\" : \"s\"} supported: '${[...this.#localizations.keys()].join(\"', '\")}'`,\n );\n }\n\n async setLanguage(name: string) {\n let realName!: string;\n\n if (name === \"auto\") {\n let names = [];\n\n if (typeof navigator === \"object\") {\n const nav = navigator as any;\n\n if (nav.languages?.length > 0) {\n names.push(...nav.languages);\n } else if (nav.language) {\n names.push(nav.language);\n } else if (nav.browserLanguage) {\n names.push(nav.browserLanguage);\n } else if (nav.userLanguage) {\n names.push(nav.userLanguage);\n }\n }\n\n for (const name of names) {\n if (this.#localizations.has(name)) {\n // Found a matching language.\n realName = name;\n }\n }\n } else {\n // Tag is the actual tag to set.\n if (this.#localizations.has(name)) {\n realName = name;\n }\n }\n\n if (realName == null) {\n const firstLanguage = this.#localizations.keys().next().value;\n if (firstLanguage) {\n realName = firstLanguage;\n }\n }\n\n if (!realName || !this.#localizations.has(realName)) {\n throw new Error(`Language '${name}' is not configured for this app.`);\n }\n\n const lang = this.#localizations.get(realName)!;\n\n try {\n const translation = await lang.load();\n\n this.#setStrings(translation);\n this.#setCurrent(realName);\n\n this.#logger.info(\"set language to \" + realName);\n } catch (error) {\n if (error instanceof Error) {\n this.#logger.crash(error);\n }\n }\n }\n\n /**\n * Returns a State containing the value at `key`.\n \n * @param key - Key to the translated value.\n * @param values - A map of {{placeholder}} names and the values to replace them with.\n */\n t(key: string, values?: Record<string, Stringable | State<Stringable>>): State<string> {\n if (this === undefined) {\n throw new Error(\n `The 't' function cannot be destructured. If you need a standalone version you can import it like so: 'import { t } from \"@manyducks.co/dolla\"'`,\n );\n }\n\n if (!this.$current.get()) {\n return $noLanguageValue;\n }\n\n const cached = this.#getCached(key, values);\n if (cached) {\n return cached;\n }\n\n if (values) {\n const stateValues: Record<string, State<any>> = {};\n\n for (const [key, value] of Object.entries<any>(values)) {\n if (isState(value)) {\n stateValues[key] = value;\n }\n }\n\n // This looks extremely weird, but it creates a joined state\n // that contains the translation with interpolated observable values.\n const readableEntries = Object.entries(stateValues);\n if (readableEntries.length > 0) {\n const readables = readableEntries.map((x) => x[1]);\n const $merged = derive([this.#$strings, ...readables], (t, ...entryValues) => {\n const entries = entryValues.map((_, i) => readableEntries[i]);\n const mergedValues = {\n ...values,\n };\n\n for (let i = 0; i < entries.length; i++) {\n const key = entries[i][0];\n mergedValues[key] = entryValues[i];\n }\n\n const result = resolve(t, key) || `[NO TRANSLATION: ${key}]`;\n return replaceMustaches(result, mergedValues);\n });\n\n this.#cache.push([key, values, $merged]);\n\n return $merged;\n }\n }\n\n const $replaced = derive([this.#$strings], (t) => {\n let result = resolve(t, key) || `[NO TRANSLATION: ${key}]`;\n\n if (values) {\n result = replaceMustaches(result, values);\n }\n\n return result;\n });\n\n this.#cache.push([key, values, $replaced]);\n\n return $replaced;\n }\n\n #getCached(key: string, values?: Record<string, Stringable | State<Stringable>>): State<string> | undefined {\n for (const entry of this.#cache) {\n if (entry[0] === key && deepEqual(entry[1], values)) {\n return entry[2];\n }\n }\n }\n}\n\n// Fallback labels for missing state and data.\nconst $noLanguageValue = toState(\"[NO LANGUAGE SET]\");\n\n/**\n * Replaces {{placeholders}} with values in translated strings.\n */\nfunction replaceMustaches(template: string, values: Record<string, Stringable>) {\n for (const name in values) {\n template = template.replace(`{{${name}}}`, String(values[name]));\n }\n return template;\n}\n\nfunction resolve(object: any, key: string) {\n const parsed = String(key)\n .split(/[\\.\\[\\]]/)\n .filter((part) => part.trim() !== \"\");\n let value = object;\n\n while (parsed.length > 0) {\n const part = parsed.shift()!;\n\n if (value != null) {\n value = value[part];\n } else {\n value = undefined;\n }\n }\n\n return value;\n}\n","import type { Dolla, Logger } from \"./dolla.js\";\n\nexport class Render {\n #dolla: Dolla;\n #logger: Logger;\n\n // Keyed updates ensure only the most recent callback queued with a certain key\n // will be called, keeping DOM operations to a minimum.\n #keyedUpdates = new Map<string, () => void>();\n\n // All unkeyed updates are run on every batch.\n #unkeyedUpdates: (() => void)[] = [];\n\n #reads: (() => void)[] = [];\n\n #isUpdating = false;\n\n constructor(dolla: Dolla) {\n this.#dolla = dolla;\n this.#logger = dolla.createLogger(\"dolla/render\");\n }\n\n /**\n * Queues a callback to run in the next render batch.\n * Running your DOM mutations in update callbacks reduces layout thrashing.\n * Returns a Promise that resolves once the callback has run.\n */\n update(callback: () => void, key?: string): Promise<void> {\n return new Promise((resolve) => {\n if (key) {\n this.#keyedUpdates.set(key, () => {\n callback();\n resolve();\n });\n } else {\n this.#unkeyedUpdates.push(() => {\n callback();\n resolve();\n });\n }\n\n if (!this.#isUpdating && this.#dolla.isMounted) {\n this.#isUpdating = true;\n this.#runUpdates();\n }\n });\n }\n\n /**\n * Queues a callback that reads DOM information to run after the next render batch,\n * ensuring all writes have been performed before reading.\n * Returns a Promise that resolves once the callback has run.\n */\n async read(callback: () => void): Promise<void> {\n return new Promise((resolve) => {\n this.#reads.push(() => {\n callback();\n resolve();\n });\n\n if (!this.#isUpdating && this.#dolla.isMounted) {\n this.#isUpdating = true;\n this.#runUpdates();\n }\n });\n }\n\n #runUpdates() {\n const totalQueued = this.#keyedUpdates.size + this.#unkeyedUpdates.length;\n\n if (!this.#dolla.isMounted || totalQueued === 0) {\n this.#isUpdating = false;\n }\n\n if (!this.#isUpdating) {\n for (const callback of this.#reads) {\n callback();\n }\n this.#reads = [];\n return;\n }\n\n requestAnimationFrame(() => {\n this.#logger.info(`Batching ${this.#keyedUpdates.size + this.#unkeyedUpdates.length} queued DOM update(s).`);\n\n // Run keyed updates first.\n for (const callback of this.#keyedUpdates.values()) {\n callback();\n }\n this.#keyedUpdates.clear();\n\n // Run unkeyed updates second.\n for (const callback of this.#unkeyedUpdates) {\n callback();\n }\n this.#unkeyedUpdates = [];\n\n // Trigger again to catch updates queued while this batch was running.\n this.#runUpdates();\n });\n }\n}\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","import _extends from '@babel/runtime/helpers/esm/extends';\n\n/**\r\n * Actions represent the type of change to a location value.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#action\r\n */\nvar Action;\n\n(function (Action) {\n /**\r\n * A POP indicates a change to an arbitrary index in the history stack, such\r\n * as a back or forward navigation. It does not describe the direction of the\r\n * navigation, only that the current index changed.\r\n *\r\n * Note: This is the default action for newly created history objects.\r\n */\n Action[\"Pop\"] = \"POP\";\n /**\r\n * A PUSH indicates a new entry being added to the history stack, such as when\r\n * a link is clicked and a new page loads. When this happens, all subsequent\r\n * entries in the stack are lost.\r\n */\n\n Action[\"Push\"] = \"PUSH\";\n /**\r\n * A REPLACE indicates the entry at the current index in the history stack\r\n * being replaced by a new one.\r\n */\n\n Action[\"Replace\"] = \"REPLACE\";\n})(Action || (Action = {}));\n\nvar readOnly = process.env.NODE_ENV !== \"production\" ? function (obj) {\n return Object.freeze(obj);\n} : function (obj) {\n return obj;\n};\n\nfunction warning(cond, message) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== 'undefined') console.warn(message);\n\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience so you can more easily\n // find the source for a warning that appears in the console by\n // enabling \"pause on exceptions\" in your JavaScript debugger.\n throw new Error(message); // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n\nvar BeforeUnloadEventType = 'beforeunload';\nvar HashChangeEventType = 'hashchange';\nvar PopStateEventType = 'popstate';\n/**\r\n * Browser history stores the location in regular URLs. This is the standard for\r\n * most web apps, but it requires some configuration on the server to ensure you\r\n * serve the same app at multiple URLs.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\r\n */\n\nfunction createBrowserHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$window = _options.window,\n window = _options$window === void 0 ? document.defaultView : _options$window;\n var globalHistory = window.history;\n\n function getIndexAndLocation() {\n var _window$location = window.location,\n pathname = _window$location.pathname,\n search = _window$location.search,\n hash = _window$location.hash;\n var state = globalHistory.state || {};\n return [state.idx, readOnly({\n pathname: pathname,\n search: search,\n hash: hash,\n state: state.usr || null,\n key: state.key || 'default'\n })];\n }\n\n var blockedPopTx = null;\n\n function handlePop() {\n if (blockedPopTx) {\n blockers.call(blockedPopTx);\n blockedPopTx = null;\n } else {\n var nextAction = Action.Pop;\n\n var _getIndexAndLocation = getIndexAndLocation(),\n nextIndex = _getIndexAndLocation[0],\n nextLocation = _getIndexAndLocation[1];\n\n if (blockers.length) {\n if (nextIndex != null) {\n var delta = index - nextIndex;\n\n if (delta) {\n // Revert the POP\n blockedPopTx = {\n action: nextAction,\n location: nextLocation,\n retry: function retry() {\n go(delta * -1);\n }\n };\n go(delta);\n }\n } else {\n // Trying to POP to a location with no index. We did not create\n // this location, so we can't effectively block the navigation.\n process.env.NODE_ENV !== \"production\" ? warning(false, // TODO: Write up a doc that explains our blocking strategy in\n // detail and link to it here so people can understand better what\n // is going on and how to avoid it.\n \"You are trying to block a POP navigation to a location that was not \" + \"created by the history library. The block will fail silently in \" + \"production, but in general you should do all navigation with the \" + \"history library (instead of using window.history.pushState directly) \" + \"to avoid this situation.\") : void 0;\n }\n } else {\n applyTx(nextAction);\n }\n }\n }\n\n window.addEventListener(PopStateEventType, handlePop);\n var action = Action.Pop;\n\n var _getIndexAndLocation2 = getIndexAndLocation(),\n index = _getIndexAndLocation2[0],\n location = _getIndexAndLocation2[1];\n\n var listeners = createEvents();\n var blockers = createEvents();\n\n if (index == null) {\n index = 0;\n globalHistory.replaceState(_extends({}, globalHistory.state, {\n idx: index\n }), '');\n }\n\n function createHref(to) {\n return typeof to === 'string' ? to : createPath(to);\n } // state defaults to `null` because `window.history.state` does\n\n\n function getNextLocation(to, state) {\n if (state === void 0) {\n state = null;\n }\n\n return readOnly(_extends({\n pathname: location.pathname,\n hash: '',\n search: ''\n }, typeof to === 'string' ? parsePath(to) : to, {\n state: state,\n key: createKey()\n }));\n }\n\n function getHistoryStateAndUrl(nextLocation, index) {\n return [{\n usr: nextLocation.state,\n key: nextLocation.key,\n idx: index\n }, createHref(nextLocation)];\n }\n\n function allowTx(action, location, retry) {\n return !blockers.length || (blockers.call({\n action: action,\n location: location,\n retry: retry\n }), false);\n }\n\n function applyTx(nextAction) {\n action = nextAction;\n\n var _getIndexAndLocation3 = getIndexAndLocation();\n\n index = _getIndexAndLocation3[0];\n location = _getIndexAndLocation3[1];\n listeners.call({\n action: action,\n location: location\n });\n }\n\n function push(to, state) {\n var nextAction = Action.Push;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n push(to, state);\n }\n\n if (allowTx(nextAction, nextLocation, retry)) {\n var _getHistoryStateAndUr = getHistoryStateAndUrl(nextLocation, index + 1),\n historyState = _getHistoryStateAndUr[0],\n url = _getHistoryStateAndUr[1]; // TODO: Support forced reloading\n // try...catch because iOS limits us to 100 pushState calls :/\n\n\n try {\n globalHistory.pushState(historyState, '', url);\n } catch (error) {\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n applyTx(nextAction);\n }\n }\n\n function replace(to, state) {\n var nextAction = Action.Replace;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n replace(to, state);\n }\n\n if (allowTx(nextAction, nextLocation, retry)) {\n var _getHistoryStateAndUr2 = getHistoryStateAndUrl(nextLocation, index),\n historyState = _getHistoryStateAndUr2[0],\n url = _getHistoryStateAndUr2[1]; // TODO: Support forced reloading\n\n\n globalHistory.replaceState(historyState, '', url);\n applyTx(nextAction);\n }\n }\n\n function go(delta) {\n globalHistory.go(delta);\n }\n\n var history = {\n get action() {\n return action;\n },\n\n get location() {\n return location;\n },\n\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n back: function back() {\n go(-1);\n },\n forward: function forward() {\n go(1);\n },\n listen: function listen(listener) {\n return listeners.push(listener);\n },\n block: function block(blocker) {\n var unblock = blockers.push(blocker);\n\n if (blockers.length === 1) {\n window.addEventListener(BeforeUnloadEventType, promptBeforeUnload);\n }\n\n return function () {\n unblock(); // Remove the beforeunload listener so the document may\n // still be salvageable in the pagehide event.\n // See https://html.spec.whatwg.org/#unloading-documents\n\n if (!blockers.length) {\n window.removeEventListener(BeforeUnloadEventType, promptBeforeUnload);\n }\n };\n }\n };\n return history;\n}\n/**\r\n * Hash history stores the location in window.location.hash. This makes it ideal\r\n * for situations where you don't want to send the location to the server for\r\n * some reason, either because you do cannot configure it or the URL space is\r\n * reserved for something else.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\r\n */\n\nfunction createHashHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options2 = options,\n _options2$window = _options2.window,\n window = _options2$window === void 0 ? document.defaultView : _options2$window;\n var globalHistory = window.history;\n\n function getIndexAndLocation() {\n var _parsePath = parsePath(window.location.hash.substr(1)),\n _parsePath$pathname = _parsePath.pathname,\n pathname = _parsePath$pathname === void 0 ? '/' : _parsePath$pathname,\n _parsePath$search = _parsePath.search,\n search = _parsePath$search === void 0 ? '' : _parsePath$search,\n _parsePath$hash = _parsePath.hash,\n hash = _parsePath$hash === void 0 ? '' : _parsePath$hash;\n\n var state = globalHistory.state || {};\n return [state.idx, readOnly({\n pathname: pathname,\n search: search,\n hash: hash,\n state: state.usr || null,\n key: state.key || 'default'\n })];\n }\n\n var blockedPopTx = null;\n\n function handlePop() {\n if (blockedPopTx) {\n blockers.call(blockedPopTx);\n blockedPopTx = null;\n } else {\n var nextAction = Action.Pop;\n\n var _getIndexAndLocation4 = getIndexAndLocation(),\n nextIndex = _getIndexAndLocation4[0],\n nextLocation = _getIndexAndLocation4[1];\n\n if (blockers.length) {\n if (nextIndex != null) {\n var delta = index - nextIndex;\n\n if (delta) {\n // Revert the POP\n blockedPopTx = {\n action: nextAction,\n location: nextLocation,\n retry: function retry() {\n go(delta * -1);\n }\n };\n go(delta);\n }\n } else {\n // Trying to POP to a location with no index. We did not create\n // this location, so we can't effectively block the navigation.\n process.env.NODE_ENV !== \"production\" ? warning(false, // TODO: Write up a doc that explains our blocking strategy in\n // detail and link to it here so people can understand better\n // what is going on and how to avoid it.\n \"You are trying to block a POP navigation to a location that was not \" + \"created by the history library. The block will fail silently in \" + \"production, but in general you should do all navigation with the \" + \"history library (instead of using window.history.pushState directly) \" + \"to avoid this situation.\") : void 0;\n }\n } else {\n applyTx(nextAction);\n }\n }\n }\n\n window.addEventListener(PopStateEventType, handlePop); // popstate does not fire on hashchange in IE 11 and old (trident) Edge\n // https://developer.mozilla.org/de/docs/Web/API/Window/popstate_event\n\n window.addEventListener(HashChangeEventType, function () {\n var _getIndexAndLocation5 = getIndexAndLocation(),\n nextLocation = _getIndexAndLocation5[1]; // Ignore extraneous hashchange events.\n\n\n if (createPath(nextLocation) !== createPath(location)) {\n handlePop();\n }\n });\n var action = Action.Pop;\n\n var _getIndexAndLocation6 = getIndexAndLocation(),\n index = _getIndexAndLocation6[0],\n location = _getIndexAndLocation6[1];\n\n var listeners = createEvents();\n var blockers = createEvents();\n\n if (index == null) {\n index = 0;\n globalHistory.replaceState(_extends({}, globalHistory.state, {\n idx: index\n }), '');\n }\n\n function getBaseHref() {\n var base = document.querySelector('base');\n var href = '';\n\n if (base && base.getAttribute('href')) {\n var url = window.location.href;\n var hashIndex = url.indexOf('#');\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n\n return href;\n }\n\n function createHref(to) {\n return getBaseHref() + '#' + (typeof to === 'string' ? to : createPath(to));\n }\n\n function getNextLocation(to, state) {\n if (state === void 0) {\n state = null;\n }\n\n return readOnly(_extends({\n pathname: location.pathname,\n hash: '',\n search: ''\n }, typeof to === 'string' ? parsePath(to) : to, {\n state: state,\n key: createKey()\n }));\n }\n\n function getHistoryStateAndUrl(nextLocation, index) {\n return [{\n usr: nextLocation.state,\n key: nextLocation.key,\n idx: index\n }, createHref(nextLocation)];\n }\n\n function allowTx(action, location, retry) {\n return !blockers.length || (blockers.call({\n action: action,\n location: location,\n retry: retry\n }), false);\n }\n\n function applyTx(nextAction) {\n action = nextAction;\n\n var _getIndexAndLocation7 = getIndexAndLocation();\n\n index = _getIndexAndLocation7[0];\n location = _getIndexAndLocation7[1];\n listeners.call({\n action: action,\n location: location\n });\n }\n\n function push(to, state) {\n var nextAction = Action.Push;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n push(to, state);\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(nextLocation.pathname.charAt(0) === '/', \"Relative pathnames are not supported in hash history.push(\" + JSON.stringify(to) + \")\") : void 0;\n\n if (allowTx(nextAction, nextLocation, retry)) {\n var _getHistoryStateAndUr3 = getHistoryStateAndUrl(nextLocation, index + 1),\n historyState = _getHistoryStateAndUr3[0],\n url = _getHistoryStateAndUr3[1]; // TODO: Support forced reloading\n // try...catch because iOS limits us to 100 pushState calls :/\n\n\n try {\n globalHistory.pushState(historyState, '', url);\n } catch (error) {\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n applyTx(nextAction);\n }\n }\n\n function replace(to, state) {\n var nextAction = Action.Replace;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n replace(to, state);\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(nextLocation.pathname.charAt(0) === '/', \"Relative pathnames are not supported in hash history.replace(\" + JSON.stringify(to) + \")\") : void 0;\n\n if (allowTx(nextAction, nextLocation, retry)) {\n var _getHistoryStateAndUr4 = getHistoryStateAndUrl(nextLocation, index),\n historyState = _getHistoryStateAndUr4[0],\n url = _getHistoryStateAndUr4[1]; // TODO: Support forced reloading\n\n\n globalHistory.replaceState(historyState, '', url);\n applyTx(nextAction);\n }\n }\n\n function go(delta) {\n globalHistory.go(delta);\n }\n\n var history = {\n get action() {\n return action;\n },\n\n get location() {\n return location;\n },\n\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n back: function back() {\n go(-1);\n },\n forward: function forward() {\n go(1);\n },\n listen: function listen(listener) {\n return listeners.push(listener);\n },\n block: function block(blocker) {\n var unblock = blockers.push(blocker);\n\n if (blockers.length === 1) {\n window.addEventListener(BeforeUnloadEventType, promptBeforeUnload);\n }\n\n return function () {\n unblock(); // Remove the beforeunload listener so the document may\n // still be salvageable in the pagehide event.\n // See https://html.spec.whatwg.org/#unloading-documents\n\n if (!blockers.length) {\n window.removeEventListener(BeforeUnloadEventType, promptBeforeUnload);\n }\n };\n }\n };\n return history;\n}\n/**\r\n * Memory history stores the current location in memory. It is designed for use\r\n * in stateful non-browser environments like tests and React Native.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#creatememoryhistory\r\n */\n\nfunction createMemoryHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options3 = options,\n _options3$initialEntr = _options3.initialEntries,\n initialEntries = _options3$initialEntr === void 0 ? ['/'] : _options3$initialEntr,\n initialIndex = _options3.initialIndex;\n var entries = initialEntries.map(function (entry) {\n var location = readOnly(_extends({\n pathname: '/',\n search: '',\n hash: '',\n state: null,\n key: createKey()\n }, typeof entry === 'string' ? parsePath(entry) : entry));\n process.env.NODE_ENV !== \"production\" ? warning(location.pathname.charAt(0) === '/', \"Relative pathnames are not supported in createMemoryHistory({ initialEntries }) (invalid entry: \" + JSON.stringify(entry) + \")\") : void 0;\n return location;\n });\n var index = clamp(initialIndex == null ? entries.length - 1 : initialIndex, 0, entries.length - 1);\n var action = Action.Pop;\n var location = entries[index];\n var listeners = createEvents();\n var blockers = createEvents();\n\n function createHref(to) {\n return typeof to === 'string' ? to : createPath(to);\n }\n\n function getNextLocation(to, state) {\n if (state === void 0) {\n state = null;\n }\n\n return readOnly(_extends({\n pathname: location.pathname,\n search: '',\n hash: ''\n }, typeof to === 'string' ? parsePath(to) : to, {\n state: state,\n key: createKey()\n }));\n }\n\n function allowTx(action, location, retry) {\n return !blockers.length || (blockers.call({\n action: action,\n location: location,\n retry: retry\n }), false);\n }\n\n function applyTx(nextAction, nextLocation) {\n action = nextAction;\n location = nextLocation;\n listeners.call({\n action: action,\n location: location\n });\n }\n\n function push(to, state) {\n var nextAction = Action.Push;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n push(to, state);\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(location.pathname.charAt(0) === '/', \"Relative pathnames are not supported in memory history.push(\" + JSON.stringify(to) + \")\") : void 0;\n\n if (allowTx(nextAction, nextLocation, retry)) {\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n applyTx(nextAction, nextLocation);\n }\n }\n\n function replace(to, state) {\n var nextAction = Action.Replace;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n replace(to, state);\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(location.pathname.charAt(0) === '/', \"Relative pathnames are not supported in memory history.replace(\" + JSON.stringify(to) + \")\") : void 0;\n\n if (allowTx(nextAction, nextLocation, retry)) {\n entries[index] = nextLocation;\n applyTx(nextAction, nextLocation);\n }\n }\n\n function go(delta) {\n var nextIndex = clamp(index + delta, 0, entries.length - 1);\n var nextAction = Action.Pop;\n var nextLocation = entries[nextIndex];\n\n function retry() {\n go(delta);\n }\n\n if (allowTx(nextAction, nextLocation, retry)) {\n index = nextIndex;\n applyTx(nextAction, nextLocation);\n }\n }\n\n var history = {\n get index() {\n return index;\n },\n\n get action() {\n return action;\n },\n\n get location() {\n return location;\n },\n\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n back: function back() {\n go(-1);\n },\n forward: function forward() {\n go(1);\n },\n listen: function listen(listener) {\n return listeners.push(listener);\n },\n block: function block(blocker) {\n return blockers.push(blocker);\n }\n };\n return history;\n} ////////////////////////////////////////////////////////////////////////////////\n// UTILS\n////////////////////////////////////////////////////////////////////////////////\n\nfunction clamp(n, lowerBound, upperBound) {\n return Math.min(Math.max(n, lowerBound), upperBound);\n}\n\nfunction promptBeforeUnload(event) {\n // Cancel the event.\n event.preventDefault(); // Chrome (and legacy IE) requires returnValue to be set.\n\n event.returnValue = '';\n}\n\nfunction createEvents() {\n var handlers = [];\n return {\n get length() {\n return handlers.length;\n },\n\n push: function push(fn) {\n handlers.push(fn);\n return function () {\n handlers = handlers.filter(function (handler) {\n return handler !== fn;\n });\n };\n },\n call: function call(arg) {\n handlers.forEach(function (fn) {\n return fn && fn(arg);\n });\n }\n };\n}\n\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n/**\r\n * Creates a string URL path from the given pathname, search, and hash components.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createpath\r\n */\n\n\nfunction createPath(_ref) {\n var _ref$pathname = _ref.pathname,\n pathname = _ref$pathname === void 0 ? '/' : _ref$pathname,\n _ref$search = _ref.search,\n search = _ref$search === void 0 ? '' : _ref$search,\n _ref$hash = _ref.hash,\n hash = _ref$hash === void 0 ? '' : _ref$hash;\n if (search && search !== '?') pathname += search.charAt(0) === '?' ? search : '?' + search;\n if (hash && hash !== '#') pathname += hash.charAt(0) === '#' ? hash : '#' + hash;\n return pathname;\n}\n/**\r\n * Parses a string URL path into its separate pathname, search, and hash components.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#parsepath\r\n */\n\nfunction parsePath(path) {\n var parsedPath = {};\n\n if (path) {\n var hashIndex = path.indexOf('#');\n\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n\n var searchIndex = path.indexOf('?');\n\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n\n if (path) {\n parsedPath.pathname = path;\n }\n }\n\n return parsedPath;\n}\n\nexport { Action, createBrowserHistory, createHashHistory, createMemoryHistory, createPath, parsePath };\n//# sourceMappingURL=index.js.map\n","import { assertString, assertArrayOf, isFunction } from \"./typeChecking.js\";\n\nexport type RouteMatch<T = Record<string, any>> = {\n /**\n * The path string that triggered this match.\n */\n path: string;\n\n /**\n * The pattern satisfied by `path`.\n */\n pattern: string;\n\n /**\n * Named params as parsed from `path`.\n */\n params: Record<string, string | number>;\n\n /**\n * Query params as parsed from `path`.\n */\n query: Record<string, string | number | boolean>;\n\n /**\n * Metadata registered to this route.\n */\n meta: T;\n};\n\nexport enum FragTypes {\n Literal = 1,\n Param = 2,\n Wildcard = 3,\n NumericParam = 4,\n}\n\nexport type RouteFragment = {\n name: string;\n type: FragTypes;\n value: string | number | null;\n};\n\nexport type ParsedRoute<T> = {\n pattern: string;\n fragments: RouteFragment[];\n meta: T;\n};\n\nexport type RouteMatchOptions<T> = {\n willMatch?: (route: ParsedRoute<T>) => boolean;\n};\n\n/**\n * Separates a URL path into multiple fragments.\n *\n * @param path - A path string (e.g. `\"/api/users/5\"`)\n * @returns an array of fragments (e.g. `[\"api\", \"users\", \"5\"]`)\n */\nexport function splitPath(path: string): string[] {\n assertString(path, \"Expected `path` to be a string. Got type: %t, value: %v\");\n\n return path\n .split(\"/\")\n .map((f) => f.trim())\n .filter((f) => f !== \"\");\n}\n\n/**\n * Joins multiple URL path fragments into a single string.\n *\n * @param parts - One or more URL fragments (e.g. `[\"api\", \"users\", 5]`)\n * @returns a joined path (e.g. `\"api/users/5\"`)\n */\nexport function joinPath(parts: { toString(): string }[]): string {\n assertArrayOf(\n (part) => isFunction(part?.toString),\n parts,\n \"Expected `parts` to be an array of objects with a .toString() method. Got type: %t, value: %v\",\n );\n\n parts = parts.filter((x) => x).flatMap(String);\n\n let joined = parts.shift()?.toString();\n\n if (joined) {\n for (const part of parts.map((p) => p.toString())) {\n if (part.startsWith(\".\")) {\n // Resolve relative path against joined\n joined = resolvePath(joined, part);\n } else if (joined[joined.length - 1] !== \"/\") {\n if (part[0] !== \"/\") {\n joined += \"/\" + part;\n } else {\n joined += part;\n }\n } else {\n if (part[0] === \"/\") {\n joined += part.slice(1);\n } else {\n joined += part;\n }\n }\n }\n\n // Remove trailing slash (unless path is just '/')\n if (joined && joined !== \"/\" && joined.endsWith(\"/\")) {\n joined = joined.slice(0, joined.length - 1);\n }\n }\n\n return joined ?? \"\";\n}\n\nexport function resolvePath(base: string, part: string | null) {\n assertString(base, \"Expected `base` to be a string. Got type: %t, value: %v\");\n\n if (part == null) {\n part = base;\n base = \"\";\n }\n\n if (part.startsWith(\"/\")) {\n return part;\n }\n\n let resolved = base;\n\n while (true) {\n if (part.startsWith(\"..\")) {\n for (let i = resolved.length; i > 0; --i) {\n if (resolved[i] === \"/\" || i === 0) {\n resolved = resolved.slice(0, i);\n part = part.replace(/^\\.\\.\\/?/, \"\");\n break;\n }\n }\n } else if (part.startsWith(\".\")) {\n part = part.replace(/^\\.\\/?/, \"\");\n } else {\n break;\n }\n }\n\n return joinPath([resolved, part]);\n}\n\nexport function parseQueryParams(query: string): Record<string, string | number | boolean> {\n if (!query) return {};\n\n if (query.startsWith(\"?\")) {\n query = query.slice(1);\n }\n\n const entries = query\n .split(\"&\")\n .filter((x) => x.trim() !== \"\")\n .map((entry) => {\n const [key, value] = entry.split(\"=\").map((x) => x.trim());\n\n if (value.toLowerCase() === \"true\") {\n return [key, true] as const;\n }\n\n if (value.toLowerCase() === \"false\") {\n return [key, false] as const;\n }\n\n // Return value as a number if it parses as one.\n if (!isNaN(Number(value))) {\n return [key, Number(value)] as const;\n }\n\n return [key, value] as const;\n });\n\n return Object.fromEntries(entries);\n}\n\n/**\n * Returns the nearest match, or undefined if the path matches no route.\n *\n * @param url - Path to match against routes.\n * @param options - Options to customize how matching operates.\n */\nexport function matchRoutes<T>(\n routes: ParsedRoute<T>[],\n url: string,\n options: RouteMatchOptions<T> = {},\n): RouteMatch<T> | undefined {\n const [path, query] = url.split(\"?\");\n const parts = splitPath(path);\n\n routes: for (const route of routes) {\n const { fragments } = route;\n const hasWildcard = fragments[fragments.length - 1]?.type === FragTypes.Wildcard;\n\n if (!hasWildcard && fragments.length !== parts.length) {\n continue routes;\n }\n\n if (options.willMatch && !options.willMatch(route)) {\n continue routes;\n }\n\n const matched: RouteFragment[] = [];\n\n fragments: for (let i = 0; i < fragments.length; i++) {\n const part = parts[i];\n const frag = fragments[i];\n\n if (part == null && frag.type !== FragTypes.Wildcard) {\n continue routes;\n }\n\n switch (frag.type) {\n case FragTypes.Literal:\n if (frag.name.toLowerCase() === part.toLowerCase()) {\n matched.push(frag);\n break;\n } else {\n continue routes;\n }\n case FragTypes.Param:\n matched.push({ ...frag, value: part });\n break;\n case FragTypes.Wildcard:\n matched.push({ ...frag, value: parts.slice(i).join(\"/\") });\n break fragments;\n case FragTypes.NumericParam:\n if (!isNaN(Number(part))) {\n matched.push({ ...frag, value: Number(part) });\n break;\n } else {\n continue routes;\n }\n default:\n throw new Error(`Unknown fragment type: ${frag.type}`);\n }\n }\n\n const params = Object.create(null);\n\n for (const frag of matched) {\n if (frag.type === FragTypes.Param) {\n params[frag.name] = decodeURIComponent(frag.value as string);\n }\n\n if (frag.type === FragTypes.NumericParam) {\n params[frag.name] = frag.value as number;\n }\n\n if (frag.type === FragTypes.Wildcard) {\n params.wildcard = \"/\" + decodeURIComponent(frag.value as string);\n }\n }\n\n return {\n path: \"/\" + matched.map((f) => f.value).join(\"/\"),\n pattern:\n \"/\" +\n fragments\n .map((f) => {\n if (f.type === FragTypes.Param) {\n return `{${f.name}}`;\n }\n\n if (f.type === FragTypes.NumericParam) {\n return `{#${f.name}}`;\n }\n\n return f.name;\n })\n .join(\"/\"),\n params,\n query: parseQueryParams(query),\n meta: route.meta,\n };\n }\n}\n\n/**\n * Sort routes descending by specificity. Guarantees that the most specific route matches first\n * no matter the order in which they were added.\n *\n * Routes without named params and routes with more fragments are weighted more heavily.\n */\nexport function sortRoutes<T>(routes: ParsedRoute<T>[]): ParsedRoute<T>[] {\n const withoutParams = [];\n const withNumericParams = [];\n const withParams = [];\n const wildcard = [];\n\n for (const route of routes) {\n const { fragments } = route;\n\n if (fragments.some((f) => f.type === FragTypes.Wildcard)) {\n wildcard.push(route);\n } else if (fragments.some((f) => f.type === FragTypes.NumericParam)) {\n withNumericParams.push(route);\n } else if (fragments.some((f) => f.type === FragTypes.Param)) {\n withParams.push(route);\n } else {\n withoutParams.push(route);\n }\n }\n\n const bySizeDesc = (a: ParsedRoute<T>, b: ParsedRoute<T>) => {\n if (a.fragments.length > b.fragments.length) {\n return -1;\n } else {\n return 1;\n }\n };\n\n withoutParams.sort(bySizeDesc);\n withNumericParams.sort(bySizeDesc);\n withParams.sort(bySizeDesc);\n wildcard.sort(bySizeDesc);\n\n return [...withoutParams, ...withNumericParams, ...withParams, ...wildcard];\n}\n\n/**\n * Converts a route pattern into a set of matchable fragments.\n *\n * @param route - A route string (e.g. \"/api/users/{id}\")\n */\nexport function patternToFragments(pattern: string): RouteFragment[] {\n const parts = splitPath(pattern);\n const fragments = [];\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (part === \"*\") {\n if (i !== parts.length - 1) {\n throw new Error(`Wildcard must be at the end of a pattern. Received: ${pattern}`);\n }\n fragments.push({\n type: FragTypes.Wildcard,\n name: \"*\",\n value: null,\n });\n } else if (part.at(0) === \"{\" && part.at(-1) === \"}\") {\n fragments.push({\n type: part[1] === \"#\" ? FragTypes.NumericParam : FragTypes.Param,\n name: part[1] === \"#\" ? part.slice(2, -1) : part.slice(1, -1),\n value: null,\n });\n } else {\n fragments.push({\n type: FragTypes.Literal,\n name: part,\n value: part,\n });\n }\n }\n\n return fragments;\n}\n","import { createBrowserHistory, createHashHistory, Update, type History } from \"history\";\nimport {\n joinPath,\n matchRoutes,\n ParsedRoute,\n parseQueryParams,\n patternToFragments,\n resolvePath,\n sortRoutes,\n splitPath,\n} from \"../routing.js\";\nimport { createState, StopFunction, watch } from \"../state.js\";\nimport { isFunction, isString } from \"../typeChecking.js\";\nimport { type Stringable } from \"../types.js\";\nimport { ViewNode, type ViewFunction } from \"../view.js\";\nimport { Passthrough } from \"../views/passthrough.js\";\nimport type { Dolla, Logger } from \"./dolla.js\";\n\n// ----- Types ----- //\n\nexport interface RouteMatchContext {\n /**\n * Redirects the user to a different route instead of matching the current one.\n */\n redirect(path: string): void;\n}\n\nexport interface Route {\n /**\n * The path or path fragment to match.\n */\n path: string;\n\n /**\n * Path to redirect to when this route is matched, or a callback function that returns such path.\n */\n redirect?: string | ((ctx: RouteRedirectContext) => string) | ((ctx: RouteRedirectContext) => Promise<string>);\n\n /**\n * View to display when this route is matched.\n */\n view?: ViewFunction<any>;\n\n /**\n * Subroutes.\n */\n routes?: Route[];\n\n /**\n * Called after the match is identified but before it is acted on. Use this to set state, load data, etc.\n */\n beforeMatch?: (ctx: RouteMatchContext) => void | Promise<void>;\n}\n\nexport interface RouteConfig {\n pattern: string;\n meta: {\n redirect?: string | ((ctx: RouteRedirectContext) => string) | ((ctx: RouteRedirectContext) => Promise<string>);\n pattern?: string;\n layers?: RouteLayer[];\n beforeMatch?: (ctx: RouteMatchContext) => void | Promise<void>;\n };\n}\n\nexport interface RouteLayer {\n id: number;\n view: ViewFunction<{}>;\n}\n\n/**\n * An active route layer whose markup has been initialized into a view.\n */\ninterface ActiveLayer {\n id: number;\n node: ViewNode;\n}\n\n/**\n * Object passed to redirect callbacks. Contains information useful for determining how to redirect.\n */\nexport interface RouteRedirectContext {\n /**\n * The path as it appears in the URL bar.\n */\n path: string;\n\n /**\n * The pattern that this path was matched with.\n */\n pattern: string;\n\n /**\n * Named route params parsed from `path`.\n */\n params: Record<string, string | number | undefined>;\n\n /**\n * Query params parsed from `path`.\n */\n query: Record<string, string | number | boolean | undefined>;\n}\n\ninterface ParsedParams {\n [key: string]: string | number | boolean | (string | number | boolean | null)[] | null;\n}\n\ninterface ParsedQuery extends ParsedParams {}\n\nexport interface NavigateOptions {\n /**\n * Replace the current item in the history stack instead of adding a new one.\n * The back button will send the user to the page they visited before this. Defaults to false.\n */\n replace?: boolean;\n\n /**\n * Preserve existing query params (if any) when navigating. Defaults to false.\n */\n preserveQuery?: boolean;\n}\n\nexport enum RoutingStyle {\n /**\n * Constructs routes like \"https://www.example.com/#/sub/route\" which work without any server-side setup.\n * A good choice if your app has no backend.\n */\n hash = \"hash\",\n\n /**\n * Constructs routes like \"https://www.example.com/sub/route\" which look nicer (subjective?) than hash routes and are what most users will expect URLs to look like, but require additional backend setup.\n * Path routing requires you to configure your backend to redirect to the app's index.html when subpaths are requested.\n */\n path = \"path\",\n}\n\nexport interface RouterSetupOptions {\n routes: Route[];\n\n /**\n * The routing style to use; \"hash\" will construct routes like \"https://www.example.com/#/sub/route\" which work without any server-side setup, while \"path\" will construct routes that use paths directly.\n */\n style?: RoutingStyle;\n}\n\nexport interface RouterElements {\n readonly rootElement?: HTMLElement;\n readonly rootView?: ViewNode;\n}\n\n// ----- Code ----- //\n\nexport class Router {\n #dolla: Dolla;\n #logger: Logger;\n #elements: RouterElements;\n\n #history!: History;\n #layerId = 0;\n #activeLayers: ActiveLayer[] = [];\n #lastQuery?: string;\n #routes: ParsedRoute<RouteConfig[\"meta\"]>[] = [];\n\n // Callbacks that need to be called on unmount.\n #cleanupCallbacks: StopFunction[] = [];\n\n /**\n * The currently matched route pattern, if any.\n */\n $pattern;\n #setPattern;\n\n /**\n * The current URL path.\n */\n $path;\n #setPath;\n\n /**\n * The current named path params.\n */\n $params;\n #setParams;\n\n /**\n * The current query params. Changes to this object will be reflected in the URL.\n */\n $query;\n #setQuery;\n\n constructor(dolla: Dolla, elements: RouterElements) {\n this.#dolla = dolla;\n this.#logger = dolla.createLogger(\"dolla/router\");\n this.#elements = elements;\n\n const [$pattern, setPattern] = createState<string | null>(null);\n const [$path, setPath] = createState(\"\");\n const [$params, setParams] = createState<ParsedParams>({});\n const [$query, setQuery] = createState<ParsedQuery>(\n parseQueryParams(typeof window === \"undefined\" ? \"\" : (window.location.search ?? \"\")),\n );\n\n this.$pattern = $pattern;\n this.#setPattern = setPattern;\n\n this.$path = $path;\n this.#setPath = setPath;\n\n this.$params = $params;\n this.#setParams = setParams;\n\n this.$query = $query;\n this.#setQuery = setQuery;\n\n dolla.beforeMount(() => {\n // If router setup has not run, we don't need to do anything.\n if (this.#history == null) return;\n\n // Update URL when query changes\n this.#cleanupCallbacks.push(\n watch([$query], (current) => {\n const params = new URLSearchParams();\n\n for (const key in current) {\n params.set(key, String(current[key]));\n }\n\n const search = \"?\" + params.toString();\n\n if (search != this.#history.location.search) {\n this.#history.replace({\n pathname: this.#history.location.pathname,\n search,\n });\n }\n }),\n );\n\n this.#cleanupCallbacks.push(this.#history.listen(this.#onRouteChange.bind(this)));\n this.#onRouteChange(this.#history);\n\n this.#cleanupCallbacks.push(\n catchLinks(this.#elements.rootElement!, (anchor) => {\n let href = anchor.getAttribute(\"href\")!;\n\n this.#logger.info(\"Intercepted link click\", anchor, href);\n\n if (!/^https?:\\/\\/|^\\//.test(href)) {\n href = joinPath([this.#history.location.pathname, href]);\n }\n\n this.#history.push(href);\n }),\n );\n this.#logger.info(\"Intercepting <a> clicks within root element:\", this.#elements.rootElement!);\n });\n\n dolla.onUnmount(() => {\n while (this.#cleanupCallbacks.length > 0) {\n const callback = this.#cleanupCallbacks.pop()!;\n callback();\n }\n });\n }\n\n setup(options: RouterSetupOptions) {\n if (this.#dolla.isMounted) {\n this.#logger.crash(\n new Error(`Dolla is already mounted. Router setup must be called before Dolla.mount is called.`),\n );\n return;\n }\n\n if (options.style === RoutingStyle.hash) {\n this.#history = createHashHistory();\n } else {\n this.#history = createBrowserHistory();\n }\n\n this.#routes = sortRoutes(\n options.routes\n .flatMap((route) => this.#prepareRoute(route))\n .map((route) => ({\n pattern: route.pattern,\n meta: route.meta,\n fragments: patternToFragments(route.pattern),\n })),\n );\n\n // Test redirects to make sure all possible redirect targets actually exist.\n for (const route of this.#routes) {\n if (route.meta.redirect) {\n let redirectPath: string;\n\n if (isFunction(route.meta.redirect)) {\n // throw new Error(`Redirect functions are not yet supported.`);\n // Just allow, though it could fail later. Best not to call the function and cause potential side effects.\n } else if (isString(route.meta.redirect)) {\n redirectPath = route.meta.redirect;\n\n const match = matchRoutes(this.#routes, redirectPath, {\n willMatch(r) {\n return r !== route;\n },\n });\n\n if (!match) {\n throw new Error(\n `Found a redirect to an undefined URL. From '${route.pattern}' to '${route.meta.redirect}'`,\n );\n }\n } else {\n throw new TypeError(`Expected a string or redirect function. Got: ${route.meta.redirect}`);\n }\n }\n }\n }\n\n /**\n * Navigates to another route.\n *\n * @example\n * navigate(\"/login\"); // navigate to `/login`\n * navigate([\"/users\", 215], { replace: true }); // replace current history entry with `/users/215`\n */\n go(path: Stringable | Stringable[], options: NavigateOptions = {}) {\n if (this.#history == null) {\n this.#logger.crash(\n new Error(\n `Router.go was called, but the router was never configured! Run 'Dolla.router.setup' before 'Dolla.mount' to configure routes.`,\n ),\n );\n return;\n }\n\n let joined: string;\n\n if (Array.isArray(path)) {\n joined = joinPath(path);\n } else {\n joined = path.toString();\n }\n\n joined = resolvePath(this.#history.location.pathname, joined);\n\n if (options.preserveQuery) {\n joined += this.#history.location.search;\n }\n\n if (options.replace) {\n this.#history.replace(joined);\n } else {\n this.#history.push(joined);\n }\n }\n\n /**\n * Navigate backward. Pass a number of steps to hit the back button that many times.\n */\n back(steps = 1) {\n if (this.#history == null) {\n this.#logger.crash(\n new Error(\n `Router.back was called, but the router was never configured! Run 'Dolla.router.setup' before 'Dolla.mount' to configure routes.`,\n ),\n );\n return;\n }\n\n this.#history.go(-steps);\n }\n\n /**\n * Navigate forward. Pass a number of steps to hit the forward button that many times.\n */\n forward(steps = 1) {\n if (this.#history == null) {\n this.#logger.crash(\n new Error(\n `Router.forward was called, but the router was never configured! Run 'Dolla.router.setup' before 'Dolla.mount' to configure routes.`,\n ),\n );\n return;\n }\n\n this.#history.go(steps);\n }\n\n /**\n * Parses a route definition object into a set of matchable routes.\n *\n * @param route - Route config object.\n * @param layers - Array of parent layers. Passed when this function calls itself on nested routes.\n */\n #prepareRoute(route: Route, parents: Route[] = [], layers: RouteLayer[] = []) {\n if (!(typeof route === \"object\" && !Array.isArray(route)) || !(typeof route.path === \"string\")) {\n throw new TypeError(`Route configs must be objects with a 'path' string property. Got: ${route}`);\n }\n\n if (route.redirect && route.routes) {\n throw new Error(`Route cannot have both a 'redirect' and nested 'routes'.`);\n } else if (route.redirect && route.view) {\n throw new Error(`Route cannot have both a 'redirect' and a 'view'.`);\n } else if (!route.view && !route.routes && !route.redirect) {\n throw new Error(`Route must have a 'view', a 'redirect', or a set of nested 'routes'.`);\n }\n\n let parts: string[] = [];\n\n for (const parent of parents) {\n parts.push(...splitPath(parent.path));\n }\n\n parts.push(...splitPath(route.path));\n\n // Remove trailing wildcard for joining with nested routes.\n if (parts[parts.length - 1] === \"*\") {\n parts.pop();\n }\n\n const routes: RouteConfig[] = [];\n\n if (route.redirect) {\n let redirect = route.redirect;\n\n if (isString(redirect)) {\n redirect = resolvePath(joinPath(parts), redirect);\n\n if (!redirect.startsWith(\"/\")) {\n redirect = \"/\" + redirect;\n }\n }\n\n routes.push({\n pattern: \"/\" + joinPath([...parts, ...splitPath(route.path)]),\n meta: {\n redirect,\n },\n });\n\n return routes;\n }\n\n let view: ViewFunction<any> = Passthrough;\n\n if (typeof route.view === \"function\") {\n view = route.view;\n } else if (route.view) {\n throw new TypeError(`Route '${route.path}' expected a view function or undefined. Got: ${route.view}`);\n }\n\n const layer: RouteLayer = { id: this.#layerId++, view };\n\n // Parse nested routes if they exist.\n if (route.routes) {\n for (const subroute of route.routes) {\n routes.push(...this.#prepareRoute(subroute, [...parents, route], [...layers, layer]));\n }\n } else {\n routes.push({\n pattern: parent ? joinPath([...parents.map((p) => p.path), route.path]) : route.path,\n meta: {\n pattern: route.path,\n layers: [...layers, layer],\n beforeMatch: route.beforeMatch,\n },\n });\n }\n\n return routes;\n }\n\n /**\n * Run when the location changes. Diffs and mounts new routes and updates\n * the $path, $route, $params and $query states accordingly.\n */\n async #onRouteChange({ location }: History | Update) {\n // Update query params if they've changed.\n if (location.search !== this.#lastQuery) {\n this.#lastQuery = location.search;\n this.#setQuery(parseQueryParams(location.search));\n }\n\n const matched = matchRoutes(this.#routes, location.pathname);\n\n if (!matched) {\n this.#setPattern(null);\n this.#setPath(location.pathname);\n this.#setParams({\n wildcard: location.pathname,\n });\n return;\n }\n\n if (matched.meta.beforeMatch) {\n await matched.meta.beforeMatch({\n redirect: (path) => {\n // TODO: Implement\n throw new Error(`Redirect not yet implemented.`);\n },\n });\n }\n\n this.#logger.info(`Matched route: '${matched.pattern}' ('${matched.path}')`);\n\n if (matched.meta.redirect != null) {\n if (typeof matched.meta.redirect === \"string\") {\n const path = replaceParams(matched.meta.redirect, matched.params);\n this.#logger.info(`Redirecting to: '${path}'`);\n this.#history.replace(path);\n } else if (typeof matched.meta.redirect === \"function\") {\n const redirectContext: RouteRedirectContext = {\n path: matched.path,\n pattern: matched.pattern,\n params: matched.params,\n query: matched.query,\n };\n let path = await matched.meta.redirect(redirectContext);\n if (typeof path !== \"string\") {\n throw new Error(`Redirect function must return a path to redirect to.`);\n }\n if (!path.startsWith(\"/\")) {\n // Not absolute. Resolve against matched path.\n path = resolvePath(matched.path, path);\n }\n this.#logger.info(`Redirecting to: '${path}'`);\n this.#history.replace(path);\n } else {\n throw new TypeError(`Redirect must either be a path string or a function.`);\n }\n } else {\n this.#setPath(matched.path);\n this.#setParams(matched.params);\n\n if (matched.pattern !== this.$pattern.get()) {\n this.#setPattern(matched.pattern);\n\n const layers = matched.meta.layers!;\n\n // Diff and update route layers.\n for (let i = 0; i < layers.length; i++) {\n const matchedLayer = layers[i];\n const activeLayer = this.#activeLayers[i];\n\n if (activeLayer?.id !== matchedLayer.id) {\n this.#logger.info(`Replacing layer @${i} (active ID: ${activeLayer?.id}, matched ID: ${matchedLayer.id})`);\n\n // Remove any previously active layers at this depth or deeper.\n this.#activeLayers = this.#activeLayers.slice(0, i);\n\n const parentLayer = this.#activeLayers.at(-1);\n const node = this.#dolla.constructView(matchedLayer.view, {});\n\n if (activeLayer && activeLayer.node.isMounted) {\n // Disconnect first mismatched active layer.\n activeLayer.node.unmount();\n }\n\n // Replace parentLayer's previous children with the new layer.\n if (parentLayer) {\n parentLayer.node.setChildren([node]);\n } else {\n this.#elements.rootView!.setChildren([node]);\n }\n\n // Store the new active layer.\n this.#activeLayers.push({ id: matchedLayer.id, node });\n }\n }\n }\n }\n }\n}\n\nconst safeExternalLink = /(noopener|noreferrer) (noopener|noreferrer)/;\nconst protocolLink = /^[\\w-_]+:/;\n\n/**\n * Intercepts links within the root node.\n *\n * This is adapted from https://github.com/choojs/nanohref/blob/master/index.js\n *\n * @param root - Element under which to intercept link clicks\n * @param callback - Function to call when a click event is intercepted\n * @param _window - (optional) Override for global window object\n */\nexport function catchLinks(root: HTMLElement, callback: (anchor: HTMLAnchorElement) => void, _window = window) {\n function traverse(node: HTMLElement | null): HTMLAnchorElement | null {\n if (!node || node === root) {\n return null;\n }\n\n if (node.localName !== \"a\" || (node as any).href === undefined) {\n return traverse(node.parentNode as HTMLElement | null);\n }\n\n return node as HTMLAnchorElement;\n }\n\n function handler(e: MouseEvent) {\n if ((e.button && e.button !== 0) || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey || e.defaultPrevented) {\n return;\n }\n\n const anchor = traverse(e.target as HTMLElement);\n\n if (!anchor) {\n return;\n }\n\n if (\n _window.location.protocol !== anchor.protocol ||\n _window.location.hostname !== anchor.hostname ||\n _window.location.port !== anchor.port ||\n anchor.hasAttribute(\"data-router-ignore\") ||\n anchor.hasAttribute(\"download\") ||\n (anchor.getAttribute(\"target\") === \"_blank\" && safeExternalLink.test(anchor.getAttribute(\"rel\")!)) ||\n protocolLink.test(anchor.getAttribute(\"href\")!)\n ) {\n return;\n }\n\n e.preventDefault();\n callback(anchor);\n }\n\n root.addEventListener(\"click\", handler);\n\n return function cancel() {\n root.removeEventListener(\"click\", handler);\n };\n}\n\n/**\n * Replace route pattern param placeholders with real matched values.\n */\nfunction replaceParams(path: string, params: Record<string, string | number>) {\n for (const key in params) {\n const value = params[key].toString();\n path = path.replace(`{${key}}`, value).replace(`{#${key}}`, value);\n }\n\n return path;\n}\n","import { constructMarkup, createMarkup, createRef, isRef, MarkupNode, mergeNodes, type Markup } from \"../markup.js\";\nimport {\n createSettableState,\n createState,\n derive,\n toSettableState,\n toState,\n valueOf,\n watch,\n type State,\n} from \"../state.js\";\nimport { assertInstanceOf, isString } from \"../typeChecking.js\";\nimport { colorFromString, createMatcher, getDefaultConsole, noOp } from \"../utils.js\";\nimport { constructView, type ViewFunction, type ViewNode } from \"../view.js\";\nimport { DefaultCrashView, type CrashViewProps } from \"../views/default-crash-view.js\";\nimport { Passthrough } from \"../views/passthrough.js\";\n\nimport { HTTP } from \"./http.js\";\nimport { Language } from \"./language.js\";\nimport { Render } from \"./render.js\";\nimport { Router } from \"./router.js\";\n\n// Affects which log messages will print and how much debugging info is included in the DOM.\nexport type Environment = \"development\" | \"production\";\n\n/**\n * Log type toggles. Each message category can be turned on or off or enabled only in a specific environment.\n */\nexport type Loggles = {\n info: boolean | Environment;\n log: boolean | Environment;\n warn: boolean | Environment;\n error: boolean | Environment;\n};\n\nexport interface Logger {\n info(...args: any[]): void;\n log(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n crash(error: Error): void;\n}\n\nexport interface LoggerErrorContext {\n error: Error;\n loggerName: string;\n uid?: string;\n}\n\nexport type LoggerOptions = {\n /**\n * Console object to use for logging (mostly for testing). Uses window.console by default.\n */\n console?: any;\n\n /**\n * Unique ID to print with logs. Makes it easier to track down messages from specific view instances.\n */\n uid?: string;\n};\n\nexport class Dolla {\n readonly http: HTTP;\n readonly language: Language;\n readonly render: Render;\n readonly router: Router;\n\n #isMounted = false;\n #env: Environment = \"production\";\n #rootElement?: HTMLElement;\n #rootView?: ViewNode;\n #crashView: ViewFunction<CrashViewProps> = DefaultCrashView;\n\n #beforeMountCallbacks: Array<() => void | Promise<void>> = [];\n #onMountCallbacks: Array<() => void> = [];\n #beforeUnmountCallbacks: Array<() => void | Promise<void>> = [];\n #onUnmountCallbacks: Array<() => void> = [];\n\n #loggles: Loggles = {\n info: \"development\",\n log: \"development\",\n warn: \"development\",\n error: true,\n };\n #match = createMatcher(\"*,-dolla/*\");\n\n constructor() {\n const self = this;\n\n this.http = new HTTP();\n this.language = new Language(this);\n this.render = new Render(this);\n this.router = new Router(this, {\n get rootElement() {\n return self.#rootElement;\n },\n get rootView() {\n return self.#rootView;\n },\n });\n }\n\n createState = createState;\n createSettableState = createSettableState;\n toSettableState = toSettableState;\n toState = toState;\n valueOf = valueOf;\n derive = derive;\n watch = watch;\n\n createRef = createRef;\n isRef = isRef;\n\n /**\n * True when the app is connected to a DOM node and displayed to the user.\n */\n get isMounted() {\n return this.#isMounted;\n }\n\n /**\n * Get the current environment that this app is running in.\n * Environment affects which log messages will print and how much debugging info is included in the DOM.\n */\n getEnv() {\n return this.#env;\n }\n\n /**\n * Sets the environment that this app is running in.\n * Environment affects which log messages will print and how much debugging info is included in the DOM.\n */\n setEnv(value: Environment) {\n this.#env = value;\n }\n\n /**\n * Sets the view that will be shown when the `crash` method is called on any logger.\n * When a crash is reported the app will be unmounted and replaced with this crash page.\n */\n setCrashView(view: ViewFunction<CrashViewProps>) {\n this.#crashView = view;\n }\n\n async mount(selector: string, view?: ViewFunction<any>): Promise<void>;\n async mount(element: HTMLElement, view?: ViewFunction<any>): Promise<void>;\n\n async mount(target: string | HTMLElement, view?: ViewFunction<any>) {\n if (this.#isMounted) {\n throw new Error(`Dolla is already mounted.`);\n }\n\n if (isString(target)) {\n const match = document.querySelector<HTMLElement>(target);\n assertInstanceOf(HTMLElement, match, `Selector '${target}' did not match any element.`);\n this.#rootElement = match!;\n } else {\n assertInstanceOf(HTMLElement, target, \"Expected an HTML element or a selector string. Got type: %t, value: %v\");\n this.#rootElement = target;\n }\n\n let rootViewMarkup: Markup;\n\n if (view) {\n rootViewMarkup = createMarkup(view);\n } else {\n rootViewMarkup = createMarkup(Passthrough);\n }\n\n // First, initialize the root view. The router store needs this to connect the initial route.\n this.#rootView = this.constructView(rootViewMarkup.type as ViewFunction<any>, rootViewMarkup.props);\n\n // Run beforeMount\n await Promise.all(this.#beforeMountCallbacks.map((callback) => callback()));\n\n this.#rootView.mount(this.#rootElement);\n\n // App is now fully mounted.\n this.#isMounted = true;\n\n // Run onMount\n for (const callback of this.#onMountCallbacks) {\n callback();\n }\n }\n\n async unmount() {\n if (!this.#isMounted) return;\n\n // Run beforeUnmount\n await Promise.all(this.#beforeUnmountCallbacks.map((callback) => callback()));\n\n this.#rootView?.unmount();\n\n this.#isMounted = false;\n\n // Run onUnmount\n for (const callback of this.#onUnmountCallbacks) {\n callback();\n }\n }\n\n /**\n * Registers a `callback` to run after `Dolla.mount` is called, before the app is mounted. If `callback` returns a Promise,\n * it will be awaited before mounting finishes. Use this to perform initial setup before the app is displayed to the user.\n */\n beforeMount(callback: () => void | Promise<void>) {\n this.#beforeMountCallbacks.push(callback);\n }\n\n /**\n * Registers a `callback` to run after the app is mounted.\n */\n onMount(callback: () => void) {\n this.#onMountCallbacks.push(callback);\n }\n\n /**\n * Registers a `callback` to run after `Dolla.unmount` is called, before the app is unmounted. If `callback` returns a Promise,\n * it will be awaited before unmounting finishes. Use this to perform cleanup.\n */\n beforeUnmount(callback: () => void | Promise<void>) {\n this.#beforeUnmountCallbacks.push(callback);\n }\n\n /**\n * Registers a `callback` to run after the app is unmounted.\n */\n onUnmount(callback: () => void) {\n this.#onUnmountCallbacks.push(callback);\n }\n\n /**\n * Update log type toggles. Values that are not passed will remain unchanged.\n */\n setLoggles(options: Partial<Loggles>) {\n for (const key in options) {\n const value = options[key as keyof Loggles];\n if (value) {\n this.#loggles[key as keyof Loggles] = value;\n }\n }\n }\n\n setLogFilter(filter: string | RegExp) {\n this.#match = createMatcher(filter);\n }\n\n createLogger(name: string | State<string>, options?: LoggerOptions): Logger {\n const $name = toState(name);\n\n const _console = options?.console ?? getDefaultConsole();\n\n const self = this;\n\n return {\n get info() {\n const name = $name.get();\n if (\n self.#loggles.info === false ||\n (isString(self.#loggles.info) && self.#loggles.info !== self.getEnv()) ||\n !self.#match(name)\n ) {\n return noOp;\n } else {\n let label = `%c${name}`;\n if (options?.uid) {\n label += ` %c[uid: %c${options.uid}%c]`;\n } else {\n label += `%c%c%c`;\n }\n return _console.info.bind(\n _console,\n label,\n `color:${colorFromString(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n },\n\n get log() {\n const name = $name.get();\n if (\n self.#loggles.log === false ||\n (isString(self.#loggles.log) && self.#loggles.log !== self.getEnv()) ||\n !self.#match(name)\n ) {\n return noOp;\n } else {\n let label = `%c${name}`;\n if (options?.uid) {\n label += ` %c[uid: %c${options.uid}%c]`;\n } else {\n label += `%c%c%c`;\n }\n return _console.log.bind(\n _console,\n label,\n `color:${colorFromString(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n },\n\n get warn() {\n const name = $name.get();\n if (\n self.#loggles.warn === false ||\n (isString(self.#loggles.warn) && self.#loggles.warn !== self.getEnv()) ||\n !self.#match(name)\n ) {\n return noOp;\n } else {\n let label = `%c${name}`;\n if (options?.uid) {\n label += ` %c[uid: %c${options.uid}%c]`;\n } else {\n label += `%c%c%c`;\n }\n return _console.warn.bind(\n _console,\n label,\n `color:${colorFromString(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n },\n\n get error() {\n const name = $name.get();\n if (\n self.#loggles.error === false ||\n (isString(self.#loggles.error) && self.#loggles.error !== self.getEnv()) ||\n !self.#match(name)\n ) {\n return noOp;\n } else {\n let label = `%c${name}`;\n if (options?.uid) {\n label += ` %c[uid: %c${options.uid}%c]`;\n } else {\n label += `%c%c%c`;\n }\n return _console.error.bind(\n _console,\n label,\n `color:${colorFromString(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n },\n\n crash(error: Error) {\n if (self.isMounted) {\n // Unmount the app.\n self.unmount();\n\n // Mount the crash page\n const crashPage = self.constructView(self.#crashView, {\n error,\n loggerName: $name.get(),\n uid: options?.uid,\n });\n crashPage.mount(self.#rootElement!);\n }\n\n throw error;\n },\n };\n }\n\n /**\n *\n */\n constructView<P>(view: ViewFunction<P>, props: P, children: Markup[] = []): ViewNode {\n return constructView({ root: this }, view, props, children);\n }\n\n /**\n *\n */\n constructMarkup(markup: Markup | Markup[]): MarkupNode {\n return mergeNodes(constructMarkup({ root: this }, markup));\n }\n}\n","// States\nexport { createSettableState, createSetter, createState, derive, toSettableState, toState, valueOf } from \"./state.js\";\nexport type { MaybeState, SettableState, State, StopFunction } from \"./state.js\";\n\n// Markup\nexport { cond, createMarkup, createRef, html, isRef, portal, repeat } from \"./markup.js\";\nexport type { Markup, MarkupNode, Ref } from \"./markup.js\";\n\nimport { Dolla } from \"./modules/dolla.js\";\nconst dolla = new Dolla();\n\nexport default dolla;\n\n// Language: standalone `t` function\nexport const t = dolla.language.t.bind(dolla.language);\n\n// Other types\nexport type { Dolla, Environment, Logger, LoggerErrorContext, LoggerOptions, Loggles } from \"./modules/dolla.js\";\nexport type { HTTPRequest, HTTPResponse } from \"./modules/http.js\";\nexport type { InputType, Renderable } from \"./types.js\";\nexport type { ViewContext, ViewFunction, ViewNode } from \"./view.js\";\nexport type { CrashViewProps } from \"./views/default-crash-view.js\";\n\nimport type { IntrinsicElements as Elements } from \"./types\";\n\ndeclare global {\n namespace JSX {\n interface IntrinsicElements extends Elements {\n // Catch all for custom elements\n [tag: string]: any;\n }\n }\n}\n"],"names":["DefaultCrashView","props","html","cond","HTTP","__privateAdd","_HTTP_instances","_middleware","_fetch","getDefaultFetch","fn","__privateGet","uri","options","__privateMethod","request_fn","method","makeRequest","HTTPResponseError","response","status","statusText","message","__publicField","config","headers","query","fetch","middleware","request","value","key","name","handler","fullURL","reqBody","isObject","fetched","contentType","body","mount","index","current","next","Localization","dolla","isFunction","strings","isString","res","Language","_Language_instances","_dolla","_logger","_localizations","_cache","_initialLanguage","_setCurrent","_$strings","_setStrings","__privateSet","$current","setCurrent","createState","$strings","setStrings","entry","realName","names","nav","_a","firstLanguage","lang","translation","error","values","$noLanguageValue","cached","getCached_fn","stateValues","isState","readableEntries","readables","x","$merged","derive","t","entryValues","entries","_","i","mergedValues","result","resolve","replaceMustaches","$replaced","deepEqual","toState","template","object","parsed","part","Render","_Render_instances","_keyedUpdates","_unkeyedUpdates","_reads","_isUpdating","callback","runUpdates_fn","totalQueued","_extends","n","Action","readOnly","obj","warning","BeforeUnloadEventType","HashChangeEventType","PopStateEventType","createBrowserHistory","_options","_options$window","window","globalHistory","getIndexAndLocation","_window$location","pathname","search","hash","state","blockedPopTx","handlePop","blockers","nextAction","_getIndexAndLocation","nextIndex","nextLocation","delta","go","applyTx","action","_getIndexAndLocation2","location","listeners","createEvents","createHref","to","createPath","getNextLocation","parsePath","createKey","getHistoryStateAndUrl","allowTx","retry","_getIndexAndLocation3","push","_getHistoryStateAndUr","historyState","url","replace","_getHistoryStateAndUr2","history","listener","blocker","unblock","promptBeforeUnload","createHashHistory","_options2","_options2$window","_parsePath","_parsePath$pathname","_parsePath$search","_parsePath$hash","_getIndexAndLocation4","_getIndexAndLocation5","_getIndexAndLocation6","getBaseHref","base","href","hashIndex","_getIndexAndLocation7","_getHistoryStateAndUr3","_getHistoryStateAndUr4","event","handlers","arg","_ref","_ref$pathname","_ref$search","_ref$hash","path","parsedPath","searchIndex","splitPath","assertString","f","joinPath","parts","assertArrayOf","joined","p","resolvePath","resolved","parseQueryParams","matchRoutes","routes","route","fragments","matched","frag","params","sortRoutes","withoutParams","withNumericParams","withParams","wildcard","bySizeDesc","a","b","patternToFragments","pattern","Router","elements","_Router_instances","_elements","_history","_layerId","_activeLayers","_lastQuery","_routes","_cleanupCallbacks","_setPattern","_setPath","_setParams","_setQuery","$pattern","setPattern","$path","setPath","$params","setParams","$query","setQuery","watch","onRouteChange_fn","catchLinks","anchor","prepareRoute_fn","redirectPath","r","steps","parents","layers","parent","redirect","view","Passthrough","layer","__privateWrapper","subroute","replaceParams","redirectContext","matchedLayer","activeLayer","parentLayer","node","safeExternalLink","protocolLink","root","_window","traverse","e","Dolla","_isMounted","_env","_rootElement","_rootView","_crashView","_beforeMountCallbacks","_onMountCallbacks","_beforeUnmountCallbacks","_onUnmountCallbacks","_loggles","_match","createMatcher","createSettableState","toSettableState","valueOf","createRef","isRef","self","target","match","assertInstanceOf","rootViewMarkup","createMarkup","filter","$name","_console","getDefaultConsole","noOp","label","colorFromString","children","constructView","markup","mergeNodes","constructMarkup"],"mappings":"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","x_google_ignoreList":[4,5]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/views/default-crash-view.ts","../src/modules/http.ts","../src/modules/language.ts","../src/modules/render.ts","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/history/index.js","../src/routing.ts","../src/modules/router.ts","../src/modules/dolla.ts","../src/index.ts"],"sourcesContent":["import { cond, html } from \"../markup.js\";\n\n/**\n * Props passed to the crash view when a crash occurs.\n */\nexport type CrashViewProps = {\n /**\n * JavaScript Error object.\n */\n error: Error;\n\n /**\n * A string to identify the logger that reported this error.\n */\n loggerName: string;\n\n /**\n * Unique identifier to pinpoint the specific view that reported the crash.\n */\n uid?: string;\n};\n\nexport function DefaultCrashView(props: CrashViewProps) {\n return html`\n <div\n style=${{\n backgroundColor: \"#880000\",\n color: \"#fff\",\n padding: \"2rem\",\n position: \"fixed\",\n inset: 0,\n fontSize: \"20px\",\n }}\n >\n <h1 style=${{ marginBottom: \"0.5rem\" }}>The app has crashed</h1>\n <p style=${{ marginBottom: \"0.25rem\" }}>\n <span style=${{ fontFamily: \"monospace\" }}>${props.loggerName}</span>\n ${cond(props.uid, html`<span style=${{ fontFamily: \"monospace\", opacity: 0.5 }}> [uid: ${props.uid}]</span>`)}\n ${\" \"}says:\n </p>\n <blockquote\n style=${{\n backgroundColor: \"#991111\",\n padding: \"0.25em\",\n borderRadius: \"6px\",\n fontFamily: \"monospace\",\n marginBottom: \"1rem\",\n }}\n >\n <span\n style=${{\n display: \"inline-block\",\n backgroundColor: \"red\",\n padding: \"0.1em 0.4em\",\n marginRight: \"0.5em\",\n borderRadius: \"4px\",\n fontSize: \"0.9em\",\n fontWeight: \"bold\",\n }}\n >\n ${props.error.name}\n </span>\n ${props.error.message}\n </blockquote>\n\n <p>Please see the browser console for details.</p>\n </div>\n `;\n}\n","import { isObject } from \"../typeChecking.js\";\n\n/**\n * A simple HTTP client with middleware support. Middleware applies to all requests made through this store,\n * so it's the perfect way to handle things like auth headers and permission checks for API calls.\n */\nexport class HTTP {\n #middleware: HTTPMiddleware[] = [];\n #fetch = getDefaultFetch();\n\n /**\n * Adds a new middleware that will apply to subsequent requests.\n * Returns a function to remove this middleware.\n *\n * @param middleware - A middleware function that will intercept requests.\n */\n use(fn: HTTPMiddleware) {\n this.#middleware.push(fn);\n\n // Call returned function to remove this middleware for subsequent requests.\n return () => {\n this.#middleware.splice(this.#middleware.indexOf(fn), 1);\n };\n }\n\n async get<ResBody = unknown>(uri: string, options?: RequestOptions<never>) {\n return this.#request<ResBody, never>(\"get\", uri, options);\n }\n\n async put<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"put\", uri, options);\n }\n\n async patch<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"patch\", uri, options);\n }\n\n async post<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"post\", uri, options);\n }\n\n async delete<ResBody = unknown>(uri: string, options?: RequestOptions<never>) {\n return this.#request<ResBody, never>(\"delete\", uri, options);\n }\n\n async head<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"head\", uri, options);\n }\n\n async options<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"options\", uri, options);\n }\n\n async trace<ResBody = unknown, ReqBody = unknown>(uri: string, options?: RequestOptions<ReqBody>) {\n return this.#request<ResBody, ReqBody>(\"trace\", uri, options);\n }\n\n async #request<ResBody, ReqBody>(method: string, uri: string, options?: RequestOptions<any>) {\n return makeRequest<ResBody, ReqBody>({\n ...options,\n method,\n uri,\n middleware: this.#middleware,\n fetch: this.#fetch,\n });\n }\n}\n\nfunction getDefaultFetch(): typeof window.fetch {\n if (typeof window !== \"undefined\" && window.fetch) {\n return window.fetch.bind(window);\n }\n\n if (typeof global !== \"undefined\" && global.fetch) {\n return global.fetch.bind(global);\n }\n\n throw new Error(\"Running in neither browser nor node. Please run this app in one of the supported environments.\");\n}\n\n/*====================*\\\n|| Request ||\n\\*====================*/\n\nexport type HTTPMiddleware = (\n request: HTTPRequest<unknown>,\n next: () => Promise<HTTPResponse<unknown>>,\n) => void | Promise<void>;\n\nexport interface RequestOptions<ReqBody> {\n /**\n * Body to send with the request.\n */\n body?: ReqBody;\n\n /**\n * Headers to send with the request.\n */\n headers?: Record<string, any> | Headers;\n\n /**\n * Query params to interpolate into the URL.\n */\n query?: Record<string, any> | URLSearchParams;\n}\n\nexport interface HTTPRequest<Body> {\n method: string;\n uri: string;\n readonly sameOrigin: boolean;\n headers: Headers;\n query: URLSearchParams;\n body: Body;\n}\n\nexport interface HTTPResponse<Body> {\n method: string;\n uri: string;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: Body;\n}\n\nexport class HTTPResponseError extends Error {\n response;\n\n constructor(response: HTTPResponse<any>) {\n const { status, statusText, method, uri } = response;\n const message = `${status} ${statusText}: Request failed (${method.toUpperCase()} ${uri})`;\n\n super(message);\n\n this.response = response;\n }\n}\n\ninterface MakeRequestConfig<ReqBody> extends RequestOptions<ReqBody> {\n method: string;\n uri: string;\n middleware: HTTPMiddleware[];\n fetch: typeof window.fetch;\n}\n\nasync function makeRequest<ResBody, ReqBody>(config: MakeRequestConfig<ReqBody>) {\n const { headers, query, fetch, middleware } = config;\n\n const request: HTTPRequest<ReqBody> = {\n method: config.method,\n uri: config.uri,\n get sameOrigin() {\n return !request.uri.startsWith(\"http\");\n },\n query: new URLSearchParams(),\n headers: new Headers(),\n body: config.body!,\n };\n\n // Read headers into request\n if (headers) {\n if (headers instanceof Map || headers instanceof Headers) {\n headers.forEach((value, key) => {\n request.headers.set(key, value);\n });\n } else if (headers != null && typeof headers === \"object\" && !Array.isArray(headers)) {\n for (const name in headers) {\n const value = headers[name];\n if (value instanceof Date) {\n request.headers.set(name, value.toISOString());\n } else if (value != null) {\n request.headers.set(name, String(value));\n }\n }\n } else {\n throw new TypeError(`Unknown headers type. Got: ${headers}`);\n }\n }\n\n // Read query params into request\n if (query) {\n if (query instanceof Map || query instanceof URLSearchParams) {\n query.forEach((value, key) => {\n request.query.set(key, value);\n });\n } else if (query != null && typeof query === \"object\" && !Array.isArray(query)) {\n for (const name in query) {\n const value = query[name];\n if (value instanceof Date) {\n request.query.set(name, value.toISOString());\n } else if (value != null) {\n request.query.set(name, String(value));\n }\n }\n } else {\n throw new TypeError(`Unknown query params type. Got: ${query}`);\n }\n }\n\n let response: HTTPResponse<ResBody>;\n\n // This is the function that performs the actual request after the final middleware.\n const handler = async () => {\n const query = request.query.toString();\n const fullURL = query.length > 0 ? request.uri + \"?\" + query : request.uri;\n\n let reqBody: BodyInit;\n\n if (!request.headers.has(\"content-type\") && isObject(request.body)) {\n // Auto-detect JSON bodies and encode as a string with correct headers.\n request.headers.set(\"content-type\", \"application/json\");\n reqBody = JSON.stringify(request.body);\n } else {\n reqBody = request.body as BodyInit;\n }\n\n const fetched = await fetch(fullURL, {\n method: request.method,\n headers: request.headers,\n body: reqBody,\n });\n\n // Auto-parse response body based on content-type header\n const headers = Object.fromEntries<string>(fetched.headers.entries());\n const contentType = headers[\"content-type\"];\n\n let body: ResBody;\n\n if (contentType?.includes(\"application/json\")) {\n body = await fetched.json();\n } else if (contentType?.includes(\"application/x-www-form-urlencoded\")) {\n body = (await fetched.formData()) as ResBody;\n } else {\n body = (await fetched.text()) as ResBody;\n }\n\n response = {\n method: request.method,\n uri: request.uri,\n status: fetched.status,\n statusText: fetched.statusText,\n headers: headers,\n body,\n };\n };\n\n if (middleware.length > 0) {\n const mount = (index = 0) => {\n const current = middleware[index];\n const next = middleware[index + 1] ? mount(index + 1) : handler;\n\n return async () =>\n current(request, async () => {\n await next();\n return response;\n });\n };\n\n await mount()();\n } else {\n await handler();\n }\n\n if (response!.status < 200 || response!.status >= 400) {\n throw new HTTPResponseError(response!);\n }\n\n return response!;\n}\n","import { createState, derive, isState, toState, type State } from \"../state.js\";\nimport { isFunction, isObject, isString } from \"../typeChecking.js\";\nimport type { Stringable } from \"../types.js\";\nimport { deepEqual } from \"../utils.js\";\nimport type { Dolla, Logger } from \"./dolla.js\";\n\n// ----- Types ----- //\n\n// TODO: Is there a good way to represent infinitely nested recursive types?\n/**\n * An object where values are either a translated string or another nested Translation object.\n */\ntype LocalizedStrings = Record<\n string,\n string | Record<string, string | Record<string, string | Record<string, string>>>\n>;\n\nexport interface LanguageConfig {\n name: string;\n\n /**\n * Path to a JSON file with translated strings for this language.\n */\n path?: string;\n\n /**\n * A callback function that returns a Promise that resolves to the translation object for this language.\n */\n fetch?: () => Promise<LocalizedStrings>;\n}\n\nexport type LanguageSetupOptions = {\n /**\n * Default language to load on startup\n */\n initialLanguage?: string | null;\n\n languages: LanguageConfig[];\n};\n\n// ----- Code ----- //\n\nclass Localization {\n dolla: Dolla;\n config: LanguageConfig;\n strings?: LocalizedStrings;\n\n constructor(config: LanguageConfig, dolla: Dolla) {\n this.config = config;\n this.dolla = dolla;\n }\n\n async load(): Promise<LocalizedStrings> {\n if (this.strings == null) {\n if (isFunction(this.config.fetch)) {\n const strings = await this.config.fetch();\n if (isObject(strings)) {\n this.strings = strings as LocalizedStrings;\n } else {\n throw new Error(`Fetch function did not return an object of language strings: ${strings}`);\n }\n } else if (isString(this.config.path)) {\n const res = await this.dolla.http.get(this.config.path);\n if (res.status >= 200 && res.status < 300) {\n if (isObject(res.body)) {\n this.strings = res.body as LocalizedStrings;\n } else {\n throw new Error(\n `Language path '${this.config.path}' did not return an object of language strings: ${res.body}`,\n );\n }\n } else {\n throw new Error(`HTTP request failed.`);\n }\n }\n }\n\n if (this.strings == null) {\n throw new Error(`Language could not be loaded.`);\n } else {\n return this.strings;\n }\n }\n}\n\nexport class Language {\n #dolla: Dolla;\n #logger: Logger;\n #localizations = new Map<string, Localization>();\n #cache: [key: string, values: Record<string, Stringable | State<Stringable>> | undefined, readable: State<string>][] =\n [];\n\n #initialLanguage = \"auto\";\n\n $current: State<string | undefined>;\n #setCurrent;\n #$strings;\n #setStrings;\n\n constructor(dolla: Dolla) {\n this.#dolla = dolla;\n this.#logger = dolla.createLogger(\"dolla/language\");\n\n const [$current, setCurrent] = createState<string>();\n const [$strings, setStrings] = createState<LocalizedStrings>();\n\n this.$current = $current;\n this.#setCurrent = setCurrent;\n this.#$strings = $strings;\n this.#setStrings = setStrings;\n\n /**\n * Load language before the app mounts.\n */\n dolla.beforeMount(async () => {\n if (this.#localizations.size > 0) {\n await this.setLanguage(this.#initialLanguage);\n }\n });\n }\n\n get supportedLanguages() {\n return [...this.#localizations.keys()];\n }\n\n setup(options: LanguageSetupOptions) {\n // Convert languages into Language instances.\n options.languages.forEach((entry) => {\n this.#localizations.set(entry.name, new Localization(entry, this.#dolla));\n });\n\n // Check that initialLanguage is actually registered.\n if (options.initialLanguage && options.initialLanguage !== \"auto\") {\n const isRegistered = options.languages.some((entry) => entry.name === options.initialLanguage);\n if (!isRegistered) {\n throw new Error(`Initial language '${options.initialLanguage}' has no registered translation.`);\n }\n this.#initialLanguage = options.initialLanguage;\n }\n\n this.#logger.info(\n `${this.#localizations.size} language${this.#localizations.size === 1 ? \"\" : \"s\"} supported: '${[...this.#localizations.keys()].join(\"', '\")}'`,\n );\n }\n\n async setLanguage(name: string) {\n let realName!: string;\n\n if (name === \"auto\") {\n let names = [];\n\n if (typeof navigator === \"object\") {\n const nav = navigator as any;\n\n if (nav.languages?.length > 0) {\n names.push(...nav.languages);\n } else if (nav.language) {\n names.push(nav.language);\n } else if (nav.browserLanguage) {\n names.push(nav.browserLanguage);\n } else if (nav.userLanguage) {\n names.push(nav.userLanguage);\n }\n }\n\n for (const name of names) {\n if (this.#localizations.has(name)) {\n // Found a matching language.\n realName = name;\n }\n }\n } else {\n // Tag is the actual tag to set.\n if (this.#localizations.has(name)) {\n realName = name;\n }\n }\n\n if (realName == null) {\n const firstLanguage = this.#localizations.keys().next().value;\n if (firstLanguage) {\n realName = firstLanguage;\n }\n }\n\n if (!realName || !this.#localizations.has(realName)) {\n throw new Error(`Language '${name}' is not configured for this app.`);\n }\n\n const lang = this.#localizations.get(realName)!;\n\n try {\n const translation = await lang.load();\n\n this.#setStrings(translation);\n this.#setCurrent(realName);\n\n this.#logger.info(\"set language to \" + realName);\n } catch (error) {\n if (error instanceof Error) {\n this.#logger.crash(error);\n }\n }\n }\n\n /**\n * Returns a State containing the value at `key`.\n \n * @param key - Key to the translated value.\n * @param values - A map of {{placeholder}} names and the values to replace them with.\n */\n t(key: string, values?: Record<string, Stringable | State<Stringable>>): State<string> {\n if (this === undefined) {\n throw new Error(\n `The 't' function cannot be destructured. If you need a standalone version you can import it like so: 'import { t } from \"@manyducks.co/dolla\"'`,\n );\n }\n\n if (!this.$current.get()) {\n return $noLanguageValue;\n }\n\n const cached = this.#getCached(key, values);\n if (cached) {\n return cached;\n }\n\n if (values) {\n const stateValues: Record<string, State<any>> = {};\n\n for (const [key, value] of Object.entries<any>(values)) {\n if (isState(value)) {\n stateValues[key] = value;\n }\n }\n\n // This looks extremely weird, but it creates a joined state\n // that contains the translation with interpolated observable values.\n const readableEntries = Object.entries(stateValues);\n if (readableEntries.length > 0) {\n const readables = readableEntries.map((x) => x[1]);\n const $merged = derive([this.#$strings, ...readables], (t, ...entryValues) => {\n const entries = entryValues.map((_, i) => readableEntries[i]);\n const mergedValues = {\n ...values,\n };\n\n for (let i = 0; i < entries.length; i++) {\n const key = entries[i][0];\n mergedValues[key] = entryValues[i];\n }\n\n const result = resolve(t, key) || `[NO TRANSLATION: ${key}]`;\n return replaceMustaches(result, mergedValues);\n });\n\n this.#cache.push([key, values, $merged]);\n\n return $merged;\n }\n }\n\n const $replaced = derive([this.#$strings], (t) => {\n let result = resolve(t, key) || `[NO TRANSLATION: ${key}]`;\n\n if (values) {\n result = replaceMustaches(result, values);\n }\n\n return result;\n });\n\n this.#cache.push([key, values, $replaced]);\n\n return $replaced;\n }\n\n #getCached(key: string, values?: Record<string, Stringable | State<Stringable>>): State<string> | undefined {\n for (const entry of this.#cache) {\n if (entry[0] === key && deepEqual(entry[1], values)) {\n return entry[2];\n }\n }\n }\n}\n\n// Fallback labels for missing state and data.\nconst $noLanguageValue = toState(\"[NO LANGUAGE SET]\");\n\n/**\n * Replaces {{placeholders}} with values in translated strings.\n */\nfunction replaceMustaches(template: string, values: Record<string, Stringable>) {\n for (const name in values) {\n template = template.replace(`{{${name}}}`, String(values[name]));\n }\n return template;\n}\n\nfunction resolve(object: any, key: string) {\n const parsed = String(key)\n .split(/[\\.\\[\\]]/)\n .filter((part) => part.trim() !== \"\");\n let value = object;\n\n while (parsed.length > 0) {\n const part = parsed.shift()!;\n\n if (value != null) {\n value = value[part];\n } else {\n value = undefined;\n }\n }\n\n return value;\n}\n","import type { Dolla, Logger } from \"./dolla.js\";\n\nexport class Render {\n #dolla: Dolla;\n #logger: Logger;\n\n // Keyed updates ensure only the most recent callback queued with a certain key\n // will be called, keeping DOM operations to a minimum.\n #keyedUpdates = new Map<string, () => void>();\n\n // All unkeyed updates are run on every batch.\n #unkeyedUpdates: (() => void)[] = [];\n\n // All read callbacks are run before updates on every batch.\n #reads: (() => void)[] = [];\n\n #isUpdating = false;\n\n constructor(dolla: Dolla) {\n this.#dolla = dolla;\n this.#logger = dolla.createLogger(\"dolla/render\");\n }\n\n /**\n * Queues a callback to run in the next render batch.\n * Running your DOM mutations in update callbacks reduces layout thrashing.\n * Returns a Promise that resolves once the callback has run.\n */\n update(callback: () => void, key?: string): Promise<void> {\n return new Promise((resolve) => {\n if (key) {\n this.#keyedUpdates.set(key, () => {\n callback();\n resolve();\n });\n } else {\n this.#unkeyedUpdates.push(() => {\n callback();\n resolve();\n });\n }\n\n if (!this.#isUpdating && this.#dolla.isMounted) {\n this.#isUpdating = true;\n this.#runUpdates();\n }\n });\n }\n\n /**\n * Queues a callback that reads DOM information to run after the next render batch,\n * ensuring all writes have been performed before reading.\n * Returns a Promise that resolves once the callback has run.\n */\n async read(callback: () => void): Promise<void> {\n return new Promise((resolve) => {\n this.#reads.push(() => {\n callback();\n resolve();\n });\n\n if (!this.#isUpdating && this.#dolla.isMounted) {\n this.#isUpdating = true;\n this.#runUpdates();\n }\n });\n }\n\n #runUpdates() {\n const totalQueued = this.#keyedUpdates.size + this.#unkeyedUpdates.length;\n\n if (!this.#dolla.isMounted || totalQueued === 0) {\n this.#isUpdating = false;\n }\n\n if (!this.#isUpdating) {\n for (const callback of this.#reads) {\n callback();\n }\n this.#reads = [];\n return;\n }\n\n requestAnimationFrame(() => {\n this.#logger.info(`Batching ${this.#keyedUpdates.size + this.#unkeyedUpdates.length} queued DOM update(s).`);\n\n // Run keyed updates first.\n for (const callback of this.#keyedUpdates.values()) {\n callback();\n }\n this.#keyedUpdates.clear();\n\n // Run unkeyed updates second.\n for (const callback of this.#unkeyedUpdates) {\n callback();\n }\n this.#unkeyedUpdates = [];\n\n // Trigger again to catch updates queued while this batch was running.\n this.#runUpdates();\n });\n }\n}\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","import _extends from '@babel/runtime/helpers/esm/extends';\n\n/**\r\n * Actions represent the type of change to a location value.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#action\r\n */\nvar Action;\n\n(function (Action) {\n /**\r\n * A POP indicates a change to an arbitrary index in the history stack, such\r\n * as a back or forward navigation. It does not describe the direction of the\r\n * navigation, only that the current index changed.\r\n *\r\n * Note: This is the default action for newly created history objects.\r\n */\n Action[\"Pop\"] = \"POP\";\n /**\r\n * A PUSH indicates a new entry being added to the history stack, such as when\r\n * a link is clicked and a new page loads. When this happens, all subsequent\r\n * entries in the stack are lost.\r\n */\n\n Action[\"Push\"] = \"PUSH\";\n /**\r\n * A REPLACE indicates the entry at the current index in the history stack\r\n * being replaced by a new one.\r\n */\n\n Action[\"Replace\"] = \"REPLACE\";\n})(Action || (Action = {}));\n\nvar readOnly = process.env.NODE_ENV !== \"production\" ? function (obj) {\n return Object.freeze(obj);\n} : function (obj) {\n return obj;\n};\n\nfunction warning(cond, message) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== 'undefined') console.warn(message);\n\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience so you can more easily\n // find the source for a warning that appears in the console by\n // enabling \"pause on exceptions\" in your JavaScript debugger.\n throw new Error(message); // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n\nvar BeforeUnloadEventType = 'beforeunload';\nvar HashChangeEventType = 'hashchange';\nvar PopStateEventType = 'popstate';\n/**\r\n * Browser history stores the location in regular URLs. This is the standard for\r\n * most web apps, but it requires some configuration on the server to ensure you\r\n * serve the same app at multiple URLs.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\r\n */\n\nfunction createBrowserHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$window = _options.window,\n window = _options$window === void 0 ? document.defaultView : _options$window;\n var globalHistory = window.history;\n\n function getIndexAndLocation() {\n var _window$location = window.location,\n pathname = _window$location.pathname,\n search = _window$location.search,\n hash = _window$location.hash;\n var state = globalHistory.state || {};\n return [state.idx, readOnly({\n pathname: pathname,\n search: search,\n hash: hash,\n state: state.usr || null,\n key: state.key || 'default'\n })];\n }\n\n var blockedPopTx = null;\n\n function handlePop() {\n if (blockedPopTx) {\n blockers.call(blockedPopTx);\n blockedPopTx = null;\n } else {\n var nextAction = Action.Pop;\n\n var _getIndexAndLocation = getIndexAndLocation(),\n nextIndex = _getIndexAndLocation[0],\n nextLocation = _getIndexAndLocation[1];\n\n if (blockers.length) {\n if (nextIndex != null) {\n var delta = index - nextIndex;\n\n if (delta) {\n // Revert the POP\n blockedPopTx = {\n action: nextAction,\n location: nextLocation,\n retry: function retry() {\n go(delta * -1);\n }\n };\n go(delta);\n }\n } else {\n // Trying to POP to a location with no index. We did not create\n // this location, so we can't effectively block the navigation.\n process.env.NODE_ENV !== \"production\" ? warning(false, // TODO: Write up a doc that explains our blocking strategy in\n // detail and link to it here so people can understand better what\n // is going on and how to avoid it.\n \"You are trying to block a POP navigation to a location that was not \" + \"created by the history library. The block will fail silently in \" + \"production, but in general you should do all navigation with the \" + \"history library (instead of using window.history.pushState directly) \" + \"to avoid this situation.\") : void 0;\n }\n } else {\n applyTx(nextAction);\n }\n }\n }\n\n window.addEventListener(PopStateEventType, handlePop);\n var action = Action.Pop;\n\n var _getIndexAndLocation2 = getIndexAndLocation(),\n index = _getIndexAndLocation2[0],\n location = _getIndexAndLocation2[1];\n\n var listeners = createEvents();\n var blockers = createEvents();\n\n if (index == null) {\n index = 0;\n globalHistory.replaceState(_extends({}, globalHistory.state, {\n idx: index\n }), '');\n }\n\n function createHref(to) {\n return typeof to === 'string' ? to : createPath(to);\n } // state defaults to `null` because `window.history.state` does\n\n\n function getNextLocation(to, state) {\n if (state === void 0) {\n state = null;\n }\n\n return readOnly(_extends({\n pathname: location.pathname,\n hash: '',\n search: ''\n }, typeof to === 'string' ? parsePath(to) : to, {\n state: state,\n key: createKey()\n }));\n }\n\n function getHistoryStateAndUrl(nextLocation, index) {\n return [{\n usr: nextLocation.state,\n key: nextLocation.key,\n idx: index\n }, createHref(nextLocation)];\n }\n\n function allowTx(action, location, retry) {\n return !blockers.length || (blockers.call({\n action: action,\n location: location,\n retry: retry\n }), false);\n }\n\n function applyTx(nextAction) {\n action = nextAction;\n\n var _getIndexAndLocation3 = getIndexAndLocation();\n\n index = _getIndexAndLocation3[0];\n location = _getIndexAndLocation3[1];\n listeners.call({\n action: action,\n location: location\n });\n }\n\n function push(to, state) {\n var nextAction = Action.Push;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n push(to, state);\n }\n\n if (allowTx(nextAction, nextLocation, retry)) {\n var _getHistoryStateAndUr = getHistoryStateAndUrl(nextLocation, index + 1),\n historyState = _getHistoryStateAndUr[0],\n url = _getHistoryStateAndUr[1]; // TODO: Support forced reloading\n // try...catch because iOS limits us to 100 pushState calls :/\n\n\n try {\n globalHistory.pushState(historyState, '', url);\n } catch (error) {\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n applyTx(nextAction);\n }\n }\n\n function replace(to, state) {\n var nextAction = Action.Replace;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n replace(to, state);\n }\n\n if (allowTx(nextAction, nextLocation, retry)) {\n var _getHistoryStateAndUr2 = getHistoryStateAndUrl(nextLocation, index),\n historyState = _getHistoryStateAndUr2[0],\n url = _getHistoryStateAndUr2[1]; // TODO: Support forced reloading\n\n\n globalHistory.replaceState(historyState, '', url);\n applyTx(nextAction);\n }\n }\n\n function go(delta) {\n globalHistory.go(delta);\n }\n\n var history = {\n get action() {\n return action;\n },\n\n get location() {\n return location;\n },\n\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n back: function back() {\n go(-1);\n },\n forward: function forward() {\n go(1);\n },\n listen: function listen(listener) {\n return listeners.push(listener);\n },\n block: function block(blocker) {\n var unblock = blockers.push(blocker);\n\n if (blockers.length === 1) {\n window.addEventListener(BeforeUnloadEventType, promptBeforeUnload);\n }\n\n return function () {\n unblock(); // Remove the beforeunload listener so the document may\n // still be salvageable in the pagehide event.\n // See https://html.spec.whatwg.org/#unloading-documents\n\n if (!blockers.length) {\n window.removeEventListener(BeforeUnloadEventType, promptBeforeUnload);\n }\n };\n }\n };\n return history;\n}\n/**\r\n * Hash history stores the location in window.location.hash. This makes it ideal\r\n * for situations where you don't want to send the location to the server for\r\n * some reason, either because you do cannot configure it or the URL space is\r\n * reserved for something else.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\r\n */\n\nfunction createHashHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options2 = options,\n _options2$window = _options2.window,\n window = _options2$window === void 0 ? document.defaultView : _options2$window;\n var globalHistory = window.history;\n\n function getIndexAndLocation() {\n var _parsePath = parsePath(window.location.hash.substr(1)),\n _parsePath$pathname = _parsePath.pathname,\n pathname = _parsePath$pathname === void 0 ? '/' : _parsePath$pathname,\n _parsePath$search = _parsePath.search,\n search = _parsePath$search === void 0 ? '' : _parsePath$search,\n _parsePath$hash = _parsePath.hash,\n hash = _parsePath$hash === void 0 ? '' : _parsePath$hash;\n\n var state = globalHistory.state || {};\n return [state.idx, readOnly({\n pathname: pathname,\n search: search,\n hash: hash,\n state: state.usr || null,\n key: state.key || 'default'\n })];\n }\n\n var blockedPopTx = null;\n\n function handlePop() {\n if (blockedPopTx) {\n blockers.call(blockedPopTx);\n blockedPopTx = null;\n } else {\n var nextAction = Action.Pop;\n\n var _getIndexAndLocation4 = getIndexAndLocation(),\n nextIndex = _getIndexAndLocation4[0],\n nextLocation = _getIndexAndLocation4[1];\n\n if (blockers.length) {\n if (nextIndex != null) {\n var delta = index - nextIndex;\n\n if (delta) {\n // Revert the POP\n blockedPopTx = {\n action: nextAction,\n location: nextLocation,\n retry: function retry() {\n go(delta * -1);\n }\n };\n go(delta);\n }\n } else {\n // Trying to POP to a location with no index. We did not create\n // this location, so we can't effectively block the navigation.\n process.env.NODE_ENV !== \"production\" ? warning(false, // TODO: Write up a doc that explains our blocking strategy in\n // detail and link to it here so people can understand better\n // what is going on and how to avoid it.\n \"You are trying to block a POP navigation to a location that was not \" + \"created by the history library. The block will fail silently in \" + \"production, but in general you should do all navigation with the \" + \"history library (instead of using window.history.pushState directly) \" + \"to avoid this situation.\") : void 0;\n }\n } else {\n applyTx(nextAction);\n }\n }\n }\n\n window.addEventListener(PopStateEventType, handlePop); // popstate does not fire on hashchange in IE 11 and old (trident) Edge\n // https://developer.mozilla.org/de/docs/Web/API/Window/popstate_event\n\n window.addEventListener(HashChangeEventType, function () {\n var _getIndexAndLocation5 = getIndexAndLocation(),\n nextLocation = _getIndexAndLocation5[1]; // Ignore extraneous hashchange events.\n\n\n if (createPath(nextLocation) !== createPath(location)) {\n handlePop();\n }\n });\n var action = Action.Pop;\n\n var _getIndexAndLocation6 = getIndexAndLocation(),\n index = _getIndexAndLocation6[0],\n location = _getIndexAndLocation6[1];\n\n var listeners = createEvents();\n var blockers = createEvents();\n\n if (index == null) {\n index = 0;\n globalHistory.replaceState(_extends({}, globalHistory.state, {\n idx: index\n }), '');\n }\n\n function getBaseHref() {\n var base = document.querySelector('base');\n var href = '';\n\n if (base && base.getAttribute('href')) {\n var url = window.location.href;\n var hashIndex = url.indexOf('#');\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n\n return href;\n }\n\n function createHref(to) {\n return getBaseHref() + '#' + (typeof to === 'string' ? to : createPath(to));\n }\n\n function getNextLocation(to, state) {\n if (state === void 0) {\n state = null;\n }\n\n return readOnly(_extends({\n pathname: location.pathname,\n hash: '',\n search: ''\n }, typeof to === 'string' ? parsePath(to) : to, {\n state: state,\n key: createKey()\n }));\n }\n\n function getHistoryStateAndUrl(nextLocation, index) {\n return [{\n usr: nextLocation.state,\n key: nextLocation.key,\n idx: index\n }, createHref(nextLocation)];\n }\n\n function allowTx(action, location, retry) {\n return !blockers.length || (blockers.call({\n action: action,\n location: location,\n retry: retry\n }), false);\n }\n\n function applyTx(nextAction) {\n action = nextAction;\n\n var _getIndexAndLocation7 = getIndexAndLocation();\n\n index = _getIndexAndLocation7[0];\n location = _getIndexAndLocation7[1];\n listeners.call({\n action: action,\n location: location\n });\n }\n\n function push(to, state) {\n var nextAction = Action.Push;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n push(to, state);\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(nextLocation.pathname.charAt(0) === '/', \"Relative pathnames are not supported in hash history.push(\" + JSON.stringify(to) + \")\") : void 0;\n\n if (allowTx(nextAction, nextLocation, retry)) {\n var _getHistoryStateAndUr3 = getHistoryStateAndUrl(nextLocation, index + 1),\n historyState = _getHistoryStateAndUr3[0],\n url = _getHistoryStateAndUr3[1]; // TODO: Support forced reloading\n // try...catch because iOS limits us to 100 pushState calls :/\n\n\n try {\n globalHistory.pushState(historyState, '', url);\n } catch (error) {\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n applyTx(nextAction);\n }\n }\n\n function replace(to, state) {\n var nextAction = Action.Replace;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n replace(to, state);\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(nextLocation.pathname.charAt(0) === '/', \"Relative pathnames are not supported in hash history.replace(\" + JSON.stringify(to) + \")\") : void 0;\n\n if (allowTx(nextAction, nextLocation, retry)) {\n var _getHistoryStateAndUr4 = getHistoryStateAndUrl(nextLocation, index),\n historyState = _getHistoryStateAndUr4[0],\n url = _getHistoryStateAndUr4[1]; // TODO: Support forced reloading\n\n\n globalHistory.replaceState(historyState, '', url);\n applyTx(nextAction);\n }\n }\n\n function go(delta) {\n globalHistory.go(delta);\n }\n\n var history = {\n get action() {\n return action;\n },\n\n get location() {\n return location;\n },\n\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n back: function back() {\n go(-1);\n },\n forward: function forward() {\n go(1);\n },\n listen: function listen(listener) {\n return listeners.push(listener);\n },\n block: function block(blocker) {\n var unblock = blockers.push(blocker);\n\n if (blockers.length === 1) {\n window.addEventListener(BeforeUnloadEventType, promptBeforeUnload);\n }\n\n return function () {\n unblock(); // Remove the beforeunload listener so the document may\n // still be salvageable in the pagehide event.\n // See https://html.spec.whatwg.org/#unloading-documents\n\n if (!blockers.length) {\n window.removeEventListener(BeforeUnloadEventType, promptBeforeUnload);\n }\n };\n }\n };\n return history;\n}\n/**\r\n * Memory history stores the current location in memory. It is designed for use\r\n * in stateful non-browser environments like tests and React Native.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#creatememoryhistory\r\n */\n\nfunction createMemoryHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options3 = options,\n _options3$initialEntr = _options3.initialEntries,\n initialEntries = _options3$initialEntr === void 0 ? ['/'] : _options3$initialEntr,\n initialIndex = _options3.initialIndex;\n var entries = initialEntries.map(function (entry) {\n var location = readOnly(_extends({\n pathname: '/',\n search: '',\n hash: '',\n state: null,\n key: createKey()\n }, typeof entry === 'string' ? parsePath(entry) : entry));\n process.env.NODE_ENV !== \"production\" ? warning(location.pathname.charAt(0) === '/', \"Relative pathnames are not supported in createMemoryHistory({ initialEntries }) (invalid entry: \" + JSON.stringify(entry) + \")\") : void 0;\n return location;\n });\n var index = clamp(initialIndex == null ? entries.length - 1 : initialIndex, 0, entries.length - 1);\n var action = Action.Pop;\n var location = entries[index];\n var listeners = createEvents();\n var blockers = createEvents();\n\n function createHref(to) {\n return typeof to === 'string' ? to : createPath(to);\n }\n\n function getNextLocation(to, state) {\n if (state === void 0) {\n state = null;\n }\n\n return readOnly(_extends({\n pathname: location.pathname,\n search: '',\n hash: ''\n }, typeof to === 'string' ? parsePath(to) : to, {\n state: state,\n key: createKey()\n }));\n }\n\n function allowTx(action, location, retry) {\n return !blockers.length || (blockers.call({\n action: action,\n location: location,\n retry: retry\n }), false);\n }\n\n function applyTx(nextAction, nextLocation) {\n action = nextAction;\n location = nextLocation;\n listeners.call({\n action: action,\n location: location\n });\n }\n\n function push(to, state) {\n var nextAction = Action.Push;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n push(to, state);\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(location.pathname.charAt(0) === '/', \"Relative pathnames are not supported in memory history.push(\" + JSON.stringify(to) + \")\") : void 0;\n\n if (allowTx(nextAction, nextLocation, retry)) {\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n applyTx(nextAction, nextLocation);\n }\n }\n\n function replace(to, state) {\n var nextAction = Action.Replace;\n var nextLocation = getNextLocation(to, state);\n\n function retry() {\n replace(to, state);\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(location.pathname.charAt(0) === '/', \"Relative pathnames are not supported in memory history.replace(\" + JSON.stringify(to) + \")\") : void 0;\n\n if (allowTx(nextAction, nextLocation, retry)) {\n entries[index] = nextLocation;\n applyTx(nextAction, nextLocation);\n }\n }\n\n function go(delta) {\n var nextIndex = clamp(index + delta, 0, entries.length - 1);\n var nextAction = Action.Pop;\n var nextLocation = entries[nextIndex];\n\n function retry() {\n go(delta);\n }\n\n if (allowTx(nextAction, nextLocation, retry)) {\n index = nextIndex;\n applyTx(nextAction, nextLocation);\n }\n }\n\n var history = {\n get index() {\n return index;\n },\n\n get action() {\n return action;\n },\n\n get location() {\n return location;\n },\n\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n back: function back() {\n go(-1);\n },\n forward: function forward() {\n go(1);\n },\n listen: function listen(listener) {\n return listeners.push(listener);\n },\n block: function block(blocker) {\n return blockers.push(blocker);\n }\n };\n return history;\n} ////////////////////////////////////////////////////////////////////////////////\n// UTILS\n////////////////////////////////////////////////////////////////////////////////\n\nfunction clamp(n, lowerBound, upperBound) {\n return Math.min(Math.max(n, lowerBound), upperBound);\n}\n\nfunction promptBeforeUnload(event) {\n // Cancel the event.\n event.preventDefault(); // Chrome (and legacy IE) requires returnValue to be set.\n\n event.returnValue = '';\n}\n\nfunction createEvents() {\n var handlers = [];\n return {\n get length() {\n return handlers.length;\n },\n\n push: function push(fn) {\n handlers.push(fn);\n return function () {\n handlers = handlers.filter(function (handler) {\n return handler !== fn;\n });\n };\n },\n call: function call(arg) {\n handlers.forEach(function (fn) {\n return fn && fn(arg);\n });\n }\n };\n}\n\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n/**\r\n * Creates a string URL path from the given pathname, search, and hash components.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createpath\r\n */\n\n\nfunction createPath(_ref) {\n var _ref$pathname = _ref.pathname,\n pathname = _ref$pathname === void 0 ? '/' : _ref$pathname,\n _ref$search = _ref.search,\n search = _ref$search === void 0 ? '' : _ref$search,\n _ref$hash = _ref.hash,\n hash = _ref$hash === void 0 ? '' : _ref$hash;\n if (search && search !== '?') pathname += search.charAt(0) === '?' ? search : '?' + search;\n if (hash && hash !== '#') pathname += hash.charAt(0) === '#' ? hash : '#' + hash;\n return pathname;\n}\n/**\r\n * Parses a string URL path into its separate pathname, search, and hash components.\r\n *\r\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#parsepath\r\n */\n\nfunction parsePath(path) {\n var parsedPath = {};\n\n if (path) {\n var hashIndex = path.indexOf('#');\n\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n\n var searchIndex = path.indexOf('?');\n\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n\n if (path) {\n parsedPath.pathname = path;\n }\n }\n\n return parsedPath;\n}\n\nexport { Action, createBrowserHistory, createHashHistory, createMemoryHistory, createPath, parsePath };\n//# sourceMappingURL=index.js.map\n","import { assertString, assertArrayOf, isFunction } from \"./typeChecking.js\";\n\nexport type RouteMatch<T = Record<string, any>> = {\n /**\n * The path string that triggered this match.\n */\n path: string;\n\n /**\n * The pattern satisfied by `path`.\n */\n pattern: string;\n\n /**\n * Named params as parsed from `path`.\n */\n params: Record<string, string | number>;\n\n /**\n * Query params as parsed from `path`.\n */\n query: Record<string, string | number | boolean>;\n\n /**\n * Metadata registered to this route.\n */\n meta: T;\n};\n\nexport enum FragTypes {\n Literal = 1,\n Param = 2,\n Wildcard = 3,\n NumericParam = 4,\n}\n\nexport type RouteFragment = {\n name: string;\n type: FragTypes;\n value: string | number | null;\n};\n\nexport type ParsedRoute<T> = {\n pattern: string;\n fragments: RouteFragment[];\n meta: T;\n};\n\nexport type RouteMatchOptions<T> = {\n willMatch?: (route: ParsedRoute<T>) => boolean;\n};\n\n/**\n * Separates a URL path into multiple fragments.\n *\n * @param path - A path string (e.g. `\"/api/users/5\"`)\n * @returns an array of fragments (e.g. `[\"api\", \"users\", \"5\"]`)\n */\nexport function splitPath(path: string): string[] {\n assertString(path, \"Expected `path` to be a string. Got type: %t, value: %v\");\n\n return path\n .split(\"/\")\n .map((f) => f.trim())\n .filter((f) => f !== \"\");\n}\n\n/**\n * Joins multiple URL path fragments into a single string.\n *\n * @param parts - One or more URL fragments (e.g. `[\"api\", \"users\", 5]`)\n * @returns a joined path (e.g. `\"api/users/5\"`)\n */\nexport function joinPath(parts: { toString(): string }[]): string {\n assertArrayOf(\n (part) => isFunction(part?.toString),\n parts,\n \"Expected `parts` to be an array of objects with a .toString() method. Got type: %t, value: %v\",\n );\n\n parts = parts.filter((x) => x).flatMap(String);\n\n let joined = parts.shift()?.toString();\n\n if (joined) {\n for (const part of parts.map((p) => p.toString())) {\n if (part.startsWith(\".\")) {\n // Resolve relative path against joined\n joined = resolvePath(joined, part);\n } else if (joined[joined.length - 1] !== \"/\") {\n if (part[0] !== \"/\") {\n joined += \"/\" + part;\n } else {\n joined += part;\n }\n } else {\n if (part[0] === \"/\") {\n joined += part.slice(1);\n } else {\n joined += part;\n }\n }\n }\n\n // Remove trailing slash (unless path is just '/')\n if (joined && joined !== \"/\" && joined.endsWith(\"/\")) {\n joined = joined.slice(0, joined.length - 1);\n }\n }\n\n return joined ?? \"\";\n}\n\nexport function resolvePath(base: string, part: string | null) {\n assertString(base, \"Expected `base` to be a string. Got type: %t, value: %v\");\n\n if (part == null) {\n part = base;\n base = \"\";\n }\n\n if (part.startsWith(\"/\")) {\n return part;\n }\n\n let resolved = base;\n\n while (true) {\n if (part.startsWith(\"..\")) {\n for (let i = resolved.length; i > 0; --i) {\n if (resolved[i] === \"/\" || i === 0) {\n resolved = resolved.slice(0, i);\n part = part.replace(/^\\.\\.\\/?/, \"\");\n break;\n }\n }\n } else if (part.startsWith(\".\")) {\n part = part.replace(/^\\.\\/?/, \"\");\n } else {\n break;\n }\n }\n\n return joinPath([resolved, part]);\n}\n\nexport function parseQueryParams(query: string): Record<string, string | number | boolean> {\n if (!query) return {};\n\n if (query.startsWith(\"?\")) {\n query = query.slice(1);\n }\n\n const entries = query\n .split(\"&\")\n .filter((x) => x.trim() !== \"\")\n .map((entry) => {\n const [key, value] = entry.split(\"=\").map((x) => x.trim());\n\n if (value.toLowerCase() === \"true\") {\n return [key, true] as const;\n }\n\n if (value.toLowerCase() === \"false\") {\n return [key, false] as const;\n }\n\n // Return value as a number if it parses as one.\n if (!isNaN(Number(value))) {\n return [key, Number(value)] as const;\n }\n\n return [key, value] as const;\n });\n\n return Object.fromEntries(entries);\n}\n\n/**\n * Returns the nearest match, or undefined if the path matches no route.\n *\n * @param url - Path to match against routes.\n * @param options - Options to customize how matching operates.\n */\nexport function matchRoutes<T>(\n routes: ParsedRoute<T>[],\n url: string,\n options: RouteMatchOptions<T> = {},\n): RouteMatch<T> | undefined {\n const [path, query] = url.split(\"?\");\n const parts = splitPath(path);\n\n routes: for (const route of routes) {\n const { fragments } = route;\n const hasWildcard = fragments[fragments.length - 1]?.type === FragTypes.Wildcard;\n\n if (!hasWildcard && fragments.length !== parts.length) {\n continue routes;\n }\n\n if (options.willMatch && !options.willMatch(route)) {\n continue routes;\n }\n\n const matched: RouteFragment[] = [];\n\n fragments: for (let i = 0; i < fragments.length; i++) {\n const part = parts[i];\n const frag = fragments[i];\n\n if (part == null && frag.type !== FragTypes.Wildcard) {\n continue routes;\n }\n\n switch (frag.type) {\n case FragTypes.Literal:\n if (frag.name.toLowerCase() === part.toLowerCase()) {\n matched.push(frag);\n break;\n } else {\n continue routes;\n }\n case FragTypes.Param:\n matched.push({ ...frag, value: part });\n break;\n case FragTypes.Wildcard:\n matched.push({ ...frag, value: parts.slice(i).join(\"/\") });\n break fragments;\n case FragTypes.NumericParam:\n if (!isNaN(Number(part))) {\n matched.push({ ...frag, value: Number(part) });\n break;\n } else {\n continue routes;\n }\n default:\n throw new Error(`Unknown fragment type: ${frag.type}`);\n }\n }\n\n const params = Object.create(null);\n\n for (const frag of matched) {\n if (frag.type === FragTypes.Param) {\n params[frag.name] = decodeURIComponent(frag.value as string);\n }\n\n if (frag.type === FragTypes.NumericParam) {\n params[frag.name] = frag.value as number;\n }\n\n if (frag.type === FragTypes.Wildcard) {\n params.wildcard = \"/\" + decodeURIComponent(frag.value as string);\n }\n }\n\n return {\n path: \"/\" + matched.map((f) => f.value).join(\"/\"),\n pattern:\n \"/\" +\n fragments\n .map((f) => {\n if (f.type === FragTypes.Param) {\n return `{${f.name}}`;\n }\n\n if (f.type === FragTypes.NumericParam) {\n return `{#${f.name}}`;\n }\n\n return f.name;\n })\n .join(\"/\"),\n params,\n query: parseQueryParams(query),\n meta: route.meta,\n };\n }\n}\n\n/**\n * Sort routes descending by specificity. Guarantees that the most specific route matches first\n * no matter the order in which they were added.\n *\n * Routes without named params and routes with more fragments are weighted more heavily.\n */\nexport function sortRoutes<T>(routes: ParsedRoute<T>[]): ParsedRoute<T>[] {\n const withoutParams = [];\n const withNumericParams = [];\n const withParams = [];\n const wildcard = [];\n\n for (const route of routes) {\n const { fragments } = route;\n\n if (fragments.some((f) => f.type === FragTypes.Wildcard)) {\n wildcard.push(route);\n } else if (fragments.some((f) => f.type === FragTypes.NumericParam)) {\n withNumericParams.push(route);\n } else if (fragments.some((f) => f.type === FragTypes.Param)) {\n withParams.push(route);\n } else {\n withoutParams.push(route);\n }\n }\n\n const bySizeDesc = (a: ParsedRoute<T>, b: ParsedRoute<T>) => {\n if (a.fragments.length > b.fragments.length) {\n return -1;\n } else {\n return 1;\n }\n };\n\n withoutParams.sort(bySizeDesc);\n withNumericParams.sort(bySizeDesc);\n withParams.sort(bySizeDesc);\n wildcard.sort(bySizeDesc);\n\n return [...withoutParams, ...withNumericParams, ...withParams, ...wildcard];\n}\n\n/**\n * Converts a route pattern into a set of matchable fragments.\n *\n * @param route - A route string (e.g. \"/api/users/{id}\")\n */\nexport function patternToFragments(pattern: string): RouteFragment[] {\n const parts = splitPath(pattern);\n const fragments = [];\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (part === \"*\") {\n if (i !== parts.length - 1) {\n throw new Error(`Wildcard must be at the end of a pattern. Received: ${pattern}`);\n }\n fragments.push({\n type: FragTypes.Wildcard,\n name: \"*\",\n value: null,\n });\n } else if (part.at(0) === \"{\" && part.at(-1) === \"}\") {\n fragments.push({\n type: part[1] === \"#\" ? FragTypes.NumericParam : FragTypes.Param,\n name: part[1] === \"#\" ? part.slice(2, -1) : part.slice(1, -1),\n value: null,\n });\n } else {\n fragments.push({\n type: FragTypes.Literal,\n name: part,\n value: part,\n });\n }\n }\n\n return fragments;\n}\n","import { createBrowserHistory, createHashHistory, Update, type History } from \"history\";\nimport {\n joinPath,\n matchRoutes,\n ParsedRoute,\n parseQueryParams,\n patternToFragments,\n resolvePath,\n sortRoutes,\n splitPath,\n} from \"../routing.js\";\nimport { createState, StopFunction, watch } from \"../state.js\";\nimport { isFunction, isString } from \"../typeChecking.js\";\nimport { type Stringable } from \"../types.js\";\nimport { ViewNode, type ViewFunction } from \"../view.js\";\nimport { Passthrough } from \"../views/passthrough.js\";\nimport type { Dolla, Logger } from \"./dolla.js\";\n\n// ----- Types ----- //\n\nexport interface RouteMatchContext {\n /**\n * Redirects the user to a different route instead of matching the current one.\n */\n redirect(path: string): void;\n}\n\nexport interface Route {\n /**\n * The path or path fragment to match.\n */\n path: string;\n\n /**\n * Path to redirect to when this route is matched, or a callback function that returns such path.\n */\n redirect?: string | ((ctx: RouteRedirectContext) => string) | ((ctx: RouteRedirectContext) => Promise<string>);\n\n /**\n * View to display when this route is matched.\n */\n view?: ViewFunction<any>;\n\n /**\n * Subroutes.\n */\n routes?: Route[];\n\n /**\n * Called after the match is identified but before it is acted on. Use this to set state, load data, etc.\n */\n beforeMatch?: (ctx: RouteMatchContext) => void | Promise<void>;\n}\n\nexport interface RouteConfig {\n pattern: string;\n meta: {\n redirect?: string | ((ctx: RouteRedirectContext) => string) | ((ctx: RouteRedirectContext) => Promise<string>);\n pattern?: string;\n layers?: RouteLayer[];\n beforeMatch?: (ctx: RouteMatchContext) => void | Promise<void>;\n };\n}\n\nexport interface RouteLayer {\n id: number;\n view: ViewFunction<{}>;\n}\n\n/**\n * An active route layer whose markup has been initialized into a view.\n */\ninterface ActiveLayer {\n id: number;\n node: ViewNode;\n}\n\n/**\n * Object passed to redirect callbacks. Contains information useful for determining how to redirect.\n */\nexport interface RouteRedirectContext {\n /**\n * The path as it appears in the URL bar.\n */\n path: string;\n\n /**\n * The pattern that this path was matched with.\n */\n pattern: string;\n\n /**\n * Named route params parsed from `path`.\n */\n params: Record<string, string | number | undefined>;\n\n /**\n * Query params parsed from `path`.\n */\n query: Record<string, string | number | boolean | undefined>;\n}\n\ninterface ParsedParams {\n [key: string]: string | number | boolean | (string | number | boolean | null)[] | null;\n}\n\ninterface ParsedQuery extends ParsedParams {}\n\nexport interface NavigateOptions {\n /**\n * Replace the current item in the history stack instead of adding a new one.\n * The back button will send the user to the page they visited before this. Defaults to false.\n */\n replace?: boolean;\n\n /**\n * Preserve existing query params (if any) when navigating. Defaults to false.\n */\n preserveQuery?: boolean;\n}\n\nexport enum RoutingStyle {\n /**\n * Constructs routes like \"https://www.example.com/#/sub/route\" which work without any server-side setup.\n * A good choice if your app has no backend.\n */\n hash = \"hash\",\n\n /**\n * Constructs routes like \"https://www.example.com/sub/route\" which look nicer (subjective?) than hash routes and are what most users will expect URLs to look like, but require additional backend setup.\n * Path routing requires you to configure your backend to redirect to the app's index.html when subpaths are requested.\n */\n path = \"path\",\n}\n\nexport interface RouterSetupOptions {\n routes: Route[];\n\n /**\n * The routing style to use; \"hash\" will construct routes like \"https://www.example.com/#/sub/route\" which work without any server-side setup, while \"path\" will construct routes that use paths directly.\n */\n style?: RoutingStyle;\n}\n\nexport interface RouterElements {\n readonly rootElement?: HTMLElement;\n readonly rootView?: ViewNode;\n}\n\n// ----- Code ----- //\n\nexport class Router {\n #dolla: Dolla;\n #logger: Logger;\n #elements: RouterElements;\n\n #history!: History;\n #layerId = 0;\n #activeLayers: ActiveLayer[] = [];\n #lastQuery?: string;\n #routes: ParsedRoute<RouteConfig[\"meta\"]>[] = [];\n\n // Callbacks that need to be called on unmount.\n #cleanupCallbacks: StopFunction[] = [];\n\n /**\n * The currently matched route pattern, if any.\n */\n $pattern;\n #setPattern;\n\n /**\n * The current URL path.\n */\n $path;\n #setPath;\n\n /**\n * The current named path params.\n */\n $params;\n #setParams;\n\n /**\n * The current query params. Changes to this object will be reflected in the URL.\n */\n $query;\n #setQuery;\n\n constructor(dolla: Dolla, elements: RouterElements) {\n this.#dolla = dolla;\n this.#logger = dolla.createLogger(\"dolla/router\");\n this.#elements = elements;\n\n const [$pattern, setPattern] = createState<string | null>(null);\n const [$path, setPath] = createState(\"\");\n const [$params, setParams] = createState<ParsedParams>({});\n const [$query, setQuery] = createState<ParsedQuery>(\n parseQueryParams(typeof window === \"undefined\" ? \"\" : (window.location.search ?? \"\")),\n );\n\n this.$pattern = $pattern;\n this.#setPattern = setPattern;\n\n this.$path = $path;\n this.#setPath = setPath;\n\n this.$params = $params;\n this.#setParams = setParams;\n\n this.$query = $query;\n this.#setQuery = setQuery;\n\n dolla.beforeMount(() => {\n // If router setup has not run, we don't need to do anything.\n if (this.#history == null) return;\n\n // Update URL when query changes\n this.#cleanupCallbacks.push(\n watch([$query], (current) => {\n const params = new URLSearchParams();\n\n for (const key in current) {\n params.set(key, String(current[key]));\n }\n\n const search = \"?\" + params.toString();\n\n if (search != this.#history.location.search) {\n this.#history.replace({\n pathname: this.#history.location.pathname,\n search,\n });\n }\n }),\n );\n\n this.#cleanupCallbacks.push(this.#history.listen(this.#onRouteChange.bind(this)));\n this.#onRouteChange(this.#history);\n\n this.#cleanupCallbacks.push(\n catchLinks(this.#elements.rootElement!, (anchor) => {\n let href = anchor.getAttribute(\"href\")!;\n\n this.#logger.info(\"Intercepted link click\", anchor, href);\n\n if (!/^https?:\\/\\/|^\\//.test(href)) {\n href = joinPath([this.#history.location.pathname, href]);\n }\n\n this.#history.push(href);\n }),\n );\n this.#logger.info(\"Intercepting <a> clicks within root element:\", this.#elements.rootElement!);\n });\n\n dolla.onUnmount(() => {\n while (this.#cleanupCallbacks.length > 0) {\n const callback = this.#cleanupCallbacks.pop()!;\n callback();\n }\n });\n }\n\n setup(options: RouterSetupOptions) {\n if (this.#dolla.isMounted) {\n this.#logger.crash(\n new Error(`Dolla is already mounted. Router setup must be called before Dolla.mount is called.`),\n );\n return;\n }\n\n if (options.style === RoutingStyle.hash) {\n this.#history = createHashHistory();\n } else {\n this.#history = createBrowserHistory();\n }\n\n this.#routes = sortRoutes(\n options.routes\n .flatMap((route) => this.#prepareRoute(route))\n .map((route) => ({\n pattern: route.pattern,\n meta: route.meta,\n fragments: patternToFragments(route.pattern),\n })),\n );\n\n // Test redirects to make sure all possible redirect targets actually exist.\n for (const route of this.#routes) {\n if (route.meta.redirect) {\n let redirectPath: string;\n\n if (isFunction(route.meta.redirect)) {\n // throw new Error(`Redirect functions are not yet supported.`);\n // Just allow, though it could fail later. Best not to call the function and cause potential side effects.\n } else if (isString(route.meta.redirect)) {\n redirectPath = route.meta.redirect;\n\n const match = matchRoutes(this.#routes, redirectPath, {\n willMatch(r) {\n return r !== route;\n },\n });\n\n if (!match) {\n throw new Error(\n `Found a redirect to an undefined URL. From '${route.pattern}' to '${route.meta.redirect}'`,\n );\n }\n } else {\n throw new TypeError(`Expected a string or redirect function. Got: ${route.meta.redirect}`);\n }\n }\n }\n }\n\n /**\n * Navigates to another route.\n *\n * @example\n * navigate(\"/login\"); // navigate to `/login`\n * navigate([\"/users\", 215], { replace: true }); // replace current history entry with `/users/215`\n */\n go(path: Stringable | Stringable[], options: NavigateOptions = {}) {\n if (this.#history == null) {\n this.#logger.crash(\n new Error(\n `Router.go was called, but the router was never configured! Run 'Dolla.router.setup' before 'Dolla.mount' to configure routes.`,\n ),\n );\n return;\n }\n\n let joined: string;\n\n if (Array.isArray(path)) {\n joined = joinPath(path);\n } else {\n joined = path.toString();\n }\n\n joined = resolvePath(this.#history.location.pathname, joined);\n\n if (options.preserveQuery) {\n joined += this.#history.location.search;\n }\n\n if (options.replace) {\n this.#history.replace(joined);\n } else {\n this.#history.push(joined);\n }\n }\n\n /**\n * Navigate backward. Pass a number of steps to hit the back button that many times.\n */\n back(steps = 1) {\n if (this.#history == null) {\n this.#logger.crash(\n new Error(\n `Router.back was called, but the router was never configured! Run 'Dolla.router.setup' before 'Dolla.mount' to configure routes.`,\n ),\n );\n return;\n }\n\n this.#history.go(-steps);\n }\n\n /**\n * Navigate forward. Pass a number of steps to hit the forward button that many times.\n */\n forward(steps = 1) {\n if (this.#history == null) {\n this.#logger.crash(\n new Error(\n `Router.forward was called, but the router was never configured! Run 'Dolla.router.setup' before 'Dolla.mount' to configure routes.`,\n ),\n );\n return;\n }\n\n this.#history.go(steps);\n }\n\n /**\n * Parses a route definition object into a set of matchable routes.\n *\n * @param route - Route config object.\n * @param layers - Array of parent layers. Passed when this function calls itself on nested routes.\n */\n #prepareRoute(route: Route, parents: Route[] = [], layers: RouteLayer[] = []) {\n if (!(typeof route === \"object\" && !Array.isArray(route)) || !(typeof route.path === \"string\")) {\n throw new TypeError(`Route configs must be objects with a 'path' string property. Got: ${route}`);\n }\n\n if (route.redirect && route.routes) {\n throw new Error(`Route cannot have both a 'redirect' and nested 'routes'.`);\n } else if (route.redirect && route.view) {\n throw new Error(`Route cannot have both a 'redirect' and a 'view'.`);\n } else if (!route.view && !route.routes && !route.redirect) {\n throw new Error(`Route must have a 'view', a 'redirect', or a set of nested 'routes'.`);\n }\n\n let parts: string[] = [];\n\n for (const parent of parents) {\n parts.push(...splitPath(parent.path));\n }\n\n parts.push(...splitPath(route.path));\n\n // Remove trailing wildcard for joining with nested routes.\n if (parts[parts.length - 1] === \"*\") {\n parts.pop();\n }\n\n const routes: RouteConfig[] = [];\n\n if (route.redirect) {\n let redirect = route.redirect;\n\n if (isString(redirect)) {\n redirect = resolvePath(joinPath(parts), redirect);\n\n if (!redirect.startsWith(\"/\")) {\n redirect = \"/\" + redirect;\n }\n }\n\n routes.push({\n pattern: \"/\" + joinPath([...parts, ...splitPath(route.path)]),\n meta: {\n redirect,\n },\n });\n\n return routes;\n }\n\n let view: ViewFunction<any> = Passthrough;\n\n if (typeof route.view === \"function\") {\n view = route.view;\n } else if (route.view) {\n throw new TypeError(`Route '${route.path}' expected a view function or undefined. Got: ${route.view}`);\n }\n\n const layer: RouteLayer = { id: this.#layerId++, view };\n\n // Parse nested routes if they exist.\n if (route.routes) {\n for (const subroute of route.routes) {\n routes.push(...this.#prepareRoute(subroute, [...parents, route], [...layers, layer]));\n }\n } else {\n routes.push({\n pattern: parent ? joinPath([...parents.map((p) => p.path), route.path]) : route.path,\n meta: {\n pattern: route.path,\n layers: [...layers, layer],\n beforeMatch: route.beforeMatch,\n },\n });\n }\n\n return routes;\n }\n\n /**\n * Run when the location changes. Diffs and mounts new routes and updates\n * the $path, $route, $params and $query states accordingly.\n */\n async #onRouteChange({ location }: History | Update) {\n // Update query params if they've changed.\n if (location.search !== this.#lastQuery) {\n this.#lastQuery = location.search;\n this.#setQuery(parseQueryParams(location.search));\n }\n\n const matched = matchRoutes(this.#routes, location.pathname);\n\n if (!matched) {\n this.#setPattern(null);\n this.#setPath(location.pathname);\n this.#setParams({\n wildcard: location.pathname,\n });\n return;\n }\n\n // TODO: Replace with concept of route middleware.\n if (matched.meta.beforeMatch) {\n await matched.meta.beforeMatch({\n // TODO: Allow setting context variables from here.\n redirect: (path) => {\n // TODO: Implement\n throw new Error(`Redirect not yet implemented.`);\n },\n });\n }\n\n if (matched.meta.redirect != null) {\n if (typeof matched.meta.redirect === \"string\") {\n const path = replaceParams(matched.meta.redirect, matched.params);\n this.#logger.info(`↩️ redirecting from '${matched.path}' to '${path}'`);\n this.#history.replace(path);\n } else if (typeof matched.meta.redirect === \"function\") {\n const redirectContext: RouteRedirectContext = {\n path: matched.path,\n pattern: matched.pattern,\n params: matched.params,\n query: matched.query,\n };\n let path = await matched.meta.redirect(redirectContext);\n if (typeof path !== \"string\") {\n throw new Error(`Redirect function must return a path to redirect to.`);\n }\n if (!path.startsWith(\"/\")) {\n // Not absolute. Resolve against matched path.\n path = resolvePath(matched.path, path);\n }\n this.#logger.info(`Redirecting to: '${path}'`);\n this.#history.replace(path);\n } else {\n throw new TypeError(`Redirect must either be a path string or a function.`);\n }\n } else {\n this.#logger.info(`📍 navigating to '${matched.path}'`);\n\n this.#setPath(matched.path);\n this.#setParams(matched.params);\n\n if (matched.pattern !== this.$pattern.get()) {\n this.#setPattern(matched.pattern);\n\n const layers = matched.meta.layers!;\n\n // Diff and update route layers.\n for (let i = 0; i < layers.length; i++) {\n const matchedLayer = layers[i];\n const activeLayer = this.#activeLayers[i];\n\n if (activeLayer?.id !== matchedLayer.id) {\n // Remove any previously active layers at this depth or deeper.\n this.#activeLayers = this.#activeLayers.slice(0, i);\n\n const parentLayer = this.#activeLayers.at(-1);\n\n if (activeLayer && activeLayer.node.isMounted) {\n // Disconnect first mismatched active layer.\n activeLayer.node.unmount();\n }\n\n let node: ViewNode;\n\n // Replace parentLayer's previous children with the new layer.\n if (parentLayer) {\n node = parentLayer.node.setChildView(matchedLayer.view);\n } else {\n node = this.#elements.rootView!.setChildView(matchedLayer.view);\n }\n\n // Store the new active layer.\n this.#activeLayers.push({ id: matchedLayer.id, node });\n }\n }\n }\n }\n }\n}\n\nconst safeExternalLink = /(noopener|noreferrer) (noopener|noreferrer)/;\nconst protocolLink = /^[\\w-_]+:/;\n\n/**\n * Intercepts links within the root node.\n *\n * This is adapted from https://github.com/choojs/nanohref/blob/master/index.js\n *\n * @param root - Element under which to intercept link clicks\n * @param callback - Function to call when a click event is intercepted\n * @param _window - (optional) Override for global window object\n */\nexport function catchLinks(root: HTMLElement, callback: (anchor: HTMLAnchorElement) => void, _window = window) {\n function traverse(node: HTMLElement | null): HTMLAnchorElement | null {\n if (!node || node === root) {\n return null;\n }\n\n if (node.localName !== \"a\" || (node as any).href === undefined) {\n return traverse(node.parentNode as HTMLElement | null);\n }\n\n return node as HTMLAnchorElement;\n }\n\n function handler(e: MouseEvent) {\n if ((e.button && e.button !== 0) || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey || e.defaultPrevented) {\n return;\n }\n\n const anchor = traverse(e.target as HTMLElement);\n\n if (!anchor) {\n return;\n }\n\n if (\n _window.location.protocol !== anchor.protocol ||\n _window.location.hostname !== anchor.hostname ||\n _window.location.port !== anchor.port ||\n anchor.hasAttribute(\"data-router-ignore\") ||\n anchor.hasAttribute(\"download\") ||\n (anchor.getAttribute(\"target\") === \"_blank\" && safeExternalLink.test(anchor.getAttribute(\"rel\")!)) ||\n protocolLink.test(anchor.getAttribute(\"href\")!)\n ) {\n return;\n }\n\n e.preventDefault();\n callback(anchor);\n }\n\n root.addEventListener(\"click\", handler);\n\n return function cancel() {\n root.removeEventListener(\"click\", handler);\n };\n}\n\n/**\n * Replace route pattern param placeholders with real matched values.\n */\nfunction replaceParams(path: string, params: Record<string, string | number>) {\n for (const key in params) {\n const value = params[key].toString();\n path = path.replace(`{${key}}`, value).replace(`{#${key}}`, value);\n }\n\n return path;\n}\n","import { constructMarkup, createMarkup, createRef, isRef, MarkupNode, mergeNodes, type Markup } from \"../markup.js\";\nimport {\n createSettableState,\n createState,\n derive,\n toSettableState,\n toState,\n valueOf,\n watch,\n type State,\n} from \"../state.js\";\nimport { assertInstanceOf, isString } from \"../typeChecking.js\";\nimport { colorFromString, createMatcher, getDefaultConsole, noOp } from \"../utils.js\";\nimport { constructView, type ViewFunction, type ViewNode } from \"../view.js\";\nimport { DefaultCrashView, type CrashViewProps } from \"../views/default-crash-view.js\";\nimport { Passthrough } from \"../views/passthrough.js\";\n\nimport { HTTP } from \"./http.js\";\nimport { Language } from \"./language.js\";\nimport { Render } from \"./render.js\";\nimport { Router } from \"./router.js\";\n\n// Affects which log messages will print and how much debugging info is included in the DOM.\nexport type Environment = \"development\" | \"production\";\n\n/**\n * Log type toggles. Each message category can be turned on or off or enabled only in a specific environment.\n */\nexport type Loggles = {\n info: boolean | Environment;\n log: boolean | Environment;\n warn: boolean | Environment;\n error: boolean | Environment;\n};\n\nexport interface Logger {\n info(...args: any[]): void;\n log(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n crash(error: Error): void;\n}\n\nexport interface LoggerErrorContext {\n error: Error;\n loggerName: string;\n uid?: string;\n}\n\nexport type LoggerOptions = {\n /**\n * Console object to use for logging (mostly for testing). Uses window.console by default.\n */\n console?: any;\n\n /**\n * Unique ID to print with logs. Makes it easier to track down messages from specific view instances.\n */\n uid?: string;\n};\n\nexport class Dolla {\n readonly http: HTTP;\n readonly language: Language;\n readonly render: Render;\n readonly router: Router;\n\n #isMounted = false;\n #env: Environment = \"production\";\n #rootElement?: HTMLElement;\n #rootView?: ViewNode;\n #crashView: ViewFunction<CrashViewProps> = DefaultCrashView;\n\n #beforeMountCallbacks: Array<() => void | Promise<void>> = [];\n #onMountCallbacks: Array<() => void> = [];\n #beforeUnmountCallbacks: Array<() => void | Promise<void>> = [];\n #onUnmountCallbacks: Array<() => void> = [];\n\n #loggles: Loggles = {\n info: \"development\",\n log: \"development\",\n warn: \"development\",\n error: true,\n };\n #match = createMatcher(\"*,-dolla/*\");\n\n constructor() {\n const self = this;\n\n this.http = new HTTP();\n this.language = new Language(this);\n this.render = new Render(this);\n this.router = new Router(this, {\n get rootElement() {\n return self.#rootElement;\n },\n get rootView() {\n return self.#rootView;\n },\n });\n }\n\n createState = createState;\n createSettableState = createSettableState;\n toSettableState = toSettableState;\n toState = toState;\n valueOf = valueOf;\n derive = derive;\n watch = watch;\n\n createRef = createRef;\n isRef = isRef;\n\n /**\n * True when the app is connected to a DOM node and displayed to the user.\n */\n get isMounted() {\n return this.#isMounted;\n }\n\n /**\n * Get the current environment that this app is running in.\n * Environment affects which log messages will print and how much debugging info is included in the DOM.\n */\n getEnv() {\n return this.#env;\n }\n\n /**\n * Sets the environment that this app is running in.\n * Environment affects which log messages will print and how much debugging info is included in the DOM.\n */\n setEnv(value: Environment) {\n this.#env = value;\n }\n\n /**\n * Sets the view that will be shown when the `crash` method is called on any logger.\n * When a crash is reported the app will be unmounted and replaced with this crash page.\n */\n setCrashView(view: ViewFunction<CrashViewProps>) {\n this.#crashView = view;\n }\n\n async mount(selector: string, view?: ViewFunction<any>): Promise<void>;\n async mount(element: HTMLElement, view?: ViewFunction<any>): Promise<void>;\n\n async mount(target: string | HTMLElement, view?: ViewFunction<any>) {\n if (this.#isMounted) {\n throw new Error(`Dolla is already mounted.`);\n }\n\n if (isString(target)) {\n const match = document.querySelector<HTMLElement>(target);\n assertInstanceOf(HTMLElement, match, `Selector '${target}' did not match any element.`);\n this.#rootElement = match!;\n } else {\n assertInstanceOf(HTMLElement, target, \"Expected an HTML element or a selector string. Got type: %t, value: %v\");\n this.#rootElement = target;\n }\n\n let rootViewMarkup: Markup;\n\n if (view) {\n rootViewMarkup = createMarkup(view);\n } else {\n rootViewMarkup = createMarkup(Passthrough);\n }\n\n // First, initialize the root view. The router store needs this to connect the initial route.\n this.#rootView = this.constructView(rootViewMarkup.type as ViewFunction<any>, rootViewMarkup.props);\n\n // Run beforeMount\n await Promise.all(this.#beforeMountCallbacks.map((callback) => callback()));\n\n this.#rootView.mount(this.#rootElement);\n\n // App is now fully mounted.\n this.#isMounted = true;\n\n // Run onMount\n for (const callback of this.#onMountCallbacks) {\n callback();\n }\n }\n\n async unmount() {\n if (!this.#isMounted) return;\n\n // Run beforeUnmount\n await Promise.all(this.#beforeUnmountCallbacks.map((callback) => callback()));\n\n this.#rootView?.unmount();\n\n this.#isMounted = false;\n\n // Run onUnmount\n for (const callback of this.#onUnmountCallbacks) {\n callback();\n }\n }\n\n /**\n * Registers a `callback` to run after `Dolla.mount` is called, before the app is mounted. If `callback` returns a Promise,\n * it will be awaited before mounting finishes. Use this to perform initial setup before the app is displayed to the user.\n */\n beforeMount(callback: () => void | Promise<void>) {\n this.#beforeMountCallbacks.push(callback);\n }\n\n /**\n * Registers a `callback` to run after the app is mounted.\n */\n onMount(callback: () => void) {\n this.#onMountCallbacks.push(callback);\n }\n\n /**\n * Registers a `callback` to run after `Dolla.unmount` is called, before the app is unmounted. If `callback` returns a Promise,\n * it will be awaited before unmounting finishes. Use this to perform cleanup.\n */\n beforeUnmount(callback: () => void | Promise<void>) {\n this.#beforeUnmountCallbacks.push(callback);\n }\n\n /**\n * Registers a `callback` to run after the app is unmounted.\n */\n onUnmount(callback: () => void) {\n this.#onUnmountCallbacks.push(callback);\n }\n\n /**\n * Update log type toggles. Values that are not passed will remain unchanged.\n */\n setLoggles(options: Partial<Loggles>) {\n for (const key in options) {\n const value = options[key as keyof Loggles];\n if (value) {\n this.#loggles[key as keyof Loggles] = value;\n }\n }\n }\n\n setLogFilter(filter: string | RegExp) {\n this.#match = createMatcher(filter);\n }\n\n createLogger(name: string | State<string>, options?: LoggerOptions): Logger {\n const $name = toState(name);\n\n const _console = options?.console ?? getDefaultConsole();\n\n const self = this;\n\n return {\n get info() {\n const name = $name.get();\n if (\n self.#loggles.info === false ||\n (isString(self.#loggles.info) && self.#loggles.info !== self.getEnv()) ||\n !self.#match(name)\n ) {\n return noOp;\n } else {\n let label = `%c${name}`;\n if (options?.uid) {\n label += ` %c[uid: %c${options.uid}%c]`;\n } else {\n label += `%c%c%c`;\n }\n return _console.info.bind(\n _console,\n label,\n `color:${colorFromString(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n },\n\n get log() {\n const name = $name.get();\n if (\n self.#loggles.log === false ||\n (isString(self.#loggles.log) && self.#loggles.log !== self.getEnv()) ||\n !self.#match(name)\n ) {\n return noOp;\n } else {\n let label = `%c${name}`;\n if (options?.uid) {\n label += ` %c[uid: %c${options.uid}%c]`;\n } else {\n label += `%c%c%c`;\n }\n return _console.log.bind(\n _console,\n label,\n `color:${colorFromString(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n },\n\n get warn() {\n const name = $name.get();\n if (\n self.#loggles.warn === false ||\n (isString(self.#loggles.warn) && self.#loggles.warn !== self.getEnv()) ||\n !self.#match(name)\n ) {\n return noOp;\n } else {\n let label = `%c${name}`;\n if (options?.uid) {\n label += ` %c[uid: %c${options.uid}%c]`;\n } else {\n label += `%c%c%c`;\n }\n return _console.warn.bind(\n _console,\n label,\n `color:${colorFromString(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n },\n\n get error() {\n const name = $name.get();\n if (\n self.#loggles.error === false ||\n (isString(self.#loggles.error) && self.#loggles.error !== self.getEnv()) ||\n !self.#match(name)\n ) {\n return noOp;\n } else {\n let label = `%c${name}`;\n if (options?.uid) {\n label += ` %c[uid: %c${options.uid}%c]`;\n } else {\n label += `%c%c%c`;\n }\n return _console.error.bind(\n _console,\n label,\n `color:${colorFromString(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n },\n\n crash(error: Error) {\n if (self.isMounted) {\n // Unmount the app.\n self.unmount();\n\n // Mount the crash page\n const crashPage = self.constructView(self.#crashView, {\n error,\n loggerName: $name.get(),\n uid: options?.uid,\n });\n crashPage.mount(self.#rootElement!);\n }\n\n throw error;\n },\n };\n }\n\n /**\n *\n */\n constructView<P>(view: ViewFunction<P>, props: P, children: Markup[] = []): ViewNode {\n return constructView({ root: this, data: {} }, view, props, children);\n }\n\n /**\n *\n */\n constructMarkup(markup: Markup | Markup[]): MarkupNode {\n return mergeNodes(constructMarkup({ root: this, data: {} }, markup));\n }\n}\n","// States\nexport { createSettableState, createSetter, createState, derive, toSettableState, toState, valueOf } from \"./state.js\";\nexport type { MaybeState, SettableState, State, StopFunction } from \"./state.js\";\n\n// Markup\nexport { cond, createMarkup, createRef, html, isRef, portal, repeat } from \"./markup.js\";\nexport type { Markup, MarkupNode, Ref } from \"./markup.js\";\n\nimport { Dolla } from \"./modules/dolla.js\";\nconst dolla = new Dolla();\n\nexport default dolla;\n\n// Language: standalone `t` function\nexport const t = dolla.language.t.bind(dolla.language);\n\n// Other types\nexport type { Dolla, Environment, Logger, LoggerErrorContext, LoggerOptions, Loggles } from \"./modules/dolla.js\";\nexport type { HTTPRequest, HTTPResponse } from \"./modules/http.js\";\nexport type { InputType, Renderable } from \"./types.js\";\nexport type { ViewContext, ViewFunction, ViewNode } from \"./view.js\";\nexport type { CrashViewProps } from \"./views/default-crash-view.js\";\n\nimport type { IntrinsicElements as Elements } from \"./types\";\n\ndeclare global {\n namespace JSX {\n interface IntrinsicElements extends Elements {\n // Catch all for custom elements\n [tag: string]: any;\n }\n }\n}\n"],"names":["DefaultCrashView","props","html","cond","HTTP","__privateAdd","_HTTP_instances","_middleware","_fetch","getDefaultFetch","fn","__privateGet","uri","options","__privateMethod","request_fn","method","makeRequest","HTTPResponseError","response","status","statusText","message","__publicField","config","headers","query","fetch","middleware","request","value","key","name","handler","fullURL","reqBody","isObject","fetched","contentType","body","mount","index","current","next","Localization","dolla","isFunction","strings","isString","res","Language","_Language_instances","_dolla","_logger","_localizations","_cache","_initialLanguage","_setCurrent","_$strings","_setStrings","__privateSet","$current","setCurrent","createState","$strings","setStrings","entry","realName","names","nav","_a","firstLanguage","lang","translation","error","values","$noLanguageValue","cached","getCached_fn","stateValues","isState","readableEntries","readables","x","$merged","derive","t","entryValues","entries","_","i","mergedValues","result","resolve","replaceMustaches","$replaced","deepEqual","toState","template","object","parsed","part","Render","_Render_instances","_keyedUpdates","_unkeyedUpdates","_reads","_isUpdating","callback","runUpdates_fn","totalQueued","_extends","n","Action","readOnly","obj","warning","BeforeUnloadEventType","HashChangeEventType","PopStateEventType","createBrowserHistory","_options","_options$window","window","globalHistory","getIndexAndLocation","_window$location","pathname","search","hash","state","blockedPopTx","handlePop","blockers","nextAction","_getIndexAndLocation","nextIndex","nextLocation","delta","go","applyTx","action","_getIndexAndLocation2","location","listeners","createEvents","createHref","to","createPath","getNextLocation","parsePath","createKey","getHistoryStateAndUrl","allowTx","retry","_getIndexAndLocation3","push","_getHistoryStateAndUr","historyState","url","replace","_getHistoryStateAndUr2","history","listener","blocker","unblock","promptBeforeUnload","createHashHistory","_options2","_options2$window","_parsePath","_parsePath$pathname","_parsePath$search","_parsePath$hash","_getIndexAndLocation4","_getIndexAndLocation5","_getIndexAndLocation6","getBaseHref","base","href","hashIndex","_getIndexAndLocation7","_getHistoryStateAndUr3","_getHistoryStateAndUr4","event","handlers","arg","_ref","_ref$pathname","_ref$search","_ref$hash","path","parsedPath","searchIndex","splitPath","assertString","f","joinPath","parts","assertArrayOf","joined","p","resolvePath","resolved","parseQueryParams","matchRoutes","routes","route","fragments","matched","frag","params","sortRoutes","withoutParams","withNumericParams","withParams","wildcard","bySizeDesc","a","b","patternToFragments","pattern","Router","elements","_Router_instances","_elements","_history","_layerId","_activeLayers","_lastQuery","_routes","_cleanupCallbacks","_setPattern","_setPath","_setParams","_setQuery","$pattern","setPattern","$path","setPath","$params","setParams","$query","setQuery","watch","onRouteChange_fn","catchLinks","anchor","prepareRoute_fn","redirectPath","r","steps","parents","layers","parent","redirect","view","Passthrough","layer","__privateWrapper","subroute","replaceParams","redirectContext","matchedLayer","activeLayer","parentLayer","node","safeExternalLink","protocolLink","root","_window","traverse","e","Dolla","_isMounted","_env","_rootElement","_rootView","_crashView","_beforeMountCallbacks","_onMountCallbacks","_beforeUnmountCallbacks","_onUnmountCallbacks","_loggles","_match","createMatcher","createSettableState","toSettableState","valueOf","createRef","isRef","self","target","match","assertInstanceOf","rootViewMarkup","createMarkup","filter","$name","_console","getDefaultConsole","noOp","label","colorFromString","children","constructView","markup","mergeNodes","constructMarkup"],"mappings":";;;;;;;;;;;;;;;;;AAsBO,SAASA,GAAiBC,GAAuB;AAC/C,SAAAC;AAAA;AAAA,cAEK;AAAA,IACN,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,EACX,CAAA;AAAA;AAAA,kBAEW,EAAE,cAAc,UAAU;AAAA,iBAC3B,EAAE,cAAc,WAAW;AAAA,sBACtB,EAAE,YAAY,YAAA,CAAa,IAAID,EAAM,UAAU;AAAA,UAC3DE,GAAKF,EAAM,KAAKC,iBAAmB,EAAE,YAAY,aAAa,SAAS,IAAA,CAAK,WAAWD,EAAM,GAAG,UAAU,CAAC;AAAA,UAC3G,GAAG;AAAA;AAAA;AAAA,gBAGG;AAAA,IACN,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,cAAc;AAAA,EACf,CAAA;AAAA;AAAA;AAAA,kBAGS;AAAA,IACN,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,EACb,CAAA;AAAA;AAAA,YAECA,EAAM,MAAM,IAAI;AAAA;AAAA,UAElBA,EAAM,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAM7B;;AC9DO,MAAMG,GAAK;AAAA,EAAX;AAAA,IAAAC,EAAA,MAAAC;AACL,IAAAD,EAAA,MAAAE,GAAgC,CAAC;AACjC,IAAAF,EAAA,MAAAG,IAASC,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzB,IAAIC,GAAoB;AACjB,WAAAC,EAAA,MAAAJ,GAAY,KAAKG,CAAE,GAGjB,MAAM;AACX,MAAAC,EAAA,MAAKJ,GAAY,OAAOI,EAAA,MAAKJ,GAAY,QAAQG,CAAE,GAAG,CAAC;AAAA,IACzD;AAAA,EAAA;AAAA,EAGF,MAAM,IAAuBE,GAAaC,GAAiC;AACzE,WAAOC,EAAA,MAAKR,GAAAS,GAAL,WAA8B,OAAOH,GAAKC;AAAA,EAAO;AAAA,EAG1D,MAAM,IAA0CD,GAAaC,GAAmC;AAC9F,WAAOC,EAAA,MAAKR,GAAAS,GAAL,WAAgC,OAAOH,GAAKC;AAAA,EAAO;AAAA,EAG5D,MAAM,MAA4CD,GAAaC,GAAmC;AAChG,WAAOC,EAAA,MAAKR,GAAAS,GAAL,WAAgC,SAASH,GAAKC;AAAA,EAAO;AAAA,EAG9D,MAAM,KAA2CD,GAAaC,GAAmC;AAC/F,WAAOC,EAAA,MAAKR,GAAAS,GAAL,WAAgC,QAAQH,GAAKC;AAAA,EAAO;AAAA,EAG7D,MAAM,OAA0BD,GAAaC,GAAiC;AAC5E,WAAOC,EAAA,MAAKR,GAAAS,GAAL,WAA8B,UAAUH,GAAKC;AAAA,EAAO;AAAA,EAG7D,MAAM,KAA2CD,GAAaC,GAAmC;AAC/F,WAAOC,EAAA,MAAKR,GAAAS,GAAL,WAAgC,QAAQH,GAAKC;AAAA,EAAO;AAAA,EAG7D,MAAM,QAA8CD,GAAaC,GAAmC;AAClG,WAAOC,EAAA,MAAKR,GAAAS,GAAL,WAAgC,WAAWH,GAAKC;AAAA,EAAO;AAAA,EAGhE,MAAM,MAA4CD,GAAaC,GAAmC;AAChG,WAAOC,EAAA,MAAKR,GAAAS,GAAL,WAAgC,SAASH,GAAKC;AAAA,EAAO;AAYhE;AA3DEN,IAAA,eACAC,KAAA,eAFKF,IAAA,eAmDCS,IAAA,eAA2BC,GAAgBJ,GAAaC,GAA+B;AAC3F,SAAOI,GAA8B;AAAA,IACnC,GAAGJ;AAAA,IACH,QAAAG;AAAA,IACA,KAAAJ;AAAA,IACA,YAAYD,EAAA,MAAKJ;AAAA,IACjB,OAAOI,EAAA,MAAKH;AAAA,EAAA,CACb;AAAA;AAIL,SAASC,KAAuC;AAC9C,MAAI,OAAO,SAAW,OAAe,OAAO;AACnC,WAAA,OAAO,MAAM,KAAK,MAAM;AAGjC,MAAI,OAAO,SAAW,OAAe,OAAO;AACnC,WAAA,OAAO,MAAM,KAAK,MAAM;AAG3B,QAAA,IAAI,MAAM,gGAAgG;AAClH;AA8CO,MAAMS,WAA0B,MAAM;AAAA,EAG3C,YAAYC,GAA6B;AACvC,UAAM,EAAE,QAAAC,GAAQ,YAAAC,GAAY,QAAAL,GAAQ,KAAAJ,EAAQ,IAAAO,GACtCG,IAAU,GAAGF,CAAM,IAAIC,CAAU,qBAAqBL,EAAO,YAAa,CAAA,IAAIJ,CAAG;AAEvF,UAAMU,CAAO;AANf,IAAAC,EAAA;AAQE,SAAK,WAAWJ;AAAA,EAAA;AAEpB;AASA,eAAeF,GAA8BO,GAAoC;AAC/E,QAAM,EAAE,SAAAC,GAAS,OAAAC,GAAO,OAAAC,GAAO,YAAAC,EAAe,IAAAJ,GAExCK,IAAgC;AAAA,IACpC,QAAQL,EAAO;AAAA,IACf,KAAKA,EAAO;AAAA,IACZ,IAAI,aAAa;AACf,aAAO,CAACK,EAAQ,IAAI,WAAW,MAAM;AAAA,IACvC;AAAA,IACA,OAAO,IAAI,gBAAgB;AAAA,IAC3B,SAAS,IAAI,QAAQ;AAAA,IACrB,MAAML,EAAO;AAAA,EACf;AAGA,MAAIC;AACE,QAAAA,aAAmB,OAAOA,aAAmB;AACvC,MAAAA,EAAA,QAAQ,CAACK,GAAOC,MAAQ;AACtB,QAAAF,EAAA,QAAQ,IAAIE,GAAKD,CAAK;AAAA,MAAA,CAC/B;AAAA,aACQL,KAAW,QAAQ,OAAOA,KAAY,YAAY,CAAC,MAAM,QAAQA,CAAO;AACjF,iBAAWO,KAAQP,GAAS;AACpB,cAAAK,IAAQL,EAAQO,CAAI;AAC1B,QAAIF,aAAiB,OACnBD,EAAQ,QAAQ,IAAIG,GAAMF,EAAM,aAAa,IACpCA,KAAS,QAClBD,EAAQ,QAAQ,IAAIG,GAAM,OAAOF,CAAK,CAAC;AAAA,MACzC;AAAA;AAGF,YAAM,IAAI,UAAU,8BAA8BL,CAAO,EAAE;AAK/D,MAAIC;AACE,QAAAA,aAAiB,OAAOA,aAAiB;AACrC,MAAAA,EAAA,QAAQ,CAACI,GAAOC,MAAQ;AACpB,QAAAF,EAAA,MAAM,IAAIE,GAAKD,CAAK;AAAA,MAAA,CAC7B;AAAA,aACQJ,KAAS,QAAQ,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK;AAC3E,iBAAWM,KAAQN,GAAO;AAClB,cAAAI,IAAQJ,EAAMM,CAAI;AACxB,QAAIF,aAAiB,OACnBD,EAAQ,MAAM,IAAIG,GAAMF,EAAM,aAAa,IAClCA,KAAS,QAClBD,EAAQ,MAAM,IAAIG,GAAM,OAAOF,CAAK,CAAC;AAAA,MACvC;AAAA;AAGF,YAAM,IAAI,UAAU,mCAAmCJ,CAAK,EAAE;AAI9D,MAAAP;AAGJ,QAAMc,IAAU,YAAY;AACpBP,UAAAA,IAAQG,EAAQ,MAAM,SAAS,GAC/BK,IAAUR,EAAM,SAAS,IAAIG,EAAQ,MAAM,MAAMH,IAAQG,EAAQ;AAEnE,QAAAM;AAEA,IAAA,CAACN,EAAQ,QAAQ,IAAI,cAAc,KAAKO,GAASP,EAAQ,IAAI,KAEvDA,EAAA,QAAQ,IAAI,gBAAgB,kBAAkB,GAC5CM,IAAA,KAAK,UAAUN,EAAQ,IAAI,KAErCM,IAAUN,EAAQ;AAGd,UAAAQ,IAAU,MAAMV,EAAMO,GAAS;AAAA,MACnC,QAAQL,EAAQ;AAAA,MAChB,SAASA,EAAQ;AAAA,MACjB,MAAMM;AAAA,IAAA,CACP,GAGKV,IAAU,OAAO,YAAoBY,EAAQ,QAAQ,SAAS,GAC9DC,IAAcb,EAAQ,cAAc;AAEtC,QAAAc;AAEA,IAAAD,KAAA,QAAAA,EAAa,SAAS,sBACjBC,IAAA,MAAMF,EAAQ,KAAK,IACjBC,KAAA,QAAAA,EAAa,SAAS,uCACvBC,IAAA,MAAMF,EAAQ,SAAS,IAEvBE,IAAA,MAAMF,EAAQ,KAAK,GAGlBlB,IAAA;AAAA,MACT,QAAQU,EAAQ;AAAA,MAChB,KAAKA,EAAQ;AAAA,MACb,QAAQQ,EAAQ;AAAA,MAChB,YAAYA,EAAQ;AAAA,MACpB,SAASZ;AAAAA,MACT,MAAAc;AAAA,IACF;AAAA,EACF;AAEI,MAAAX,EAAW,SAAS,GAAG;AACnB,UAAAY,IAAQ,CAACC,IAAQ,MAAM;AACrB,YAAAC,IAAUd,EAAWa,CAAK,GAC1BE,IAAOf,EAAWa,IAAQ,CAAC,IAAID,EAAMC,IAAQ,CAAC,IAAIR;AAEjD,aAAA,YACLS,EAAQb,GAAS,aACf,MAAMc,EAAK,GACJxB,EACR;AAAA,IACL;AAEA,UAAMqB,IAAQ;AAAA,EAAA;AAEd,UAAMP,EAAQ;AAGhB,MAAId,EAAU,SAAS,OAAOA,EAAU,UAAU;AAC1C,UAAA,IAAID,GAAkBC,CAAS;AAGhC,SAAAA;AACT;ACjOA,MAAMyB,GAAa;AAAA,EAKjB,YAAYpB,GAAwBqB,GAAc;AAJlD,IAAAtB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGE,SAAK,SAASC,GACd,KAAK,QAAQqB;AAAA,EAAA;AAAA,EAGf,MAAM,OAAkC;AAClC,QAAA,KAAK,WAAW;AAClB,UAAIC,GAAW,KAAK,OAAO,KAAK,GAAG;AACjC,cAAMC,IAAU,MAAM,KAAK,OAAO,MAAM;AACpC,YAAAX,GAASW,CAAO;AAClB,eAAK,UAAUA;AAAA;AAEf,gBAAM,IAAI,MAAM,gEAAgEA,CAAO,EAAE;AAAA,MAElF,WAAAC,EAAS,KAAK,OAAO,IAAI,GAAG;AAC/B,cAAAC,IAAM,MAAM,KAAK,MAAM,KAAK,IAAI,KAAK,OAAO,IAAI;AACtD,YAAIA,EAAI,UAAU,OAAOA,EAAI,SAAS;AAChC,cAAAb,GAASa,EAAI,IAAI;AACnB,iBAAK,UAAUA,EAAI;AAAA;AAEnB,kBAAM,IAAI;AAAA,cACR,kBAAkB,KAAK,OAAO,IAAI,mDAAmDA,EAAI,IAAI;AAAA,YAC/F;AAAA;AAGI,gBAAA,IAAI,MAAM,sBAAsB;AAAA,MACxC;AAAA;AAIA,QAAA,KAAK,WAAW;AACZ,YAAA,IAAI,MAAM,+BAA+B;AAE/C,WAAO,KAAK;AAAA,EACd;AAEJ;;AAEO,MAAMC,GAAS;AAAA,EAcpB,YAAYL,GAAc;AAdrB,IAAAxC,EAAA,MAAA8C;AACL,IAAA9C,EAAA,MAAA+C;AACA,IAAA/C,EAAA,MAAAgD;AACA,IAAAhD,EAAA,MAAAiD,uBAAqB,IAA0B;AAC/C,IAAAjD,EAAA,MAAAkD,IACE,CAAC;AAEH,IAAAlD,EAAA,MAAAmD,IAAmB;AAEnB,IAAAjC,EAAA;AACA,IAAAlB,EAAA,MAAAoD;AACA,IAAApD,EAAA,MAAAqD;AACA,IAAArD,EAAA,MAAAsD;AAGE,IAAAC,EAAA,MAAKR,IAASP,IACTe,EAAA,MAAAP,GAAUR,EAAM,aAAa,gBAAgB;AAElD,UAAM,CAACgB,GAAUC,CAAU,IAAIC,EAAoB,GAC7C,CAACC,GAAUC,CAAU,IAAIF,EAA8B;AAE7D,SAAK,WAAWF,GAChBD,EAAA,MAAKH,IAAcK,IACnBF,EAAA,MAAKF,IAAYM,IACjBJ,EAAA,MAAKD,IAAcM,IAKnBpB,EAAM,YAAY,YAAY;AACxB,MAAAlC,EAAA,MAAK2C,GAAe,OAAO,KACvB,MAAA,KAAK,YAAY3C,EAAA,MAAK6C,GAAgB;AAAA,IAC9C,CACD;AAAA,EAAA;AAAA,EAGH,IAAI,qBAAqB;AACvB,WAAO,CAAC,GAAG7C,EAAA,MAAK2C,GAAe,MAAM;AAAA,EAAA;AAAA,EAGvC,MAAMzC,GAA+B;AAOnC,QALQA,EAAA,UAAU,QAAQ,CAACqD,MAAU;AAC9B,MAAAvD,EAAA,MAAA2C,GAAe,IAAIY,EAAM,MAAM,IAAItB,GAAasB,GAAOvD,EAAA,MAAKyC,GAAM,CAAC;AAAA,IAAA,CACzE,GAGGvC,EAAQ,mBAAmBA,EAAQ,oBAAoB,QAAQ;AAEjE,UAAI,CADiBA,EAAQ,UAAU,KAAK,CAACqD,MAAUA,EAAM,SAASrD,EAAQ,eAAe;AAE3F,cAAM,IAAI,MAAM,qBAAqBA,EAAQ,eAAe,kCAAkC;AAEhG,MAAA+C,EAAA,MAAKJ,IAAmB3C,EAAQ;AAAA,IAAA;AAGlC,IAAAF,EAAA,MAAK0C,GAAQ;AAAA,MACX,GAAG1C,EAAA,MAAK2C,GAAe,IAAI,YAAY3C,EAAA,MAAK2C,GAAe,SAAS,IAAI,KAAK,GAAG,gBAAgB,CAAC,GAAG3C,EAAA,MAAK2C,GAAe,MAAM,EAAE,KAAK,MAAM,CAAC;AAAA,IAC9I;AAAA,EAAA;AAAA,EAGF,MAAM,YAAYtB,GAAc;;AAC1B,QAAAmC;AAEJ,QAAInC,MAAS,QAAQ;AACnB,UAAIoC,IAAQ,CAAC;AAET,UAAA,OAAO,aAAc,UAAU;AACjC,cAAMC,IAAM;AAER,UAAAC,IAAAD,EAAI,cAAJ,gBAAAC,EAAe,UAAS,IACpBF,EAAA,KAAK,GAAGC,EAAI,SAAS,IAClBA,EAAI,WACPD,EAAA,KAAKC,EAAI,QAAQ,IACdA,EAAI,kBACPD,EAAA,KAAKC,EAAI,eAAe,IACrBA,EAAI,gBACPD,EAAA,KAAKC,EAAI,YAAY;AAAA,MAC7B;AAGF,iBAAWrC,KAAQoC;AACjB,QAAIzD,EAAA,MAAK2C,GAAe,IAAItB,CAAI,MAEnBA,IAAAA;AAAAA,IAEf;AAGA,MAAIrB,EAAA,MAAK2C,GAAe,IAAItB,CAAI,MACnBmC,IAAAnC;AAIf,QAAImC,KAAY,MAAM;AACpB,YAAMI,IAAgB5D,EAAA,MAAK2C,GAAe,KAAK,EAAE,OAAO;AACxD,MAAIiB,MACSJ,IAAAI;AAAA,IACb;AAGF,QAAI,CAACJ,KAAY,CAACxD,EAAA,MAAK2C,GAAe,IAAIa,CAAQ;AAChD,YAAM,IAAI,MAAM,aAAanC,CAAI,mCAAmC;AAGtE,UAAMwC,IAAO7D,EAAA,MAAK2C,GAAe,IAAIa,CAAQ;AAEzC,QAAA;AACI,YAAAM,IAAc,MAAMD,EAAK,KAAK;AAEpC,MAAA7D,EAAA,MAAKgD,IAAL,WAAiBc,IACjB9D,EAAA,MAAK8C,IAAL,WAAiBU,IAEZxD,EAAA,MAAA0C,GAAQ,KAAK,qBAAqBc,CAAQ;AAAA,aACxCO,GAAO;AACd,MAAIA,aAAiB,SACd/D,EAAA,MAAA0C,GAAQ,MAAMqB,CAAK;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,EAAE3C,GAAa4C,GAAwE;AACrF,QAAI,SAAS;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAGF,QAAI,CAAC,KAAK,SAAS;AACV,aAAAC;AAGT,UAAMC,IAAS/D,EAAA,MAAKqC,IAAA2B,IAAL,WAAgB/C,GAAK4C;AACpC,QAAIE;AACK,aAAAA;AAGT,QAAIF,GAAQ;AACV,YAAMI,IAA0C,CAAC;AAEjD,iBAAW,CAAChD,GAAKD,CAAK,KAAK,OAAO,QAAa6C,CAAM;AAC/C,QAAAK,GAAQlD,CAAK,MACfiD,EAAYhD,CAAG,IAAID;AAMjB,YAAAmD,IAAkB,OAAO,QAAQF,CAAW;AAC9C,UAAAE,EAAgB,SAAS,GAAG;AAC9B,cAAMC,IAAYD,EAAgB,IAAI,CAACE,MAAMA,EAAE,CAAC,CAAC,GAC3CC,IAAUC,GAAO,CAAC1E,EAAA,MAAK+C,KAAW,GAAGwB,CAAS,GAAG,CAACI,MAAMC,MAAgB;AACtE,gBAAAC,IAAUD,EAAY,IAAI,CAACE,GAAGC,MAAMT,EAAgBS,CAAC,CAAC,GACtDC,IAAe;AAAA,YACnB,GAAGhB;AAAA,UACL;AAEA,mBAASe,IAAI,GAAGA,IAAIF,EAAQ,QAAQE,KAAK;AACvC,kBAAM3D,IAAMyD,EAAQE,CAAC,EAAE,CAAC;AACX3D,YAAAA,EAAAA,CAAG,IAAIwD,EAAYG,CAAC;AAAA,UAAA;AAGnC,gBAAME,IAASC,GAAQP,GAAGvD,CAAG,KAAK,oBAAoBA,CAAG;AAClD,iBAAA+D,GAAiBF,GAAQD,CAAY;AAAA,QAAA,CAC7C;AAED,eAAAhF,EAAA,MAAK4C,IAAO,KAAK,CAACxB,GAAK4C,GAAQS,CAAO,CAAC,GAEhCA;AAAA,MAAA;AAAA,IACT;AAGF,UAAMW,IAAYV,GAAO,CAAC1E,EAAA,MAAK+C,GAAS,GAAG,CAAC4B,MAAM;AAChD,UAAIM,IAASC,GAAQP,GAAGvD,CAAG,KAAK,oBAAoBA,CAAG;AAEvD,aAAI4C,MACOiB,IAAAE,GAAiBF,GAAQjB,CAAM,IAGnCiB;AAAA,IAAA,CACR;AAED,WAAAjF,EAAA,MAAK4C,IAAO,KAAK,CAACxB,GAAK4C,GAAQoB,CAAS,CAAC,GAElCA;AAAA,EAAA;AAUX;AAtME3C,KAAA,eACAC,IAAA,eACAC,IAAA,eACAC,KAAA,eAGAC,KAAA,eAGAC,KAAA,eACAC,KAAA,eACAC,KAAA,eAZKR,KAAA,eAgML2B,KAAA,SAAW/C,GAAa4C,GAAoF;AAC/F,aAAAT,KAASvD,EAAA,MAAK4C;AACnB,QAAAW,EAAM,CAAC,MAAMnC,KAAOiE,GAAU9B,EAAM,CAAC,GAAGS,CAAM;AAChD,aAAOT,EAAM,CAAC;AAElB;AAKJ,MAAMU,KAAmBqB,GAAQ,mBAAmB;AAKpD,SAASH,GAAiBI,GAAkBvB,GAAoC;AAC9E,aAAW3C,KAAQ2C;AACN,IAAAuB,IAAAA,EAAS,QAAQ,KAAKlE,CAAI,MAAM,OAAO2C,EAAO3C,CAAI,CAAC,CAAC;AAE1D,SAAAkE;AACT;AAEA,SAASL,GAAQM,GAAapE,GAAa;AACzC,QAAMqE,IAAS,OAAOrE,CAAG,EACtB,MAAM,UAAU,EAChB,OAAO,CAACsE,MAASA,EAAK,KAAA,MAAW,EAAE;AACtC,MAAIvE,IAAQqE;AAEL,SAAAC,EAAO,SAAS,KAAG;AAClB,UAAAC,IAAOD,EAAO,MAAM;AAE1B,IAAItE,KAAS,OACXA,IAAQA,EAAMuE,CAAI,IAEVvE,IAAA;AAAA,EACV;AAGK,SAAAA;AACT;;AC1TO,MAAMwE,GAAO;AAAA,EAgBlB,YAAYzD,GAAc;AAhBrB,IAAAxC,EAAA,MAAAkG;AACL,IAAAlG,EAAA,MAAA+C;AACA,IAAA/C,EAAA,MAAAgD;AAIA;AAAA;AAAA,IAAAhD,EAAA,MAAAmG,uBAAoB,IAAwB;AAG5C;AAAA,IAAAnG,EAAA,MAAAoG,GAAkC,CAAC;AAGnC;AAAA,IAAApG,EAAA,MAAAqG,IAAyB,CAAC;AAE1B,IAAArG,EAAA,MAAAsG,GAAc;AAGZ,IAAA/C,EAAA,MAAKR,GAASP,IACTe,EAAA,MAAAP,IAAUR,EAAM,aAAa,cAAc;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlD,OAAO+D,GAAsB7E,GAA6B;AACjD,WAAA,IAAI,QAAQ,CAAC8D,MAAY;AAC9B,MAAI9D,IACGpB,EAAA,MAAA6F,GAAc,IAAIzE,GAAK,MAAM;AACvB,QAAA6E,EAAA,GACDf,EAAA;AAAA,MAAA,CACT,IAEIlF,EAAA,MAAA8F,GAAgB,KAAK,MAAM;AACrB,QAAAG,EAAA,GACDf,EAAA;AAAA,MAAA,CACT,GAGC,CAAClF,EAAA,MAAKgG,MAAehG,EAAA,MAAKyC,GAAO,cACnCQ,EAAA,MAAK+C,GAAc,KACnB7F,EAAA,MAAKyF,IAAAM,IAAL;AAAA,IACF,CACD;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQH,MAAM,KAAKD,GAAqC;AACvC,WAAA,IAAI,QAAQ,CAACf,MAAY;AACzB,MAAAlF,EAAA,MAAA+F,IAAO,KAAK,MAAM;AACZ,QAAAE,EAAA,GACDf,EAAA;AAAA,MAAA,CACT,GAEG,CAAClF,EAAA,MAAKgG,MAAehG,EAAA,MAAKyC,GAAO,cACnCQ,EAAA,MAAK+C,GAAc,KACnB7F,EAAA,MAAKyF,IAAAM,IAAL;AAAA,IACF,CACD;AAAA,EAAA;AAqCL;AAnGEzD,IAAA,eACAC,KAAA,eAIAmD,IAAA,eAGAC,IAAA,eAGAC,KAAA,eAEAC,IAAA,eAdKJ,KAAA,eAkELM,KAAc,WAAA;AACZ,QAAMC,IAAcnG,EAAA,MAAK6F,GAAc,OAAO7F,EAAA,MAAK8F,GAAgB;AAM/D,OAJA,CAAC9F,EAAA,MAAKyC,GAAO,aAAa0D,MAAgB,MAC5ClD,EAAA,MAAK+C,GAAc,KAGjB,CAAChG,EAAA,MAAKgG,IAAa;AACV,eAAAC,KAAYjG,EAAA,MAAK+F;AACjB,MAAAE,EAAA;AAEX,IAAAhD,EAAA,MAAK8C,IAAS,CAAC;AACf;AAAA,EAAA;AAGF,wBAAsB,MAAM;AACrB,IAAA/F,EAAA,MAAA0C,IAAQ,KAAK,YAAY1C,EAAA,MAAK6F,GAAc,OAAO7F,EAAA,MAAK8F,GAAgB,MAAM,wBAAwB;AAG3G,eAAWG,KAAYjG,EAAA,MAAK6F,GAAc,OAAA;AAC/B,MAAAI,EAAA;AAEX,IAAAjG,EAAA,MAAK6F,GAAc,MAAM;AAGd,eAAAI,KAAYjG,EAAA,MAAK8F;AACjB,MAAAG,EAAA;AAEX,IAAAhD,EAAA,MAAK6C,GAAkB,CAAC,IAGxB3F,EAAA,MAAKyF,IAAAM,IAAL;AAAA,EAAiB,CAClB;AAAA;ACpGL,SAASE,KAAW;AAClB,SAAOA,KAAW,OAAO,SAAS,OAAO,OAAO,KAAI,IAAK,SAAUC,GAAG;AACpE,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAI,IAAI,UAAU,CAAC;AACnB,eAAS,KAAK,EAAG,EAAC,CAAE,GAAE,eAAe,KAAK,GAAG,CAAC,MAAMA,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,IACpE;AACI,WAAOA;AAAA,EACR,GAAED,GAAS,MAAM,MAAM,SAAS;AACnC;ACDA,IAAIE;AAAA,CAEH,SAAUA,GAAQ;AAQjB,EAAAA,EAAO,MAAS,OAOhBA,EAAO,OAAU,QAMjBA,EAAO,UAAa;AACtB,GAAGA,MAAWA,IAAS,CAAA,EAAG;AAE1B,IAAIC,KAAW,QAAQ,IAAI,aAAa,eAAe,SAAUC,GAAK;AACpE,SAAO,OAAO,OAAOA,CAAG;AAC1B,IAAI,SAAUA,GAAK;AACjB,SAAOA;AACT;AAEA,SAASC,GAAQjH,GAAMmB,GAAS;AAC9B,MAAI,CAACnB,GAAM;AAET,IAAI,OAAO,UAAY,OAAa,QAAQ,KAAKmB,CAAO;AAExD,QAAI;AAMF,YAAM,IAAI,MAAMA,CAAO;AAAA,IACxB,QAAW;AAAA,IAAA;AAAA,EAChB;AACA;AAEA,IAAI+F,KAAwB,gBACxBC,KAAsB,cACtBC,KAAoB;AASxB,SAASC,GAAqB3G,GAAS;AACrC,EAAIA,MAAY,WACdA,IAAU,CAAE;AAGd,MAAI4G,IAAW5G,GACX6G,IAAkBD,EAAS,QAC3BE,IAASD,MAAoB,SAAS,SAAS,cAAcA,GAC7DE,IAAgBD,EAAO;AAE3B,WAASE,IAAsB;AAC7B,QAAIC,IAAmBH,EAAO,UAC1BI,IAAWD,EAAiB,UAC5BE,IAASF,EAAiB,QAC1BG,IAAOH,EAAiB,MACxBI,IAAQN,EAAc,SAAS,CAAE;AACrC,WAAO,CAACM,EAAM,KAAKhB,GAAS;AAAA,MAC1B,UAAUa;AAAA,MACV,QAAQC;AAAA,MACR,MAAMC;AAAA,MACN,OAAOC,EAAM,OAAO;AAAA,MACpB,KAAKA,EAAM,OAAO;AAAA,IACxB,CAAK,CAAC;AAAA,EACN;AAEE,MAAIC,IAAe;AAEnB,WAASC,IAAY;AACnB,QAAID;AACF,MAAAE,EAAS,KAAKF,CAAY,GAC1BA,IAAe;AAAA,SACV;AACL,UAAIG,IAAarB,EAAO,KAEpBsB,IAAuBV,EAAqB,GAC5CW,IAAYD,EAAqB,CAAC,GAClCE,IAAeF,EAAqB,CAAC;AAEzC,UAAIF,EAAS;AACX,YAAIG,KAAa,MAAM;AACrB,cAAIE,IAAQjG,IAAQ+F;AAEpB,UAAIE,MAEFP,IAAe;AAAA,YACb,QAAQG;AAAA,YACR,UAAUG;AAAA,YACV,OAAO,WAAiB;AACtB,cAAAE,EAAGD,IAAQ,EAAE;AAAA,YAC7B;AAAA,UACa,GACDC,EAAGD,CAAK;AAAA,QAEpB;AAGU,kBAAQ,IAAI,aAAa,gBAAetB;AAAA,YAAQ;AAAA;AAAA;AAAA;AAAA,YAGhD;AAAA,UAAwT;AAAA;AAG1T,QAAAwB,GAAQN,CAAU;AAAA,IAE1B;AAAA,EACA;AAEE,EAAAX,EAAO,iBAAiBJ,IAAmBa,CAAS;AACpD,MAAIS,IAAS5B,EAAO,KAEhB6B,IAAwBjB,EAAqB,GAC7CpF,IAAQqG,EAAsB,CAAC,GAC/BC,IAAWD,EAAsB,CAAC,GAElCE,IAAYC,GAAc,GAC1BZ,IAAWY,GAAc;AAE7B,EAAIxG,KAAS,SACXA,IAAQ,GACRmF,EAAc,aAAab,GAAS,CAAA,GAAIa,EAAc,OAAO;AAAA,IAC3D,KAAKnF;AAAA,EACN,CAAA,GAAG,EAAE;AAGR,WAASyG,EAAWC,GAAI;AACtB,WAAO,OAAOA,KAAO,WAAWA,IAAKC,GAAWD,CAAE;AAAA,EACnD;AAGD,WAASE,EAAgBF,GAAIjB,GAAO;AAClC,WAAIA,MAAU,WACZA,IAAQ,OAGHhB,GAASH,GAAS;AAAA,MACvB,UAAUgC,EAAS;AAAA,MACnB,MAAM;AAAA,MACN,QAAQ;AAAA,IACd,GAAO,OAAOI,KAAO,WAAWG,GAAUH,CAAE,IAAIA,GAAI;AAAA,MAC9C,OAAOjB;AAAA,MACP,KAAKqB,GAAS;AAAA,IACpB,CAAK,CAAC;AAAA,EACN;AAEE,WAASC,GAAsBf,GAAchG,GAAO;AAClD,WAAO,CAAC;AAAA,MACN,KAAKgG,EAAa;AAAA,MAClB,KAAKA,EAAa;AAAA,MAClB,KAAKhG;AAAA,IACX,GAAOyG,EAAWT,CAAY,CAAC;AAAA,EAC/B;AAEE,WAASgB,GAAQZ,GAAQE,GAAUW,GAAO;AACxC,WAAO,CAACrB,EAAS,WAAWA,EAAS,KAAK;AAAA,MACxC,QAAQQ;AAAA,MACR,UAAUE;AAAA,MACV,OAAOW;AAAA,IACR,CAAA,GAAG;AAAA,EACR;AAEE,WAASd,GAAQN,GAAY;AAC3B,IAAAO,IAASP;AAET,QAAIqB,IAAwB9B,EAAqB;AAEjD,IAAApF,IAAQkH,EAAsB,CAAC,GAC/BZ,IAAWY,EAAsB,CAAC,GAClCX,EAAU,KAAK;AAAA,MACb,QAAQH;AAAA,MACR,UAAUE;AAAA,IAChB,CAAK;AAAA,EACL;AAEE,WAASa,GAAKT,GAAIjB,GAAO;AACvB,QAAII,IAAarB,EAAO,MACpBwB,IAAeY,EAAgBF,GAAIjB,CAAK;AAE5C,aAASwB,IAAQ;AACf,MAAAE,GAAKT,GAAIjB,CAAK;AAAA,IACpB;AAEI,QAAIuB,GAAQnB,GAAYG,GAAciB,CAAK,GAAG;AAC5C,UAAIG,IAAwBL,GAAsBf,GAAchG,IAAQ,CAAC,GACrEqH,IAAeD,EAAsB,CAAC,GACtCE,IAAMF,EAAsB,CAAC;AAIjC,UAAI;AACF,QAAAjC,EAAc,UAAUkC,GAAc,IAAIC,CAAG;AAAA,MAC9C,QAAe;AAGd,QAAApC,EAAO,SAAS,OAAOoC,CAAG;AAAA,MAClC;AAEM,MAAAnB,GAAQN,CAAU;AAAA,IACxB;AAAA,EACA;AAEE,WAAS0B,GAAQb,GAAIjB,GAAO;AAC1B,QAAII,IAAarB,EAAO,SACpBwB,IAAeY,EAAgBF,GAAIjB,CAAK;AAE5C,aAASwB,IAAQ;AACf,MAAAM,GAAQb,GAAIjB,CAAK;AAAA,IACvB;AAEI,QAAIuB,GAAQnB,GAAYG,GAAciB,CAAK,GAAG;AAC5C,UAAIO,IAAyBT,GAAsBf,GAAchG,CAAK,GAClEqH,IAAeG,EAAuB,CAAC,GACvCF,IAAME,EAAuB,CAAC;AAGlC,MAAArC,EAAc,aAAakC,GAAc,IAAIC,CAAG,GAChDnB,GAAQN,CAAU;AAAA,IACxB;AAAA,EACA;AAEE,WAASK,EAAGD,GAAO;AACjB,IAAAd,EAAc,GAAGc,CAAK;AAAA,EAC1B;AAEE,MAAIwB,IAAU;AAAA,IACZ,IAAI,SAAS;AACX,aAAOrB;AAAA,IACR;AAAA,IAED,IAAI,WAAW;AACb,aAAOE;AAAA,IACR;AAAA,IAED,YAAYG;AAAA,IACZ,MAAMU;AAAA,IACN,SAASI;AAAA,IACT,IAAIrB;AAAA,IACJ,MAAM,WAAgB;AACpB,MAAAA,EAAG,EAAE;AAAA,IACN;AAAA,IACD,SAAS,WAAmB;AAC1B,MAAAA,EAAG,CAAC;AAAA,IACL;AAAA,IACD,QAAQ,SAAgBwB,GAAU;AAChC,aAAOnB,EAAU,KAAKmB,CAAQ;AAAA,IAC/B;AAAA,IACD,OAAO,SAAeC,GAAS;AAC7B,UAAIC,IAAUhC,EAAS,KAAK+B,CAAO;AAEnC,aAAI/B,EAAS,WAAW,KACtBV,EAAO,iBAAiBN,IAAuBiD,EAAkB,GAG5D,WAAY;AACjB,QAAAD,KAIKhC,EAAS,UACZV,EAAO,oBAAoBN,IAAuBiD,EAAkB;AAAA,MAEvE;AAAA,IACP;AAAA,EACG;AACD,SAAOJ;AACT;AAUA,SAASK,GAAkB1J,GAAS;AAClC,EAAIA,MAAY,WACdA,IAAU,CAAE;AAGd,MAAI2J,IAAY3J,GACZ4J,IAAmBD,EAAU,QAC7B7C,IAAS8C,MAAqB,SAAS,SAAS,cAAcA,GAC9D7C,IAAgBD,EAAO;AAE3B,WAASE,IAAsB;AAC7B,QAAI6C,IAAapB,GAAU3B,EAAO,SAAS,KAAK,OAAO,CAAC,CAAC,GACrDgD,IAAsBD,EAAW,UACjC3C,IAAW4C,MAAwB,SAAS,MAAMA,GAClDC,IAAoBF,EAAW,QAC/B1C,IAAS4C,MAAsB,SAAS,KAAKA,GAC7CC,IAAkBH,EAAW,MAC7BzC,IAAO4C,MAAoB,SAAS,KAAKA,GAEzC3C,IAAQN,EAAc,SAAS,CAAE;AACrC,WAAO,CAACM,EAAM,KAAKhB,GAAS;AAAA,MAC1B,UAAUa;AAAA,MACV,QAAQC;AAAA,MACR,MAAMC;AAAA,MACN,OAAOC,EAAM,OAAO;AAAA,MACpB,KAAKA,EAAM,OAAO;AAAA,IACxB,CAAK,CAAC;AAAA,EACN;AAEE,MAAIC,IAAe;AAEnB,WAASC,IAAY;AACnB,QAAID;AACF,MAAAE,EAAS,KAAKF,CAAY,GAC1BA,IAAe;AAAA,SACV;AACL,UAAIG,IAAarB,EAAO,KAEpB6D,IAAwBjD,EAAqB,GAC7CW,IAAYsC,EAAsB,CAAC,GACnCrC,IAAeqC,EAAsB,CAAC;AAE1C,UAAIzC,EAAS;AACX,YAAIG,KAAa,MAAM;AACrB,cAAIE,IAAQjG,IAAQ+F;AAEpB,UAAIE,MAEFP,IAAe;AAAA,YACb,QAAQG;AAAA,YACR,UAAUG;AAAA,YACV,OAAO,WAAiB;AACtB,cAAAE,EAAGD,IAAQ,EAAE;AAAA,YAC7B;AAAA,UACa,GACDC,EAAGD,CAAK;AAAA,QAEpB;AAGU,kBAAQ,IAAI,aAAa,gBAAetB;AAAA,YAAQ;AAAA;AAAA;AAAA;AAAA,YAGhD;AAAA,UAAwT;AAAA;AAG1T,QAAAwB,GAAQN,CAAU;AAAA,IAE1B;AAAA,EACA;AAEE,EAAAX,EAAO,iBAAiBJ,IAAmBa,CAAS,GAGpDT,EAAO,iBAAiBL,IAAqB,WAAY;AACvD,QAAIyD,IAAwBlD,EAAqB,GAC7CY,IAAesC,EAAsB,CAAC;AAG1C,IAAI3B,GAAWX,CAAY,MAAMW,GAAWL,CAAQ,KAClDX,EAAW;AAAA,EAEjB,CAAG;AACD,MAAIS,IAAS5B,EAAO,KAEhB+D,IAAwBnD,EAAqB,GAC7CpF,IAAQuI,EAAsB,CAAC,GAC/BjC,IAAWiC,EAAsB,CAAC,GAElChC,IAAYC,GAAc,GAC1BZ,IAAWY,GAAc;AAE7B,EAAIxG,KAAS,SACXA,IAAQ,GACRmF,EAAc,aAAab,GAAS,CAAA,GAAIa,EAAc,OAAO;AAAA,IAC3D,KAAKnF;AAAA,EACN,CAAA,GAAG,EAAE;AAGR,WAASwI,IAAc;AACrB,QAAIC,IAAO,SAAS,cAAc,MAAM,GACpCC,IAAO;AAEX,QAAID,KAAQA,EAAK,aAAa,MAAM,GAAG;AACrC,UAAInB,IAAMpC,EAAO,SAAS,MACtByD,IAAYrB,EAAI,QAAQ,GAAG;AAC/B,MAAAoB,IAAOC,MAAc,KAAKrB,IAAMA,EAAI,MAAM,GAAGqB,CAAS;AAAA,IAC5D;AAEI,WAAOD;AAAA,EACX;AAEE,WAASjC,EAAWC,GAAI;AACtB,WAAO8B,EAAW,IAAK,OAAO,OAAO9B,KAAO,WAAWA,IAAKC,GAAWD,CAAE;AAAA,EAC7E;AAEE,WAASE,GAAgBF,GAAIjB,GAAO;AAClC,WAAIA,MAAU,WACZA,IAAQ,OAGHhB,GAASH,GAAS;AAAA,MACvB,UAAUgC,EAAS;AAAA,MACnB,MAAM;AAAA,MACN,QAAQ;AAAA,IACd,GAAO,OAAOI,KAAO,WAAWG,GAAUH,CAAE,IAAIA,GAAI;AAAA,MAC9C,OAAOjB;AAAA,MACP,KAAKqB,GAAS;AAAA,IACpB,CAAK,CAAC;AAAA,EACN;AAEE,WAASC,GAAsBf,GAAchG,GAAO;AAClD,WAAO,CAAC;AAAA,MACN,KAAKgG,EAAa;AAAA,MAClB,KAAKA,EAAa;AAAA,MAClB,KAAKhG;AAAA,IACX,GAAOyG,EAAWT,CAAY,CAAC;AAAA,EAC/B;AAEE,WAASgB,GAAQZ,GAAQE,GAAUW,GAAO;AACxC,WAAO,CAACrB,EAAS,WAAWA,EAAS,KAAK;AAAA,MACxC,QAAQQ;AAAA,MACR,UAAUE;AAAA,MACV,OAAOW;AAAA,IACR,CAAA,GAAG;AAAA,EACR;AAEE,WAASd,GAAQN,GAAY;AAC3B,IAAAO,IAASP;AAET,QAAI+C,IAAwBxD,EAAqB;AAEjD,IAAApF,IAAQ4I,EAAsB,CAAC,GAC/BtC,IAAWsC,EAAsB,CAAC,GAClCrC,EAAU,KAAK;AAAA,MACb,QAAQH;AAAA,MACR,UAAUE;AAAA,IAChB,CAAK;AAAA,EACL;AAEE,WAASa,GAAKT,GAAIjB,GAAO;AACvB,QAAII,IAAarB,EAAO,MACpBwB,IAAeY,GAAgBF,GAAIjB,CAAK;AAE5C,aAASwB,IAAQ;AACf,MAAAE,GAAKT,GAAIjB,CAAK;AAAA,IACpB;AAII,QAFA,QAAQ,IAAI,aAAa,gBAAed,GAAQqB,EAAa,SAAS,OAAO,CAAC,MAAM,KAAK,+DAA+D,KAAK,UAAUU,CAAE,IAAI,GAAG,GAE5KM,GAAQnB,GAAYG,GAAciB,CAAK,GAAG;AAC5C,UAAI4B,IAAyB9B,GAAsBf,GAAchG,IAAQ,CAAC,GACtEqH,IAAewB,EAAuB,CAAC,GACvCvB,IAAMuB,EAAuB,CAAC;AAIlC,UAAI;AACF,QAAA1D,EAAc,UAAUkC,GAAc,IAAIC,CAAG;AAAA,MAC9C,QAAe;AAGd,QAAApC,EAAO,SAAS,OAAOoC,CAAG;AAAA,MAClC;AAEM,MAAAnB,GAAQN,CAAU;AAAA,IACxB;AAAA,EACA;AAEE,WAAS0B,EAAQb,GAAIjB,GAAO;AAC1B,QAAII,IAAarB,EAAO,SACpBwB,IAAeY,GAAgBF,GAAIjB,CAAK;AAE5C,aAASwB,IAAQ;AACf,MAAAM,EAAQb,GAAIjB,CAAK;AAAA,IACvB;AAII,QAFA,QAAQ,IAAI,aAAa,gBAAed,GAAQqB,EAAa,SAAS,OAAO,CAAC,MAAM,KAAK,kEAAkE,KAAK,UAAUU,CAAE,IAAI,GAAG,GAE/KM,GAAQnB,GAAYG,GAAciB,CAAK,GAAG;AAC5C,UAAI6B,IAAyB/B,GAAsBf,GAAchG,CAAK,GAClEqH,IAAeyB,EAAuB,CAAC,GACvCxB,IAAMwB,EAAuB,CAAC;AAGlC,MAAA3D,EAAc,aAAakC,GAAc,IAAIC,CAAG,GAChDnB,GAAQN,CAAU;AAAA,IACxB;AAAA,EACA;AAEE,WAASK,EAAGD,GAAO;AACjB,IAAAd,EAAc,GAAGc,CAAK;AAAA,EAC1B;AAEE,MAAIwB,IAAU;AAAA,IACZ,IAAI,SAAS;AACX,aAAOrB;AAAA,IACR;AAAA,IAED,IAAI,WAAW;AACb,aAAOE;AAAA,IACR;AAAA,IAED,YAAYG;AAAA,IACZ,MAAMU;AAAA,IACN,SAASI;AAAA,IACT,IAAIrB;AAAA,IACJ,MAAM,WAAgB;AACpB,MAAAA,EAAG,EAAE;AAAA,IACN;AAAA,IACD,SAAS,WAAmB;AAC1B,MAAAA,EAAG,CAAC;AAAA,IACL;AAAA,IACD,QAAQ,SAAgBwB,GAAU;AAChC,aAAOnB,EAAU,KAAKmB,CAAQ;AAAA,IAC/B;AAAA,IACD,OAAO,SAAeC,GAAS;AAC7B,UAAIC,IAAUhC,EAAS,KAAK+B,CAAO;AAEnC,aAAI/B,EAAS,WAAW,KACtBV,EAAO,iBAAiBN,IAAuBiD,EAAkB,GAG5D,WAAY;AACjB,QAAAD,KAIKhC,EAAS,UACZV,EAAO,oBAAoBN,IAAuBiD,EAAkB;AAAA,MAEvE;AAAA,IACP;AAAA,EACG;AACD,SAAOJ;AACT;AA6JA,SAASI,GAAmBkB,GAAO;AAEjC,EAAAA,EAAM,eAAc,GAEpBA,EAAM,cAAc;AACtB;AAEA,SAASvC,KAAe;AACtB,MAAIwC,IAAW,CAAE;AACjB,SAAO;AAAA,IACL,IAAI,SAAS;AACX,aAAOA,EAAS;AAAA,IACjB;AAAA,IAED,MAAM,SAAc/K,GAAI;AACtB,aAAA+K,EAAS,KAAK/K,CAAE,GACT,WAAY;AACjB,QAAA+K,IAAWA,EAAS,OAAO,SAAUxJ,GAAS;AAC5C,iBAAOA,MAAYvB;AAAA,QAC7B,CAAS;AAAA,MACF;AAAA,IACF;AAAA,IACD,MAAM,SAAcgL,GAAK;AACvB,MAAAD,EAAS,QAAQ,SAAU/K,GAAI;AAC7B,eAAOA,KAAMA,EAAGgL,CAAG;AAAA,MAC3B,CAAO;AAAA,IACP;AAAA,EACG;AACH;AAEA,SAASnC,KAAY;AACnB,SAAO,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AAC/C;AAQA,SAASH,GAAWuC,GAAM;AACxB,MAAIC,IAAgBD,EAAK,UACrB5D,IAAW6D,MAAkB,SAAS,MAAMA,GAC5CC,IAAcF,EAAK,QACnB3D,IAAS6D,MAAgB,SAAS,KAAKA,GACvCC,IAAYH,EAAK,MACjB1D,IAAO6D,MAAc,SAAS,KAAKA;AACvC,SAAI9D,KAAUA,MAAW,QAAKD,KAAYC,EAAO,OAAO,CAAC,MAAM,MAAMA,IAAS,MAAMA,IAChFC,KAAQA,MAAS,QAAKF,KAAYE,EAAK,OAAO,CAAC,MAAM,MAAMA,IAAO,MAAMA,IACrEF;AACT;AAOA,SAASuB,GAAUyC,GAAM;AACvB,MAAIC,IAAa,CAAE;AAEnB,MAAID,GAAM;AACR,QAAIX,IAAYW,EAAK,QAAQ,GAAG;AAEhC,IAAIX,KAAa,MACfY,EAAW,OAAOD,EAAK,OAAOX,CAAS,GACvCW,IAAOA,EAAK,OAAO,GAAGX,CAAS;AAGjC,QAAIa,IAAcF,EAAK,QAAQ,GAAG;AAElC,IAAIE,KAAe,MACjBD,EAAW,SAASD,EAAK,OAAOE,CAAW,GAC3CF,IAAOA,EAAK,OAAO,GAAGE,CAAW,IAG/BF,MACFC,EAAW,WAAWD;AAAA,EAE5B;AAEE,SAAOC;AACT;AC/tBO,SAASE,GAAUH,GAAwB;AAChD,SAAAI,GAAaJ,GAAM,yDAAyD,GAErEA,EACJ,MAAM,GAAG,EACT,IAAI,CAACK,MAAMA,EAAE,KAAA,CAAM,EACnB,OAAO,CAACA,MAAMA,MAAM,EAAE;AAC3B;AAQO,SAASC,GAASC,GAAyC;;AAChE,EAAAC;AAAA,IACE,CAAClG,MAASvD,GAAWuD,KAAA,gBAAAA,EAAM,QAAQ;AAAA,IACnCiG;AAAA,IACA;AAAA,EACF,GAEAA,IAAQA,EAAM,OAAO,CAACnH,MAAMA,CAAC,EAAE,QAAQ,MAAM;AAE7C,MAAIqH,KAASlI,IAAAgI,EAAM,MAAM,MAAZ,gBAAAhI,EAAe;AAE5B,MAAIkI,GAAQ;AACC,eAAAnG,KAAQiG,EAAM,IAAI,CAACG,MAAMA,EAAE,SAAA,CAAU;AAC1C,MAAApG,EAAK,WAAW,GAAG,IAEZmG,IAAAE,GAAYF,GAAQnG,CAAI,IACxBmG,EAAOA,EAAO,SAAS,CAAC,MAAM,MACnCnG,EAAK,CAAC,MAAM,MACdmG,KAAU,MAAMnG,IAENmG,KAAAnG,IAGRA,EAAK,CAAC,MAAM,MACJmG,KAAAnG,EAAK,MAAM,CAAC,IAEZmG,KAAAnG;AAMhB,IAAImG,KAAUA,MAAW,OAAOA,EAAO,SAAS,GAAG,MACjDA,IAASA,EAAO,MAAM,GAAGA,EAAO,SAAS,CAAC;AAAA,EAC5C;AAGF,SAAOA,KAAU;AACnB;AAEgB,SAAAE,GAAYxB,GAAc7E,GAAqB;AAQzD,MAPJ8F,GAAajB,GAAM,yDAAyD,GAExE7E,KAAQ,SACHA,IAAA6E,GACAA,IAAA,KAGL7E,EAAK,WAAW,GAAG;AACd,WAAAA;AAGT,MAAIsG,IAAWzB;AAEf;AACM,QAAA7E,EAAK,WAAW,IAAI;AACtB,eAASX,IAAIiH,EAAS,QAAQjH,IAAI,GAAG,EAAEA;AACrC,YAAIiH,EAASjH,CAAC,MAAM,OAAOA,MAAM,GAAG;AACvB,UAAAiH,IAAAA,EAAS,MAAM,GAAGjH,CAAC,GACvBW,IAAAA,EAAK,QAAQ,YAAY,EAAE;AAClC;AAAA,QAAA;AAAA,eAGKA,EAAK,WAAW,GAAG;AACrB,MAAAA,IAAAA,EAAK,QAAQ,UAAU,EAAE;AAAA;AAEhC;AAIJ,SAAOgG,GAAS,CAACM,GAAUtG,CAAI,CAAC;AAClC;AAEO,SAASuG,GAAiBlL,GAA0D;AACrF,MAAA,CAACA,EAAO,QAAO,CAAC;AAEhB,EAAAA,EAAM,WAAW,GAAG,MACdA,IAAAA,EAAM,MAAM,CAAC;AAGvB,QAAM8D,IAAU9D,EACb,MAAM,GAAG,EACT,OAAO,CAACyD,MAAMA,EAAE,WAAW,EAAE,EAC7B,IAAI,CAACjB,MAAU;AACd,UAAM,CAACnC,GAAKD,CAAK,IAAIoC,EAAM,MAAM,GAAG,EAAE,IAAI,CAACiB,MAAMA,EAAE,MAAM;AAErD,WAAArD,EAAM,YAAY,MAAM,SACnB,CAACC,GAAK,EAAI,IAGfD,EAAM,YAAY,MAAM,UACnB,CAACC,GAAK,EAAK,IAIf,MAAM,OAAOD,CAAK,CAAC,IAIjB,CAACC,GAAKD,CAAK,IAHT,CAACC,GAAK,OAAOD,CAAK,CAAC;AAAA,EAGV,CACnB;AAEI,SAAA,OAAO,YAAY0D,CAAO;AACnC;AAQO,SAASqH,GACdC,GACA/C,GACAlJ,IAAgC,CAAA,GACL;;AAC3B,QAAM,CAACkL,GAAMrK,CAAK,IAAIqI,EAAI,MAAM,GAAG,GAC7BuC,IAAQJ,GAAUH,CAAI;AAEpB,EAAAe,EAAA,YAAWC,KAASD,GAAQ;AAC5B,UAAA,EAAE,WAAAE,MAAcD;AAOtB,QAJI,IAFgBzI,IAAA0I,EAAUA,EAAU,SAAS,CAAC,MAA9B,gBAAA1I,EAAiC,UAAS,MAE1C0I,EAAU,WAAWV,EAAM,UAI3CzL,EAAQ,aAAa,CAACA,EAAQ,UAAUkM,CAAK;AACtC,eAAAD;AAGX,UAAMG,IAA2B,CAAC;AAElC,IAAAD,YAAoBtH,IAAI,GAAGA,IAAIsH,EAAU,QAAQtH,KAAK;AAC9C,YAAAW,IAAOiG,EAAM5G,CAAC,GACdwH,IAAOF,EAAUtH,CAAC;AAExB,UAAIW,KAAQ,QAAQ6G,EAAK,SAAS;AACvB,iBAAAJ;AAGX,cAAQI,EAAK,MAAM;AAAA,QACjB,KAAK;AACH,cAAIA,EAAK,KAAK,YAAkB,MAAA7G,EAAK,eAAe;AAClD,YAAA4G,EAAQ,KAAKC,CAAI;AACjB;AAAA,UAAA;AAES,qBAAAJ;AAAA,QAEb,KAAK;AACH,UAAAG,EAAQ,KAAK,EAAE,GAAGC,GAAM,OAAO7G,GAAM;AACrC;AAAA,QACF,KAAK;AACH,UAAA4G,EAAQ,KAAK,EAAE,GAAGC,GAAM,OAAOZ,EAAM,MAAM5G,CAAC,EAAE,KAAK,GAAG,EAAA,CAAG;AACnD,gBAAAsH;AAAA,QACR,KAAK;AACH,cAAK,MAAM,OAAO3G,CAAI,CAAC;AAIZ,qBAAAyG;AAHD,UAAAG,EAAA,KAAK,EAAE,GAAGC,GAAM,OAAO,OAAO7G,CAAI,GAAG;AAC7C;AAAA,QAIJ;AACE,gBAAM,IAAI,MAAM,0BAA0B6G,EAAK,IAAI,EAAE;AAAA,MAAA;AAAA,IACzD;AAGI,UAAAC,IAAgB,uBAAA,OAAO,IAAI;AAEjC,eAAWD,KAAQD;AACb,MAAAC,EAAK,SAAS,MAChBC,EAAOD,EAAK,IAAI,IAAI,mBAAmBA,EAAK,KAAe,IAGzDA,EAAK,SAAS,MACTC,EAAAD,EAAK,IAAI,IAAIA,EAAK,QAGvBA,EAAK,SAAS,MAChBC,EAAO,WAAW,MAAM,mBAAmBD,EAAK,KAAe;AAI5D,WAAA;AAAA,MACL,MAAM,MAAMD,EAAQ,IAAI,CAACb,MAAMA,EAAE,KAAK,EAAE,KAAK,GAAG;AAAA,MAChD,SACE,MACAY,EACG,IAAI,CAACZ,MACAA,EAAE,SAAS,IACN,IAAIA,EAAE,IAAI,MAGfA,EAAE,SAAS,IACN,KAAKA,EAAE,IAAI,MAGbA,EAAE,IACV,EACA,KAAK,GAAG;AAAA,MACb,QAAAe;AAAA,MACA,OAAOP,GAAiBlL,CAAK;AAAA,MAC7B,MAAMqL,EAAM;AAAA,IACd;AAAA,EAAA;AAEJ;AAQO,SAASK,GAAcN,GAA4C;AACxE,QAAMO,IAAgB,CAAC,GACjBC,IAAoB,CAAC,GACrBC,IAAa,CAAC,GACdC,IAAW,CAAC;AAElB,aAAWT,KAASD,GAAQ;AACpB,UAAA,EAAE,WAAAE,MAAcD;AAEtB,IAAIC,EAAU;AAAA,MAAK,CAACZ,MAAMA,EAAE,SAAS;AAAA;AAAA,QACnCoB,EAAS,KAAKT,CAAK,IACVC,EAAU;AAAA,MAAK,CAACZ,MAAMA,EAAE,SAAS;AAAA;AAAA,QAC1CkB,EAAkB,KAAKP,CAAK,IACnBC,EAAU;AAAA,MAAK,CAACZ,MAAMA,EAAE,SAAS;AAAA;AAAA,QAC1CmB,EAAW,KAAKR,CAAK,IAErBM,EAAc,KAAKN,CAAK;AAAA,EAC1B;AAGI,QAAAU,IAAa,CAACC,GAAmBC,MACjCD,EAAE,UAAU,SAASC,EAAE,UAAU,SAC5B,KAEA;AAIX,SAAAN,EAAc,KAAKI,CAAU,GAC7BH,EAAkB,KAAKG,CAAU,GACjCF,EAAW,KAAKE,CAAU,GAC1BD,EAAS,KAAKC,CAAU,GAEjB,CAAC,GAAGJ,GAAe,GAAGC,GAAmB,GAAGC,GAAY,GAAGC,CAAQ;AAC5E;AAOO,SAASI,GAAmBC,GAAkC;AAC7D,QAAAvB,IAAQJ,GAAU2B,CAAO,GACzBb,IAAY,CAAC;AAEnB,WAAStH,IAAI,GAAGA,IAAI4G,EAAM,QAAQ5G,KAAK;AAC/B,UAAAW,IAAOiG,EAAM5G,CAAC;AAEpB,QAAIW,MAAS,KAAK;AACZ,UAAAX,MAAM4G,EAAM,SAAS;AACvB,cAAM,IAAI,MAAM,uDAAuDuB,CAAO,EAAE;AAElF,MAAAb,EAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MAAA,CACR;AAAA,IAAA,MACH,CAAW3G,EAAK,GAAG,CAAC,MAAM,OAAOA,EAAK,GAAG,EAAE,MAAM,MAC/C2G,EAAU,KAAK;AAAA,MACb,MAAM3G,EAAK,CAAC,MAAM,MAAM,IAAyB;AAAA,MACjD,MAAMA,EAAK,CAAC,MAAM,MAAMA,EAAK,MAAM,GAAG,EAAE,IAAIA,EAAK,MAAM,GAAG,EAAE;AAAA,MAC5D,OAAO;AAAA,IAAA,CACR,IAED2G,EAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,MAAM3G;AAAA,MACN,OAAOA;AAAA,IAAA,CACR;AAAA,EACH;AAGK,SAAA2G;AACT;;AChNO,MAAMc,GAAO;AAAA,EAsClB,YAAYjL,GAAckL,GAA0B;AAtC/C,IAAA1N,EAAA,MAAA2N;AACL,IAAA3N,EAAA,MAAA+C;AACA,IAAA/C,EAAA,MAAAgD;AACA,IAAAhD,EAAA,MAAA4N;AAEA,IAAA5N,EAAA,MAAA6N;AACA,IAAA7N,EAAA,MAAA8N,IAAW;AACX,IAAA9N,EAAA,MAAA+N,GAA+B,CAAC;AAChC,IAAA/N,EAAA,MAAAgO;AACA,IAAAhO,EAAA,MAAAiO,IAA8C,CAAC;AAG/C;AAAA,IAAAjO,EAAA,MAAAkO,GAAoC,CAAC;AAKrC;AAAA;AAAA;AAAA,IAAAhN,EAAA;AACA,IAAAlB,EAAA,MAAAmO;AAKA;AAAA;AAAA;AAAA,IAAAjN,EAAA;AACA,IAAAlB,EAAA,MAAAoO;AAKA;AAAA;AAAA;AAAA,IAAAlN,EAAA;AACA,IAAAlB,EAAA,MAAAqO;AAKA;AAAA;AAAA;AAAA,IAAAnN,EAAA;AACA,IAAAlB,EAAA,MAAAsO;AAGE,IAAA/K,EAAA,MAAKR,IAASP,IACTe,EAAA,MAAAP,GAAUR,EAAM,aAAa,cAAc,IAChDe,EAAA,MAAKqK,GAAYF;AAEjB,UAAM,CAACa,GAAUC,CAAU,IAAI9K,EAA2B,IAAI,GACxD,CAAC+K,GAAOC,CAAO,IAAIhL,EAAY,EAAE,GACjC,CAACiL,GAASC,CAAS,IAAIlL,EAA0B,CAAA,CAAE,GACnD,CAACmL,GAAQC,CAAQ,IAAIpL;AAAA,MACzB6I,GAAiB,OAAO,SAAW,MAAc,KAAM,OAAO,SAAS,UAAU,EAAG;AAAA,IACtF;AAEA,SAAK,WAAWgC,GAChBhL,EAAA,MAAK4K,IAAcK,IAEnB,KAAK,QAAQC,GACblL,EAAA,MAAK6K,IAAWM,IAEhB,KAAK,UAAUC,GACfpL,EAAA,MAAK8K,IAAaO,IAElB,KAAK,SAASC,GACdtL,EAAA,MAAK+K,IAAYQ,IAEjBtM,EAAM,YAAY,MAAM;AAElB,MAAAlC,EAAA,MAAKuN,MAAY,SAGrBvN,EAAA,MAAK4N,GAAkB;AAAA,QACrBa,GAAM,CAACF,CAAM,GAAG,CAACxM,MAAY;AACrB,gBAAAyK,IAAS,IAAI,gBAAgB;AAEnC,qBAAWpL,KAAOW;AAChB,YAAAyK,EAAO,IAAIpL,GAAK,OAAOW,EAAQX,CAAG,CAAC,CAAC;AAGhC,gBAAAiG,IAAS,MAAMmF,EAAO,SAAS;AAErC,UAAInF,KAAUrH,EAAA,MAAKuN,GAAS,SAAS,UACnCvN,EAAA,MAAKuN,GAAS,QAAQ;AAAA,YACpB,UAAUvN,EAAA,MAAKuN,GAAS,SAAS;AAAA,YACjC,QAAAlG;AAAA,UAAA,CACD;AAAA,QAEJ,CAAA;AAAA,MACH,GAEKrH,EAAA,MAAA4N,GAAkB,KAAK5N,EAAA,MAAKuN,GAAS,OAAOpN,EAAA,MAAKkN,GAAAqB,IAAe,KAAK,IAAI,CAAC,CAAC,GAC3EvO,EAAA,MAAAkN,GAAAqB,IAAA,WAAe1O,EAAA,MAAKuN,KAEzBvN,EAAA,MAAK4N,GAAkB;AAAA,QACrBe,GAAW3O,EAAA,MAAKsN,GAAU,aAAc,CAACsB,MAAW;AAC9C,cAAApE,IAAOoE,EAAO,aAAa,MAAM;AAErC,UAAA5O,EAAA,MAAK0C,GAAQ,KAAK,0BAA0BkM,GAAQpE,CAAI,GAEnD,mBAAmB,KAAKA,CAAI,MAC/BA,IAAOkB,GAAS,CAAC1L,EAAA,MAAKuN,GAAS,SAAS,UAAU/C,CAAI,CAAC,IAGpDxK,EAAA,MAAAuN,GAAS,KAAK/C,CAAI;AAAA,QACxB,CAAA;AAAA,MACH,GACAxK,EAAA,MAAK0C,GAAQ,KAAK,gDAAgD1C,EAAA,MAAKsN,GAAU,WAAY;AAAA,IAAA,CAC9F,GAEDpL,EAAM,UAAU,MAAM;AACb,aAAAlC,EAAA,MAAK4N,GAAkB,SAAS;AAE5B,QADQ5N,EAAA,MAAK4N,GAAkB,IAAI,EACnC;AAAA,IACX,CACD;AAAA,EAAA;AAAA,EAGH,MAAM1N,GAA6B;AAC7B,QAAAF,EAAA,MAAKyC,IAAO,WAAW;AACzB,MAAAzC,EAAA,MAAK0C,GAAQ;AAAA,QACX,IAAI,MAAM,qFAAqF;AAAA,MACjG;AACA;AAAA,IAAA;AAGE,IAAAxC,EAAQ,UAAU,SACpB+C,EAAA,MAAKsK,GAAW3D,GAAkB,KAElC3G,EAAA,MAAKsK,GAAW1G,GAAqB,IAGvC5D,EAAA,MAAK0K,IAAUlB;AAAA,MACbvM,EAAQ,OACL,QAAQ,CAACkM,MAAUjM,EAAA,MAAKkN,GAAAwB,IAAL,WAAmBzC,EAAM,EAC5C,IAAI,CAACA,OAAW;AAAA,QACf,SAASA,EAAM;AAAA,QACf,MAAMA,EAAM;AAAA,QACZ,WAAWa,GAAmBb,EAAM,OAAO;AAAA,MAAA,EAC3C;AAAA,IACN;AAGW,eAAAA,KAASpM,EAAA,MAAK2N;AACnB,UAAAvB,EAAM,KAAK,UAAU;AACnB,YAAA0C;AAEJ,YAAI,CAAA3M,GAAWiK,EAAM,KAAK,QAAQ,EAGvB,KAAA/J,EAAS+J,EAAM,KAAK,QAAQ;AASrC,cARA0C,IAAe1C,EAAM,KAAK,UAQtB,CANUF,GAAYlM,EAAA,MAAK2N,KAASmB,GAAc;AAAA,YACpD,UAAUC,GAAG;AACX,qBAAOA,MAAM3C;AAAA,YAAA;AAAA,UACf,CACD;AAGC,kBAAM,IAAI;AAAA,cACR,+CAA+CA,EAAM,OAAO,SAASA,EAAM,KAAK,QAAQ;AAAA,YAC1F;AAAA;AAGF,gBAAM,IAAI,UAAU,gDAAgDA,EAAM,KAAK,QAAQ,EAAE;AAAA,MAC3F;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUF,GAAGhB,GAAiClL,IAA2B,IAAI;AAC7D,QAAAF,EAAA,MAAKuN,MAAY,MAAM;AACzB,MAAAvN,EAAA,MAAK0C,GAAQ;AAAA,QACX,IAAI;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ;AACA;AAAA,IAAA;AAGE,QAAAmJ;AAEA,IAAA,MAAM,QAAQT,CAAI,IACpBS,IAASH,GAASN,CAAI,IAEtBS,IAAST,EAAK,SAAS,GAGzBS,IAASE,GAAY/L,EAAA,MAAKuN,GAAS,SAAS,UAAU1B,CAAM,GAExD3L,EAAQ,kBACA2L,KAAA7L,EAAA,MAAKuN,GAAS,SAAS,SAG/BrN,EAAQ,UACLF,EAAA,MAAAuN,GAAS,QAAQ1B,CAAM,IAEvB7L,EAAA,MAAAuN,GAAS,KAAK1B,CAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAMF,KAAKmD,IAAQ,GAAG;AACV,QAAAhP,EAAA,MAAKuN,MAAY,MAAM;AACzB,MAAAvN,EAAA,MAAK0C,GAAQ;AAAA,QACX,IAAI;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ;AACA;AAAA,IAAA;AAGG,IAAA1C,EAAA,MAAAuN,GAAS,GAAG,CAACyB,CAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMzB,QAAQA,IAAQ,GAAG;AACb,QAAAhP,EAAA,MAAKuN,MAAY,MAAM;AACzB,MAAAvN,EAAA,MAAK0C,GAAQ;AAAA,QACX,IAAI;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ;AACA;AAAA,IAAA;AAGG,IAAA1C,EAAA,MAAAuN,GAAS,GAAGyB,CAAK;AAAA,EAAA;AA4L1B;AApaEvM,KAAA,eACAC,IAAA,eACA4K,IAAA,eAEAC,IAAA,eACAC,KAAA,eACAC,IAAA,eACAC,KAAA,eACAC,KAAA,eAGAC,IAAA,eAMAC,KAAA,eAMAC,KAAA,eAMAC,KAAA,eAMAC,KAAA,eApCKX,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkPLwB,cAAczC,GAAc6C,IAAmB,CAAA,GAAIC,IAAuB,CAAA,GAAI;AAC5E,MAAI,EAAE,OAAO9C,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK,MAAQ,OAAOA,EAAM,QAAS;AACnF,UAAM,IAAI,UAAU,qEAAqEA,CAAK,EAAE;AAG9F,MAAAA,EAAM,YAAYA,EAAM;AACpB,UAAA,IAAI,MAAM,0DAA0D;AACjE,MAAAA,EAAM,YAAYA,EAAM;AAC3B,UAAA,IAAI,MAAM,mDAAmD;AACrE,MAAW,CAACA,EAAM,QAAQ,CAACA,EAAM,UAAU,CAACA,EAAM;AAC1C,UAAA,IAAI,MAAM,sEAAsE;AAGxF,MAAIT,IAAkB,CAAC;AAEvB,aAAWwD,KAAUF;AACnB,IAAAtD,EAAM,KAAK,GAAGJ,GAAU4D,EAAO,IAAI,CAAC;AAGtC,EAAAxD,EAAM,KAAK,GAAGJ,GAAUa,EAAM,IAAI,CAAC,GAG/BT,EAAMA,EAAM,SAAS,CAAC,MAAM,OAC9BA,EAAM,IAAI;AAGZ,QAAMQ,IAAwB,CAAC;AAE/B,MAAIC,EAAM,UAAU;AAClB,QAAIgD,IAAWhD,EAAM;AAEjB,WAAA/J,EAAS+M,CAAQ,MACnBA,IAAWrD,GAAYL,GAASC,CAAK,GAAGyD,CAAQ,GAE3CA,EAAS,WAAW,GAAG,MAC1BA,IAAW,MAAMA,KAIrBjD,EAAO,KAAK;AAAA,MACV,SAAS,MAAMT,GAAS,CAAC,GAAGC,GAAO,GAAGJ,GAAUa,EAAM,IAAI,CAAC,CAAC;AAAA,MAC5D,MAAM;AAAA,QACJ,UAAAgD;AAAA,MAAA;AAAA,IACF,CACD,GAEMjD;AAAA,EAAA;AAGT,MAAIkD,IAA0BC;AAE1B,MAAA,OAAOlD,EAAM,QAAS;AACxB,IAAAiD,IAAOjD,EAAM;AAAA,WACJA,EAAM;AACT,UAAA,IAAI,UAAU,UAAUA,EAAM,IAAI,iDAAiDA,EAAM,IAAI,EAAE;AAGvG,QAAMmD,IAAoB,EAAE,IAAIC,GAAA,MAAKhC,IAAL,KAAiB,MAAA6B,EAAK;AAGtD,MAAIjD,EAAM;AACG,eAAAqD,KAAYrD,EAAM;AAC3B,MAAAD,EAAO,KAAK,GAAGhM,EAAA,MAAKkN,GAAAwB,IAAL,WAAmBY,GAAU,CAAC,GAAGR,GAAS7C,CAAK,GAAG,CAAC,GAAG8C,GAAQK,CAAK,EAAE;AAAA;AAGtF,IAAApD,EAAO,KAAK;AAAA,MACV,SAAS,SAAST,GAAS,CAAC,GAAGuD,EAAQ,IAAI,CAACnD,MAAMA,EAAE,IAAI,GAAGM,EAAM,IAAI,CAAC,IAAIA,EAAM;AAAA,MAChF,MAAM;AAAA,QACJ,SAASA,EAAM;AAAA,QACf,QAAQ,CAAC,GAAG8C,GAAQK,CAAK;AAAA,QACzB,aAAanD,EAAM;AAAA,MAAA;AAAA,IACrB,CACD;AAGI,SAAAD;AAAA,GAOHuC,KAAA,eAAe,EAAE,UAAAtG,KAA8B;AAE/C,EAAAA,EAAS,WAAWpI,EAAA,MAAK0N,QAC3BzK,EAAA,MAAKyK,IAAatF,EAAS,SAC3BpI,EAAA,MAAKgO,IAAL,WAAe/B,GAAiB7D,EAAS,MAAM;AAGjD,QAAMkE,IAAUJ,GAAYlM,EAAA,MAAK2N,KAASvF,EAAS,QAAQ;AAE3D,MAAI,CAACkE,GAAS;AACZ,IAAAtM,EAAA,MAAK6N,IAAL,WAAiB,OACZ7N,EAAA,MAAA8N,IAAA,WAAS1F,EAAS,WACvBpI,EAAA,MAAK+N,IAAL,WAAgB;AAAA,MACd,UAAU3F,EAAS;AAAA,IAAA;AAErB;AAAA,EAAA;AAcE,MAVAkE,EAAQ,KAAK,eACT,MAAAA,EAAQ,KAAK,YAAY;AAAA;AAAA,IAE7B,UAAU,CAAClB,MAAS;AAEZ,YAAA,IAAI,MAAM,+BAA+B;AAAA,IAAA;AAAA,EACjD,CACD,GAGCkB,EAAQ,KAAK,YAAY;AAC3B,QAAI,OAAOA,EAAQ,KAAK,YAAa,UAAU;AAC7C,YAAMlB,IAAOsE,GAAcpD,EAAQ,KAAK,UAAUA,EAAQ,MAAM;AAChE,MAAAtM,EAAA,MAAK0C,GAAQ,KAAK,wBAAwB4J,EAAQ,IAAI,SAASlB,CAAI,GAAG,GACjEpL,EAAA,MAAAuN,GAAS,QAAQnC,CAAI;AAAA,IACjB,WAAA,OAAOkB,EAAQ,KAAK,YAAa,YAAY;AACtD,YAAMqD,IAAwC;AAAA,QAC5C,MAAMrD,EAAQ;AAAA,QACd,SAASA,EAAQ;AAAA,QACjB,QAAQA,EAAQ;AAAA,QAChB,OAAOA,EAAQ;AAAA,MACjB;AACA,UAAIlB,IAAO,MAAMkB,EAAQ,KAAK,SAASqD,CAAe;AAClD,UAAA,OAAOvE,KAAS;AACZ,cAAA,IAAI,MAAM,sDAAsD;AAExE,MAAKA,EAAK,WAAW,GAAG,MAEfA,IAAAW,GAAYO,EAAQ,MAAMlB,CAAI,IAEvCpL,EAAA,MAAK0C,GAAQ,KAAK,oBAAoB0I,CAAI,GAAG,GACxCpL,EAAA,MAAAuN,GAAS,QAAQnC,CAAI;AAAA,IAAA;AAEpB,YAAA,IAAI,UAAU,sDAAsD;AAAA,WAG5EpL,EAAA,MAAK0C,GAAQ,KAAK,qBAAqB4J,EAAQ,IAAI,GAAG,GAEjDtM,EAAA,MAAA8N,IAAA,WAASxB,EAAQ,OACjBtM,EAAA,MAAA+N,IAAA,WAAWzB,EAAQ,SAEpBA,EAAQ,YAAY,KAAK,SAAS,OAAO;AACtC,IAAAtM,EAAA,MAAA6N,IAAA,WAAYvB,EAAQ;AAEnB,UAAA4C,IAAS5C,EAAQ,KAAK;AAG5B,aAAS,IAAI,GAAG,IAAI4C,EAAO,QAAQ,KAAK;AAChC,YAAAU,IAAeV,EAAO,CAAC,GACvBW,IAAc7P,EAAA,MAAKyN,GAAc,CAAC;AAEpC,WAAAoC,KAAA,gBAAAA,EAAa,QAAOD,EAAa,IAAI;AAEvC,QAAA3M,EAAA,MAAKwK,GAAgBzN,EAAA,MAAKyN,GAAc,MAAM,GAAG,CAAC;AAElD,cAAMqC,IAAc9P,EAAA,MAAKyN,GAAc,GAAG,EAAE;AAExC,QAAAoC,KAAeA,EAAY,KAAK,aAElCA,EAAY,KAAK,QAAQ;AAGvB,YAAAE;AAGJ,QAAID,IACFC,IAAOD,EAAY,KAAK,aAAaF,EAAa,IAAI,IAEtDG,IAAO/P,EAAA,MAAKsN,GAAU,SAAU,aAAasC,EAAa,IAAI,GAIhE5P,EAAA,MAAKyN,GAAc,KAAK,EAAE,IAAImC,EAAa,IAAI,MAAAG,GAAM;AAAA,MAAA;AAAA,IACvD;AAAA,EACF;AAEJ;AAIJ,MAAMC,KAAmB,+CACnBC,KAAe;AAWd,SAAStB,GAAWuB,GAAmBjK,GAA+CkK,IAAU,QAAQ;AAC7G,WAASC,EAASL,GAAoD;AAChE,WAAA,CAACA,KAAQA,MAASG,IACb,OAGLH,EAAK,cAAc,OAAQA,EAAa,SAAS,SAC5CK,EAASL,EAAK,UAAgC,IAGhDA;AAAA,EAAA;AAGT,WAASzO,EAAQ+O,GAAe;AAC9B,QAAKA,EAAE,UAAUA,EAAE,WAAW,KAAMA,EAAE,WAAWA,EAAE,WAAWA,EAAE,UAAUA,EAAE,YAAYA,EAAE;AACxF;AAGI,UAAAzB,IAASwB,EAASC,EAAE,MAAqB;AAE/C,IAAKzB,MAKHuB,EAAQ,SAAS,aAAavB,EAAO,YACrCuB,EAAQ,SAAS,aAAavB,EAAO,YACrCuB,EAAQ,SAAS,SAASvB,EAAO,QACjCA,EAAO,aAAa,oBAAoB,KACxCA,EAAO,aAAa,UAAU,KAC7BA,EAAO,aAAa,QAAQ,MAAM,YAAYoB,GAAiB,KAAKpB,EAAO,aAAa,KAAK,CAAE,KAChGqB,GAAa,KAAKrB,EAAO,aAAa,MAAM,CAAE,MAKhDyB,EAAE,eAAe,GACjBpK,EAAS2I,CAAM;AAAA,EAAA;AAGZ,SAAAsB,EAAA,iBAAiB,SAAS5O,CAAO,GAE/B,WAAkB;AAClB,IAAA4O,EAAA,oBAAoB,SAAS5O,CAAO;AAAA,EAC3C;AACF;AAKA,SAASoO,GAActE,GAAcoB,GAAyC;AAC5E,aAAWpL,KAAOoL,GAAQ;AACxB,UAAMrL,IAAQqL,EAAOpL,CAAG,EAAE,SAAS;AAC5B,IAAAgK,IAAAA,EAAK,QAAQ,IAAIhK,CAAG,KAAKD,CAAK,EAAE,QAAQ,KAAKC,CAAG,KAAKD,CAAK;AAAA,EAAA;AAG5D,SAAAiK;AACT;;ACtkBO,MAAMkF,GAAM;AAAA,EAyBjB,cAAc;AAxBL,IAAA1P,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAET,IAAAlB,EAAA,MAAA6Q,GAAa;AACb,IAAA7Q,EAAA,MAAA8Q,IAAoB;AACpB,IAAA9Q,EAAA,MAAA+Q;AACA,IAAA/Q,EAAA,MAAAgR;AACA,IAAAhR,EAAA,MAAAiR,IAA2CtR;AAE3C,IAAAK,EAAA,MAAAkR,IAA2D,CAAC;AAC5D,IAAAlR,EAAA,MAAAmR,IAAuC,CAAC;AACxC,IAAAnR,EAAA,MAAAoR,IAA6D,CAAC;AAC9D,IAAApR,EAAA,MAAAqR,IAAyC,CAAC;AAE1C,IAAArR,EAAA,MAAAsR,GAAoB;AAAA,MAClB,MAAM;AAAA,MACN,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AACA,IAAAtR,EAAA,MAAAuR,GAASC,GAAc,YAAY;AAkBnC,IAAAtQ,EAAA,qBAAcwC;AACd,IAAAxC,EAAA,6BAAsBuQ;AACtB,IAAAvQ,EAAA,yBAAkBwQ;AAClB,IAAAxQ,EAAA,iBAAU0E;AACV,IAAA1E,EAAA,iBAAUyQ;AACV,IAAAzQ,EAAA,gBAAS8D;AACT,IAAA9D,EAAA,eAAQ6N;AAER,IAAA7N,EAAA,mBAAY0Q;AACZ,IAAA1Q,EAAA,eAAQ2Q;AAxBN,UAAMC,IAAO;AAER,SAAA,OAAO,IAAI/R,GAAK,GAChB,KAAA,WAAW,IAAI8C,GAAS,IAAI,GAC5B,KAAA,SAAS,IAAIoD,GAAO,IAAI,GACxB,KAAA,SAAS,IAAIwH,GAAO,MAAM;AAAA,MAC7B,IAAI,cAAc;AAChB,eAAOnN,EAAAwR,GAAKf;AAAA,MACd;AAAA,MACA,IAAI,WAAW;AACb,eAAOzQ,EAAAwR,GAAKd;AAAA,MAAA;AAAA,IACd,CACD;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAiBH,IAAI,YAAY;AACd,WAAO1Q,EAAA,MAAKuQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,SAAS;AACP,WAAOvQ,EAAA,MAAKwQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,OAAOrP,GAAoB;AACzB,IAAA8B,EAAA,MAAKuN,IAAOrP;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,aAAakO,GAAoC;AAC/C,IAAApM,EAAA,MAAK0N,IAAatB;AAAA,EAAA;AAAA,EAMpB,MAAM,MAAMoC,GAA8BpC,GAA0B;AAClE,QAAIrP,EAAA,MAAKuQ;AACD,YAAA,IAAI,MAAM,2BAA2B;AAGzC,QAAAlO,EAASoP,CAAM,GAAG;AACd,YAAAC,IAAQ,SAAS,cAA2BD,CAAM;AACxD,MAAAE,GAAiB,aAAaD,GAAO,aAAaD,CAAM,8BAA8B,GACtFxO,EAAA,MAAKwN,GAAeiB;AAAA,IAAA;AAEH,MAAAC,GAAA,aAAaF,GAAQ,wEAAwE,GAC9GxO,EAAA,MAAKwN,GAAegB;AAGlB,QAAAG;AAEJ,IAAIvC,IACFuC,IAAiBC,GAAaxC,CAAI,IAElCuC,IAAiBC,GAAavC,EAAW,GAI3CrM,EAAA,MAAKyN,IAAY,KAAK,cAAckB,EAAe,MAA2BA,EAAe,KAAK,IAG5F,MAAA,QAAQ,IAAI5R,EAAA,MAAK4Q,IAAsB,IAAI,CAAC3K,MAAaA,EAAS,CAAC,CAAC,GAErEjG,EAAA,MAAA0Q,IAAU,MAAM1Q,EAAA,MAAKyQ,EAAY,GAGtCxN,EAAA,MAAKsN,GAAa;AAGP,eAAAtK,KAAYjG,EAAA,MAAK6Q;AACjB,MAAA5K,EAAA;AAAA,EACX;AAAA,EAGF,MAAM,UAAU;;AACV,QAACjG,EAAA,MAAKuQ,IAGJ;AAAA,YAAA,QAAQ,IAAIvQ,EAAA,MAAK8Q,IAAwB,IAAI,CAAC7K,MAAaA,EAAS,CAAC,CAAC,IAE5EtC,IAAA3D,EAAA,MAAK0Q,QAAL,QAAA/M,EAAgB,WAEhBV,EAAA,MAAKsN,GAAa;AAGP,iBAAAtK,KAAYjG,EAAA,MAAK+Q;AACjB,QAAA9K,EAAA;AAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,YAAYA,GAAsC;AAC3C,IAAAjG,EAAA,MAAA4Q,IAAsB,KAAK3K,CAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAM1C,QAAQA,GAAsB;AACvB,IAAAjG,EAAA,MAAA6Q,IAAkB,KAAK5K,CAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOtC,cAAcA,GAAsC;AAC7C,IAAAjG,EAAA,MAAA8Q,IAAwB,KAAK7K,CAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAM5C,UAAUA,GAAsB;AACzB,IAAAjG,EAAA,MAAA+Q,IAAoB,KAAK9K,CAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMxC,WAAW/F,GAA2B;AACpC,eAAWkB,KAAOlB,GAAS;AACnB,YAAAiB,IAAQjB,EAAQkB,CAAoB;AAC1C,MAAID,MACGnB,EAAA,MAAAgR,GAAS5P,CAAoB,IAAID;AAAA,IACxC;AAAA,EACF;AAAA,EAGF,aAAa2Q,GAAyB;AAC/B,IAAA7O,EAAA,MAAAgO,GAASC,GAAcY,CAAM;AAAA,EAAA;AAAA,EAGpC,aAAazQ,GAA8BnB,GAAiC;AACpE,UAAA6R,IAAQzM,GAAQjE,CAAI,GAEpB2Q,KAAW9R,KAAA,gBAAAA,EAAS,YAAW+R,GAAkB,GAEjDT,IAAO;AAEN,WAAA;AAAA,MACL,IAAI,OAAO;;AACHnQ,cAAAA,IAAO0Q,EAAM,IAAI;AACvB,YACE/R,EAAAwR,GAAKR,GAAS,SAAS,MACtB3O,EAASrC,EAAAwR,GAAKR,GAAS,IAAI,KAAKhR,EAAAwR,GAAKR,GAAS,SAASQ,EAAK,OAAO,KACpE,CAACxR,EAAA2D,IAAA6N,GAAKP,GAAL,KAAAtN,GAAYtC;AAEN,iBAAA6Q;AACF;AACD,cAAAC,IAAQ,KAAK9Q,CAAI;AACrB,iBAAInB,KAAA,QAAAA,EAAS,MACFiS,KAAA,cAAcjS,EAAQ,GAAG,QAEzBiS,KAAA,UAEJH,EAAS,KAAK;AAAA,YACnBA;AAAA,YACAG;AAAA,YACA,SAASC,GAAgBD,CAAK,CAAC;AAAA,YAC/B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ;AAAA,MAEA,IAAI,MAAM;;AACF9Q,cAAAA,IAAO0Q,EAAM,IAAI;AACvB,YACE/R,EAAAwR,GAAKR,GAAS,QAAQ,MACrB3O,EAASrC,EAAAwR,GAAKR,GAAS,GAAG,KAAKhR,EAAAwR,GAAKR,GAAS,QAAQQ,EAAK,OAAO,KAClE,CAACxR,EAAA2D,IAAA6N,GAAKP,GAAL,KAAAtN,GAAYtC;AAEN,iBAAA6Q;AACF;AACD,cAAAC,IAAQ,KAAK9Q,CAAI;AACrB,iBAAInB,KAAA,QAAAA,EAAS,MACFiS,KAAA,cAAcjS,EAAQ,GAAG,QAEzBiS,KAAA,UAEJH,EAAS,IAAI;AAAA,YAClBA;AAAA,YACAG;AAAA,YACA,SAASC,GAAgBD,CAAK,CAAC;AAAA,YAC/B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ;AAAA,MAEA,IAAI,OAAO;;AACH9Q,cAAAA,IAAO0Q,EAAM,IAAI;AACvB,YACE/R,EAAAwR,GAAKR,GAAS,SAAS,MACtB3O,EAASrC,EAAAwR,GAAKR,GAAS,IAAI,KAAKhR,EAAAwR,GAAKR,GAAS,SAASQ,EAAK,OAAO,KACpE,CAACxR,EAAA2D,IAAA6N,GAAKP,GAAL,KAAAtN,GAAYtC;AAEN,iBAAA6Q;AACF;AACD,cAAAC,IAAQ,KAAK9Q,CAAI;AACrB,iBAAInB,KAAA,QAAAA,EAAS,MACFiS,KAAA,cAAcjS,EAAQ,GAAG,QAEzBiS,KAAA,UAEJH,EAAS,KAAK;AAAA,YACnBA;AAAA,YACAG;AAAA,YACA,SAASC,GAAgBD,CAAK,CAAC;AAAA,YAC/B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ;AAAA,MAEA,IAAI,QAAQ;;AACJ9Q,cAAAA,IAAO0Q,EAAM,IAAI;AACvB,YACE/R,EAAAwR,GAAKR,GAAS,UAAU,MACvB3O,EAASrC,EAAAwR,GAAKR,GAAS,KAAK,KAAKhR,EAAAwR,GAAKR,GAAS,UAAUQ,EAAK,OAAO,KACtE,CAACxR,EAAA2D,IAAA6N,GAAKP,GAAL,KAAAtN,GAAYtC;AAEN,iBAAA6Q;AACF;AACD,cAAAC,IAAQ,KAAK9Q,CAAI;AACrB,iBAAInB,KAAA,QAAAA,EAAS,MACFiS,KAAA,cAAcjS,EAAQ,GAAG,QAEzBiS,KAAA,UAEJH,EAAS,MAAM;AAAA,YACpBA;AAAA,YACAG;AAAA,YACA,SAASC,GAAgBD,CAAK,CAAC;AAAA,YAC/B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ;AAAA,MAEA,MAAMpO,GAAc;AAClB,cAAIyN,EAAK,cAEPA,EAAK,QAAQ,GAGKA,EAAK,cAAcxR,EAAAwR,GAAKb,KAAY;AAAA,UACpD,OAAA5M;AAAA,UACA,YAAYgO,EAAM,IAAI;AAAA,UACtB,KAAK7R,KAAA,gBAAAA,EAAS;AAAA,QAAA,CACf,EACS,MAAMF,EAAAwR,GAAKf,EAAa,IAG9B1M;AAAA,MAAA;AAAA,IAEV;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMF,cAAiBsL,GAAuB/P,GAAU+S,IAAqB,CAAA,GAAc;AAC5E,WAAAC,GAAc,EAAE,MAAM,MAAM,MAAM,CAAA,KAAMjD,GAAM/P,GAAO+S,CAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMtE,gBAAgBE,GAAuC;AAC9C,WAAAC,GAAWC,GAAgB,EAAE,MAAM,MAAM,MAAM,CAAA,KAAMF,CAAM,CAAC;AAAA,EAAA;AAEvE;AArUEhC,IAAA,eACAC,KAAA,eACAC,IAAA,eACAC,KAAA,eACAC,KAAA,eAEAC,KAAA,eACAC,KAAA,eACAC,KAAA,eACAC,KAAA,eAEAC,IAAA,eAMAC,IAAA;AC3EI,MAAA/O,KAAQ,IAAIoO,GAAM,GAKX3L,KAAIzC,GAAM,SAAS,EAAE,KAAKA,GAAM,QAAQ;","x_google_ignoreList":[4,5]}
|