{"version":3,"file":"turbo.js","mappings":"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","sources":["./app/assets/javascript/application/meta.js","./node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js","./node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js","./node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js","./node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js","./node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js","./node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js","./app/assets/javascript/application/csrf_request.js","./app/assets/javascript/application/release_skew.js","./app/assets/javascript/turbo.js"],"sourcesContent":["const DYNAMIC_NAMES = ['csrf-token', 'user-id', 'user-email', 'anonymous-id'];\n\nconst metaElement = (name) => document.querySelector(`meta[name=\"${name}\"]`);\n\nexport class NetworkError extends Error {}\n\nexport class UnauthorizedError extends Error {}\n\nconst wrapNetworkError = (error) => {\n if (error instanceof TypeError) throw new NetworkError(error.message);\n throw error;\n};\n\nconst Meta = {\n _version: 0,\n\n findByName(name) {\n return metaElement(name)?.content;\n },\n\n clear() {\n DYNAMIC_NAMES.forEach((name) => metaElement(name)?.remove());\n this.loaded = false;\n },\n\n invalidate() {\n this._version += 1;\n this._html = null;\n this._loadingPromise = null;\n this.clear();\n },\n\n load() {\n if (this.isLoaded()) return Promise.resolve();\n if (this._html) return Promise.resolve(this.inject());\n\n this._loadingPromise ??= this.fetchAndInject();\n return this._loadingPromise;\n },\n\n isLoaded() {\n return Boolean(metaElement('csrf-token'));\n },\n\n async fetchAndInject() {\n const version = this._version;\n try {\n const html = await this.fetchMeta();\n if (version !== this._version) return;\n this._html = html;\n this.inject();\n } finally {\n if (version === this._version) this._loadingPromise = null;\n }\n },\n\n inject() {\n this.clear();\n document.head.insertAdjacentHTML('beforeend', this._html);\n this.loaded = true;\n },\n\n async fetchMeta(retryUnauthorized = true) {\n const response = await fetch('/meta', {\n credentials: 'same-origin',\n redirect: 'error',\n headers: { 'X-Requested-With': 'XMLHttpRequest' },\n }).catch(wrapNetworkError);\n if (response.redirected) {\n throw new Error('Meta response was redirected');\n }\n if (response.status === 401) {\n // a timed-out session is signed out by the 401 itself, so one\n // retry runs anonymously and recovers a fresh csrf token\n if (!retryUnauthorized) {\n throw new UnauthorizedError('Meta request was unauthorized');\n }\n return this.fetchMeta(false);\n }\n if (!response.ok) {\n throw new Error(`Failed to load meta: ${response.status}`);\n }\n\n const html = (await response.text().catch(wrapNetworkError)).trim();\n if (!html) {\n throw new Error('Meta response was empty');\n }\n if (!this.isMetaPayload(html)) {\n throw new Error('Meta response is not a meta payload');\n }\n\n return html;\n },\n\n isMetaPayload(html) {\n const template = document.createElement('template');\n template.innerHTML = html;\n const nodes = [...template.content.childNodes];\n const isMeta = (node) =>\n node.nodeType === Node.ELEMENT_NODE && node.tagName === 'META';\n const isWhitespace = (node) =>\n node.nodeType === Node.TEXT_NODE && !node.textContent.trim();\n const isComment = (node) => node.nodeType === Node.COMMENT_NODE;\n return (\n nodes.some(isMeta) &&\n nodes.every(\n (node) => isMeta(node) || isWhitespace(node) || isComment(node),\n )\n );\n },\n};\n\nexport const ignoreExpectedErrors = (error) => {\n if (error instanceof NetworkError) return;\n if (error instanceof UnauthorizedError) return;\n throw error;\n};\n\nwindow.Meta ??= Meta;\n\nexport default window.Meta;\n","/*!\nTurbo 8.0.23\nCopyright © 2026 37signals LLC\n */\nconst FrameLoadingStyle = {\n eager: \"eager\",\n lazy: \"lazy\"\n};\n\n/**\n * Contains a fragment of HTML which is updated based on navigation within\n * it (e.g. via links or form submissions).\n *\n * @customElement turbo-frame\n * @example\n * \n * \n * Show all expanded messages in this frame.\n * \n *\n *
\n * Show response from this form within this frame.\n *
\n *
\n */\nclass FrameElement extends HTMLElement {\n static delegateConstructor = undefined\n\n loaded = Promise.resolve()\n\n static get observedAttributes() {\n return [\"disabled\", \"loading\", \"src\"]\n }\n\n constructor() {\n super();\n this.delegate = new FrameElement.delegateConstructor(this);\n }\n\n connectedCallback() {\n this.delegate.connect();\n }\n\n disconnectedCallback() {\n this.delegate.disconnect();\n }\n\n reload() {\n return this.delegate.sourceURLReloaded()\n }\n\n attributeChangedCallback(name) {\n if (name == \"loading\") {\n this.delegate.loadingStyleChanged();\n } else if (name == \"src\") {\n this.delegate.sourceURLChanged();\n } else if (name == \"disabled\") {\n this.delegate.disabledChanged();\n }\n }\n\n /**\n * Gets the URL to lazily load source HTML from\n */\n get src() {\n return this.getAttribute(\"src\")\n }\n\n /**\n * Sets the URL to lazily load source HTML from\n */\n set src(value) {\n if (value) {\n this.setAttribute(\"src\", value);\n } else {\n this.removeAttribute(\"src\");\n }\n }\n\n /**\n * Gets the refresh mode for the frame.\n */\n get refresh() {\n return this.getAttribute(\"refresh\")\n }\n\n /**\n * Sets the refresh mode for the frame.\n */\n set refresh(value) {\n if (value) {\n this.setAttribute(\"refresh\", value);\n } else {\n this.removeAttribute(\"refresh\");\n }\n }\n\n get shouldReloadWithMorph() {\n return this.src && this.refresh === \"morph\"\n }\n\n /**\n * Determines if the element is loading\n */\n get loading() {\n return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\")\n }\n\n /**\n * Sets the value of if the element is loading\n */\n set loading(value) {\n if (value) {\n this.setAttribute(\"loading\", value);\n } else {\n this.removeAttribute(\"loading\");\n }\n }\n\n /**\n * Gets the disabled state of the frame.\n *\n * If disabled, no requests will be intercepted by the frame.\n */\n get disabled() {\n return this.hasAttribute(\"disabled\")\n }\n\n /**\n * Sets the disabled state of the frame.\n *\n * If disabled, no requests will be intercepted by the frame.\n */\n set disabled(value) {\n if (value) {\n this.setAttribute(\"disabled\", \"\");\n } else {\n this.removeAttribute(\"disabled\");\n }\n }\n\n /**\n * Gets the autoscroll state of the frame.\n *\n * If true, the frame will be scrolled into view automatically on update.\n */\n get autoscroll() {\n return this.hasAttribute(\"autoscroll\")\n }\n\n /**\n * Sets the autoscroll state of the frame.\n *\n * If true, the frame will be scrolled into view automatically on update.\n */\n set autoscroll(value) {\n if (value) {\n this.setAttribute(\"autoscroll\", \"\");\n } else {\n this.removeAttribute(\"autoscroll\");\n }\n }\n\n /**\n * Determines if the element has finished loading\n */\n get complete() {\n return !this.delegate.isLoading\n }\n\n /**\n * Gets the active state of the frame.\n *\n * If inactive, source changes will not be observed.\n */\n get isActive() {\n return this.ownerDocument === document && !this.isPreview\n }\n\n /**\n * Sets the active state of the frame.\n *\n * If inactive, source changes will not be observed.\n */\n get isPreview() {\n return this.ownerDocument?.documentElement?.hasAttribute(\"data-turbo-preview\")\n }\n}\n\nfunction frameLoadingStyleFromString(style) {\n switch (style.toLowerCase()) {\n case \"lazy\":\n return FrameLoadingStyle.lazy\n default:\n return FrameLoadingStyle.eager\n }\n}\n\nconst drive = {\n enabled: true,\n progressBarDelay: 500,\n unvisitableExtensions: new Set(\n [\n \".7z\", \".aac\", \".apk\", \".avi\", \".bmp\", \".bz2\", \".css\", \".csv\", \".deb\", \".dmg\", \".doc\",\n \".docx\", \".exe\", \".gif\", \".gz\", \".heic\", \".heif\", \".ico\", \".iso\", \".jpeg\", \".jpg\",\n \".js\", \".json\", \".m4a\", \".mkv\", \".mov\", \".mp3\", \".mp4\", \".mpeg\", \".mpg\", \".msi\",\n \".ogg\", \".ogv\", \".pdf\", \".pkg\", \".png\", \".ppt\", \".pptx\", \".rar\", \".rtf\",\n \".svg\", \".tar\", \".tif\", \".tiff\", \".txt\", \".wav\", \".webm\", \".webp\", \".wma\", \".wmv\",\n \".xls\", \".xlsx\", \".xml\", \".zip\"\n ]\n )\n};\n\nfunction activateScriptElement(element) {\n if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n return element\n } else {\n const createdScriptElement = document.createElement(\"script\");\n const cspNonce = getCspNonce();\n if (cspNonce) {\n createdScriptElement.nonce = cspNonce;\n }\n createdScriptElement.textContent = element.textContent;\n createdScriptElement.async = false;\n copyElementAttributes(createdScriptElement, element);\n return createdScriptElement\n }\n}\n\nfunction copyElementAttributes(destinationElement, sourceElement) {\n for (const { name, value } of sourceElement.attributes) {\n destinationElement.setAttribute(name, value);\n }\n}\n\nfunction createDocumentFragment(html) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n const event = new CustomEvent(eventName, {\n cancelable,\n bubbles: true,\n composed: true,\n detail\n });\n\n if (target && target.isConnected) {\n target.dispatchEvent(event);\n } else {\n document.documentElement.dispatchEvent(event);\n }\n\n return event\n}\n\nfunction cancelEvent(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n\nfunction nextRepaint() {\n if (document.visibilityState === \"hidden\") {\n return nextEventLoopTick()\n } else {\n return nextAnimationFrame()\n }\n}\n\nfunction nextAnimationFrame() {\n return new Promise((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction nextEventLoopTick() {\n return new Promise((resolve) => setTimeout(() => resolve(), 0))\n}\n\nfunction parseHTMLDocument(html = \"\") {\n return new DOMParser().parseFromString(html, \"text/html\")\n}\n\nfunction unindent(strings, ...values) {\n const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n const match = lines[0].match(/^\\s+/);\n const indent = match ? match[0].length : 0;\n return lines.map((line) => line.slice(indent)).join(\"\\n\")\n}\n\nfunction interpolate(strings, values) {\n return strings.reduce((result, string, i) => {\n const value = values[i] == undefined ? \"\" : values[i];\n return result + string + value\n }, \"\")\n}\n\nfunction uuid() {\n return Array.from({ length: 36 })\n .map((_, i) => {\n if (i == 8 || i == 13 || i == 18 || i == 23) {\n return \"-\"\n } else if (i == 14) {\n return \"4\"\n } else if (i == 19) {\n return (Math.floor(Math.random() * 4) + 8).toString(16)\n } else {\n return Math.floor(Math.random() * 16).toString(16)\n }\n })\n .join(\"\")\n}\n\nfunction getAttribute(attributeName, ...elements) {\n for (const value of elements.map((element) => element?.getAttribute(attributeName))) {\n if (typeof value == \"string\") return value\n }\n\n return null\n}\n\nfunction hasAttribute(attributeName, ...elements) {\n return elements.some((element) => element && element.hasAttribute(attributeName))\n}\n\nfunction markAsBusy(...elements) {\n for (const element of elements) {\n if (element.localName == \"turbo-frame\") {\n element.setAttribute(\"busy\", \"\");\n }\n element.setAttribute(\"aria-busy\", \"true\");\n }\n}\n\nfunction clearBusyState(...elements) {\n for (const element of elements) {\n if (element.localName == \"turbo-frame\") {\n element.removeAttribute(\"busy\");\n }\n\n element.removeAttribute(\"aria-busy\");\n }\n}\n\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n return new Promise((resolve) => {\n const onComplete = () => {\n element.removeEventListener(\"error\", onComplete);\n element.removeEventListener(\"load\", onComplete);\n resolve();\n };\n\n element.addEventListener(\"load\", onComplete, { once: true });\n element.addEventListener(\"error\", onComplete, { once: true });\n setTimeout(resolve, timeoutInMilliseconds);\n })\n}\n\nfunction getHistoryMethodForAction(action) {\n switch (action) {\n case \"replace\":\n return history.replaceState\n case \"advance\":\n case \"restore\":\n return history.pushState\n }\n}\n\nfunction isAction(action) {\n return action == \"advance\" || action == \"replace\" || action == \"restore\"\n}\n\nfunction getVisitAction(...elements) {\n const action = getAttribute(\"data-turbo-action\", ...elements);\n\n return isAction(action) ? action : null\n}\n\nfunction getMetaElement(name) {\n return document.querySelector(`meta[name=\"${name}\"]`)\n}\n\nfunction getMetaContent(name) {\n const element = getMetaElement(name);\n return element && element.content\n}\n\nfunction getCspNonce() {\n const element = getMetaElement(\"csp-nonce\");\n\n if (element) {\n const { nonce, content } = element;\n return nonce == \"\" ? content : nonce\n }\n}\n\nfunction setMetaContent(name, content) {\n let element = getMetaElement(name);\n\n if (!element) {\n element = document.createElement(\"meta\");\n element.setAttribute(\"name\", name);\n\n document.head.appendChild(element);\n }\n\n element.setAttribute(\"content\", content);\n\n return element\n}\n\nfunction findClosestRecursively(element, selector) {\n if (element instanceof Element) {\n return (\n element.closest(selector) || findClosestRecursively(element.assignedSlot || element.getRootNode()?.host, selector)\n )\n }\n}\n\nfunction elementIsFocusable(element) {\n const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n\n return !!element && element.closest(inertDisabledOrHidden) == null && typeof element.focus == \"function\"\n}\n\nfunction queryAutofocusableElement(elementOrDocumentFragment) {\n return Array.from(elementOrDocumentFragment.querySelectorAll(\"[autofocus]\")).find(elementIsFocusable)\n}\n\nasync function around(callback, reader) {\n const before = reader();\n\n callback();\n\n await nextAnimationFrame();\n\n const after = reader();\n\n return [before, after]\n}\n\nfunction doesNotTargetIFrame(name) {\n if (name === \"_blank\") {\n return false\n } else if (name) {\n for (const element of document.getElementsByName(name)) {\n if (element instanceof HTMLIFrameElement) return false\n }\n\n return true\n } else {\n return true\n }\n}\n\nfunction findLinkFromClickTarget(target) {\n const link = findClosestRecursively(target, \"a[href], a[xlink\\\\:href]\");\n\n if (!link) return null\n if (link.href.startsWith(\"#\")) return null\n if (link.hasAttribute(\"download\")) return null\n\n const linkTarget = link.getAttribute(\"target\");\n if (linkTarget && linkTarget !== \"_self\") return null\n\n return link\n}\n\nfunction debounce(fn, delay) {\n let timeoutId = null;\n\n return (...args) => {\n const callback = () => fn.apply(this, args);\n clearTimeout(timeoutId);\n timeoutId = setTimeout(callback, delay);\n }\n}\n\nconst submitter = {\n \"aria-disabled\": {\n beforeSubmit: submitter => {\n submitter.setAttribute(\"aria-disabled\", \"true\");\n submitter.addEventListener(\"click\", cancelEvent);\n },\n\n afterSubmit: submitter => {\n submitter.removeAttribute(\"aria-disabled\");\n submitter.removeEventListener(\"click\", cancelEvent);\n }\n },\n\n \"disabled\": {\n beforeSubmit: submitter => submitter.disabled = true,\n afterSubmit: submitter => submitter.disabled = false\n }\n};\n\nclass Config {\n #submitter = null\n\n constructor(config) {\n Object.assign(this, config);\n }\n\n get submitter() {\n return this.#submitter\n }\n\n set submitter(value) {\n this.#submitter = submitter[value] || value;\n }\n}\n\nconst forms = new Config({\n mode: \"on\",\n submitter: \"disabled\"\n});\n\nconst config = {\n drive,\n forms\n};\n\nfunction expandURL(locatable) {\n return new URL(locatable.toString(), document.baseURI)\n}\n\nfunction getAnchor(url) {\n let anchorMatch;\n if (url.hash) {\n return url.hash.slice(1)\n // eslint-disable-next-line no-cond-assign\n } else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n return anchorMatch[1]\n }\n}\n\nfunction getAction$1(form, submitter) {\n const action = submitter?.getAttribute(\"formaction\") || form.getAttribute(\"action\") || form.action;\n\n return expandURL(action)\n}\n\nfunction getExtension(url) {\n return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\"\n}\n\nfunction isPrefixedBy(baseURL, url) {\n const prefix = addTrailingSlash(url.origin + url.pathname);\n return addTrailingSlash(baseURL.href) === prefix || baseURL.href.startsWith(prefix)\n}\n\nfunction locationIsVisitable(location, rootLocation) {\n return isPrefixedBy(location, rootLocation) && !config.drive.unvisitableExtensions.has(getExtension(location))\n}\n\nfunction getLocationForLink(link) {\n return expandURL(link.getAttribute(\"href\") || \"\")\n}\n\nfunction getRequestURL(url) {\n const anchor = getAnchor(url);\n return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href\n}\n\nfunction toCacheKey(url) {\n return getRequestURL(url)\n}\n\nfunction urlsAreEqual(left, right) {\n return expandURL(left).href == expandURL(right).href\n}\n\nfunction getPathComponents(url) {\n return url.pathname.split(\"/\").slice(1)\n}\n\nfunction getLastPathComponent(url) {\n return getPathComponents(url).slice(-1)[0]\n}\n\nfunction addTrailingSlash(value) {\n return value.endsWith(\"/\") ? value : value + \"/\"\n}\n\nclass FetchResponse {\n constructor(response) {\n this.response = response;\n }\n\n get succeeded() {\n return this.response.ok\n }\n\n get failed() {\n return !this.succeeded\n }\n\n get clientError() {\n return this.statusCode >= 400 && this.statusCode <= 499\n }\n\n get serverError() {\n return this.statusCode >= 500 && this.statusCode <= 599\n }\n\n get redirected() {\n return this.response.redirected\n }\n\n get location() {\n return expandURL(this.response.url)\n }\n\n get isHTML() {\n return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/)\n }\n\n get statusCode() {\n return this.response.status\n }\n\n get contentType() {\n return this.header(\"Content-Type\")\n }\n\n get responseText() {\n return this.response.clone().text()\n }\n\n get responseHTML() {\n if (this.isHTML) {\n return this.response.clone().text()\n } else {\n return Promise.resolve(undefined)\n }\n }\n\n header(name) {\n return this.response.headers.get(name)\n }\n}\n\nclass LimitedSet extends Set {\n constructor(maxSize) {\n super();\n this.maxSize = maxSize;\n }\n\n add(value) {\n if (this.size >= this.maxSize) {\n const iterator = this.values();\n const oldestValue = iterator.next().value;\n this.delete(oldestValue);\n }\n super.add(value);\n }\n}\n\nconst recentRequests = new LimitedSet(20);\n\nfunction fetchWithTurboHeaders(url, options = {}) {\n const modifiedHeaders = new Headers(options.headers || {});\n const requestUID = uuid();\n recentRequests.add(requestUID);\n modifiedHeaders.append(\"X-Turbo-Request-Id\", requestUID);\n\n return window.fetch(url, {\n ...options,\n headers: modifiedHeaders\n })\n}\n\nfunction fetchMethodFromString(method) {\n switch (method.toLowerCase()) {\n case \"get\":\n return FetchMethod.get\n case \"post\":\n return FetchMethod.post\n case \"put\":\n return FetchMethod.put\n case \"patch\":\n return FetchMethod.patch\n case \"delete\":\n return FetchMethod.delete\n }\n}\n\nconst FetchMethod = {\n get: \"get\",\n post: \"post\",\n put: \"put\",\n patch: \"patch\",\n delete: \"delete\"\n};\n\nfunction fetchEnctypeFromString(encoding) {\n switch (encoding.toLowerCase()) {\n case FetchEnctype.multipart:\n return FetchEnctype.multipart\n case FetchEnctype.plain:\n return FetchEnctype.plain\n default:\n return FetchEnctype.urlEncoded\n }\n}\n\nconst FetchEnctype = {\n urlEncoded: \"application/x-www-form-urlencoded\",\n multipart: \"multipart/form-data\",\n plain: \"text/plain\"\n};\n\nclass FetchRequest {\n abortController = new AbortController()\n #resolveRequestPromise = (_value) => {}\n\n constructor(delegate, method, location, requestBody = new URLSearchParams(), target = null, enctype = FetchEnctype.urlEncoded) {\n const [url, body] = buildResourceAndBody(expandURL(location), method, requestBody, enctype);\n\n this.delegate = delegate;\n this.url = url;\n this.target = target;\n this.fetchOptions = {\n credentials: \"same-origin\",\n redirect: \"follow\",\n method: method.toUpperCase(),\n headers: { ...this.defaultHeaders },\n body: body,\n signal: this.abortSignal,\n referrer: this.delegate.referrer?.href\n };\n this.enctype = enctype;\n }\n\n get method() {\n return this.fetchOptions.method\n }\n\n set method(value) {\n const fetchBody = this.isSafe ? this.url.searchParams : this.fetchOptions.body || new FormData();\n const fetchMethod = fetchMethodFromString(value) || FetchMethod.get;\n\n this.url.search = \"\";\n\n const [url, body] = buildResourceAndBody(this.url, fetchMethod, fetchBody, this.enctype);\n\n this.url = url;\n this.fetchOptions.body = body;\n this.fetchOptions.method = fetchMethod.toUpperCase();\n }\n\n get headers() {\n return this.fetchOptions.headers\n }\n\n set headers(value) {\n this.fetchOptions.headers = value;\n }\n\n get body() {\n if (this.isSafe) {\n return this.url.searchParams\n } else {\n return this.fetchOptions.body\n }\n }\n\n set body(value) {\n this.fetchOptions.body = value;\n }\n\n get location() {\n return this.url\n }\n\n get params() {\n return this.url.searchParams\n }\n\n get entries() {\n return this.body ? Array.from(this.body.entries()) : []\n }\n\n cancel() {\n this.abortController.abort();\n }\n\n async perform() {\n const { fetchOptions } = this;\n this.delegate.prepareRequest(this);\n const event = await this.#allowRequestToBeIntercepted(fetchOptions);\n try {\n this.delegate.requestStarted(this);\n\n if (event.detail.fetchRequest) {\n this.response = event.detail.fetchRequest.response;\n } else {\n this.response = fetchWithTurboHeaders(this.url.href, fetchOptions);\n }\n\n const response = await this.response;\n return await this.receive(response)\n } catch (error) {\n if (error.name !== \"AbortError\") {\n if (this.#willDelegateErrorHandling(error)) {\n this.delegate.requestErrored(this, error);\n }\n throw error\n }\n } finally {\n this.delegate.requestFinished(this);\n }\n }\n\n async receive(response) {\n const fetchResponse = new FetchResponse(response);\n const event = dispatch(\"turbo:before-fetch-response\", {\n cancelable: true,\n detail: { fetchResponse },\n target: this.target\n });\n if (event.defaultPrevented) {\n this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n } else if (fetchResponse.succeeded) {\n this.delegate.requestSucceededWithResponse(this, fetchResponse);\n } else {\n this.delegate.requestFailedWithResponse(this, fetchResponse);\n }\n return fetchResponse\n }\n\n get defaultHeaders() {\n return {\n Accept: \"text/html, application/xhtml+xml\"\n }\n }\n\n get isSafe() {\n return isSafe(this.method)\n }\n\n get abortSignal() {\n return this.abortController.signal\n }\n\n acceptResponseType(mimeType) {\n this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n }\n\n async #allowRequestToBeIntercepted(fetchOptions) {\n const requestInterception = new Promise((resolve) => (this.#resolveRequestPromise = resolve));\n const event = dispatch(\"turbo:before-fetch-request\", {\n cancelable: true,\n detail: {\n fetchOptions,\n url: this.url,\n resume: this.#resolveRequestPromise\n },\n target: this.target\n });\n this.url = event.detail.url;\n if (event.defaultPrevented) await requestInterception;\n\n return event\n }\n\n #willDelegateErrorHandling(error) {\n const event = dispatch(\"turbo:fetch-request-error\", {\n target: this.target,\n cancelable: true,\n detail: { request: this, error: error }\n });\n\n return !event.defaultPrevented\n }\n}\n\nfunction isSafe(fetchMethod) {\n return fetchMethodFromString(fetchMethod) == FetchMethod.get\n}\n\nfunction buildResourceAndBody(resource, method, requestBody, enctype) {\n const searchParams =\n Array.from(requestBody).length > 0 ? new URLSearchParams(entriesExcludingFiles(requestBody)) : resource.searchParams;\n\n if (isSafe(method)) {\n return [mergeIntoURLSearchParams(resource, searchParams), null]\n } else if (enctype == FetchEnctype.urlEncoded) {\n return [resource, searchParams]\n } else {\n return [resource, requestBody]\n }\n}\n\nfunction entriesExcludingFiles(requestBody) {\n const entries = [];\n\n for (const [name, value] of requestBody) {\n if (value instanceof File) continue\n else entries.push([name, value]);\n }\n\n return entries\n}\n\nfunction mergeIntoURLSearchParams(url, requestBody) {\n const searchParams = new URLSearchParams(entriesExcludingFiles(requestBody));\n\n url.search = searchParams.toString();\n\n return url\n}\n\nclass AppearanceObserver {\n started = false\n\n constructor(delegate, element) {\n this.delegate = delegate;\n this.element = element;\n this.intersectionObserver = new IntersectionObserver(this.intersect);\n }\n\n start() {\n if (!this.started) {\n this.started = true;\n this.intersectionObserver.observe(this.element);\n }\n }\n\n stop() {\n if (this.started) {\n this.started = false;\n this.intersectionObserver.unobserve(this.element);\n }\n }\n\n intersect = (entries) => {\n const lastEntry = entries.slice(-1)[0];\n if (lastEntry?.isIntersecting) {\n this.delegate.elementAppearedInViewport(this.element);\n }\n }\n}\n\nclass StreamMessage {\n static contentType = \"text/vnd.turbo-stream.html\"\n\n static wrap(message) {\n if (typeof message == \"string\") {\n return new this(createDocumentFragment(message))\n } else {\n return message\n }\n }\n\n constructor(fragment) {\n this.fragment = importStreamElements(fragment);\n }\n}\n\nfunction importStreamElements(fragment) {\n for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n const streamElement = document.importNode(element, true);\n\n for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n }\n\n element.replaceWith(streamElement);\n }\n\n return fragment\n}\n\nconst identity = key => key;\n\nclass LRUCache {\n keys = []\n entries = {}\n #toCacheKey\n\n constructor(size, toCacheKey = identity) {\n this.size = size;\n this.#toCacheKey = toCacheKey;\n }\n\n has(key) {\n return this.#toCacheKey(key) in this.entries\n }\n\n get(key) {\n if (this.has(key)) {\n const entry = this.read(key);\n this.touch(key);\n return entry\n }\n }\n\n put(key, entry) {\n this.write(key, entry);\n this.touch(key);\n return entry\n }\n\n clear() {\n for (const key of Object.keys(this.entries)) {\n this.evict(key);\n }\n }\n\n // Private\n\n read(key) {\n return this.entries[this.#toCacheKey(key)]\n }\n\n write(key, entry) {\n this.entries[this.#toCacheKey(key)] = entry;\n }\n\n touch(key) {\n key = this.#toCacheKey(key);\n const index = this.keys.indexOf(key);\n if (index > -1) this.keys.splice(index, 1);\n this.keys.unshift(key);\n this.trim();\n }\n\n trim() {\n for (const key of this.keys.splice(this.size)) {\n this.evict(key);\n }\n }\n\n evict(key) {\n delete this.entries[key];\n }\n}\n\nconst PREFETCH_DELAY = 100;\n\nclass PrefetchCache extends LRUCache {\n #prefetchTimeout = null\n #maxAges = {}\n\n constructor(size = 1, prefetchDelay = PREFETCH_DELAY) {\n super(size, toCacheKey);\n this.prefetchDelay = prefetchDelay;\n }\n\n putLater(url, request, ttl) {\n this.#prefetchTimeout = setTimeout(() => {\n request.perform();\n this.put(url, request, ttl);\n this.#prefetchTimeout = null;\n }, this.prefetchDelay);\n }\n\n put(url, request, ttl = cacheTtl) {\n super.put(url, request);\n this.#maxAges[toCacheKey(url)] = new Date(new Date().getTime() + ttl);\n }\n\n clear() {\n super.clear();\n if (this.#prefetchTimeout) clearTimeout(this.#prefetchTimeout);\n }\n\n evict(key) {\n super.evict(key);\n delete this.#maxAges[key];\n }\n\n has(key) {\n if (super.has(key)) {\n const maxAge = this.#maxAges[toCacheKey(key)];\n\n return maxAge && maxAge > Date.now()\n } else {\n return false\n }\n }\n}\n\nconst cacheTtl = 10 * 1000;\nconst prefetchCache = new PrefetchCache();\n\nconst FormSubmissionState = {\n initialized: \"initialized\",\n requesting: \"requesting\",\n waiting: \"waiting\",\n receiving: \"receiving\",\n stopping: \"stopping\",\n stopped: \"stopped\"\n};\n\nclass FormSubmission {\n state = FormSubmissionState.initialized\n\n static confirmMethod(message) {\n return Promise.resolve(confirm(message))\n }\n\n constructor(delegate, formElement, submitter, mustRedirect = false) {\n const method = getMethod(formElement, submitter);\n const action = getAction(getFormAction(formElement, submitter), method);\n const body = buildFormData(formElement, submitter);\n const enctype = getEnctype(formElement, submitter);\n\n this.delegate = delegate;\n this.formElement = formElement;\n this.submitter = submitter;\n this.fetchRequest = new FetchRequest(this, method, action, body, formElement, enctype);\n this.mustRedirect = mustRedirect;\n }\n\n get method() {\n return this.fetchRequest.method\n }\n\n set method(value) {\n this.fetchRequest.method = value;\n }\n\n get action() {\n return this.fetchRequest.url.toString()\n }\n\n set action(value) {\n this.fetchRequest.url = expandURL(value);\n }\n\n get body() {\n return this.fetchRequest.body\n }\n\n get enctype() {\n return this.fetchRequest.enctype\n }\n\n get isSafe() {\n return this.fetchRequest.isSafe\n }\n\n get location() {\n return this.fetchRequest.url\n }\n\n // The submission process\n\n async start() {\n const { initialized, requesting } = FormSubmissionState;\n const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n\n if (typeof confirmationMessage === \"string\") {\n const confirmMethod = typeof config.forms.confirm === \"function\" ?\n config.forms.confirm :\n FormSubmission.confirmMethod;\n\n const answer = await confirmMethod(confirmationMessage, this.formElement, this.submitter);\n if (!answer) {\n return\n }\n }\n\n if (this.state == initialized) {\n this.state = requesting;\n return this.fetchRequest.perform()\n }\n }\n\n stop() {\n const { stopping, stopped } = FormSubmissionState;\n if (this.state != stopping && this.state != stopped) {\n this.state = stopping;\n this.fetchRequest.cancel();\n return true\n }\n }\n\n // Fetch request delegate\n\n prepareRequest(request) {\n if (!request.isSafe) {\n const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n if (token) {\n request.headers[\"X-CSRF-Token\"] = token;\n }\n }\n\n if (this.requestAcceptsTurboStreamResponse(request)) {\n request.acceptResponseType(StreamMessage.contentType);\n }\n }\n\n requestStarted(_request) {\n this.state = FormSubmissionState.waiting;\n if (this.submitter) config.forms.submitter.beforeSubmit(this.submitter);\n this.setSubmitsWith();\n markAsBusy(this.formElement);\n dispatch(\"turbo:submit-start\", {\n target: this.formElement,\n detail: { formSubmission: this }\n });\n this.delegate.formSubmissionStarted(this);\n }\n\n requestPreventedHandlingResponse(request, response) {\n prefetchCache.clear();\n\n this.result = { success: response.succeeded, fetchResponse: response };\n }\n\n requestSucceededWithResponse(request, response) {\n if (response.clientError || response.serverError) {\n this.delegate.formSubmissionFailedWithResponse(this, response);\n return\n }\n\n prefetchCache.clear();\n\n if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n const error = new Error(\"Form responses must redirect to another location\");\n this.delegate.formSubmissionErrored(this, error);\n } else {\n this.state = FormSubmissionState.receiving;\n this.result = { success: true, fetchResponse: response };\n this.delegate.formSubmissionSucceededWithResponse(this, response);\n }\n }\n\n requestFailedWithResponse(request, response) {\n this.result = { success: false, fetchResponse: response };\n this.delegate.formSubmissionFailedWithResponse(this, response);\n }\n\n requestErrored(request, error) {\n this.result = { success: false, error };\n this.delegate.formSubmissionErrored(this, error);\n }\n\n requestFinished(_request) {\n this.state = FormSubmissionState.stopped;\n if (this.submitter) config.forms.submitter.afterSubmit(this.submitter);\n this.resetSubmitterText();\n clearBusyState(this.formElement);\n dispatch(\"turbo:submit-end\", {\n target: this.formElement,\n detail: { formSubmission: this, ...this.result }\n });\n this.delegate.formSubmissionFinished(this);\n }\n\n // Private\n\n setSubmitsWith() {\n if (!this.submitter || !this.submitsWith) return\n\n if (this.submitter.matches(\"button\")) {\n this.originalSubmitText = this.submitter.innerHTML;\n this.submitter.innerHTML = this.submitsWith;\n } else if (this.submitter.matches(\"input\")) {\n const input = this.submitter;\n this.originalSubmitText = input.value;\n input.value = this.submitsWith;\n }\n }\n\n resetSubmitterText() {\n if (!this.submitter || !this.originalSubmitText) return\n\n if (this.submitter.matches(\"button\")) {\n this.submitter.innerHTML = this.originalSubmitText;\n } else if (this.submitter.matches(\"input\")) {\n const input = this.submitter;\n input.value = this.originalSubmitText;\n }\n }\n\n requestMustRedirect(request) {\n return !request.isSafe && this.mustRedirect\n }\n\n requestAcceptsTurboStreamResponse(request) {\n return !request.isSafe || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement)\n }\n\n get submitsWith() {\n return this.submitter?.getAttribute(\"data-turbo-submits-with\")\n }\n}\n\nfunction buildFormData(formElement, submitter) {\n const formData = new FormData(formElement);\n const name = submitter?.getAttribute(\"name\");\n const value = submitter?.getAttribute(\"value\");\n\n if (name) {\n formData.append(name, value || \"\");\n }\n\n return formData\n}\n\nfunction getCookieValue(cookieName) {\n if (cookieName != null) {\n const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n if (cookie) {\n const value = cookie.split(\"=\").slice(1).join(\"=\");\n return value ? decodeURIComponent(value) : undefined\n }\n }\n}\n\nfunction responseSucceededWithoutRedirect(response) {\n return response.statusCode == 200 && !response.redirected\n}\n\nfunction getFormAction(formElement, submitter) {\n const formElementAction = typeof formElement.action === \"string\" ? formElement.action : null;\n\n if (submitter?.hasAttribute(\"formaction\")) {\n return submitter.getAttribute(\"formaction\") || \"\"\n } else {\n return formElement.getAttribute(\"action\") || formElementAction || \"\"\n }\n}\n\nfunction getAction(formAction, fetchMethod) {\n const action = expandURL(formAction);\n\n if (isSafe(fetchMethod)) {\n action.search = \"\";\n }\n\n return action\n}\n\nfunction getMethod(formElement, submitter) {\n const method = submitter?.getAttribute(\"formmethod\") || formElement.getAttribute(\"method\") || \"\";\n return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get\n}\n\nfunction getEnctype(formElement, submitter) {\n return fetchEnctypeFromString(submitter?.getAttribute(\"formenctype\") || formElement.enctype)\n}\n\nclass Snapshot {\n constructor(element) {\n this.element = element;\n }\n\n get activeElement() {\n return this.element.ownerDocument.activeElement\n }\n\n get children() {\n return [...this.element.children]\n }\n\n hasAnchor(anchor) {\n return this.getElementForAnchor(anchor) != null\n }\n\n getElementForAnchor(anchor) {\n return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null\n }\n\n get isConnected() {\n return this.element.isConnected\n }\n\n get firstAutofocusableElement() {\n return queryAutofocusableElement(this.element)\n }\n\n get permanentElements() {\n return queryPermanentElementsAll(this.element)\n }\n\n getPermanentElementById(id) {\n return getPermanentElementById(this.element, id)\n }\n\n getPermanentElementMapForSnapshot(snapshot) {\n const permanentElementMap = {};\n\n for (const currentPermanentElement of this.permanentElements) {\n const { id } = currentPermanentElement;\n const newPermanentElement = snapshot.getPermanentElementById(id);\n if (newPermanentElement) {\n permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n }\n }\n\n return permanentElementMap\n }\n}\n\nfunction getPermanentElementById(node, id) {\n return node.querySelector(`#${id}[data-turbo-permanent]`)\n}\n\nfunction queryPermanentElementsAll(node) {\n return node.querySelectorAll(\"[id][data-turbo-permanent]\")\n}\n\nclass FormSubmitObserver {\n started = false\n\n constructor(delegate, eventTarget) {\n this.delegate = delegate;\n this.eventTarget = eventTarget;\n }\n\n start() {\n if (!this.started) {\n this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n this.started = true;\n }\n }\n\n stop() {\n if (this.started) {\n this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n this.started = false;\n }\n }\n\n submitCaptured = () => {\n this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n }\n\n submitBubbled = (event) => {\n if (!event.defaultPrevented) {\n const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n const submitter = event.submitter || undefined;\n\n if (\n form &&\n submissionDoesNotDismissDialog(form, submitter) &&\n submissionDoesNotTargetIFrame(form, submitter) &&\n this.delegate.willSubmitForm(form, submitter)\n ) {\n event.preventDefault();\n event.stopImmediatePropagation();\n this.delegate.formSubmitted(form, submitter);\n }\n }\n }\n}\n\nfunction submissionDoesNotDismissDialog(form, submitter) {\n const method = submitter?.getAttribute(\"formmethod\") || form.getAttribute(\"method\");\n\n return method != \"dialog\"\n}\n\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n const target = submitter?.getAttribute(\"formtarget\") || form.getAttribute(\"target\");\n\n return doesNotTargetIFrame(target)\n}\n\nclass View {\n #resolveRenderPromise = (_value) => {}\n #resolveInterceptionPromise = (_value) => {}\n\n constructor(delegate, element) {\n this.delegate = delegate;\n this.element = element;\n }\n\n // Scrolling\n\n scrollToAnchor(anchor) {\n const element = this.snapshot.getElementForAnchor(anchor);\n if (element) {\n this.focusElement(element);\n this.scrollToElement(element);\n } else {\n this.scrollToPosition({ x: 0, y: 0 });\n }\n }\n\n scrollToAnchorFromLocation(location) {\n this.scrollToAnchor(getAnchor(location));\n }\n\n scrollToElement(element) {\n element.scrollIntoView();\n }\n\n focusElement(element) {\n if (element instanceof HTMLElement) {\n if (element.hasAttribute(\"tabindex\")) {\n element.focus();\n } else {\n element.setAttribute(\"tabindex\", \"-1\");\n element.focus();\n element.removeAttribute(\"tabindex\");\n }\n }\n }\n\n scrollToPosition({ x, y }) {\n this.scrollRoot.scrollTo(x, y);\n }\n\n scrollToTop() {\n this.scrollToPosition({ x: 0, y: 0 });\n }\n\n get scrollRoot() {\n return window\n }\n\n // Rendering\n\n async render(renderer) {\n const { isPreview, shouldRender, willRender, newSnapshot: snapshot } = renderer;\n\n // A workaround to ignore tracked element mismatch reloads when performing\n // a promoted Visit from a frame navigation\n const shouldInvalidate = willRender;\n\n if (shouldRender) {\n try {\n this.renderPromise = new Promise((resolve) => (this.#resolveRenderPromise = resolve));\n this.renderer = renderer;\n await this.prepareToRenderSnapshot(renderer);\n\n const renderInterception = new Promise((resolve) => (this.#resolveInterceptionPromise = resolve));\n const options = { resume: this.#resolveInterceptionPromise, render: this.renderer.renderElement, renderMethod: this.renderer.renderMethod };\n const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n if (!immediateRender) await renderInterception;\n\n await this.renderSnapshot(renderer);\n this.delegate.viewRenderedSnapshot(snapshot, isPreview, this.renderer.renderMethod);\n this.delegate.preloadOnLoadLinksForView(this.element);\n this.finishRenderingSnapshot(renderer);\n } finally {\n delete this.renderer;\n this.#resolveRenderPromise(undefined);\n delete this.renderPromise;\n }\n } else if (shouldInvalidate) {\n this.invalidate(renderer.reloadReason);\n }\n }\n\n invalidate(reason) {\n this.delegate.viewInvalidated(reason);\n }\n\n async prepareToRenderSnapshot(renderer) {\n this.markAsPreview(renderer.isPreview);\n await renderer.prepareToRender();\n }\n\n markAsPreview(isPreview) {\n if (isPreview) {\n this.element.setAttribute(\"data-turbo-preview\", \"\");\n } else {\n this.element.removeAttribute(\"data-turbo-preview\");\n }\n }\n\n markVisitDirection(direction) {\n this.element.setAttribute(\"data-turbo-visit-direction\", direction);\n }\n\n unmarkVisitDirection() {\n this.element.removeAttribute(\"data-turbo-visit-direction\");\n }\n\n async renderSnapshot(renderer) {\n await renderer.render();\n }\n\n finishRenderingSnapshot(renderer) {\n renderer.finishRendering();\n }\n}\n\nclass FrameView extends View {\n missing() {\n this.element.innerHTML = `Content missing`;\n }\n\n get snapshot() {\n return new Snapshot(this.element)\n }\n}\n\nclass LinkInterceptor {\n constructor(delegate, element) {\n this.delegate = delegate;\n this.element = element;\n }\n\n start() {\n this.element.addEventListener(\"click\", this.clickBubbled);\n document.addEventListener(\"turbo:click\", this.linkClicked);\n document.addEventListener(\"turbo:before-visit\", this.willVisit);\n }\n\n stop() {\n this.element.removeEventListener(\"click\", this.clickBubbled);\n document.removeEventListener(\"turbo:click\", this.linkClicked);\n document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n }\n\n clickBubbled = (event) => {\n if (this.clickEventIsSignificant(event)) {\n this.clickEvent = event;\n } else {\n delete this.clickEvent;\n }\n }\n\n linkClicked = (event) => {\n if (this.clickEvent && this.clickEventIsSignificant(event)) {\n if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n this.clickEvent.preventDefault();\n event.preventDefault();\n this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n }\n }\n delete this.clickEvent;\n }\n\n willVisit = (_event) => {\n delete this.clickEvent;\n }\n\n clickEventIsSignificant(event) {\n const target = event.composed ? event.target?.parentElement : event.target;\n const element = findLinkFromClickTarget(target) || target;\n\n return element instanceof Element && element.closest(\"turbo-frame, html\") == this.element\n }\n}\n\nclass LinkClickObserver {\n started = false\n\n constructor(delegate, eventTarget) {\n this.delegate = delegate;\n this.eventTarget = eventTarget;\n }\n\n start() {\n if (!this.started) {\n this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n this.started = true;\n }\n }\n\n stop() {\n if (this.started) {\n this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n this.started = false;\n }\n }\n\n clickCaptured = () => {\n this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n }\n\n clickBubbled = (event) => {\n if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n const target = (event.composedPath && event.composedPath()[0]) || event.target;\n const link = findLinkFromClickTarget(target);\n if (link && doesNotTargetIFrame(link.target)) {\n const location = getLocationForLink(link);\n if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n event.preventDefault();\n this.delegate.followedLinkToLocation(link, location);\n }\n }\n }\n }\n\n clickEventIsSignificant(event) {\n return !(\n (event.target && event.target.isContentEditable) ||\n event.defaultPrevented ||\n event.which > 1 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n )\n }\n}\n\nclass FormLinkClickObserver {\n constructor(delegate, element) {\n this.delegate = delegate;\n this.linkInterceptor = new LinkClickObserver(this, element);\n }\n\n start() {\n this.linkInterceptor.start();\n }\n\n stop() {\n this.linkInterceptor.stop();\n }\n\n // Link hover observer delegate\n\n canPrefetchRequestToLocation(link, location) {\n return false\n }\n\n prefetchAndCacheRequestToLocation(link, location) {\n return\n }\n\n // Link click observer delegate\n\n willFollowLinkToLocation(link, location, originalEvent) {\n return (\n this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n (link.hasAttribute(\"data-turbo-method\") || link.hasAttribute(\"data-turbo-stream\"))\n )\n }\n\n followedLinkToLocation(link, location) {\n const form = document.createElement(\"form\");\n\n const type = \"hidden\";\n for (const [name, value] of location.searchParams) {\n form.append(Object.assign(document.createElement(\"input\"), { type, name, value }));\n }\n\n const action = Object.assign(location, { search: \"\" });\n form.setAttribute(\"data-turbo\", \"true\");\n form.setAttribute(\"action\", action.href);\n form.setAttribute(\"hidden\", \"\");\n\n const method = link.getAttribute(\"data-turbo-method\");\n if (method) form.setAttribute(\"method\", method);\n\n const turboFrame = link.getAttribute(\"data-turbo-frame\");\n if (turboFrame) form.setAttribute(\"data-turbo-frame\", turboFrame);\n\n const turboAction = getVisitAction(link);\n if (turboAction) form.setAttribute(\"data-turbo-action\", turboAction);\n\n const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n if (turboConfirm) form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n\n const turboStream = link.hasAttribute(\"data-turbo-stream\");\n if (turboStream) form.setAttribute(\"data-turbo-stream\", \"\");\n\n this.delegate.submittedFormLinkToLocation(link, location, form);\n\n document.body.appendChild(form);\n form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n requestAnimationFrame(() => form.requestSubmit());\n }\n}\n\nclass Bardo {\n static async preservingPermanentElements(delegate, permanentElementMap, callback) {\n const bardo = new this(delegate, permanentElementMap);\n bardo.enter();\n await callback();\n bardo.leave();\n }\n\n constructor(delegate, permanentElementMap) {\n this.delegate = delegate;\n this.permanentElementMap = permanentElementMap;\n }\n\n enter() {\n for (const id in this.permanentElementMap) {\n const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n }\n }\n\n leave() {\n for (const id in this.permanentElementMap) {\n const [currentPermanentElement] = this.permanentElementMap[id];\n this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n this.delegate.leavingBardo(currentPermanentElement);\n }\n }\n\n replaceNewPermanentElementWithPlaceholder(permanentElement) {\n const placeholder = createPlaceholderForPermanentElement(permanentElement);\n permanentElement.replaceWith(placeholder);\n }\n\n replaceCurrentPermanentElementWithClone(permanentElement) {\n const clone = permanentElement.cloneNode(true);\n permanentElement.replaceWith(clone);\n }\n\n replacePlaceholderWithPermanentElement(permanentElement) {\n const placeholder = this.getPlaceholderById(permanentElement.id);\n placeholder?.replaceWith(permanentElement);\n }\n\n getPlaceholderById(id) {\n return this.placeholders.find((element) => element.content == id)\n }\n\n get placeholders() {\n return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")]\n }\n}\n\nfunction createPlaceholderForPermanentElement(permanentElement) {\n const element = document.createElement(\"meta\");\n element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n element.setAttribute(\"content\", permanentElement.id);\n return element\n}\n\nclass Renderer {\n #activeElement = null\n\n static renderElement(currentElement, newElement) {\n // Abstract method\n }\n\n constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n this.currentSnapshot = currentSnapshot;\n this.newSnapshot = newSnapshot;\n this.isPreview = isPreview;\n this.willRender = willRender;\n this.renderElement = this.constructor.renderElement;\n this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n }\n\n get shouldRender() {\n return true\n }\n\n get shouldAutofocus() {\n return true\n }\n\n get reloadReason() {\n return\n }\n\n prepareToRender() {\n return\n }\n\n render() {\n // Abstract method\n }\n\n finishRendering() {\n if (this.resolvingFunctions) {\n this.resolvingFunctions.resolve();\n delete this.resolvingFunctions;\n }\n }\n\n async preservingPermanentElements(callback) {\n await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n }\n\n focusFirstAutofocusableElement() {\n if (this.shouldAutofocus) {\n const element = this.connectedSnapshot.firstAutofocusableElement;\n if (element) {\n element.focus();\n }\n }\n }\n\n // Bardo delegate\n\n enteringBardo(currentPermanentElement) {\n if (this.#activeElement) return\n\n if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n this.#activeElement = this.currentSnapshot.activeElement;\n }\n }\n\n leavingBardo(currentPermanentElement) {\n if (currentPermanentElement.contains(this.#activeElement) && this.#activeElement instanceof HTMLElement) {\n this.#activeElement.focus();\n\n this.#activeElement = null;\n }\n }\n\n get connectedSnapshot() {\n return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot\n }\n\n get currentElement() {\n return this.currentSnapshot.element\n }\n\n get newElement() {\n return this.newSnapshot.element\n }\n\n get permanentElementMap() {\n return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)\n }\n\n get renderMethod() {\n return \"replace\"\n }\n}\n\nclass FrameRenderer extends Renderer {\n static renderElement(currentElement, newElement) {\n const destinationRange = document.createRange();\n destinationRange.selectNodeContents(currentElement);\n destinationRange.deleteContents();\n\n const frameElement = newElement;\n const sourceRange = frameElement.ownerDocument?.createRange();\n if (sourceRange) {\n sourceRange.selectNodeContents(frameElement);\n currentElement.appendChild(sourceRange.extractContents());\n }\n }\n\n constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n this.delegate = delegate;\n }\n\n get shouldRender() {\n return true\n }\n\n async render() {\n await nextRepaint();\n this.preservingPermanentElements(() => {\n this.loadFrameElement();\n });\n this.scrollFrameIntoView();\n await nextRepaint();\n this.focusFirstAutofocusableElement();\n await nextRepaint();\n this.activateScriptElements();\n }\n\n loadFrameElement() {\n this.delegate.willRenderFrame(this.currentElement, this.newElement);\n this.renderElement(this.currentElement, this.newElement);\n }\n\n scrollFrameIntoView() {\n if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n const element = this.currentElement.firstElementChild;\n const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n\n if (element) {\n element.scrollIntoView({ block, behavior });\n return true\n }\n }\n return false\n }\n\n activateScriptElements() {\n for (const inertScriptElement of this.newScriptElements) {\n const activatedScriptElement = activateScriptElement(inertScriptElement);\n inertScriptElement.replaceWith(activatedScriptElement);\n }\n }\n\n get newScriptElements() {\n return this.currentElement.querySelectorAll(\"script\")\n }\n}\n\nfunction readScrollLogicalPosition(value, defaultValue) {\n if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n return value\n } else {\n return defaultValue\n }\n}\n\nfunction readScrollBehavior(value, defaultValue) {\n if (value == \"auto\" || value == \"smooth\") {\n return value\n } else {\n return defaultValue\n }\n}\n\n/**\n * @typedef {object} ConfigHead\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} [style]\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {function(Element): boolean} [shouldPreserve]\n * @property {function(Element): boolean} [shouldReAppend]\n * @property {function(Element): boolean} [shouldRemove]\n * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed]\n */\n\n/**\n * @typedef {object} ConfigCallbacks\n *\n * @property {function(Node): boolean} [beforeNodeAdded]\n * @property {function(Node): void} [afterNodeAdded]\n * @property {function(Element, Node): boolean} [beforeNodeMorphed]\n * @property {function(Element, Node): void} [afterNodeMorphed]\n * @property {function(Element): boolean} [beforeNodeRemoved]\n * @property {function(Element): void} [afterNodeRemoved]\n * @property {function(string, Element, \"update\" | \"remove\"): boolean} [beforeAttributeUpdated]\n */\n\n/**\n * @typedef {object} Config\n *\n * @property {'outerHTML' | 'innerHTML'} [morphStyle]\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacks} [callbacks]\n * @property {ConfigHead} [head]\n */\n\n/**\n * @typedef {function} NoOp\n *\n * @returns {void}\n */\n\n/**\n * @typedef {object} ConfigHeadInternal\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} style\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {(function(Element): boolean) | NoOp} shouldPreserve\n * @property {(function(Element): boolean) | NoOp} shouldReAppend\n * @property {(function(Element): boolean) | NoOp} shouldRemove\n * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed\n */\n\n/**\n * @typedef {object} ConfigCallbacksInternal\n *\n * @property {(function(Node): boolean) | NoOp} beforeNodeAdded\n * @property {(function(Node): void) | NoOp} afterNodeAdded\n * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed\n * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed\n * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved\n * @property {(function(Node): void) | NoOp} afterNodeRemoved\n * @property {(function(string, Element, \"update\" | \"remove\"): boolean) | NoOp} beforeAttributeUpdated\n */\n\n/**\n * @typedef {object} ConfigInternal\n *\n * @property {'outerHTML' | 'innerHTML'} morphStyle\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacksInternal} callbacks\n * @property {ConfigHeadInternal} head\n */\n\n/**\n * @typedef {Object} IdSets\n * @property {Set} persistentIds\n * @property {Map>} idMap\n */\n\n/**\n * @typedef {Function} Morph\n *\n * @param {Element | Document} oldNode\n * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n * @param {Config} [config]\n * @returns {undefined | Node[]}\n */\n\n// base IIFE to define idiomorph\n/**\n *\n * @type {{defaults: ConfigInternal, morph: Morph}}\n */\nvar Idiomorph = (function () {\n\n /**\n * @typedef {object} MorphContext\n *\n * @property {Element} target\n * @property {Element} newContent\n * @property {ConfigInternal} config\n * @property {ConfigInternal['morphStyle']} morphStyle\n * @property {ConfigInternal['ignoreActive']} ignoreActive\n * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue\n * @property {ConfigInternal['restoreFocus']} restoreFocus\n * @property {Map>} idMap\n * @property {Set} persistentIds\n * @property {ConfigInternal['callbacks']} callbacks\n * @property {ConfigInternal['head']} head\n * @property {HTMLDivElement} pantry\n * @property {Element[]} activeElementAndParents\n */\n\n //=============================================================================\n // AND NOW IT BEGINS...\n //=============================================================================\n\n const noOp = () => {};\n /**\n * Default configuration values, updatable by users now\n * @type {ConfigInternal}\n */\n const defaults = {\n morphStyle: \"outerHTML\",\n callbacks: {\n beforeNodeAdded: noOp,\n afterNodeAdded: noOp,\n beforeNodeMorphed: noOp,\n afterNodeMorphed: noOp,\n beforeNodeRemoved: noOp,\n afterNodeRemoved: noOp,\n beforeAttributeUpdated: noOp,\n },\n head: {\n style: \"merge\",\n shouldPreserve: (elt) => elt.getAttribute(\"im-preserve\") === \"true\",\n shouldReAppend: (elt) => elt.getAttribute(\"im-re-append\") === \"true\",\n shouldRemove: noOp,\n afterHeadMorphed: noOp,\n },\n restoreFocus: true,\n };\n\n /**\n * Core idiomorph function for morphing one DOM tree to another\n *\n * @param {Element | Document} oldNode\n * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n * @param {Config} [config]\n * @returns {Promise | Node[]}\n */\n function morph(oldNode, newContent, config = {}) {\n oldNode = normalizeElement(oldNode);\n const newNode = normalizeParent(newContent);\n const ctx = createMorphContext(oldNode, newNode, config);\n\n const morphedNodes = saveAndRestoreFocus(ctx, () => {\n return withHeadBlocking(\n ctx,\n oldNode,\n newNode,\n /** @param {MorphContext} ctx */ (ctx) => {\n if (ctx.morphStyle === \"innerHTML\") {\n morphChildren(ctx, oldNode, newNode);\n return Array.from(oldNode.childNodes);\n } else {\n return morphOuterHTML(ctx, oldNode, newNode);\n }\n },\n );\n });\n\n ctx.pantry.remove();\n return morphedNodes;\n }\n\n /**\n * Morph just the outerHTML of the oldNode to the newContent\n * We have to be careful because the oldNode could have siblings which need to be untouched\n * @param {MorphContext} ctx\n * @param {Element} oldNode\n * @param {Element} newNode\n * @returns {Node[]}\n */\n function morphOuterHTML(ctx, oldNode, newNode) {\n const oldParent = normalizeParent(oldNode);\n morphChildren(\n ctx,\n oldParent,\n newNode,\n // these two optional params are the secret sauce\n oldNode, // start point for iteration\n oldNode.nextSibling, // end point for iteration\n );\n // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed.\n return Array.from(oldParent.childNodes);\n }\n\n /**\n * @param {MorphContext} ctx\n * @param {Function} fn\n * @returns {Promise | Node[]}\n */\n function saveAndRestoreFocus(ctx, fn) {\n if (!ctx.config.restoreFocus) return fn();\n let activeElement =\n /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ (\n document.activeElement\n );\n\n // don't bother if the active element is not an input or textarea\n if (\n !(\n activeElement instanceof HTMLInputElement ||\n activeElement instanceof HTMLTextAreaElement\n )\n ) {\n return fn();\n }\n\n const { id: activeElementId, selectionStart, selectionEnd } = activeElement;\n\n const results = fn();\n\n if (\n activeElementId &&\n activeElementId !== document.activeElement?.getAttribute(\"id\")\n ) {\n activeElement = ctx.target.querySelector(`[id=\"${activeElementId}\"]`);\n activeElement?.focus();\n }\n if (activeElement && !activeElement.selectionEnd && selectionEnd) {\n activeElement.setSelectionRange(selectionStart, selectionEnd);\n }\n\n return results;\n }\n\n const morphChildren = (function () {\n /**\n * This is the core algorithm for matching up children. The idea is to use id sets to try to match up\n * nodes as faithfully as possible. We greedily match, which allows us to keep the algorithm fast, but\n * by using id sets, we are able to better match up with content deeper in the DOM.\n *\n * Basic algorithm:\n * - for each node in the new content:\n * - search self and siblings for an id set match, falling back to a soft match\n * - if match found\n * - remove any nodes up to the match:\n * - pantry persistent nodes\n * - delete the rest\n * - morph the match\n * - elsif no match found, and node is persistent\n * - find its match by querying the old root (future) and pantry (past)\n * - move it and its children here\n * - morph it\n * - else\n * - create a new node from scratch as a last result\n *\n * @param {MorphContext} ctx the merge context\n * @param {Element} oldParent the old content that we are merging the new content into\n * @param {Element} newParent the parent element of the new content\n * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child)\n * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child)\n */\n function morphChildren(\n ctx,\n oldParent,\n newParent,\n insertionPoint = null,\n endPoint = null,\n ) {\n // normalize\n if (\n oldParent instanceof HTMLTemplateElement &&\n newParent instanceof HTMLTemplateElement\n ) {\n // @ts-ignore we can pretend the DocumentFragment is an Element\n oldParent = oldParent.content;\n // @ts-ignore ditto\n newParent = newParent.content;\n }\n insertionPoint ||= oldParent.firstChild;\n\n // run through all the new content\n for (const newChild of newParent.childNodes) {\n // once we reach the end of the old parent content skip to the end and insert the rest\n if (insertionPoint && insertionPoint != endPoint) {\n const bestMatch = findBestMatch(\n ctx,\n newChild,\n insertionPoint,\n endPoint,\n );\n if (bestMatch) {\n // if the node to morph is not at the insertion point then remove/move up to it\n if (bestMatch !== insertionPoint) {\n removeNodesBetween(ctx, insertionPoint, bestMatch);\n }\n morphNode(bestMatch, newChild, ctx);\n insertionPoint = bestMatch.nextSibling;\n continue;\n }\n }\n\n // if the matching node is elsewhere in the original content\n if (newChild instanceof Element) {\n // we can pretend the id is non-null because the next `.has` line will reject it if not\n const newChildId = /** @type {String} */ (\n newChild.getAttribute(\"id\")\n );\n if (ctx.persistentIds.has(newChildId)) {\n // move it and all its children here and morph\n const movedChild = moveBeforeById(\n oldParent,\n newChildId,\n insertionPoint,\n ctx,\n );\n morphNode(movedChild, newChild, ctx);\n insertionPoint = movedChild.nextSibling;\n continue;\n }\n }\n\n // last resort: insert the new node from scratch\n const insertedNode = createNode(\n oldParent,\n newChild,\n insertionPoint,\n ctx,\n );\n // could be null if beforeNodeAdded prevented insertion\n if (insertedNode) {\n insertionPoint = insertedNode.nextSibling;\n }\n }\n\n // remove any remaining old nodes that didn't match up with new content\n while (insertionPoint && insertionPoint != endPoint) {\n const tempNode = insertionPoint;\n insertionPoint = insertionPoint.nextSibling;\n removeNode(ctx, tempNode);\n }\n }\n\n /**\n * This performs the action of inserting a new node while handling situations where the node contains\n * elements with persistent ids and possible state info we can still preserve by moving in and then morphing\n *\n * @param {Element} oldParent\n * @param {Node} newChild\n * @param {Node|null} insertionPoint\n * @param {MorphContext} ctx\n * @returns {Node|null}\n */\n function createNode(oldParent, newChild, insertionPoint, ctx) {\n if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null;\n if (ctx.idMap.has(newChild)) {\n // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm\n const newEmptyChild = document.createElement(\n /** @type {Element} */ (newChild).tagName,\n );\n oldParent.insertBefore(newEmptyChild, insertionPoint);\n morphNode(newEmptyChild, newChild, ctx);\n ctx.callbacks.afterNodeAdded(newEmptyChild);\n return newEmptyChild;\n } else {\n // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants\n const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent\n oldParent.insertBefore(newClonedChild, insertionPoint);\n ctx.callbacks.afterNodeAdded(newClonedChild);\n return newClonedChild;\n }\n }\n\n //=============================================================================\n // Matching Functions\n //=============================================================================\n const findBestMatch = (function () {\n /**\n * Scans forward from the startPoint to the endPoint looking for a match\n * for the node. It looks for an id set match first, then a soft match.\n * We abort softmatching if we find two future soft matches, to reduce churn.\n * @param {Node} node\n * @param {MorphContext} ctx\n * @param {Node | null} startPoint\n * @param {Node | null} endPoint\n * @returns {Node | null}\n */\n function findBestMatch(ctx, node, startPoint, endPoint) {\n let softMatch = null;\n let nextSibling = node.nextSibling;\n let siblingSoftMatchCount = 0;\n\n let cursor = startPoint;\n while (cursor && cursor != endPoint) {\n // soft matching is a prerequisite for id set matching\n if (isSoftMatch(cursor, node)) {\n if (isIdSetMatch(ctx, cursor, node)) {\n return cursor; // found an id set match, we're done!\n }\n\n // we haven't yet saved a soft match fallback\n if (softMatch === null) {\n // the current soft match will hard match something else in the future, leave it\n if (!ctx.idMap.has(cursor)) {\n // save this as the fallback if we get through the loop without finding a hard match\n softMatch = cursor;\n }\n }\n }\n if (\n softMatch === null &&\n nextSibling &&\n isSoftMatch(cursor, nextSibling)\n ) {\n // The next new node has a soft match with this node, so\n // increment the count of future soft matches\n siblingSoftMatchCount++;\n nextSibling = nextSibling.nextSibling;\n\n // If there are two future soft matches, block soft matching for this node to allow\n // future siblings to soft match. This is to reduce churn in the DOM when an element\n // is prepended.\n if (siblingSoftMatchCount >= 2) {\n softMatch = undefined;\n }\n }\n\n // if the current node contains active element, stop looking for better future matches,\n // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus\n // @ts-ignore pretend cursor is Element rather than Node, we're just testing for array inclusion\n if (ctx.activeElementAndParents.includes(cursor)) break;\n\n cursor = cursor.nextSibling;\n }\n\n return softMatch || null;\n }\n\n /**\n *\n * @param {MorphContext} ctx\n * @param {Node} oldNode\n * @param {Node} newNode\n * @returns {boolean}\n */\n function isIdSetMatch(ctx, oldNode, newNode) {\n let oldSet = ctx.idMap.get(oldNode);\n let newSet = ctx.idMap.get(newNode);\n\n if (!newSet || !oldSet) return false;\n\n for (const id of oldSet) {\n // a potential match is an id in the new and old nodes that\n // has not already been merged into the DOM\n // But the newNode content we call this on has not been\n // merged yet and we don't allow duplicate IDs so it is simple\n if (newSet.has(id)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n *\n * @param {Node} oldNode\n * @param {Node} newNode\n * @returns {boolean}\n */\n function isSoftMatch(oldNode, newNode) {\n // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that.\n const oldElt = /** @type {Element} */ (oldNode);\n const newElt = /** @type {Element} */ (newNode);\n\n return (\n oldElt.nodeType === newElt.nodeType &&\n oldElt.tagName === newElt.tagName &&\n // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing.\n // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n // its not persistent, and new nodes can't have any hidden state.\n // We can't use .id because of form input shadowing, and we can't count on .getAttribute's presence because it could be a document-fragment\n (!oldElt.getAttribute?.(\"id\") ||\n oldElt.getAttribute?.(\"id\") === newElt.getAttribute?.(\"id\"))\n );\n }\n\n return findBestMatch;\n })();\n\n //=============================================================================\n // DOM Manipulation Functions\n //=============================================================================\n\n /**\n * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n * - Persistent nodes will be moved to the pantry for later reuse\n * - Other nodes will have their hooks called, and then are removed\n * @param {MorphContext} ctx\n * @param {Node} node\n */\n function removeNode(ctx, node) {\n // are we going to id set match this later?\n if (ctx.idMap.has(node)) {\n // skip callbacks and move to pantry\n moveBefore(ctx.pantry, node, null);\n } else {\n // remove for realsies\n if (ctx.callbacks.beforeNodeRemoved(node) === false) return;\n node.parentNode?.removeChild(node);\n ctx.callbacks.afterNodeRemoved(node);\n }\n }\n\n /**\n * Remove nodes between the start and end nodes\n * @param {MorphContext} ctx\n * @param {Node} startInclusive\n * @param {Node} endExclusive\n * @returns {Node|null}\n */\n function removeNodesBetween(ctx, startInclusive, endExclusive) {\n /** @type {Node | null} */\n let cursor = startInclusive;\n // remove nodes until the endExclusive node\n while (cursor && cursor !== endExclusive) {\n let tempNode = /** @type {Node} */ (cursor);\n cursor = cursor.nextSibling;\n removeNode(ctx, tempNode);\n }\n return cursor;\n }\n\n /**\n * Search for an element by id within the document and pantry, and move it using moveBefore.\n *\n * @param {Element} parentNode - The parent node to which the element will be moved.\n * @param {string} id - The ID of the element to be moved.\n * @param {Node | null} after - The reference node to insert the element before.\n * If `null`, the element is appended as the last child.\n * @param {MorphContext} ctx\n * @returns {Element} The found element\n */\n function moveBeforeById(parentNode, id, after, ctx) {\n const target =\n /** @type {Element} - will always be found */\n (\n // ctx.target.id unsafe because of form input shadowing\n // ctx.target could be a document fragment which doesn't have `getAttribute`\n (ctx.target.getAttribute?.(\"id\") === id && ctx.target) ||\n ctx.target.querySelector(`[id=\"${id}\"]`) ||\n ctx.pantry.querySelector(`[id=\"${id}\"]`)\n );\n removeElementFromAncestorsIdMaps(target, ctx);\n moveBefore(parentNode, target, after);\n return target;\n }\n\n /**\n * Removes an element from its ancestors' id maps. This is needed when an element is moved from the\n * \"future\" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the\n * pantry rather than being deleted, preventing their removal hooks from being called.\n *\n * @param {Element} element - element to remove from its ancestors' id maps\n * @param {MorphContext} ctx\n */\n function removeElementFromAncestorsIdMaps(element, ctx) {\n // we know id is non-null String, because this function is only called on elements with ids\n const id = /** @type {String} */ (element.getAttribute(\"id\"));\n /** @ts-ignore - safe to loop in this way **/\n while ((element = element.parentNode)) {\n let idSet = ctx.idMap.get(element);\n if (idSet) {\n idSet.delete(id);\n if (!idSet.size) {\n ctx.idMap.delete(element);\n }\n }\n }\n }\n\n /**\n * Moves an element before another element within the same parent.\n * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n * This is essentialy a forward-compat wrapper.\n *\n * @param {Element} parentNode - The parent node containing the after element.\n * @param {Node} element - The element to be moved.\n * @param {Node | null} after - The reference node to insert `element` before.\n * If `null`, `element` is appended as the last child.\n */\n function moveBefore(parentNode, element, after) {\n // @ts-ignore - use proposed moveBefore feature\n if (parentNode.moveBefore) {\n try {\n // @ts-ignore - use proposed moveBefore feature\n parentNode.moveBefore(element, after);\n } catch (e) {\n // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry\n parentNode.insertBefore(element, after);\n }\n } else {\n parentNode.insertBefore(element, after);\n }\n }\n\n return morphChildren;\n })();\n\n //=============================================================================\n // Single Node Morphing Code\n //=============================================================================\n const morphNode = (function () {\n /**\n * @param {Node} oldNode root node to merge content into\n * @param {Node} newContent new content to merge\n * @param {MorphContext} ctx the merge context\n * @returns {Node | null} the element that ended up in the DOM\n */\n function morphNode(oldNode, newContent, ctx) {\n if (ctx.ignoreActive && oldNode === document.activeElement) {\n // don't morph focused element\n return null;\n }\n\n if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) {\n return oldNode;\n }\n\n if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if (\n oldNode instanceof HTMLHeadElement &&\n ctx.head.style !== \"morph\"\n ) {\n // ok to cast: if newContent wasn't also a , it would've got caught in the `!isSoftMatch` branch above\n handleHeadElement(\n oldNode,\n /** @type {HTMLHeadElement} */ (newContent),\n ctx,\n );\n } else {\n morphAttributes(oldNode, newContent, ctx);\n if (!ignoreValueOfActiveElement(oldNode, ctx)) {\n // @ts-ignore newContent can be a node here because .firstChild will be null\n morphChildren(ctx, oldNode, newContent);\n }\n }\n ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n return oldNode;\n }\n\n /**\n * syncs the oldNode to the newNode, copying over all attributes and\n * inner element state from the newNode to the oldNode\n *\n * @param {Node} oldNode the node to copy attributes & state to\n * @param {Node} newNode the node to copy attributes & state from\n * @param {MorphContext} ctx the merge context\n */\n function morphAttributes(oldNode, newNode, ctx) {\n let type = newNode.nodeType;\n\n // if is an element type, sync the attributes from the\n // new node into the new node\n if (type === 1 /* element type */) {\n const oldElt = /** @type {Element} */ (oldNode);\n const newElt = /** @type {Element} */ (newNode);\n\n const oldAttributes = oldElt.attributes;\n const newAttributes = newElt.attributes;\n for (const newAttribute of newAttributes) {\n if (ignoreAttribute(newAttribute.name, oldElt, \"update\", ctx)) {\n continue;\n }\n if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) {\n oldElt.setAttribute(newAttribute.name, newAttribute.value);\n }\n }\n // iterate backwards to avoid skipping over items when a delete occurs\n for (let i = oldAttributes.length - 1; 0 <= i; i--) {\n const oldAttribute = oldAttributes[i];\n\n // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe\n // e.g. custom element attribute callbacks can remove other attributes\n if (!oldAttribute) continue;\n\n if (!newElt.hasAttribute(oldAttribute.name)) {\n if (ignoreAttribute(oldAttribute.name, oldElt, \"remove\", ctx)) {\n continue;\n }\n oldElt.removeAttribute(oldAttribute.name);\n }\n }\n\n if (!ignoreValueOfActiveElement(oldElt, ctx)) {\n syncInputValue(oldElt, newElt, ctx);\n }\n }\n\n // sync text nodes\n if (type === 8 /* comment */ || type === 3 /* text */) {\n if (oldNode.nodeValue !== newNode.nodeValue) {\n oldNode.nodeValue = newNode.nodeValue;\n }\n }\n }\n\n /**\n * NB: many bothans died to bring us information:\n *\n * https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n * https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113\n *\n * @param {Element} oldElement the element to sync the input value to\n * @param {Element} newElement the element to sync the input value from\n * @param {MorphContext} ctx the merge context\n */\n function syncInputValue(oldElement, newElement, ctx) {\n if (\n oldElement instanceof HTMLInputElement &&\n newElement instanceof HTMLInputElement &&\n newElement.type !== \"file\"\n ) {\n let newValue = newElement.value;\n let oldValue = oldElement.value;\n\n // sync boolean attributes\n syncBooleanAttribute(oldElement, newElement, \"checked\", ctx);\n syncBooleanAttribute(oldElement, newElement, \"disabled\", ctx);\n\n if (!newElement.hasAttribute(\"value\")) {\n if (!ignoreAttribute(\"value\", oldElement, \"remove\", ctx)) {\n oldElement.value = \"\";\n oldElement.removeAttribute(\"value\");\n }\n } else if (oldValue !== newValue) {\n if (!ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n oldElement.setAttribute(\"value\", newValue);\n oldElement.value = newValue;\n }\n }\n // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why?\n // did I break something?\n } else if (\n oldElement instanceof HTMLOptionElement &&\n newElement instanceof HTMLOptionElement\n ) {\n syncBooleanAttribute(oldElement, newElement, \"selected\", ctx);\n } else if (\n oldElement instanceof HTMLTextAreaElement &&\n newElement instanceof HTMLTextAreaElement\n ) {\n let newValue = newElement.value;\n let oldValue = oldElement.value;\n if (ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n return;\n }\n if (newValue !== oldValue) {\n oldElement.value = newValue;\n }\n if (\n oldElement.firstChild &&\n oldElement.firstChild.nodeValue !== newValue\n ) {\n oldElement.firstChild.nodeValue = newValue;\n }\n }\n }\n\n /**\n * @param {Element} oldElement element to write the value to\n * @param {Element} newElement element to read the value from\n * @param {string} attributeName the attribute name\n * @param {MorphContext} ctx the merge context\n */\n function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) {\n // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n const newLiveValue = newElement[attributeName],\n // @ts-ignore ditto\n oldLiveValue = oldElement[attributeName];\n if (newLiveValue !== oldLiveValue) {\n const ignoreUpdate = ignoreAttribute(\n attributeName,\n oldElement,\n \"update\",\n ctx,\n );\n if (!ignoreUpdate) {\n // update attribute's associated DOM property\n // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n oldElement[attributeName] = newElement[attributeName];\n }\n if (newLiveValue) {\n if (!ignoreUpdate) {\n // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML\n // this is the correct way to set a boolean attribute to \"true\"\n oldElement.setAttribute(attributeName, \"\");\n }\n } else {\n if (!ignoreAttribute(attributeName, oldElement, \"remove\", ctx)) {\n oldElement.removeAttribute(attributeName);\n }\n }\n }\n }\n\n /**\n * @param {string} attr the attribute to be mutated\n * @param {Element} element the element that is going to be updated\n * @param {\"update\" | \"remove\"} updateType\n * @param {MorphContext} ctx the merge context\n * @returns {boolean} true if the attribute should be ignored, false otherwise\n */\n function ignoreAttribute(attr, element, updateType, ctx) {\n if (\n attr === \"value\" &&\n ctx.ignoreActiveValue &&\n element === document.activeElement\n ) {\n return true;\n }\n return (\n ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) ===\n false\n );\n }\n\n /**\n * @param {Node} possibleActiveElement\n * @param {MorphContext} ctx\n * @returns {boolean}\n */\n function ignoreValueOfActiveElement(possibleActiveElement, ctx) {\n return (\n !!ctx.ignoreActiveValue &&\n possibleActiveElement === document.activeElement &&\n possibleActiveElement !== document.body\n );\n }\n\n return morphNode;\n })();\n\n //=============================================================================\n // Head Management Functions\n //=============================================================================\n /**\n * @param {MorphContext} ctx\n * @param {Element} oldNode\n * @param {Element} newNode\n * @param {function} callback\n * @returns {Node[] | Promise}\n */\n function withHeadBlocking(ctx, oldNode, newNode, callback) {\n if (ctx.head.block) {\n const oldHead = oldNode.querySelector(\"head\");\n const newHead = newNode.querySelector(\"head\");\n if (oldHead && newHead) {\n const promises = handleHeadElement(oldHead, newHead, ctx);\n // when head promises resolve, proceed ignoring the head tag\n return Promise.all(promises).then(() => {\n const newCtx = Object.assign(ctx, {\n head: {\n block: false,\n ignore: true,\n },\n });\n return callback(newCtx);\n });\n }\n }\n // just proceed if we not head blocking\n return callback(ctx);\n }\n\n /**\n * The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style\n *\n * @param {Element} oldHead\n * @param {Element} newHead\n * @param {MorphContext} ctx\n * @returns {Promise[]}\n */\n function handleHeadElement(oldHead, newHead, ctx) {\n let added = [];\n let removed = [];\n let preserved = [];\n let nodesToAppend = [];\n\n // put all new head elements into a Map, by their outerHTML\n let srcToNewHeadNodes = new Map();\n for (const newHeadChild of newHead.children) {\n srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild);\n }\n\n // for each elt in the current head\n for (const currentHeadElt of oldHead.children) {\n // If the current head element is in the map\n let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML);\n let isReAppended = ctx.head.shouldReAppend(currentHeadElt);\n let isPreserved = ctx.head.shouldPreserve(currentHeadElt);\n if (inNewContent || isPreserved) {\n if (isReAppended) {\n // remove the current version and let the new version replace it and re-execute\n removed.push(currentHeadElt);\n } else {\n // this element already exists and should not be re-appended, so remove it from\n // the new content map, preserving it in the DOM\n srcToNewHeadNodes.delete(currentHeadElt.outerHTML);\n preserved.push(currentHeadElt);\n }\n } else {\n if (ctx.head.style === \"append\") {\n // we are appending and this existing element is not new content\n // so if and only if it is marked for re-append do we do anything\n if (isReAppended) {\n removed.push(currentHeadElt);\n nodesToAppend.push(currentHeadElt);\n }\n } else {\n // if this is a merge, we remove this content since it is not in the new head\n if (ctx.head.shouldRemove(currentHeadElt) !== false) {\n removed.push(currentHeadElt);\n }\n }\n }\n }\n\n // Push the remaining new head elements in the Map into the\n // nodes to append to the head tag\n nodesToAppend.push(...srcToNewHeadNodes.values());\n\n let promises = [];\n for (const newNode of nodesToAppend) {\n // TODO: This could theoretically be null, based on type\n let newElt = /** @type {ChildNode} */ (\n document.createRange().createContextualFragment(newNode.outerHTML)\n .firstChild\n );\n if (ctx.callbacks.beforeNodeAdded(newElt) !== false) {\n if (\n (\"href\" in newElt && newElt.href) ||\n (\"src\" in newElt && newElt.src)\n ) {\n /** @type {(result?: any) => void} */ let resolve;\n let promise = new Promise(function (_resolve) {\n resolve = _resolve;\n });\n newElt.addEventListener(\"load\", function () {\n resolve();\n });\n promises.push(promise);\n }\n oldHead.appendChild(newElt);\n ctx.callbacks.afterNodeAdded(newElt);\n added.push(newElt);\n }\n }\n\n // remove all removed elements, after we have appended the new elements to avoid\n // additional network requests for things like style sheets\n for (const removedElement of removed) {\n if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) {\n oldHead.removeChild(removedElement);\n ctx.callbacks.afterNodeRemoved(removedElement);\n }\n }\n\n ctx.head.afterHeadMorphed(oldHead, {\n added: added,\n kept: preserved,\n removed: removed,\n });\n return promises;\n }\n\n //=============================================================================\n // Create Morph Context Functions\n //=============================================================================\n const createMorphContext = (function () {\n /**\n *\n * @param {Element} oldNode\n * @param {Element} newContent\n * @param {Config} config\n * @returns {MorphContext}\n */\n function createMorphContext(oldNode, newContent, config) {\n const { persistentIds, idMap } = createIdMaps(oldNode, newContent);\n\n const mergedConfig = mergeDefaults(config);\n const morphStyle = mergedConfig.morphStyle || \"outerHTML\";\n if (![\"innerHTML\", \"outerHTML\"].includes(morphStyle)) {\n throw `Do not understand how to morph style ${morphStyle}`;\n }\n\n return {\n target: oldNode,\n newContent: newContent,\n config: mergedConfig,\n morphStyle: morphStyle,\n ignoreActive: mergedConfig.ignoreActive,\n ignoreActiveValue: mergedConfig.ignoreActiveValue,\n restoreFocus: mergedConfig.restoreFocus,\n idMap: idMap,\n persistentIds: persistentIds,\n pantry: createPantry(),\n activeElementAndParents: createActiveElementAndParents(oldNode),\n callbacks: mergedConfig.callbacks,\n head: mergedConfig.head,\n };\n }\n\n /**\n * Deep merges the config object and the Idiomorph.defaults object to\n * produce a final configuration object\n * @param {Config} config\n * @returns {ConfigInternal}\n */\n function mergeDefaults(config) {\n let finalConfig = Object.assign({}, defaults);\n\n // copy top level stuff into final config\n Object.assign(finalConfig, config);\n\n // copy callbacks into final config (do this to deep merge the callbacks)\n finalConfig.callbacks = Object.assign(\n {},\n defaults.callbacks,\n config.callbacks,\n );\n\n // copy head config into final config (do this to deep merge the head)\n finalConfig.head = Object.assign({}, defaults.head, config.head);\n\n return finalConfig;\n }\n\n /**\n * @returns {HTMLDivElement}\n */\n function createPantry() {\n const pantry = document.createElement(\"div\");\n pantry.hidden = true;\n document.body.insertAdjacentElement(\"afterend\", pantry);\n return pantry;\n }\n\n /**\n * @param {Element} oldNode\n * @returns {Element[]}\n */\n function createActiveElementAndParents(oldNode) {\n /** @type {Element[]} */\n let activeElementAndParents = [];\n let elt = document.activeElement;\n if (elt?.tagName !== \"BODY\" && oldNode.contains(elt)) {\n while (elt) {\n activeElementAndParents.push(elt);\n if (elt === oldNode) break;\n elt = elt.parentElement;\n }\n }\n return activeElementAndParents;\n }\n\n /**\n * Returns all elements with an ID contained within the root element and its descendants\n *\n * @param {Element} root\n * @returns {Element[]}\n */\n function findIdElements(root) {\n let elements = Array.from(root.querySelectorAll(\"[id]\"));\n // root could be a document fragment which doesn't have `getAttribute`\n if (root.getAttribute?.(\"id\")) {\n elements.push(root);\n }\n return elements;\n }\n\n /**\n * A bottom-up algorithm that populates a map of Element -> IdSet.\n * The idSet for a given element is the set of all IDs contained within its subtree.\n * As an optimzation, we filter these IDs through the given list of persistent IDs,\n * because we don't need to bother considering IDed elements that won't be in the new content.\n *\n * @param {Map>} idMap\n * @param {Set} persistentIds\n * @param {Element} root\n * @param {Element[]} elements\n */\n function populateIdMapWithTree(idMap, persistentIds, root, elements) {\n for (const elt of elements) {\n // we can pretend id is non-null String, because the .has line will reject it immediately if not\n const id = /** @type {String} */ (elt.getAttribute(\"id\"));\n if (persistentIds.has(id)) {\n /** @type {Element|null} */\n let current = elt;\n // walk up the parent hierarchy of that element, adding the id\n // of element to the parent's id set\n while (current) {\n let idSet = idMap.get(current);\n // if the id set doesn't exist, create it and insert it in the map\n if (idSet == null) {\n idSet = new Set();\n idMap.set(current, idSet);\n }\n idSet.add(id);\n\n if (current === root) break;\n current = current.parentElement;\n }\n }\n }\n }\n\n /**\n * This function computes a map of nodes to all ids contained within that node (inclusive of the\n * node). This map can be used to ask if two nodes have intersecting sets of ids, which allows\n * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n * to contribute to a parent nodes matching.\n *\n * @param {Element} oldContent the old content that will be morphed\n * @param {Element} newContent the new content to morph to\n * @returns {IdSets}\n */\n function createIdMaps(oldContent, newContent) {\n const oldIdElements = findIdElements(oldContent);\n const newIdElements = findIdElements(newContent);\n\n const persistentIds = createPersistentIds(oldIdElements, newIdElements);\n\n /** @type {Map>} */\n let idMap = new Map();\n populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements);\n\n /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */\n const newRoot = newContent.__idiomorphRoot || newContent;\n populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements);\n\n return { persistentIds, idMap };\n }\n\n /**\n * This function computes the set of ids that persist between the two contents excluding duplicates\n *\n * @param {Element[]} oldIdElements\n * @param {Element[]} newIdElements\n * @returns {Set}\n */\n function createPersistentIds(oldIdElements, newIdElements) {\n let duplicateIds = new Set();\n\n /** @type {Map} */\n let oldIdTagNameMap = new Map();\n for (const { id, tagName } of oldIdElements) {\n if (oldIdTagNameMap.has(id)) {\n duplicateIds.add(id);\n } else {\n oldIdTagNameMap.set(id, tagName);\n }\n }\n\n let persistentIds = new Set();\n for (const { id, tagName } of newIdElements) {\n if (persistentIds.has(id)) {\n duplicateIds.add(id);\n } else if (oldIdTagNameMap.get(id) === tagName) {\n persistentIds.add(id);\n }\n // skip if tag types mismatch because its not possible to morph one tag into another\n }\n\n for (const id of duplicateIds) {\n persistentIds.delete(id);\n }\n return persistentIds;\n }\n\n return createMorphContext;\n })();\n\n //=============================================================================\n // HTML Normalization Functions\n //=============================================================================\n const { normalizeElement, normalizeParent } = (function () {\n /** @type {WeakSet} */\n const generatedByIdiomorph = new WeakSet();\n\n /**\n *\n * @param {Element | Document} content\n * @returns {Element}\n */\n function normalizeElement(content) {\n if (content instanceof Document) {\n return content.documentElement;\n } else {\n return content;\n }\n }\n\n /**\n *\n * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent\n * @returns {Element}\n */\n function normalizeParent(newContent) {\n if (newContent == null) {\n return document.createElement(\"div\"); // dummy parent element\n } else if (typeof newContent === \"string\") {\n return normalizeParent(parseContent(newContent));\n } else if (\n generatedByIdiomorph.has(/** @type {Element} */ (newContent))\n ) {\n // the template tag created by idiomorph parsing can serve as a dummy parent\n return /** @type {Element} */ (newContent);\n } else if (newContent instanceof Node) {\n if (newContent.parentNode) {\n // we can't use the parent directly because newContent may have siblings\n // that we don't want in the morph, and reparenting might be expensive (TODO is it?),\n // so instead we create a fake parent node that only sees a slice of its children.\n /** @type {Element} */\n return /** @type {any} */ (new SlicedParentNode(newContent));\n } else {\n // a single node is added as a child to a dummy parent\n const dummyParent = document.createElement(\"div\");\n dummyParent.append(newContent);\n return dummyParent;\n }\n } else {\n // all nodes in the array or HTMLElement collection are consolidated under\n // a single dummy parent element\n const dummyParent = document.createElement(\"div\");\n for (const elt of [...newContent]) {\n dummyParent.append(elt);\n }\n return dummyParent;\n }\n }\n\n /**\n * A fake duck-typed parent element to wrap a single node, without actually reparenting it.\n * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved\n * or replaced with one or more elements during the morph. This class effectively allows us a window into\n * a slice of a node's children.\n * \"If it walks like a duck, and quacks like a duck, then it must be a duck!\" -- James Whitcomb Riley (1849–1916)\n */\n class SlicedParentNode {\n /** @param {Node} node */\n constructor(node) {\n this.originalNode = node;\n this.realParentNode = /** @type {Element} */ (node.parentNode);\n this.previousSibling = node.previousSibling;\n this.nextSibling = node.nextSibling;\n }\n\n /** @returns {Node[]} */\n get childNodes() {\n // return slice of realParent's current childNodes, based on previousSibling and nextSibling\n const nodes = [];\n let cursor = this.previousSibling\n ? this.previousSibling.nextSibling\n : this.realParentNode.firstChild;\n while (cursor && cursor != this.nextSibling) {\n nodes.push(cursor);\n cursor = cursor.nextSibling;\n }\n return nodes;\n }\n\n /**\n * @param {string} selector\n * @returns {Element[]}\n */\n querySelectorAll(selector) {\n return this.childNodes.reduce((results, node) => {\n if (node instanceof Element) {\n if (node.matches(selector)) results.push(node);\n const nodeList = node.querySelectorAll(selector);\n for (let i = 0; i < nodeList.length; i++) {\n results.push(nodeList[i]);\n }\n }\n return results;\n }, /** @type {Element[]} */ ([]));\n }\n\n /**\n * @param {Node} node\n * @param {Node} referenceNode\n * @returns {Node}\n */\n insertBefore(node, referenceNode) {\n return this.realParentNode.insertBefore(node, referenceNode);\n }\n\n /**\n * @param {Node} node\n * @param {Node} referenceNode\n * @returns {Node}\n */\n moveBefore(node, referenceNode) {\n // @ts-ignore - use new moveBefore feature\n return this.realParentNode.moveBefore(node, referenceNode);\n }\n\n /**\n * for later use with populateIdMapWithTree to halt upwards iteration\n * @returns {Node}\n */\n get __idiomorphRoot() {\n return this.originalNode;\n }\n }\n\n /**\n *\n * @param {string} newContent\n * @returns {Node | null | DocumentFragment}\n */\n function parseContent(newContent) {\n let parser = new DOMParser();\n\n // remove svgs to avoid false-positive matches on head, etc.\n let contentWithSvgsRemoved = newContent.replace(\n /]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n \"\",\n );\n\n // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping\n if (\n contentWithSvgsRemoved.match(/<\\/html>/) ||\n contentWithSvgsRemoved.match(/<\\/head>/) ||\n contentWithSvgsRemoved.match(/<\\/body>/)\n ) {\n let content = parser.parseFromString(newContent, \"text/html\");\n // if it is a full HTML document, return the document itself as the parent container\n if (contentWithSvgsRemoved.match(/<\\/html>/)) {\n generatedByIdiomorph.add(content);\n return content;\n } else {\n // otherwise return the html element as the parent container\n let htmlElement = content.firstChild;\n if (htmlElement) {\n generatedByIdiomorph.add(htmlElement);\n }\n return htmlElement;\n }\n } else {\n // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help\n // deal with touchy tags like tr, tbody, etc.\n let responseDoc = parser.parseFromString(\n \"\",\n \"text/html\",\n );\n let content = /** @type {HTMLTemplateElement} */ (\n responseDoc.body.querySelector(\"template\")\n ).content;\n generatedByIdiomorph.add(content);\n return content;\n }\n }\n\n return { normalizeElement, normalizeParent };\n })();\n\n //=============================================================================\n // This is what ends up becoming the Idiomorph global object\n //=============================================================================\n return {\n morph,\n defaults,\n };\n})();\n\n/**\n * Morph the state of the currentElement based on the attributes and contents of\n * the newElement. Morphing may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing changes\n * @param newElement Element source of morphing changes\n */\nfunction morphElements(currentElement, newElement, { callbacks, ...options } = {}) {\n Idiomorph.morph(currentElement, newElement, {\n ...options,\n callbacks: new DefaultIdiomorphCallbacks(callbacks)\n });\n}\n\n/**\n * Morph the child elements of the currentElement based on the child elements of\n * the newElement. Morphing children may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing children changes\n * @param newElement Element source of morphing children changes\n */\nfunction morphChildren(currentElement, newElement, options = {}) {\n morphElements(currentElement, newElement.childNodes, {\n ...options,\n morphStyle: \"innerHTML\"\n });\n}\n\nfunction shouldRefreshFrameWithMorphing(currentFrame, newFrame) {\n return currentFrame instanceof FrameElement &&\n currentFrame.shouldReloadWithMorph && (!newFrame || areFramesCompatibleForRefreshing(currentFrame, newFrame)) &&\n !currentFrame.closest(\"[data-turbo-permanent]\")\n}\n\nfunction areFramesCompatibleForRefreshing(currentFrame, newFrame) {\n // newFrame cannot yet be an instance of FrameElement because custom\n // elements don't get initialized until they're attached to the DOM, so\n // test its Element#nodeName instead\n return newFrame instanceof Element && newFrame.nodeName === \"TURBO-FRAME\" && currentFrame.id === newFrame.id &&\n (!newFrame.getAttribute(\"src\") || urlsAreEqual(currentFrame.src, newFrame.getAttribute(\"src\")))\n}\n\nfunction closestFrameReloadableWithMorphing(node) {\n return node.parentElement.closest(\"turbo-frame[src][refresh=morph]\")\n}\n\nclass DefaultIdiomorphCallbacks {\n #beforeNodeMorphed\n\n constructor({ beforeNodeMorphed } = {}) {\n this.#beforeNodeMorphed = beforeNodeMorphed || (() => true);\n }\n\n beforeNodeAdded = (node) => {\n return !(node.id && node.hasAttribute(\"data-turbo-permanent\") && document.getElementById(node.id))\n }\n\n beforeNodeMorphed = (currentElement, newElement) => {\n if (currentElement instanceof Element) {\n if (!currentElement.hasAttribute(\"data-turbo-permanent\") && this.#beforeNodeMorphed(currentElement, newElement)) {\n const event = dispatch(\"turbo:before-morph-element\", {\n cancelable: true,\n target: currentElement,\n detail: { currentElement, newElement }\n });\n\n return !event.defaultPrevented\n } else {\n return false\n }\n }\n }\n\n beforeAttributeUpdated = (attributeName, target, mutationType) => {\n const event = dispatch(\"turbo:before-morph-attribute\", {\n cancelable: true,\n target,\n detail: { attributeName, mutationType }\n });\n\n return !event.defaultPrevented\n }\n\n beforeNodeRemoved = (node) => {\n return this.beforeNodeMorphed(node)\n }\n\n afterNodeMorphed = (currentElement, newElement) => {\n if (currentElement instanceof Element) {\n dispatch(\"turbo:morph-element\", {\n target: currentElement,\n detail: { currentElement, newElement }\n });\n }\n }\n}\n\nclass MorphingFrameRenderer extends FrameRenderer {\n static renderElement(currentElement, newElement) {\n dispatch(\"turbo:before-frame-morph\", {\n target: currentElement,\n detail: { currentElement, newElement }\n });\n\n morphChildren(currentElement, newElement, {\n callbacks: {\n beforeNodeMorphed: (node, newNode) => {\n if (\n shouldRefreshFrameWithMorphing(node, newNode) &&\n closestFrameReloadableWithMorphing(node) === currentElement\n ) {\n node.reload();\n return false\n }\n return true\n }\n }\n });\n }\n\n async preservingPermanentElements(callback) {\n return await callback()\n }\n}\n\nclass ProgressBar {\n static animationDuration = 300 /*ms*/\n\n static get defaultCSS() {\n return unindent`\n .turbo-progress-bar {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n height: 3px;\n background: #0076ff;\n z-index: 2147483647;\n transition:\n width ${ProgressBar.animationDuration}ms ease-out,\n opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n transform: translate3d(0, 0, 0);\n }\n `\n }\n\n hiding = false\n value = 0\n visible = false\n\n constructor() {\n this.stylesheetElement = this.createStylesheetElement();\n this.progressElement = this.createProgressElement();\n this.installStylesheetElement();\n this.setValue(0);\n }\n\n show() {\n if (!this.visible) {\n this.visible = true;\n this.installProgressElement();\n this.startTrickling();\n }\n }\n\n hide() {\n if (this.visible && !this.hiding) {\n this.hiding = true;\n this.fadeProgressElement(() => {\n this.uninstallProgressElement();\n this.stopTrickling();\n this.visible = false;\n this.hiding = false;\n });\n }\n }\n\n setValue(value) {\n this.value = value;\n this.refresh();\n }\n\n // Private\n\n installStylesheetElement() {\n document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n }\n\n installProgressElement() {\n this.progressElement.style.width = \"0\";\n this.progressElement.style.opacity = \"1\";\n document.documentElement.insertBefore(this.progressElement, document.body);\n this.refresh();\n }\n\n fadeProgressElement(callback) {\n this.progressElement.style.opacity = \"0\";\n setTimeout(callback, ProgressBar.animationDuration * 1.5);\n }\n\n uninstallProgressElement() {\n if (this.progressElement.parentNode) {\n document.documentElement.removeChild(this.progressElement);\n }\n }\n\n startTrickling() {\n if (!this.trickleInterval) {\n this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n }\n }\n\n stopTrickling() {\n window.clearInterval(this.trickleInterval);\n delete this.trickleInterval;\n }\n\n trickle = () => {\n this.setValue(this.value + Math.random() / 100);\n }\n\n refresh() {\n requestAnimationFrame(() => {\n this.progressElement.style.width = `${10 + this.value * 90}%`;\n });\n }\n\n createStylesheetElement() {\n const element = document.createElement(\"style\");\n element.type = \"text/css\";\n element.textContent = ProgressBar.defaultCSS;\n const cspNonce = getCspNonce();\n if (cspNonce) {\n element.nonce = cspNonce;\n }\n return element\n }\n\n createProgressElement() {\n const element = document.createElement(\"div\");\n element.className = \"turbo-progress-bar\";\n return element\n }\n}\n\nclass HeadSnapshot extends Snapshot {\n detailsByOuterHTML = this.children\n .filter((element) => !elementIsNoscript(element))\n .map((element) => elementWithoutNonce(element))\n .reduce((result, element) => {\n const { outerHTML } = element;\n const details =\n outerHTML in result\n ? result[outerHTML]\n : {\n type: elementType(element),\n tracked: elementIsTracked(element),\n elements: []\n };\n return {\n ...result,\n [outerHTML]: {\n ...details,\n elements: [...details.elements, element]\n }\n }\n }, {})\n\n get trackedElementSignature() {\n return Object.keys(this.detailsByOuterHTML)\n .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n .join(\"\")\n }\n\n getScriptElementsNotInSnapshot(snapshot) {\n return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot)\n }\n\n getStylesheetElementsNotInSnapshot(snapshot) {\n return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot)\n }\n\n getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n return Object.keys(this.detailsByOuterHTML)\n .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n .filter(({ type }) => type == matchedType)\n .map(({ elements: [element] }) => element)\n }\n\n get provisionalElements() {\n return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n if (type == null && !tracked) {\n return [...result, ...elements]\n } else if (elements.length > 1) {\n return [...result, ...elements.slice(1)]\n } else {\n return result\n }\n }, [])\n }\n\n getMetaValue(name) {\n const element = this.findMetaElementByName(name);\n return element ? element.getAttribute(\"content\") : null\n }\n\n findMetaElementByName(name) {\n return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n const {\n elements: [element]\n } = this.detailsByOuterHTML[outerHTML];\n return elementIsMetaElementWithName(element, name) ? element : result\n }, undefined | undefined)\n }\n}\n\nfunction elementType(element) {\n if (elementIsScript(element)) {\n return \"script\"\n } else if (elementIsStylesheet(element)) {\n return \"stylesheet\"\n }\n}\n\nfunction elementIsTracked(element) {\n return element.getAttribute(\"data-turbo-track\") == \"reload\"\n}\n\nfunction elementIsScript(element) {\n const tagName = element.localName;\n return tagName == \"script\"\n}\n\nfunction elementIsNoscript(element) {\n const tagName = element.localName;\n return tagName == \"noscript\"\n}\n\nfunction elementIsStylesheet(element) {\n const tagName = element.localName;\n return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\")\n}\n\nfunction elementIsMetaElementWithName(element, name) {\n const tagName = element.localName;\n return tagName == \"meta\" && element.getAttribute(\"name\") == name\n}\n\nfunction elementWithoutNonce(element) {\n if (element.hasAttribute(\"nonce\")) {\n element.setAttribute(\"nonce\", \"\");\n }\n\n return element\n}\n\nclass PageSnapshot extends Snapshot {\n static fromHTMLString(html = \"\") {\n return this.fromDocument(parseHTMLDocument(html))\n }\n\n static fromElement(element) {\n return this.fromDocument(element.ownerDocument)\n }\n\n static fromDocument({ documentElement, body, head }) {\n return new this(documentElement, body, new HeadSnapshot(head))\n }\n\n constructor(documentElement, body, headSnapshot) {\n super(body);\n this.documentElement = documentElement;\n this.headSnapshot = headSnapshot;\n }\n\n clone() {\n const clonedElement = this.element.cloneNode(true);\n\n const selectElements = this.element.querySelectorAll(\"select\");\n const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n\n for (const [index, source] of selectElements.entries()) {\n const clone = clonedSelectElements[index];\n for (const option of clone.selectedOptions) option.selected = false;\n for (const option of source.selectedOptions) clone.options[option.index].selected = true;\n }\n\n for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n clonedPasswordInput.value = \"\";\n }\n\n for (const clonedNoscriptElement of clonedElement.querySelectorAll(\"noscript\")) {\n clonedNoscriptElement.remove();\n }\n\n return new PageSnapshot(this.documentElement, clonedElement, this.headSnapshot)\n }\n\n get lang() {\n return this.documentElement.getAttribute(\"lang\")\n }\n\n get dir() {\n return this.documentElement.getAttribute(\"dir\")\n }\n\n get headElement() {\n return this.headSnapshot.element\n }\n\n get rootLocation() {\n const root = this.getSetting(\"root\") ?? \"/\";\n return expandURL(root)\n }\n\n get cacheControlValue() {\n return this.getSetting(\"cache-control\")\n }\n\n get isPreviewable() {\n return this.cacheControlValue != \"no-preview\"\n }\n\n get isCacheable() {\n return this.cacheControlValue != \"no-cache\"\n }\n\n get isVisitable() {\n return this.getSetting(\"visit-control\") != \"reload\"\n }\n\n get prefersViewTransitions() {\n const viewTransitionEnabled = this.getSetting(\"view-transition\") === \"true\" || this.headSnapshot.getMetaValue(\"view-transition\") === \"same-origin\";\n return viewTransitionEnabled && !window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n }\n\n get refreshMethod() {\n return this.getSetting(\"refresh-method\")\n }\n\n get refreshScroll() {\n return this.getSetting(\"refresh-scroll\")\n }\n\n // Private\n\n getSetting(name) {\n return this.headSnapshot.getMetaValue(`turbo-${name}`)\n }\n}\n\nclass ViewTransitioner {\n #viewTransitionStarted = false\n #lastOperation = Promise.resolve()\n\n renderChange(useViewTransition, render) {\n if (useViewTransition && this.viewTransitionsAvailable && !this.#viewTransitionStarted) {\n this.#viewTransitionStarted = true;\n this.#lastOperation = this.#lastOperation.then(async () => {\n await document.startViewTransition(render).finished;\n });\n } else {\n this.#lastOperation = this.#lastOperation.then(render);\n }\n\n return this.#lastOperation\n }\n\n get viewTransitionsAvailable() {\n return document.startViewTransition\n }\n}\n\nconst defaultOptions = {\n action: \"advance\",\n historyChanged: false,\n visitCachedSnapshot: () => {},\n willRender: true,\n updateHistory: true,\n shouldCacheSnapshot: true,\n acceptsStreamResponse: false,\n refresh: {}\n};\n\nconst TimingMetric = {\n visitStart: \"visitStart\",\n requestStart: \"requestStart\",\n requestEnd: \"requestEnd\",\n visitEnd: \"visitEnd\"\n};\n\nconst VisitState = {\n initialized: \"initialized\",\n started: \"started\",\n canceled: \"canceled\",\n failed: \"failed\",\n completed: \"completed\"\n};\n\nconst SystemStatusCode = {\n networkFailure: 0,\n timeoutFailure: -1,\n contentTypeMismatch: -2\n};\n\nconst Direction = {\n advance: \"forward\",\n restore: \"back\",\n replace: \"none\"\n};\n\nclass Visit {\n identifier = uuid() // Required by turbo-ios\n timingMetrics = {}\n\n followedRedirect = false\n historyChanged = false\n scrolled = false\n shouldCacheSnapshot = true\n acceptsStreamResponse = false\n snapshotCached = false\n state = VisitState.initialized\n viewTransitioner = new ViewTransitioner()\n\n constructor(delegate, location, restorationIdentifier, options = {}) {\n this.delegate = delegate;\n this.location = location;\n this.restorationIdentifier = restorationIdentifier || uuid();\n\n const {\n action,\n historyChanged,\n referrer,\n snapshot,\n snapshotHTML,\n response,\n visitCachedSnapshot,\n willRender,\n updateHistory,\n shouldCacheSnapshot,\n acceptsStreamResponse,\n direction,\n refresh\n } = {\n ...defaultOptions,\n ...options\n };\n this.action = action;\n this.historyChanged = historyChanged;\n this.referrer = referrer;\n this.snapshot = snapshot;\n this.snapshotHTML = snapshotHTML;\n this.response = response;\n this.isPageRefresh = this.view.isPageRefresh(this);\n this.visitCachedSnapshot = visitCachedSnapshot;\n this.willRender = willRender;\n this.updateHistory = updateHistory;\n this.scrolled = !willRender;\n this.shouldCacheSnapshot = shouldCacheSnapshot;\n this.acceptsStreamResponse = acceptsStreamResponse;\n this.direction = direction || Direction[action];\n this.refresh = refresh;\n }\n\n get adapter() {\n return this.delegate.adapter\n }\n\n get view() {\n return this.delegate.view\n }\n\n get history() {\n return this.delegate.history\n }\n\n get restorationData() {\n return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)\n }\n\n start() {\n if (this.state == VisitState.initialized) {\n this.recordTimingMetric(TimingMetric.visitStart);\n this.state = VisitState.started;\n this.adapter.visitStarted(this);\n this.delegate.visitStarted(this);\n }\n }\n\n cancel() {\n if (this.state == VisitState.started) {\n if (this.request) {\n this.request.cancel();\n }\n this.cancelRender();\n this.state = VisitState.canceled;\n }\n }\n\n complete() {\n if (this.state == VisitState.started) {\n this.recordTimingMetric(TimingMetric.visitEnd);\n this.adapter.visitCompleted(this);\n this.state = VisitState.completed;\n this.followRedirect();\n\n if (!this.followedRedirect) {\n this.delegate.visitCompleted(this);\n }\n }\n }\n\n fail() {\n if (this.state == VisitState.started) {\n this.state = VisitState.failed;\n this.adapter.visitFailed(this);\n this.delegate.visitCompleted(this);\n }\n }\n\n changeHistory() {\n if (!this.historyChanged && this.updateHistory) {\n const actionForHistory = this.location.href === this.referrer?.href ? \"replace\" : this.action;\n const method = getHistoryMethodForAction(actionForHistory);\n this.history.update(method, this.location, this.restorationIdentifier);\n this.historyChanged = true;\n }\n }\n\n issueRequest() {\n if (this.hasPreloadedResponse()) {\n this.simulateRequest();\n } else if (this.shouldIssueRequest() && !this.request) {\n this.request = new FetchRequest(this, FetchMethod.get, this.location);\n this.request.perform();\n }\n }\n\n simulateRequest() {\n if (this.response) {\n this.startRequest();\n this.recordResponse();\n this.finishRequest();\n }\n }\n\n startRequest() {\n this.recordTimingMetric(TimingMetric.requestStart);\n this.adapter.visitRequestStarted(this);\n }\n\n recordResponse(response = this.response) {\n this.response = response;\n if (response) {\n const { statusCode } = response;\n if (isSuccessful(statusCode)) {\n this.adapter.visitRequestCompleted(this);\n } else {\n this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n }\n }\n }\n\n finishRequest() {\n this.recordTimingMetric(TimingMetric.requestEnd);\n this.adapter.visitRequestFinished(this);\n }\n\n loadResponse() {\n if (this.response) {\n const { statusCode, responseHTML } = this.response;\n this.render(async () => {\n if (this.shouldCacheSnapshot) this.cacheSnapshot();\n if (this.view.renderPromise) await this.view.renderPromise;\n\n if (isSuccessful(statusCode) && responseHTML != null) {\n const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n await this.renderPageSnapshot(snapshot, false);\n\n this.adapter.visitRendered(this);\n this.complete();\n } else {\n await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n this.adapter.visitRendered(this);\n this.fail();\n }\n });\n }\n }\n\n getCachedSnapshot() {\n const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n\n if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n if (this.action == \"restore\" || snapshot.isPreviewable) {\n return snapshot\n }\n }\n }\n\n getPreloadedSnapshot() {\n if (this.snapshotHTML) {\n return PageSnapshot.fromHTMLString(this.snapshotHTML)\n }\n }\n\n hasCachedSnapshot() {\n return this.getCachedSnapshot() != null\n }\n\n loadCachedSnapshot() {\n const snapshot = this.getCachedSnapshot();\n if (snapshot) {\n const isPreview = this.shouldIssueRequest();\n this.render(async () => {\n this.cacheSnapshot();\n if (this.isPageRefresh) {\n this.adapter.visitRendered(this);\n } else {\n if (this.view.renderPromise) await this.view.renderPromise;\n\n await this.renderPageSnapshot(snapshot, isPreview);\n\n this.adapter.visitRendered(this);\n if (!isPreview) {\n this.complete();\n }\n }\n });\n }\n }\n\n followRedirect() {\n if (this.redirectedToLocation && !this.followedRedirect && this.response?.redirected) {\n this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n action: \"replace\",\n response: this.response,\n shouldCacheSnapshot: false,\n willRender: false\n });\n this.followedRedirect = true;\n }\n }\n\n // Fetch request delegate\n\n prepareRequest(request) {\n if (this.acceptsStreamResponse) {\n request.acceptResponseType(StreamMessage.contentType);\n }\n }\n\n requestStarted() {\n this.startRequest();\n }\n\n requestPreventedHandlingResponse(_request, _response) {}\n\n async requestSucceededWithResponse(request, response) {\n const responseHTML = await response.responseHTML;\n const { redirected, statusCode } = response;\n if (responseHTML == undefined) {\n this.recordResponse({\n statusCode: SystemStatusCode.contentTypeMismatch,\n redirected\n });\n } else {\n this.redirectedToLocation = response.redirected ? response.location : undefined;\n this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n }\n }\n\n async requestFailedWithResponse(request, response) {\n const responseHTML = await response.responseHTML;\n const { redirected, statusCode } = response;\n if (responseHTML == undefined) {\n this.recordResponse({\n statusCode: SystemStatusCode.contentTypeMismatch,\n redirected\n });\n } else {\n this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n }\n }\n\n requestErrored(_request, _error) {\n this.recordResponse({\n statusCode: SystemStatusCode.networkFailure,\n redirected: false\n });\n }\n\n requestFinished() {\n this.finishRequest();\n }\n\n // Scrolling\n\n performScroll() {\n if (!this.scrolled && !this.view.forceReloaded && !this.view.shouldPreserveScrollPosition(this)) {\n if (this.action == \"restore\") {\n this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n } else {\n this.scrollToAnchor() || this.view.scrollToTop();\n }\n\n this.scrolled = true;\n }\n }\n\n scrollToRestoredPosition() {\n const { scrollPosition } = this.restorationData;\n if (scrollPosition) {\n this.view.scrollToPosition(scrollPosition);\n return true\n }\n }\n\n scrollToAnchor() {\n const anchor = getAnchor(this.location);\n if (anchor != null) {\n this.view.scrollToAnchor(anchor);\n return true\n }\n }\n\n // Instrumentation\n\n recordTimingMetric(metric) {\n this.timingMetrics[metric] = new Date().getTime();\n }\n\n getTimingMetrics() {\n return { ...this.timingMetrics }\n }\n\n // Private\n\n hasPreloadedResponse() {\n return typeof this.response == \"object\"\n }\n\n shouldIssueRequest() {\n if (this.action == \"restore\") {\n return !this.hasCachedSnapshot()\n } else {\n return this.willRender\n }\n }\n\n cacheSnapshot() {\n if (!this.snapshotCached) {\n this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n this.snapshotCached = true;\n }\n }\n\n async render(callback) {\n this.cancelRender();\n await new Promise((resolve) => {\n this.frame =\n document.visibilityState === \"hidden\" ? setTimeout(() => resolve(), 0) : requestAnimationFrame(() => resolve());\n });\n await callback();\n delete this.frame;\n }\n\n async renderPageSnapshot(snapshot, isPreview) {\n await this.viewTransitioner.renderChange(this.view.shouldTransitionTo(snapshot), async () => {\n await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n this.performScroll();\n });\n }\n\n cancelRender() {\n if (this.frame) {\n cancelAnimationFrame(this.frame);\n delete this.frame;\n }\n }\n}\n\nfunction isSuccessful(statusCode) {\n return statusCode >= 200 && statusCode < 300\n}\n\nclass BrowserAdapter {\n progressBar = new ProgressBar()\n\n constructor(session) {\n this.session = session;\n }\n\n visitProposedToLocation(location, options) {\n if (locationIsVisitable(location, this.navigator.rootLocation)) {\n this.navigator.startVisit(location, options?.restorationIdentifier || uuid(), options);\n } else {\n window.location.href = location.toString();\n }\n }\n\n visitStarted(visit) {\n this.location = visit.location;\n this.redirectedToLocation = null;\n\n visit.loadCachedSnapshot();\n visit.issueRequest();\n }\n\n visitRequestStarted(visit) {\n this.progressBar.setValue(0);\n if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n this.showVisitProgressBarAfterDelay();\n } else {\n this.showProgressBar();\n }\n }\n\n visitRequestCompleted(visit) {\n visit.loadResponse();\n\n if (visit.response.redirected) {\n this.redirectedToLocation = visit.redirectedToLocation;\n }\n }\n\n visitRequestFailedWithStatusCode(visit, statusCode) {\n switch (statusCode) {\n case SystemStatusCode.networkFailure:\n case SystemStatusCode.timeoutFailure:\n case SystemStatusCode.contentTypeMismatch:\n return this.reload({\n reason: \"request_failed\",\n context: {\n statusCode\n }\n })\n default:\n return visit.loadResponse()\n }\n }\n\n visitRequestFinished(_visit) {}\n\n visitCompleted(_visit) {\n this.progressBar.setValue(1);\n this.hideVisitProgressBar();\n }\n\n pageInvalidated(reason) {\n this.reload(reason);\n }\n\n visitFailed(_visit) {\n this.progressBar.setValue(1);\n this.hideVisitProgressBar();\n }\n\n visitRendered(_visit) {}\n\n // Link prefetching\n\n linkPrefetchingIsEnabledForLocation(location) {\n return true\n }\n\n // Form Submission Delegate\n\n formSubmissionStarted(_formSubmission) {\n this.progressBar.setValue(0);\n this.showFormProgressBarAfterDelay();\n }\n\n formSubmissionFinished(_formSubmission) {\n this.progressBar.setValue(1);\n this.hideFormProgressBar();\n }\n\n // Private\n\n showVisitProgressBarAfterDelay() {\n this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n }\n\n hideVisitProgressBar() {\n this.progressBar.hide();\n if (this.visitProgressBarTimeout != null) {\n window.clearTimeout(this.visitProgressBarTimeout);\n delete this.visitProgressBarTimeout;\n }\n }\n\n showFormProgressBarAfterDelay() {\n if (this.formProgressBarTimeout == null) {\n this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n }\n }\n\n hideFormProgressBar() {\n this.progressBar.hide();\n if (this.formProgressBarTimeout != null) {\n window.clearTimeout(this.formProgressBarTimeout);\n delete this.formProgressBarTimeout;\n }\n }\n\n showProgressBar = () => {\n this.progressBar.show();\n }\n\n reload(reason) {\n dispatch(\"turbo:reload\", { detail: reason });\n\n window.location.href = (this.redirectedToLocation || this.location)?.toString() || window.location.href;\n }\n\n get navigator() {\n return this.session.navigator\n }\n}\n\nclass CacheObserver {\n selector = \"[data-turbo-temporary]\"\n\n started = false\n\n start() {\n if (!this.started) {\n this.started = true;\n addEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n }\n }\n\n stop() {\n if (this.started) {\n this.started = false;\n removeEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n }\n }\n\n removeTemporaryElements = (_event) => {\n for (const element of this.temporaryElements) {\n element.remove();\n }\n }\n\n get temporaryElements() {\n return [...document.querySelectorAll(this.selector)]\n }\n}\n\nclass FrameRedirector {\n constructor(session, element) {\n this.session = session;\n this.element = element;\n this.linkInterceptor = new LinkInterceptor(this, element);\n this.formSubmitObserver = new FormSubmitObserver(this, element);\n }\n\n start() {\n this.linkInterceptor.start();\n this.formSubmitObserver.start();\n }\n\n stop() {\n this.linkInterceptor.stop();\n this.formSubmitObserver.stop();\n }\n\n // Link interceptor delegate\n\n shouldInterceptLinkClick(element, _location, _event) {\n return this.#shouldRedirect(element)\n }\n\n linkClickIntercepted(element, url, event) {\n const frame = this.#findFrameElement(element);\n if (frame) {\n frame.delegate.linkClickIntercepted(element, url, event);\n }\n }\n\n // Form submit observer delegate\n\n willSubmitForm(element, submitter) {\n return (\n element.closest(\"turbo-frame\") == null &&\n this.#shouldSubmit(element, submitter) &&\n this.#shouldRedirect(element, submitter)\n )\n }\n\n formSubmitted(element, submitter) {\n const frame = this.#findFrameElement(element, submitter);\n if (frame) {\n frame.delegate.formSubmitted(element, submitter);\n }\n }\n\n #shouldSubmit(form, submitter) {\n const action = getAction$1(form, submitter);\n const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n const rootLocation = expandURL(meta?.content ?? \"/\");\n\n return this.#shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation)\n }\n\n #shouldRedirect(element, submitter) {\n const isNavigatable =\n element instanceof HTMLFormElement\n ? this.session.submissionIsNavigatable(element, submitter)\n : this.session.elementIsNavigatable(element);\n\n if (isNavigatable) {\n const frame = this.#findFrameElement(element, submitter);\n return frame ? frame != element.closest(\"turbo-frame\") : false\n } else {\n return false\n }\n }\n\n #findFrameElement(element, submitter) {\n const id = submitter?.getAttribute(\"data-turbo-frame\") || element.getAttribute(\"data-turbo-frame\");\n if (id && id != \"_top\") {\n const frame = this.element.querySelector(`#${id}:not([disabled])`);\n if (frame instanceof FrameElement) {\n return frame\n }\n }\n }\n}\n\nclass History {\n location\n restorationIdentifier = uuid()\n restorationData = {}\n started = false\n currentIndex = 0\n\n constructor(delegate) {\n this.delegate = delegate;\n }\n\n start() {\n if (!this.started) {\n addEventListener(\"popstate\", this.onPopState, false);\n this.currentIndex = history.state?.turbo?.restorationIndex || 0;\n this.started = true;\n this.replace(new URL(window.location.href));\n }\n }\n\n stop() {\n if (this.started) {\n removeEventListener(\"popstate\", this.onPopState, false);\n this.started = false;\n }\n }\n\n push(location, restorationIdentifier) {\n this.update(history.pushState, location, restorationIdentifier);\n }\n\n replace(location, restorationIdentifier) {\n this.update(history.replaceState, location, restorationIdentifier);\n }\n\n update(method, location, restorationIdentifier = uuid()) {\n if (method === history.pushState) ++this.currentIndex;\n\n const state = { turbo: { restorationIdentifier, restorationIndex: this.currentIndex } };\n method.call(history, state, \"\", location.href);\n this.location = location;\n this.restorationIdentifier = restorationIdentifier;\n }\n\n // Restoration data\n\n getRestorationDataForIdentifier(restorationIdentifier) {\n return this.restorationData[restorationIdentifier] || {}\n }\n\n updateRestorationData(additionalData) {\n const { restorationIdentifier } = this;\n const restorationData = this.restorationData[restorationIdentifier];\n this.restorationData[restorationIdentifier] = {\n ...restorationData,\n ...additionalData\n };\n }\n\n // Scroll restoration\n\n assumeControlOfScrollRestoration() {\n if (!this.previousScrollRestoration) {\n this.previousScrollRestoration = history.scrollRestoration ?? \"auto\";\n history.scrollRestoration = \"manual\";\n }\n }\n\n relinquishControlOfScrollRestoration() {\n if (this.previousScrollRestoration) {\n history.scrollRestoration = this.previousScrollRestoration;\n delete this.previousScrollRestoration;\n }\n }\n\n // Event handlers\n\n onPopState = (event) => {\n const { turbo } = event.state || {};\n this.location = new URL(window.location.href);\n\n if (turbo) {\n const { restorationIdentifier, restorationIndex } = turbo;\n this.restorationIdentifier = restorationIdentifier;\n const direction = restorationIndex > this.currentIndex ? \"forward\" : \"back\";\n this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction);\n this.currentIndex = restorationIndex;\n } else {\n this.currentIndex++;\n this.delegate.historyPoppedWithEmptyState(this.location);\n }\n }\n}\n\nclass LinkPrefetchObserver {\n started = false\n #prefetchedLink = null\n\n constructor(delegate, eventTarget) {\n this.delegate = delegate;\n this.eventTarget = eventTarget;\n }\n\n start() {\n if (this.started) return\n\n if (this.eventTarget.readyState === \"loading\") {\n this.eventTarget.addEventListener(\"DOMContentLoaded\", this.#enable, { once: true });\n } else {\n this.#enable();\n }\n }\n\n stop() {\n if (!this.started) return\n\n this.eventTarget.removeEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n capture: true,\n passive: true\n });\n this.eventTarget.removeEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n capture: true,\n passive: true\n });\n\n this.eventTarget.removeEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n this.started = false;\n }\n\n #enable = () => {\n this.eventTarget.addEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n capture: true,\n passive: true\n });\n this.eventTarget.addEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n capture: true,\n passive: true\n });\n\n this.eventTarget.addEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n this.started = true;\n }\n\n #tryToPrefetchRequest = (event) => {\n if (getMetaContent(\"turbo-prefetch\") === \"false\") return\n\n const target = event.target;\n const isLink = target.matches && target.matches(\"a[href]:not([target^=_]):not([download])\");\n\n if (isLink && this.#isPrefetchable(target)) {\n const link = target;\n const location = getLocationForLink(link);\n\n if (this.delegate.canPrefetchRequestToLocation(link, location)) {\n this.#prefetchedLink = link;\n\n const fetchRequest = new FetchRequest(\n this,\n FetchMethod.get,\n location,\n new URLSearchParams(),\n target\n );\n\n fetchRequest.fetchOptions.priority = \"low\";\n\n prefetchCache.putLater(location, fetchRequest, this.#cacheTtl);\n }\n }\n }\n\n #cancelRequestIfObsolete = (event) => {\n if (event.target === this.#prefetchedLink) this.#cancelPrefetchRequest();\n }\n\n #cancelPrefetchRequest = () => {\n prefetchCache.clear();\n this.#prefetchedLink = null;\n }\n\n #tryToUsePrefetchedRequest = (event) => {\n if (event.target.tagName !== \"FORM\" && event.detail.fetchOptions.method === \"GET\") {\n const cached = prefetchCache.get(event.detail.url);\n\n if (cached) {\n // User clicked link, use cache response\n event.detail.fetchRequest = cached;\n }\n\n prefetchCache.clear();\n }\n }\n\n prepareRequest(request) {\n const link = request.target;\n\n request.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n\n const turboFrame = link.closest(\"turbo-frame\");\n const turboFrameTarget = link.getAttribute(\"data-turbo-frame\") || turboFrame?.getAttribute(\"target\") || turboFrame?.id;\n\n if (turboFrameTarget && turboFrameTarget !== \"_top\") {\n request.headers[\"Turbo-Frame\"] = turboFrameTarget;\n }\n }\n\n // Fetch request interface\n\n requestSucceededWithResponse() {}\n\n requestStarted(fetchRequest) {}\n\n requestErrored(fetchRequest) {}\n\n requestFinished(fetchRequest) {}\n\n requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n get #cacheTtl() {\n return Number(getMetaContent(\"turbo-prefetch-cache-time\")) || cacheTtl\n }\n\n #isPrefetchable(link) {\n const href = link.getAttribute(\"href\");\n\n if (!href) return false\n\n if (unfetchableLink(link)) return false\n if (linkToTheSamePage(link)) return false\n if (linkOptsOut(link)) return false\n if (nonSafeLink(link)) return false\n if (eventPrevented(link)) return false\n\n return true\n }\n}\n\nconst unfetchableLink = (link) => {\n return link.origin !== document.location.origin || ![\"http:\", \"https:\"].includes(link.protocol) || link.hasAttribute(\"target\")\n};\n\nconst linkToTheSamePage = (link) => {\n return (link.pathname + link.search === document.location.pathname + document.location.search) || link.href.startsWith(\"#\")\n};\n\nconst linkOptsOut = (link) => {\n if (link.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n if (link.getAttribute(\"data-turbo\") === \"false\") return true\n\n const turboPrefetchParent = findClosestRecursively(link, \"[data-turbo-prefetch]\");\n if (turboPrefetchParent && turboPrefetchParent.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n\n return false\n};\n\nconst nonSafeLink = (link) => {\n const turboMethod = link.getAttribute(\"data-turbo-method\");\n if (turboMethod && turboMethod.toLowerCase() !== \"get\") return true\n\n if (isUJS(link)) return true\n if (link.hasAttribute(\"data-turbo-confirm\")) return true\n if (link.hasAttribute(\"data-turbo-stream\")) return true\n\n return false\n};\n\nconst isUJS = (link) => {\n return link.hasAttribute(\"data-remote\") || link.hasAttribute(\"data-behavior\") || link.hasAttribute(\"data-confirm\") || link.hasAttribute(\"data-method\")\n};\n\nconst eventPrevented = (link) => {\n const event = dispatch(\"turbo:before-prefetch\", { target: link, cancelable: true });\n return event.defaultPrevented\n};\n\nclass Navigator {\n constructor(delegate) {\n this.delegate = delegate;\n }\n\n proposeVisit(location, options = {}) {\n if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n this.delegate.visitProposedToLocation(location, options);\n }\n }\n\n startVisit(locatable, restorationIdentifier, options = {}) {\n this.stop();\n this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, {\n referrer: this.location,\n ...options\n });\n this.currentVisit.start();\n }\n\n submitForm(form, submitter) {\n this.stop();\n this.formSubmission = new FormSubmission(this, form, submitter, true);\n\n this.formSubmission.start();\n }\n\n stop() {\n if (this.formSubmission) {\n this.formSubmission.stop();\n delete this.formSubmission;\n }\n\n if (this.currentVisit) {\n this.currentVisit.cancel();\n delete this.currentVisit;\n }\n }\n\n get adapter() {\n return this.delegate.adapter\n }\n\n get view() {\n return this.delegate.view\n }\n\n get rootLocation() {\n return this.view.snapshot.rootLocation\n }\n\n get history() {\n return this.delegate.history\n }\n\n // Form submission delegate\n\n formSubmissionStarted(formSubmission) {\n // Not all adapters implement formSubmissionStarted\n if (typeof this.adapter.formSubmissionStarted === \"function\") {\n this.adapter.formSubmissionStarted(formSubmission);\n }\n }\n\n async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n if (formSubmission == this.formSubmission) {\n const responseHTML = await fetchResponse.responseHTML;\n if (responseHTML) {\n const shouldCacheSnapshot = formSubmission.isSafe;\n if (!shouldCacheSnapshot) {\n this.view.clearSnapshotCache();\n }\n\n const { statusCode, redirected } = fetchResponse;\n const action = this.#getActionForFormSubmission(formSubmission, fetchResponse);\n const visitOptions = {\n action,\n shouldCacheSnapshot,\n response: { statusCode, responseHTML, redirected }\n };\n this.proposeVisit(fetchResponse.location, visitOptions);\n }\n }\n }\n\n async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n const responseHTML = await fetchResponse.responseHTML;\n\n if (responseHTML) {\n const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n if (fetchResponse.serverError) {\n await this.view.renderError(snapshot, this.currentVisit);\n } else {\n await this.view.renderPage(snapshot, false, true, this.currentVisit);\n }\n if (snapshot.refreshScroll !== \"preserve\") {\n this.view.scrollToTop();\n }\n this.view.clearSnapshotCache();\n }\n }\n\n formSubmissionErrored(formSubmission, error) {\n console.error(error);\n }\n\n formSubmissionFinished(formSubmission) {\n // Not all adapters implement formSubmissionFinished\n if (typeof this.adapter.formSubmissionFinished === \"function\") {\n this.adapter.formSubmissionFinished(formSubmission);\n }\n }\n\n // Link prefetching\n\n linkPrefetchingIsEnabledForLocation(location) {\n // Not all adapters implement linkPrefetchingIsEnabledForLocation\n if (typeof this.adapter.linkPrefetchingIsEnabledForLocation === \"function\") {\n return this.adapter.linkPrefetchingIsEnabledForLocation(location)\n }\n\n return true\n }\n\n // Visit delegate\n\n visitStarted(visit) {\n this.delegate.visitStarted(visit);\n }\n\n visitCompleted(visit) {\n this.delegate.visitCompleted(visit);\n delete this.currentVisit;\n }\n\n // Same-page links are no longer handled with a Visit.\n // This method is still needed for Turbo Native adapters.\n locationWithActionIsSamePage(location, action) {\n return false\n }\n\n // Visits\n\n get location() {\n return this.history.location\n }\n\n get restorationIdentifier() {\n return this.history.restorationIdentifier\n }\n\n #getActionForFormSubmission(formSubmission, fetchResponse) {\n const { submitter, formElement } = formSubmission;\n return getVisitAction(submitter, formElement) || this.#getDefaultAction(fetchResponse)\n }\n\n #getDefaultAction(fetchResponse) {\n const sameLocationRedirect = fetchResponse.redirected && fetchResponse.location.href === this.location?.href;\n return sameLocationRedirect ? \"replace\" : \"advance\"\n }\n}\n\nconst PageStage = {\n initial: 0,\n loading: 1,\n interactive: 2,\n complete: 3\n};\n\nclass PageObserver {\n stage = PageStage.initial\n started = false\n\n constructor(delegate) {\n this.delegate = delegate;\n }\n\n start() {\n if (!this.started) {\n if (this.stage == PageStage.initial) {\n this.stage = PageStage.loading;\n }\n document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n addEventListener(\"pagehide\", this.pageWillUnload, false);\n this.started = true;\n }\n }\n\n stop() {\n if (this.started) {\n document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n removeEventListener(\"pagehide\", this.pageWillUnload, false);\n this.started = false;\n }\n }\n\n interpretReadyState = () => {\n const { readyState } = this;\n if (readyState == \"interactive\") {\n this.pageIsInteractive();\n } else if (readyState == \"complete\") {\n this.pageIsComplete();\n }\n }\n\n pageIsInteractive() {\n if (this.stage == PageStage.loading) {\n this.stage = PageStage.interactive;\n this.delegate.pageBecameInteractive();\n }\n }\n\n pageIsComplete() {\n this.pageIsInteractive();\n if (this.stage == PageStage.interactive) {\n this.stage = PageStage.complete;\n this.delegate.pageLoaded();\n }\n }\n\n pageWillUnload = () => {\n this.delegate.pageWillUnload();\n }\n\n get readyState() {\n return document.readyState\n }\n}\n\nclass ScrollObserver {\n started = false\n\n constructor(delegate) {\n this.delegate = delegate;\n }\n\n start() {\n if (!this.started) {\n addEventListener(\"scroll\", this.onScroll, false);\n this.onScroll();\n this.started = true;\n }\n }\n\n stop() {\n if (this.started) {\n removeEventListener(\"scroll\", this.onScroll, false);\n this.started = false;\n }\n }\n\n onScroll = () => {\n this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n }\n\n // Private\n\n updatePosition(position) {\n this.delegate.scrollPositionChanged(position);\n }\n}\n\nclass StreamMessageRenderer {\n render({ fragment }) {\n Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => {\n withAutofocusFromFragment(fragment, () => {\n withPreservedFocus(() => {\n document.documentElement.appendChild(fragment);\n });\n });\n });\n }\n\n // Bardo delegate\n\n enteringBardo(currentPermanentElement, newPermanentElement) {\n newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n }\n\n leavingBardo() {}\n}\n\nfunction getPermanentElementMapForFragment(fragment) {\n const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n const permanentElementMap = {};\n for (const permanentElementInDocument of permanentElementsInDocument) {\n const { id } = permanentElementInDocument;\n\n for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n\n if (elementInStream) {\n permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n }\n }\n }\n\n return permanentElementMap\n}\n\nasync function withAutofocusFromFragment(fragment, callback) {\n const generatedID = `turbo-stream-autofocus-${uuid()}`;\n const turboStreams = fragment.querySelectorAll(\"turbo-stream\");\n const elementWithAutofocus = firstAutofocusableElementInStreams(turboStreams);\n let willAutofocusId = null;\n\n if (elementWithAutofocus) {\n if (elementWithAutofocus.id) {\n willAutofocusId = elementWithAutofocus.id;\n } else {\n willAutofocusId = generatedID;\n }\n\n elementWithAutofocus.id = willAutofocusId;\n }\n\n callback();\n await nextRepaint();\n\n const hasNoActiveElement = document.activeElement == null || document.activeElement == document.body;\n\n if (hasNoActiveElement && willAutofocusId) {\n const elementToAutofocus = document.getElementById(willAutofocusId);\n\n if (elementIsFocusable(elementToAutofocus)) {\n elementToAutofocus.focus();\n }\n if (elementToAutofocus && elementToAutofocus.id == generatedID) {\n elementToAutofocus.removeAttribute(\"id\");\n }\n }\n}\n\nasync function withPreservedFocus(callback) {\n const [activeElementBeforeRender, activeElementAfterRender] = await around(callback, () => document.activeElement);\n\n const restoreFocusTo = activeElementBeforeRender && activeElementBeforeRender.id;\n\n if (restoreFocusTo) {\n const elementToFocus = document.getElementById(restoreFocusTo);\n\n if (elementIsFocusable(elementToFocus) && elementToFocus != activeElementAfterRender) {\n elementToFocus.focus();\n }\n }\n}\n\nfunction firstAutofocusableElementInStreams(nodeListOfStreamElements) {\n for (const streamElement of nodeListOfStreamElements) {\n const elementWithAutofocus = queryAutofocusableElement(streamElement.templateElement.content);\n\n if (elementWithAutofocus) return elementWithAutofocus\n }\n\n return null\n}\n\nclass StreamObserver {\n sources = new Set()\n #started = false\n\n constructor(delegate) {\n this.delegate = delegate;\n }\n\n start() {\n if (!this.#started) {\n this.#started = true;\n addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n }\n }\n\n stop() {\n if (this.#started) {\n this.#started = false;\n removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n }\n }\n\n connectStreamSource(source) {\n if (!this.streamSourceIsConnected(source)) {\n this.sources.add(source);\n source.addEventListener(\"message\", this.receiveMessageEvent, false);\n }\n }\n\n disconnectStreamSource(source) {\n if (this.streamSourceIsConnected(source)) {\n this.sources.delete(source);\n source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n }\n }\n\n streamSourceIsConnected(source) {\n return this.sources.has(source)\n }\n\n inspectFetchResponse = (event) => {\n const response = fetchResponseFromEvent(event);\n if (response && fetchResponseIsStream(response)) {\n event.preventDefault();\n this.receiveMessageResponse(response);\n }\n }\n\n receiveMessageEvent = (event) => {\n if (this.#started && typeof event.data == \"string\") {\n this.receiveMessageHTML(event.data);\n }\n }\n\n async receiveMessageResponse(response) {\n const html = await response.responseHTML;\n if (html) {\n this.receiveMessageHTML(html);\n }\n }\n\n receiveMessageHTML(html) {\n this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n }\n}\n\nfunction fetchResponseFromEvent(event) {\n const fetchResponse = event.detail?.fetchResponse;\n if (fetchResponse instanceof FetchResponse) {\n return fetchResponse\n }\n}\n\nfunction fetchResponseIsStream(response) {\n const contentType = response.contentType ?? \"\";\n return contentType.startsWith(StreamMessage.contentType)\n}\n\nclass ErrorRenderer extends Renderer {\n static renderElement(currentElement, newElement) {\n const { documentElement, body } = document;\n\n documentElement.replaceChild(newElement, body);\n }\n\n async render() {\n this.replaceHeadAndBody();\n this.activateScriptElements();\n }\n\n replaceHeadAndBody() {\n const { documentElement, head } = document;\n documentElement.replaceChild(this.newHead, head);\n this.renderElement(this.currentElement, this.newElement);\n }\n\n activateScriptElements() {\n for (const replaceableElement of this.scriptElements) {\n const parentNode = replaceableElement.parentNode;\n if (parentNode) {\n const element = activateScriptElement(replaceableElement);\n parentNode.replaceChild(element, replaceableElement);\n }\n }\n }\n\n get newHead() {\n return this.newSnapshot.headSnapshot.element\n }\n\n get scriptElements() {\n return document.documentElement.querySelectorAll(\"script\")\n }\n}\n\nclass PageRenderer extends Renderer {\n static renderElement(currentElement, newElement) {\n if (document.body && newElement instanceof HTMLBodyElement) {\n document.body.replaceWith(newElement);\n } else {\n document.documentElement.appendChild(newElement);\n }\n }\n\n get shouldRender() {\n return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical\n }\n\n get reloadReason() {\n if (!this.newSnapshot.isVisitable) {\n return {\n reason: \"turbo_visit_control_is_reload\"\n }\n }\n\n if (!this.trackedElementsAreIdentical) {\n return {\n reason: \"tracked_element_mismatch\"\n }\n }\n }\n\n async prepareToRender() {\n this.#setLanguage();\n await this.mergeHead();\n }\n\n async render() {\n if (this.willRender) {\n await this.replaceBody();\n }\n }\n\n finishRendering() {\n super.finishRendering();\n if (!this.isPreview) {\n this.focusFirstAutofocusableElement();\n }\n }\n\n get currentHeadSnapshot() {\n return this.currentSnapshot.headSnapshot\n }\n\n get newHeadSnapshot() {\n return this.newSnapshot.headSnapshot\n }\n\n get newElement() {\n return this.newSnapshot.element\n }\n\n #setLanguage() {\n const { documentElement } = this.currentSnapshot;\n const { dir, lang } = this.newSnapshot;\n\n if (lang) {\n documentElement.setAttribute(\"lang\", lang);\n } else {\n documentElement.removeAttribute(\"lang\");\n }\n if (dir) {\n documentElement.setAttribute(\"dir\", dir);\n } else {\n documentElement.removeAttribute(\"dir\");\n }\n }\n\n async mergeHead() {\n const mergedHeadElements = this.mergeProvisionalElements();\n const newStylesheetElements = this.copyNewHeadStylesheetElements();\n this.copyNewHeadScriptElements();\n\n await mergedHeadElements;\n await newStylesheetElements;\n\n if (this.willRender) {\n this.removeUnusedDynamicStylesheetElements();\n }\n }\n\n async replaceBody() {\n await this.preservingPermanentElements(async () => {\n this.activateNewBody();\n await this.assignNewBody();\n });\n }\n\n get trackedElementsAreIdentical() {\n return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature\n }\n\n async copyNewHeadStylesheetElements() {\n const loadingElements = [];\n\n for (const element of this.newHeadStylesheetElements) {\n loadingElements.push(waitForLoad(element));\n\n document.head.appendChild(element);\n }\n\n await Promise.all(loadingElements);\n }\n\n copyNewHeadScriptElements() {\n for (const element of this.newHeadScriptElements) {\n document.head.appendChild(activateScriptElement(element));\n }\n }\n\n removeUnusedDynamicStylesheetElements() {\n for (const element of this.unusedDynamicStylesheetElements) {\n document.head.removeChild(element);\n }\n }\n\n async mergeProvisionalElements() {\n const newHeadElements = [...this.newHeadProvisionalElements];\n\n for (const element of this.currentHeadProvisionalElements) {\n if (!this.isCurrentElementInElementList(element, newHeadElements)) {\n document.head.removeChild(element);\n }\n }\n\n for (const element of newHeadElements) {\n document.head.appendChild(element);\n }\n }\n\n isCurrentElementInElementList(element, elementList) {\n for (const [index, newElement] of elementList.entries()) {\n // if title element...\n if (element.tagName == \"TITLE\") {\n if (newElement.tagName != \"TITLE\") {\n continue\n }\n if (element.innerHTML == newElement.innerHTML) {\n elementList.splice(index, 1);\n return true\n }\n }\n\n // if any other element...\n if (newElement.isEqualNode(element)) {\n elementList.splice(index, 1);\n return true\n }\n }\n\n return false\n }\n\n removeCurrentHeadProvisionalElements() {\n for (const element of this.currentHeadProvisionalElements) {\n document.head.removeChild(element);\n }\n }\n\n copyNewHeadProvisionalElements() {\n for (const element of this.newHeadProvisionalElements) {\n document.head.appendChild(element);\n }\n }\n\n activateNewBody() {\n document.adoptNode(this.newElement);\n this.removeNoscriptElements();\n this.activateNewBodyScriptElements();\n }\n\n removeNoscriptElements() {\n for (const noscriptElement of this.newElement.querySelectorAll(\"noscript\")) {\n noscriptElement.remove();\n }\n }\n\n activateNewBodyScriptElements() {\n for (const inertScriptElement of this.newBodyScriptElements) {\n const activatedScriptElement = activateScriptElement(inertScriptElement);\n inertScriptElement.replaceWith(activatedScriptElement);\n }\n }\n\n async assignNewBody() {\n await this.renderElement(this.currentElement, this.newElement);\n }\n\n get unusedDynamicStylesheetElements() {\n return this.oldHeadStylesheetElements.filter((element) => {\n return element.getAttribute(\"data-turbo-track\") === \"dynamic\"\n })\n }\n\n get oldHeadStylesheetElements() {\n return this.currentHeadSnapshot.getStylesheetElementsNotInSnapshot(this.newHeadSnapshot)\n }\n\n get newHeadStylesheetElements() {\n return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)\n }\n\n get newHeadScriptElements() {\n return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)\n }\n\n get currentHeadProvisionalElements() {\n return this.currentHeadSnapshot.provisionalElements\n }\n\n get newHeadProvisionalElements() {\n return this.newHeadSnapshot.provisionalElements\n }\n\n get newBodyScriptElements() {\n return this.newElement.querySelectorAll(\"script\")\n }\n}\n\nclass MorphingPageRenderer extends PageRenderer {\n static renderElement(currentElement, newElement) {\n morphElements(currentElement, newElement, {\n callbacks: {\n beforeNodeMorphed: (node, newNode) => {\n if (\n shouldRefreshFrameWithMorphing(node, newNode) &&\n !closestFrameReloadableWithMorphing(node)\n ) {\n node.reload();\n return false\n }\n return true\n }\n }\n });\n\n dispatch(\"turbo:morph\", { detail: { currentElement, newElement } });\n }\n\n async preservingPermanentElements(callback) {\n return await callback()\n }\n\n get renderMethod() {\n return \"morph\"\n }\n\n get shouldAutofocus() {\n return false\n }\n}\n\nclass SnapshotCache extends LRUCache {\n constructor(size) {\n super(size, toCacheKey);\n }\n\n get snapshots() {\n return this.entries\n }\n}\n\nclass PageView extends View {\n snapshotCache = new SnapshotCache(10)\n lastRenderedLocation = new URL(location.href)\n forceReloaded = false\n\n shouldTransitionTo(newSnapshot) {\n return this.snapshot.prefersViewTransitions && newSnapshot.prefersViewTransitions\n }\n\n renderPage(snapshot, isPreview = false, willRender = true, visit) {\n const shouldMorphPage = this.isPageRefresh(visit) && (visit?.refresh?.method || this.snapshot.refreshMethod) === \"morph\";\n const rendererClass = shouldMorphPage ? MorphingPageRenderer : PageRenderer;\n\n const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender);\n\n if (!renderer.shouldRender) {\n this.forceReloaded = true;\n } else {\n visit?.changeHistory();\n }\n\n return this.render(renderer)\n }\n\n renderError(snapshot, visit) {\n visit?.changeHistory();\n const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n return this.render(renderer)\n }\n\n clearSnapshotCache() {\n this.snapshotCache.clear();\n }\n\n async cacheSnapshot(snapshot = this.snapshot) {\n if (snapshot.isCacheable) {\n this.delegate.viewWillCacheSnapshot();\n const { lastRenderedLocation: location } = this;\n await nextEventLoopTick();\n const cachedSnapshot = snapshot.clone();\n this.snapshotCache.put(location, cachedSnapshot);\n return cachedSnapshot\n }\n }\n\n getCachedSnapshotForLocation(location) {\n return this.snapshotCache.get(location)\n }\n\n isPageRefresh(visit) {\n return !visit || (this.lastRenderedLocation.pathname === visit.location.pathname && visit.action === \"replace\")\n }\n\n shouldPreserveScrollPosition(visit) {\n return this.isPageRefresh(visit) && (visit?.refresh?.scroll || this.snapshot.refreshScroll) === \"preserve\"\n }\n\n get snapshot() {\n return PageSnapshot.fromElement(this.element)\n }\n}\n\nclass Preloader {\n selector = \"a[data-turbo-preload]\"\n\n constructor(delegate, snapshotCache) {\n this.delegate = delegate;\n this.snapshotCache = snapshotCache;\n }\n\n start() {\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", this.#preloadAll);\n } else {\n this.preloadOnLoadLinksForView(document.body);\n }\n }\n\n stop() {\n document.removeEventListener(\"DOMContentLoaded\", this.#preloadAll);\n }\n\n preloadOnLoadLinksForView(element) {\n for (const link of element.querySelectorAll(this.selector)) {\n if (this.delegate.shouldPreloadLink(link)) {\n this.preloadURL(link);\n }\n }\n }\n\n async preloadURL(link) {\n const location = new URL(link.href);\n\n if (this.snapshotCache.has(location)) {\n return\n }\n\n const fetchRequest = new FetchRequest(this, FetchMethod.get, location, new URLSearchParams(), link);\n await fetchRequest.perform();\n }\n\n // Fetch request delegate\n\n prepareRequest(fetchRequest) {\n fetchRequest.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n }\n\n async requestSucceededWithResponse(fetchRequest, fetchResponse) {\n try {\n const responseHTML = await fetchResponse.responseHTML;\n const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n\n this.snapshotCache.put(fetchRequest.url, snapshot);\n } catch (_) {\n // If we cannot preload that is ok!\n }\n }\n\n requestStarted(fetchRequest) {}\n\n requestErrored(fetchRequest) {}\n\n requestFinished(fetchRequest) {}\n\n requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n #preloadAll = () => {\n this.preloadOnLoadLinksForView(document.body);\n }\n}\n\nclass Cache {\n constructor(session) {\n this.session = session;\n }\n\n clear() {\n this.session.clearCache();\n }\n\n resetCacheControl() {\n this.#setCacheControl(\"\");\n }\n\n exemptPageFromCache() {\n this.#setCacheControl(\"no-cache\");\n }\n\n exemptPageFromPreview() {\n this.#setCacheControl(\"no-preview\");\n }\n\n #setCacheControl(value) {\n setMetaContent(\"turbo-cache-control\", value);\n }\n}\n\nclass Session {\n navigator = new Navigator(this)\n history = new History(this)\n view = new PageView(this, document.documentElement)\n adapter = new BrowserAdapter(this)\n\n pageObserver = new PageObserver(this)\n cacheObserver = new CacheObserver()\n linkPrefetchObserver = new LinkPrefetchObserver(this, document)\n linkClickObserver = new LinkClickObserver(this, window)\n formSubmitObserver = new FormSubmitObserver(this, document)\n scrollObserver = new ScrollObserver(this)\n streamObserver = new StreamObserver(this)\n formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement)\n frameRedirector = new FrameRedirector(this, document.documentElement)\n streamMessageRenderer = new StreamMessageRenderer()\n cache = new Cache(this)\n\n enabled = true\n started = false\n #pageRefreshDebouncePeriod = 150\n\n constructor(recentRequests) {\n this.recentRequests = recentRequests;\n this.preloader = new Preloader(this, this.view.snapshotCache);\n this.debouncedRefresh = this.refresh;\n this.pageRefreshDebouncePeriod = this.pageRefreshDebouncePeriod;\n }\n\n start() {\n if (!this.started) {\n this.pageObserver.start();\n this.cacheObserver.start();\n this.linkPrefetchObserver.start();\n this.formLinkClickObserver.start();\n this.linkClickObserver.start();\n this.formSubmitObserver.start();\n this.scrollObserver.start();\n this.streamObserver.start();\n this.frameRedirector.start();\n this.history.start();\n this.preloader.start();\n this.started = true;\n this.enabled = true;\n }\n }\n\n disable() {\n this.enabled = false;\n }\n\n stop() {\n if (this.started) {\n this.pageObserver.stop();\n this.cacheObserver.stop();\n this.linkPrefetchObserver.stop();\n this.formLinkClickObserver.stop();\n this.linkClickObserver.stop();\n this.formSubmitObserver.stop();\n this.scrollObserver.stop();\n this.streamObserver.stop();\n this.frameRedirector.stop();\n this.history.stop();\n this.preloader.stop();\n this.started = false;\n }\n }\n\n registerAdapter(adapter) {\n this.adapter = adapter;\n }\n\n visit(location, options = {}) {\n const frameElement = options.frame ? document.getElementById(options.frame) : null;\n\n if (frameElement instanceof FrameElement) {\n const action = options.action || getVisitAction(frameElement);\n\n frameElement.delegate.proposeVisitIfNavigatedWithAction(frameElement, action);\n frameElement.src = location.toString();\n } else {\n this.navigator.proposeVisit(expandURL(location), options);\n }\n }\n\n refresh(url, options = {}) {\n options = typeof options === \"string\" ? { requestId: options } : options;\n\n const { method, requestId, scroll } = options;\n const isRecentRequest = requestId && this.recentRequests.has(requestId);\n const isCurrentUrl = url === document.baseURI;\n if (!isRecentRequest && !this.navigator.currentVisit && isCurrentUrl) {\n this.visit(url, { action: \"replace\", shouldCacheSnapshot: false, refresh: { method, scroll } });\n }\n }\n\n connectStreamSource(source) {\n this.streamObserver.connectStreamSource(source);\n }\n\n disconnectStreamSource(source) {\n this.streamObserver.disconnectStreamSource(source);\n }\n\n renderStreamMessage(message) {\n this.streamMessageRenderer.render(StreamMessage.wrap(message));\n }\n\n clearCache() {\n this.view.clearSnapshotCache();\n }\n\n setProgressBarDelay(delay) {\n console.warn(\n \"Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`\"\n );\n\n this.progressBarDelay = delay;\n }\n\n set progressBarDelay(delay) {\n config.drive.progressBarDelay = delay;\n }\n\n get progressBarDelay() {\n return config.drive.progressBarDelay\n }\n\n set drive(value) {\n config.drive.enabled = value;\n }\n\n get drive() {\n return config.drive.enabled\n }\n\n set formMode(value) {\n config.forms.mode = value;\n }\n\n get formMode() {\n return config.forms.mode\n }\n\n get location() {\n return this.history.location\n }\n\n get restorationIdentifier() {\n return this.history.restorationIdentifier\n }\n\n get pageRefreshDebouncePeriod() {\n return this.#pageRefreshDebouncePeriod\n }\n\n set pageRefreshDebouncePeriod(value) {\n this.refresh = debounce(this.debouncedRefresh.bind(this), value);\n this.#pageRefreshDebouncePeriod = value;\n }\n\n // Preloader delegate\n\n shouldPreloadLink(element) {\n const isUnsafe = element.hasAttribute(\"data-turbo-method\");\n const isStream = element.hasAttribute(\"data-turbo-stream\");\n const frameTarget = element.getAttribute(\"data-turbo-frame\");\n const frame = frameTarget == \"_top\" ?\n null :\n document.getElementById(frameTarget) || findClosestRecursively(element, \"turbo-frame:not([disabled])\");\n\n if (isUnsafe || isStream || frame instanceof FrameElement) {\n return false\n } else {\n const location = new URL(element.href);\n\n return this.elementIsNavigatable(element) && locationIsVisitable(location, this.snapshot.rootLocation)\n }\n }\n\n // History delegate\n\n historyPoppedToLocationWithRestorationIdentifierAndDirection(location, restorationIdentifier, direction) {\n if (this.enabled) {\n this.navigator.startVisit(location, restorationIdentifier, {\n action: \"restore\",\n historyChanged: true,\n direction\n });\n } else {\n this.adapter.pageInvalidated({\n reason: \"turbo_disabled\"\n });\n }\n }\n\n historyPoppedWithEmptyState(location) {\n this.history.replace(location);\n this.view.lastRenderedLocation = location;\n this.view.cacheSnapshot();\n }\n\n // Scroll observer delegate\n\n scrollPositionChanged(position) {\n this.history.updateRestorationData({ scrollPosition: position });\n }\n\n // Form click observer delegate\n\n willSubmitFormLinkToLocation(link, location) {\n return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation)\n }\n\n submittedFormLinkToLocation() {}\n\n // Link hover observer delegate\n\n canPrefetchRequestToLocation(link, location) {\n return (\n this.elementIsNavigatable(link) &&\n locationIsVisitable(location, this.snapshot.rootLocation) &&\n this.navigator.linkPrefetchingIsEnabledForLocation(location)\n )\n }\n\n // Link click observer delegate\n\n willFollowLinkToLocation(link, location, event) {\n return (\n this.elementIsNavigatable(link) &&\n locationIsVisitable(location, this.snapshot.rootLocation) &&\n this.applicationAllowsFollowingLinkToLocation(link, location, event)\n )\n }\n\n followedLinkToLocation(link, location) {\n const action = this.getActionForLink(link);\n const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n\n this.visit(location.href, { action, acceptsStreamResponse });\n }\n\n // Navigator delegate\n\n allowsVisitingLocationWithAction(location, action) {\n return this.applicationAllowsVisitingLocation(location)\n }\n\n visitProposedToLocation(location, options) {\n extendURLWithDeprecatedProperties(location);\n this.adapter.visitProposedToLocation(location, options);\n }\n\n // Visit delegate\n\n visitStarted(visit) {\n if (!visit.acceptsStreamResponse) {\n markAsBusy(document.documentElement);\n this.view.markVisitDirection(visit.direction);\n }\n extendURLWithDeprecatedProperties(visit.location);\n this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n }\n\n visitCompleted(visit) {\n this.view.unmarkVisitDirection();\n clearBusyState(document.documentElement);\n this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n }\n\n // Form submit observer delegate\n\n willSubmitForm(form, submitter) {\n const action = getAction$1(form, submitter);\n\n return (\n this.submissionIsNavigatable(form, submitter) &&\n locationIsVisitable(expandURL(action), this.snapshot.rootLocation)\n )\n }\n\n formSubmitted(form, submitter) {\n this.navigator.submitForm(form, submitter);\n }\n\n // Page observer delegate\n\n pageBecameInteractive() {\n this.view.lastRenderedLocation = this.location;\n this.notifyApplicationAfterPageLoad();\n }\n\n pageLoaded() {\n this.history.assumeControlOfScrollRestoration();\n }\n\n pageWillUnload() {\n this.history.relinquishControlOfScrollRestoration();\n }\n\n // Stream observer delegate\n\n receivedMessageFromStream(message) {\n this.renderStreamMessage(message);\n }\n\n // Page view delegate\n\n viewWillCacheSnapshot() {\n this.notifyApplicationBeforeCachingSnapshot();\n }\n\n allowsImmediateRender({ element }, options) {\n const event = this.notifyApplicationBeforeRender(element, options);\n const {\n defaultPrevented,\n detail: { render }\n } = event;\n\n if (this.view.renderer && render) {\n this.view.renderer.renderElement = render;\n }\n\n return !defaultPrevented\n }\n\n viewRenderedSnapshot(_snapshot, _isPreview, renderMethod) {\n this.view.lastRenderedLocation = this.history.location;\n this.notifyApplicationAfterRender(renderMethod);\n }\n\n preloadOnLoadLinksForView(element) {\n this.preloader.preloadOnLoadLinksForView(element);\n }\n\n viewInvalidated(reason) {\n this.adapter.pageInvalidated(reason);\n }\n\n // Frame element\n\n frameLoaded(frame) {\n this.notifyApplicationAfterFrameLoad(frame);\n }\n\n frameRendered(fetchResponse, frame) {\n this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n }\n\n // Application events\n\n applicationAllowsFollowingLinkToLocation(link, location, ev) {\n const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n return !event.defaultPrevented\n }\n\n applicationAllowsVisitingLocation(location) {\n const event = this.notifyApplicationBeforeVisitingLocation(location);\n return !event.defaultPrevented\n }\n\n notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n return dispatch(\"turbo:click\", {\n target: link,\n detail: { url: location.href, originalEvent: event },\n cancelable: true\n })\n }\n\n notifyApplicationBeforeVisitingLocation(location) {\n return dispatch(\"turbo:before-visit\", {\n detail: { url: location.href },\n cancelable: true\n })\n }\n\n notifyApplicationAfterVisitingLocation(location, action) {\n return dispatch(\"turbo:visit\", { detail: { url: location.href, action } })\n }\n\n notifyApplicationBeforeCachingSnapshot() {\n return dispatch(\"turbo:before-cache\")\n }\n\n notifyApplicationBeforeRender(newBody, options) {\n return dispatch(\"turbo:before-render\", {\n detail: { newBody, ...options },\n cancelable: true\n })\n }\n\n notifyApplicationAfterRender(renderMethod) {\n return dispatch(\"turbo:render\", { detail: { renderMethod } })\n }\n\n notifyApplicationAfterPageLoad(timing = {}) {\n return dispatch(\"turbo:load\", {\n detail: { url: this.location.href, timing }\n })\n }\n\n notifyApplicationAfterFrameLoad(frame) {\n return dispatch(\"turbo:frame-load\", { target: frame })\n }\n\n notifyApplicationAfterFrameRender(fetchResponse, frame) {\n return dispatch(\"turbo:frame-render\", {\n detail: { fetchResponse },\n target: frame,\n cancelable: true\n })\n }\n\n // Helpers\n\n submissionIsNavigatable(form, submitter) {\n if (config.forms.mode == \"off\") {\n return false\n } else {\n const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n\n if (config.forms.mode == \"optin\") {\n return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null\n } else {\n return submitterIsNavigatable && this.elementIsNavigatable(form)\n }\n }\n }\n\n elementIsNavigatable(element) {\n const container = findClosestRecursively(element, \"[data-turbo]\");\n const withinFrame = findClosestRecursively(element, \"turbo-frame\");\n\n // Check if Drive is enabled on the session or we're within a Frame.\n if (config.drive.enabled || withinFrame) {\n // Element is navigatable by default, unless `data-turbo=\"false\"`.\n if (container) {\n return container.getAttribute(\"data-turbo\") != \"false\"\n } else {\n return true\n }\n } else {\n // Element isn't navigatable by default, unless `data-turbo=\"true\"`.\n if (container) {\n return container.getAttribute(\"data-turbo\") == \"true\"\n } else {\n return false\n }\n }\n }\n\n // Private\n\n getActionForLink(link) {\n return getVisitAction(link) || \"advance\"\n }\n\n get snapshot() {\n return this.view.snapshot\n }\n}\n\n// Older versions of the Turbo Native adapters referenced the\n// `Location#absoluteURL` property in their implementations of\n// the `Adapter#visitProposedToLocation()` and `#visitStarted()`\n// methods. The Location class has since been removed in favor\n// of the DOM URL API, and accordingly all Adapter methods now\n// receive URL objects.\n//\n// We alias #absoluteURL to #toString() here to avoid crashing\n// older adapters which do not expect URL objects. We should\n// consider removing this support at some point in the future.\n\nfunction extendURLWithDeprecatedProperties(url) {\n Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\n\nconst deprecatedLocationPropertyDescriptors = {\n absoluteURL: {\n get() {\n return this.toString()\n }\n }\n};\n\nconst session = new Session(recentRequests);\n\n// Rename `navigator` to avoid shadowing `window.navigator`\nconst { cache, navigator: sessionNavigator } = session;\n\n/**\n * Starts the main session.\n * This initialises any necessary observers such as those to monitor\n * link interactions.\n */\nfunction start() {\n session.start();\n}\n\n/**\n * Registers an adapter for the main session.\n *\n * @param adapter Adapter to register\n */\nfunction registerAdapter(adapter) {\n session.registerAdapter(adapter);\n}\n\n/**\n * Performs an application visit to the given location.\n *\n * @param location Location to visit (a URL or path)\n * @param options Options to apply\n * @param options.action Type of history navigation to apply (\"restore\",\n * \"replace\" or \"advance\")\n * @param options.historyChanged Specifies whether the browser history has\n * already been changed for this visit or not\n * @param options.referrer Specifies the referrer of this visit such that\n * navigations to the same page will not result in a new history entry.\n * @param options.snapshotHTML Cached snapshot to render\n * @param options.response Response of the specified location\n */\nfunction visit(location, options) {\n session.visit(location, options);\n}\n\n/**\n * Connects a stream source to the main session.\n *\n * @param source Stream source to connect\n */\nfunction connectStreamSource(source) {\n session.connectStreamSource(source);\n}\n\n/**\n * Disconnects a stream source from the main session.\n *\n * @param source Stream source to disconnect\n */\nfunction disconnectStreamSource(source) {\n session.disconnectStreamSource(source);\n}\n\n/**\n * Renders a stream message to the main session by appending it to the\n * current document.\n *\n * @param message Message to render\n */\nfunction renderStreamMessage(message) {\n session.renderStreamMessage(message);\n}\n\n/**\n * Sets the delay after which the progress bar will appear during navigation.\n *\n * The progress bar appears after 500ms by default.\n *\n * Note that this method has no effect when used with the iOS or Android\n * adapters.\n *\n * @param delay Time to delay in milliseconds\n */\nfunction setProgressBarDelay(delay) {\n console.warn(\n \"Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n );\n config.drive.progressBarDelay = delay;\n}\n\nfunction setConfirmMethod(confirmMethod) {\n console.warn(\n \"Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n );\n config.forms.confirm = confirmMethod;\n}\n\nfunction setFormMode(mode) {\n console.warn(\n \"Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n );\n config.forms.mode = mode;\n}\n\n/**\n * Morph the state of the currentBody based on the attributes and contents of\n * the newBody. Morphing body elements may dispatch turbo:morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentBody HTMLBodyElement destination of morphing changes\n * @param newBody HTMLBodyElement source of morphing changes\n */\nfunction morphBodyElements(currentBody, newBody) {\n MorphingPageRenderer.renderElement(currentBody, newBody);\n}\n\n/**\n * Morph the child elements of the currentFrame based on the child elements of\n * the newFrame. Morphing turbo-frame elements may dispatch turbo:before-frame-morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentFrame FrameElement destination of morphing children changes\n * @param newFrame FrameElement source of morphing children changes\n */\nfunction morphTurboFrameElements(currentFrame, newFrame) {\n MorphingFrameRenderer.renderElement(currentFrame, newFrame);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n __proto__: null,\n PageRenderer: PageRenderer,\n PageSnapshot: PageSnapshot,\n FrameRenderer: FrameRenderer,\n fetch: fetchWithTurboHeaders,\n config: config,\n session: session,\n cache: cache,\n navigator: sessionNavigator,\n start: start,\n registerAdapter: registerAdapter,\n visit: visit,\n connectStreamSource: connectStreamSource,\n disconnectStreamSource: disconnectStreamSource,\n renderStreamMessage: renderStreamMessage,\n setProgressBarDelay: setProgressBarDelay,\n setConfirmMethod: setConfirmMethod,\n setFormMode: setFormMode,\n morphBodyElements: morphBodyElements,\n morphTurboFrameElements: morphTurboFrameElements,\n morphChildren: morphChildren,\n morphElements: morphElements\n});\n\nclass TurboFrameMissingError extends Error {}\n\nclass FrameController {\n fetchResponseLoaded = (_fetchResponse) => Promise.resolve()\n #currentFetchRequest = null\n #resolveVisitPromise = () => {}\n #connected = false\n #hasBeenLoaded = false\n #ignoredAttributes = new Set()\n #shouldMorphFrame = false\n action = null\n\n constructor(element) {\n this.element = element;\n this.view = new FrameView(this, this.element);\n this.appearanceObserver = new AppearanceObserver(this, this.element);\n this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n this.linkInterceptor = new LinkInterceptor(this, this.element);\n this.restorationIdentifier = uuid();\n this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n }\n\n // Frame delegate\n\n connect() {\n if (!this.#connected) {\n this.#connected = true;\n if (this.loadingStyle == FrameLoadingStyle.lazy) {\n this.appearanceObserver.start();\n } else {\n this.#loadSourceURL();\n }\n this.formLinkClickObserver.start();\n this.linkInterceptor.start();\n this.formSubmitObserver.start();\n }\n }\n\n disconnect() {\n if (this.#connected) {\n this.#connected = false;\n this.appearanceObserver.stop();\n this.formLinkClickObserver.stop();\n this.linkInterceptor.stop();\n this.formSubmitObserver.stop();\n\n if (!this.element.hasAttribute(\"recurse\")) {\n this.#currentFetchRequest?.cancel();\n }\n }\n }\n\n disabledChanged() {\n if (this.disabled) {\n this.#currentFetchRequest?.cancel();\n } else if (this.loadingStyle == FrameLoadingStyle.eager) {\n this.#loadSourceURL();\n }\n }\n\n sourceURLChanged() {\n if (this.#isIgnoringChangesTo(\"src\")) return\n\n if (!this.sourceURL) {\n this.#currentFetchRequest?.cancel();\n }\n\n if (this.element.isConnected) {\n this.complete = false;\n }\n\n if (this.loadingStyle == FrameLoadingStyle.eager || this.#hasBeenLoaded) {\n this.#loadSourceURL();\n }\n }\n\n sourceURLReloaded() {\n const { refresh, src } = this.element;\n\n this.#shouldMorphFrame = src && refresh === \"morph\";\n\n this.element.removeAttribute(\"complete\");\n this.element.src = null;\n this.element.src = src;\n return this.element.loaded\n }\n\n loadingStyleChanged() {\n if (this.loadingStyle == FrameLoadingStyle.lazy) {\n this.appearanceObserver.start();\n } else {\n this.appearanceObserver.stop();\n this.#loadSourceURL();\n }\n }\n\n async #loadSourceURL() {\n if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n this.element.loaded = this.#visit(expandURL(this.sourceURL));\n this.appearanceObserver.stop();\n await this.element.loaded;\n this.#hasBeenLoaded = true;\n }\n }\n\n async loadResponse(fetchResponse) {\n if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n this.sourceURL = fetchResponse.response.url;\n }\n\n try {\n const html = await fetchResponse.responseHTML;\n if (html) {\n const document = parseHTMLDocument(html);\n const pageSnapshot = PageSnapshot.fromDocument(document);\n\n if (pageSnapshot.isVisitable) {\n await this.#loadFrameResponse(fetchResponse, document);\n } else {\n await this.#handleUnvisitableFrameResponse(fetchResponse);\n }\n }\n } finally {\n this.#shouldMorphFrame = false;\n this.fetchResponseLoaded = () => Promise.resolve();\n }\n }\n\n // Appearance observer delegate\n\n elementAppearedInViewport(element) {\n this.proposeVisitIfNavigatedWithAction(element, getVisitAction(element));\n this.#loadSourceURL();\n }\n\n // Form link click observer delegate\n\n willSubmitFormLinkToLocation(link) {\n return this.#shouldInterceptNavigation(link)\n }\n\n submittedFormLinkToLocation(link, _location, form) {\n const frame = this.#findFrameElement(link);\n if (frame) form.setAttribute(\"data-turbo-frame\", frame.id);\n }\n\n // Link interceptor delegate\n\n shouldInterceptLinkClick(element, _location, _event) {\n return this.#shouldInterceptNavigation(element)\n }\n\n linkClickIntercepted(element, location) {\n this.#navigateFrame(element, location);\n }\n\n // Form submit observer delegate\n\n willSubmitForm(element, submitter) {\n return element.closest(\"turbo-frame\") == this.element && this.#shouldInterceptNavigation(element, submitter)\n }\n\n formSubmitted(element, submitter) {\n if (this.formSubmission) {\n this.formSubmission.stop();\n }\n\n this.formSubmission = new FormSubmission(this, element, submitter);\n\n const { fetchRequest } = this.formSubmission;\n const frame = this.#findFrameElement(element, submitter);\n\n this.prepareRequest(fetchRequest, frame);\n this.formSubmission.start();\n }\n\n // Fetch request delegate\n\n prepareRequest(request, frame = this) {\n request.headers[\"Turbo-Frame\"] = frame.id;\n\n if (this.currentNavigationElement?.hasAttribute(\"data-turbo-stream\")) {\n request.acceptResponseType(StreamMessage.contentType);\n }\n }\n\n requestStarted(_request) {\n markAsBusy(this.element);\n }\n\n requestPreventedHandlingResponse(_request, _response) {\n this.#resolveVisitPromise();\n }\n\n async requestSucceededWithResponse(request, response) {\n await this.loadResponse(response);\n this.#resolveVisitPromise();\n }\n\n async requestFailedWithResponse(request, response) {\n await this.loadResponse(response);\n this.#resolveVisitPromise();\n }\n\n requestErrored(request, error) {\n console.error(error);\n this.#resolveVisitPromise();\n }\n\n requestFinished(_request) {\n clearBusyState(this.element);\n }\n\n // Form submission delegate\n\n formSubmissionStarted({ formElement }) {\n markAsBusy(formElement, this.#findFrameElement(formElement));\n }\n\n formSubmissionSucceededWithResponse(formSubmission, response) {\n const frame = this.#findFrameElement(formSubmission.formElement, formSubmission.submitter);\n\n frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(formSubmission.submitter, formSubmission.formElement, frame));\n frame.delegate.loadResponse(response);\n\n if (!formSubmission.isSafe) {\n session.clearCache();\n }\n }\n\n formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n this.element.delegate.loadResponse(fetchResponse);\n session.clearCache();\n }\n\n formSubmissionErrored(formSubmission, error) {\n console.error(error);\n }\n\n formSubmissionFinished({ formElement }) {\n clearBusyState(formElement, this.#findFrameElement(formElement));\n }\n\n // View delegate\n\n allowsImmediateRender({ element: newFrame }, options) {\n const event = dispatch(\"turbo:before-frame-render\", {\n target: this.element,\n detail: { newFrame, ...options },\n cancelable: true\n });\n\n const {\n defaultPrevented,\n detail: { render }\n } = event;\n\n if (this.view.renderer && render) {\n this.view.renderer.renderElement = render;\n }\n\n return !defaultPrevented\n }\n\n viewRenderedSnapshot(_snapshot, _isPreview, _renderMethod) {}\n\n preloadOnLoadLinksForView(element) {\n session.preloadOnLoadLinksForView(element);\n }\n\n viewInvalidated() {}\n\n // Frame renderer delegate\n\n willRenderFrame(currentElement, _newElement) {\n this.previousFrameElement = currentElement.cloneNode(true);\n }\n\n visitCachedSnapshot = ({ element }) => {\n const frame = element.querySelector(\"#\" + this.element.id);\n\n if (frame && this.previousFrameElement) {\n frame.replaceChildren(...this.previousFrameElement.children);\n }\n\n delete this.previousFrameElement;\n }\n\n // Private\n\n async #loadFrameResponse(fetchResponse, document) {\n const newFrameElement = await this.extractForeignFrameElement(document.body);\n const rendererClass = this.#shouldMorphFrame ? MorphingFrameRenderer : FrameRenderer;\n\n if (newFrameElement) {\n const snapshot = new Snapshot(newFrameElement);\n const renderer = new rendererClass(this, this.view.snapshot, snapshot, false, false);\n if (this.view.renderPromise) await this.view.renderPromise;\n this.changeHistory();\n\n await this.view.render(renderer);\n this.complete = true;\n session.frameRendered(fetchResponse, this.element);\n session.frameLoaded(this.element);\n await this.fetchResponseLoaded(fetchResponse);\n } else if (this.#willHandleFrameMissingFromResponse(fetchResponse)) {\n this.#handleFrameMissingFromResponse(fetchResponse);\n }\n }\n\n async #visit(url) {\n const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n\n this.#currentFetchRequest?.cancel();\n this.#currentFetchRequest = request;\n\n return new Promise((resolve) => {\n this.#resolveVisitPromise = () => {\n this.#resolveVisitPromise = () => {};\n this.#currentFetchRequest = null;\n resolve();\n };\n request.perform();\n })\n }\n\n #navigateFrame(element, url, submitter) {\n const frame = this.#findFrameElement(element, submitter);\n\n frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(submitter, element, frame));\n\n this.#withCurrentNavigationElement(element, () => {\n frame.src = url;\n });\n }\n\n proposeVisitIfNavigatedWithAction(frame, action = null) {\n this.action = action;\n\n if (this.action) {\n const pageSnapshot = PageSnapshot.fromElement(frame).clone();\n const { visitCachedSnapshot } = frame.delegate;\n\n frame.delegate.fetchResponseLoaded = async (fetchResponse) => {\n if (frame.src) {\n const { statusCode, redirected } = fetchResponse;\n const responseHTML = await fetchResponse.responseHTML;\n const response = { statusCode, redirected, responseHTML };\n const options = {\n response,\n visitCachedSnapshot,\n willRender: false,\n updateHistory: false,\n restorationIdentifier: this.restorationIdentifier,\n snapshot: pageSnapshot\n };\n\n if (this.action) options.action = this.action;\n\n session.visit(frame.src, options);\n }\n };\n }\n }\n\n changeHistory() {\n if (this.action) {\n const method = getHistoryMethodForAction(this.action);\n session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n }\n }\n\n async #handleUnvisitableFrameResponse(fetchResponse) {\n console.warn(\n `The response (${fetchResponse.statusCode}) from is performing a full page visit due to turbo-visit-control.`\n );\n\n await this.#visitResponse(fetchResponse.response);\n }\n\n #willHandleFrameMissingFromResponse(fetchResponse) {\n this.element.setAttribute(\"complete\", \"\");\n\n const response = fetchResponse.response;\n const visit = async (url, options) => {\n if (url instanceof Response) {\n this.#visitResponse(url);\n } else {\n session.visit(url, options);\n }\n };\n\n const event = dispatch(\"turbo:frame-missing\", {\n target: this.element,\n detail: { response, visit },\n cancelable: true\n });\n\n return !event.defaultPrevented\n }\n\n #handleFrameMissingFromResponse(fetchResponse) {\n this.view.missing();\n this.#throwFrameMissingError(fetchResponse);\n }\n\n #throwFrameMissingError(fetchResponse) {\n const message = `The response (${fetchResponse.statusCode}) did not contain the expected and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;\n throw new TurboFrameMissingError(message)\n }\n\n async #visitResponse(response) {\n const wrapped = new FetchResponse(response);\n const responseHTML = await wrapped.responseHTML;\n const { location, redirected, statusCode } = wrapped;\n\n return session.visit(location, { response: { redirected, statusCode, responseHTML } })\n }\n\n #findFrameElement(element, submitter) {\n const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n const target = this.#getFrameElementById(id);\n\n return target instanceof FrameElement ? target : this.element\n }\n\n async extractForeignFrameElement(container) {\n let element;\n const id = CSS.escape(this.id);\n\n try {\n element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n if (element) {\n return element\n }\n\n element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n if (element) {\n await element.loaded;\n return await this.extractForeignFrameElement(element)\n }\n } catch (error) {\n console.error(error);\n return new FrameElement()\n }\n\n return null\n }\n\n #formActionIsVisitable(form, submitter) {\n const action = getAction$1(form, submitter);\n\n return locationIsVisitable(expandURL(action), this.rootLocation)\n }\n\n #shouldInterceptNavigation(element, submitter) {\n const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n\n if (element instanceof HTMLFormElement && !this.#formActionIsVisitable(element, submitter)) {\n return false\n }\n\n if (!this.enabled || id == \"_top\") {\n return false\n }\n\n if (id) {\n const frameElement = this.#getFrameElementById(id);\n if (frameElement) {\n return !frameElement.disabled\n } else if (id == \"_parent\") {\n return false\n }\n }\n\n if (!session.elementIsNavigatable(element)) {\n return false\n }\n\n if (submitter && !session.elementIsNavigatable(submitter)) {\n return false\n }\n\n return true\n }\n\n // Computed properties\n\n get id() {\n return this.element.id\n }\n\n get disabled() {\n return this.element.disabled\n }\n\n get enabled() {\n return !this.disabled\n }\n\n get sourceURL() {\n if (this.element.src) {\n return this.element.src\n }\n }\n\n set sourceURL(sourceURL) {\n this.#ignoringChangesToAttribute(\"src\", () => {\n this.element.src = sourceURL ?? null;\n });\n }\n\n get loadingStyle() {\n return this.element.loading\n }\n\n get isLoading() {\n return this.formSubmission !== undefined || this.#resolveVisitPromise() !== undefined\n }\n\n get complete() {\n return this.element.hasAttribute(\"complete\")\n }\n\n set complete(value) {\n if (value) {\n this.element.setAttribute(\"complete\", \"\");\n } else {\n this.element.removeAttribute(\"complete\");\n }\n }\n\n get isActive() {\n return this.element.isActive && this.#connected\n }\n\n get rootLocation() {\n const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n const root = meta?.content ?? \"/\";\n return expandURL(root)\n }\n\n #isIgnoringChangesTo(attributeName) {\n return this.#ignoredAttributes.has(attributeName)\n }\n\n #ignoringChangesToAttribute(attributeName, callback) {\n this.#ignoredAttributes.add(attributeName);\n callback();\n this.#ignoredAttributes.delete(attributeName);\n }\n\n #withCurrentNavigationElement(element, callback) {\n this.currentNavigationElement = element;\n callback();\n delete this.currentNavigationElement;\n }\n\n #getFrameElementById(id) {\n if (id != null) {\n const element = id === \"_parent\" ?\n this.element.parentElement.closest(\"turbo-frame\") :\n document.getElementById(id);\n if (element instanceof FrameElement) {\n return element\n }\n }\n }\n}\n\nfunction activateElement(element, currentURL) {\n if (element) {\n const src = element.getAttribute(\"src\");\n if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n throw new Error(`Matching element has a source URL which references itself`)\n }\n if (element.ownerDocument !== document) {\n element = document.importNode(element, true);\n }\n\n if (element instanceof FrameElement) {\n element.connectedCallback();\n element.disconnectedCallback();\n return element\n }\n }\n}\n\nconst StreamActions = {\n after() {\n this.removeDuplicateTargetSiblings();\n this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e.nextSibling));\n },\n\n append() {\n this.removeDuplicateTargetChildren();\n this.targetElements.forEach((e) => e.append(this.templateContent));\n },\n\n before() {\n this.removeDuplicateTargetSiblings();\n this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e));\n },\n\n prepend() {\n this.removeDuplicateTargetChildren();\n this.targetElements.forEach((e) => e.prepend(this.templateContent));\n },\n\n remove() {\n this.targetElements.forEach((e) => e.remove());\n },\n\n replace() {\n const method = this.getAttribute(\"method\");\n\n this.targetElements.forEach((targetElement) => {\n if (method === \"morph\") {\n morphElements(targetElement, this.templateContent);\n } else {\n targetElement.replaceWith(this.templateContent);\n }\n });\n },\n\n update() {\n const method = this.getAttribute(\"method\");\n\n this.targetElements.forEach((targetElement) => {\n if (method === \"morph\") {\n morphChildren(targetElement, this.templateContent);\n } else {\n targetElement.innerHTML = \"\";\n targetElement.append(this.templateContent);\n }\n });\n },\n\n refresh() {\n const method = this.getAttribute(\"method\");\n const requestId = this.requestId;\n const scroll = this.getAttribute(\"scroll\");\n\n session.refresh(this.baseURI, { method, requestId, scroll });\n }\n};\n\n//