/*! Turbo 8.0.12 Copyright © 2024 37signals LLC */ !function (e) { function t(e, t, s) { throw new e("Failed to execute 'requestSubmit' on 'HTMLFormElement': " + t + ".", s) } "function" != typeof e.requestSubmit && (e.requestSubmit = function (e) { e ? (!function (e, s) { e instanceof HTMLElement || t(TypeError, "parameter 1 is not of type 'HTMLElement'"), "submit" == e.type || t(TypeError, "The specified element is not a submit button"), e.form == s || t(DOMException, "The specified element is not owned by this form element", "NotFoundError") }(e, this), e.click()) : ((e = document.createElement("input")).type = "submit", e.hidden = !0, this.appendChild(e), e.click(), this.removeChild(e)) }) }(HTMLFormElement.prototype); const e = new WeakMap; function t(t) { const s = function (e) { const t = e instanceof Element ? e : e instanceof Node ? e.parentElement : null, s = t ? t.closest("input, button") : null; return "submit" == s?.type ? s : null }(t.target); s && s.form && e.set(s.form, s) } !function () { if ("submitter" in Event.prototype) return; let s = window.Event.prototype; if ("SubmitEvent" in window) { const e = window.SubmitEvent.prototype; if (!/Apple Computer/.test(navigator.vendor) || "submitter" in e) return; s = e } addEventListener("click", t, !0), Object.defineProperty(s, "submitter", { get() { if ("submit" == this.type && this.target instanceof HTMLFormElement) return e.get(this.target) } }) }(); const s = { eager: "eager", lazy: "lazy" }; class r extends HTMLElement { static delegateConstructor = void 0; loaded = Promise.resolve(); static get observedAttributes() { return ["disabled", "loading", "src"] } constructor() { super(), this.delegate = new r.delegateConstructor(this) } connectedCallback() { this.delegate.connect() } disconnectedCallback() { this.delegate.disconnect() } reload() { return this.delegate.sourceURLReloaded() } attributeChangedCallback(e) { "loading" == e ? this.delegate.loadingStyleChanged() : "src" == e ? this.delegate.sourceURLChanged() : "disabled" == e && this.delegate.disabledChanged() } get src() { return this.getAttribute("src") } set src(e) { e ? this.setAttribute("src", e) : this.removeAttribute("src") } get refresh() { return this.getAttribute("refresh") } set refresh(e) { e ? this.setAttribute("refresh", e) : this.removeAttribute("refresh") } get shouldReloadWithMorph() { return this.src && "morph" === this.refresh } get loading() { return function (e) { if ("lazy" === e.toLowerCase()) return s.lazy; return s.eager }(this.getAttribute("loading") || "") } set loading(e) { e ? this.setAttribute("loading", e) : this.removeAttribute("loading") } get disabled() { return this.hasAttribute("disabled") } set disabled(e) { e ? this.setAttribute("disabled", "") : this.removeAttribute("disabled") } get autoscroll() { return this.hasAttribute("autoscroll") } set autoscroll(e) { e ? this.setAttribute("autoscroll", "") : this.removeAttribute("autoscroll") } get complete() { return !this.delegate.isLoading } get isActive() { return this.ownerDocument === document && !this.isPreview } get isPreview() { return this.ownerDocument?.documentElement?.hasAttribute("data-turbo-preview") } } const i = { enabled: !0, progressBarDelay: 500, unvisitableExtensions: new Set([".7z", ".aac", ".apk", ".avi", ".bmp", ".bz2", ".css", ".csv", ".deb", ".dmg", ".doc", ".docx", ".exe", ".gif", ".gz", ".heic", ".heif", ".ico", ".iso", ".jpeg", ".jpg", ".js", ".json", ".m4a", ".mkv", ".mov", ".mp3", ".mp4", ".mpeg", ".mpg", ".msi", ".ogg", ".ogv", ".pdf", ".pkg", ".png", ".ppt", ".pptx", ".rar", ".rtf", ".svg", ".tar", ".tif", ".tiff", ".txt", ".wav", ".webm", ".webp", ".wma", ".wmv", ".xls", ".xlsx", ".xml", ".zip"]) }; function n(e) { if ("false" == e.getAttribute("data-turbo-eval")) return e; { const t = document.createElement("script"), s = E(); return s && (t.nonce = s), t.textContent = e.textContent, t.async = !1, function (e, t) { for (const { name: s, value: r } of t.attributes) e.setAttribute(s, r) }(t, e), t } } function o(e, { target: t, cancelable: s, detail: r } = {}) { const i = new CustomEvent(e, { cancelable: s, bubbles: !0, composed: !0, detail: r }); return t && t.isConnected ? t.dispatchEvent(i) : document.documentElement.dispatchEvent(i), i } function a(e) { e.preventDefault(), e.stopImmediatePropagation() } function c() { return "hidden" === document.visibilityState ? h() : l() } function l() { return new Promise((e => requestAnimationFrame((() => e())))) } function h() { return new Promise((e => setTimeout((() => e()), 0))) } function d(e = "") { return (new DOMParser).parseFromString(e, "text/html") } function u(e, ...t) { const s = function (e, t) { return e.reduce(((e, s, r) => e + s + (null == t[r] ? "" : t[r])), "") }(e, t).replace(/^\n/, "").split("\n"), r = s[0].match(/^\s+/), i = r ? r[0].length : 0; return s.map((e => e.slice(i))).join("\n") } function m() { return Array.from({ length: 36 }).map(((e, t) => 8 == t || 13 == t || 18 == t || 23 == t ? "-" : 14 == t ? "4" : 19 == t ? (Math.floor(4 * Math.random()) + 8).toString(16) : Math.floor(15 * Math.random()).toString(16))).join("") } function p(e, ...t) { for (const s of t.map((t => t?.getAttribute(e)))) if ("string" == typeof s) return s; return null } function f(...e) { for (const t of e) "turbo-frame" == t.localName && t.setAttribute("busy", ""), t.setAttribute("aria-busy", "true") } function g(...e) { for (const t of e) "turbo-frame" == t.localName && t.removeAttribute("busy"), t.removeAttribute("aria-busy") } function b(e, t = 2e3) { return new Promise((s => { const r = () => { e.removeEventListener("error", r), e.removeEventListener("load", r), s() }; e.addEventListener("load", r, { once: !0 }), e.addEventListener("error", r, { once: !0 }), setTimeout(s, t) })) } function v(e) { switch (e) { case "replace": return history.replaceState; case "advance": case "restore": return history.pushState } } function S(...e) { const t = p("data-turbo-action", ...e); return function (e) { return "advance" == e || "replace" == e || "restore" == e }(t) ? t : null } function w(e) { return document.querySelector(`meta[name="${e}"]`) } function y(e) { const t = w(e); return t && t.content } function E() { const e = w("csp-nonce"); if (e) { const { nonce: t, content: s } = e; return "" == t ? s : t } } function A(e, t) { if (e instanceof Element) return e.closest(t) || A(e.assignedSlot || e.getRootNode()?.host, t) } function R(e) { return !!e && null == e.closest("[inert], :disabled, [hidden], details:not([open]), dialog:not([open])") && "function" == typeof e.focus } function T(e) { return Array.from(e.querySelectorAll("[autofocus]")).find(R) } function L(e) { if ("_blank" === e) return !1; if (e) { for (const t of document.getElementsByName(e)) if (t instanceof HTMLIFrameElement) return !1; return !0 } return !0 } function C(e) { return A(e, "a[href]:not([target^=_]):not([download])") } function P(e) { return F(e.getAttribute("href") || "") } const k = { "aria-disabled": { beforeSubmit: e => { e.setAttribute("aria-disabled", "true"), e.addEventListener("click", a) }, afterSubmit: e => { e.removeAttribute("aria-disabled"), e.removeEventListener("click", a) } }, disabled: { beforeSubmit: e => e.disabled = !0, afterSubmit: e => e.disabled = !1 } }; const M = new class { #e = null; constructor(e) { Object.assign(this, e) } get submitter() { return this.#e } set submitter(e) { this.#e = k[e] || e } }({ mode: "on", submitter: "disabled" }), I = { drive: i, forms: M }; function F(e) { return new URL(e.toString(), document.baseURI) } function q(e) { let t; return e.hash ? e.hash.slice(1) : (t = e.href.match(/#(.*)$/)) ? t[1] : void 0 } function H(e, t) { return F(t?.getAttribute("formaction") || e.getAttribute("action") || e.action) } function O(e) { return (function (e) { return function (e) { return e.pathname.split("/").slice(1) }(e).slice(-1)[0] }(e).match(/\.[^.]*$/) || [])[0] || "" } function B(e, t) { const s = function (e) { return t = e.origin + e.pathname, t.endsWith("/") ? t : t + "/"; var t }(t); return e.href === F(s).href || e.href.startsWith(s) } function N(e, t) { return B(e, t) && !I.drive.unvisitableExtensions.has(O(e)) } function D(e) { const t = q(e); return null != t ? e.href.slice(0, -(t.length + 1)) : e.href } function x(e) { return D(e) } class V { constructor(e) { this.response = e } get succeeded() { return this.response.ok } get failed() { return !this.succeeded } get clientError() { return this.statusCode >= 400 && this.statusCode <= 499 } get serverError() { return this.statusCode >= 500 && this.statusCode <= 599 } get redirected() { return this.response.redirected } get location() { return F(this.response.url) } get isHTML() { return this.contentType && this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/) } get statusCode() { return this.response.status } get contentType() { return this.header("Content-Type") } get responseText() { return this.response.clone().text() } get responseHTML() { return this.isHTML ? this.response.clone().text() : Promise.resolve(void 0) } header(e) { return this.response.headers.get(e) } } class W extends Set { constructor(e) { super(), this.maxSize = e } add(e) { if (this.size >= this.maxSize) { const e = this.values().next().value; this.delete(e) } super.add(e) } } const U = new W(20), _ = window.fetch; function $(e, t = {}) { const s = new Headers(t.headers || {}), r = m(); return U.add(r), s.append("X-Turbo-Request-Id", r), _(e, { ...t, headers: s }) } function j(e) { switch (e.toLowerCase()) { case "get": return z.get; case "post": return z.post; case "put": return z.put; case "patch": return z.patch; case "delete": return z.delete } } const z = { get: "get", post: "post", put: "put", patch: "patch", delete: "delete" }; function G(e) { switch (e.toLowerCase()) { case J.multipart: return J.multipart; case J.plain: return J.plain; default: return J.urlEncoded } } const J = { urlEncoded: "application/x-www-form-urlencoded", multipart: "multipart/form-data", plain: "text/plain" }; class X { abortController = new AbortController; #t = e => { }; constructor(e, t, s, r = new URLSearchParams, i = null, n = J.urlEncoded) { const [o, a] = Q(F(s), t, r, n); this.delegate = e, this.url = o, this.target = i, this.fetchOptions = { credentials: "same-origin", redirect: "follow", method: t.toUpperCase(), headers: { ...this.defaultHeaders }, body: a, signal: this.abortSignal, referrer: this.delegate.referrer?.href }, this.enctype = n } get method() { return this.fetchOptions.method } set method(e) { const t = this.isSafe ? this.url.searchParams : this.fetchOptions.body || new FormData, s = j(e) || z.get; this.url.search = ""; const [r, i] = Q(this.url, s, t, this.enctype); this.url = r, this.fetchOptions.body = i, this.fetchOptions.method = s.toUpperCase() } get headers() { return this.fetchOptions.headers } set headers(e) { this.fetchOptions.headers = e } get body() { return this.isSafe ? this.url.searchParams : this.fetchOptions.body } set body(e) { this.fetchOptions.body = e } get location() { return this.url } get params() { return this.url.searchParams } get entries() { return this.body ? Array.from(this.body.entries()) : [] } cancel() { this.abortController.abort() } async perform() { const { fetchOptions: e } = this; this.delegate.prepareRequest(this); const t = await this.#s(e); try { this.delegate.requestStarted(this), t.detail.fetchRequest ? this.response = t.detail.fetchRequest.response : this.response = $(this.url.href, e); const s = await this.response; return await this.receive(s) } catch (e) { if ("AbortError" !== e.name) throw this.#r(e) && this.delegate.requestErrored(this, e), e } finally { this.delegate.requestFinished(this) } } async receive(e) { const t = new V(e); return o("turbo:before-fetch-response", { cancelable: !0, detail: { fetchResponse: t }, target: this.target }).defaultPrevented ? this.delegate.requestPreventedHandlingResponse(this, t) : t.succeeded ? this.delegate.requestSucceededWithResponse(this, t) : this.delegate.requestFailedWithResponse(this, t), t } get defaultHeaders() { return { Accept: "text/html, application/xhtml+xml" } } get isSafe() { return K(this.method) } get abortSignal() { return this.abortController.signal } acceptResponseType(e) { this.headers.Accept = [e, this.headers.Accept].join(", ") } async#s(e) { const t = new Promise((e => this.#t = e)), s = o("turbo:before-fetch-request", { cancelable: !0, detail: { fetchOptions: e, url: this.url, resume: this.#t }, target: this.target }); return this.url = s.detail.url, s.defaultPrevented && await t, s } #r(e) { return !o("turbo:fetch-request-error", { target: this.target, cancelable: !0, detail: { request: this, error: e } }).defaultPrevented } } function K(e) { return j(e) == z.get } function Q(e, t, s, r) { const i = Array.from(s).length > 0 ? new URLSearchParams(Y(s)) : e.searchParams; return K(t) ? [Z(e, i), null] : r == J.urlEncoded ? [e, i] : [e, s] } function Y(e) { const t = []; for (const [s, r] of e) r instanceof File || t.push([s, r]); return t } function Z(e, t) { const s = new URLSearchParams(Y(t)); return e.search = s.toString(), e } class ee { started = !1; constructor(e, t) { this.delegate = e, this.element = t, this.intersectionObserver = new IntersectionObserver(this.intersect) } start() { this.started || (this.started = !0, this.intersectionObserver.observe(this.element)) } stop() { this.started && (this.started = !1, this.intersectionObserver.unobserve(this.element)) } intersect = e => { const t = e.slice(-1)[0]; t?.isIntersecting && this.delegate.elementAppearedInViewport(this.element) } } class te { static contentType = "text/vnd.turbo-stream.html"; static wrap(e) { return "string" == typeof e ? new this(function (e) { const t = document.createElement("template"); return t.innerHTML = e, t.content }(e)) : e } constructor(e) { this.fragment = function (e) { for (const t of e.querySelectorAll("turbo-stream")) { const e = document.importNode(t, !0); for (const t of e.templateElement.content.querySelectorAll("script")) t.replaceWith(n(t)); t.replaceWith(e) } return e }(e) } } const se = new class { #i = null; #n = null; get(e) { if (this.#n && this.#n.url === e && this.#n.expire > Date.now()) return this.#n.request } setLater(e, t, s) { this.clear(), this.#i = setTimeout((() => { t.perform(), this.set(e, t, s), this.#i = null }), 100) } set(e, t, s) { this.#n = { url: e, request: t, expire: new Date((new Date).getTime() + s) } } clear() { this.#i && clearTimeout(this.#i), this.#n = null } }, re = { initialized: "initialized", requesting: "requesting", waiting: "waiting", receiving: "receiving", stopping: "stopping", stopped: "stopped" }; class ie { state = re.initialized; static confirmMethod(e) { return Promise.resolve(confirm(e)) } constructor(e, t, s, r = !1) { const i = function (e, t) { const s = t?.getAttribute("formmethod") || e.getAttribute("method") || ""; return j(s.toLowerCase()) || z.get }(t, s), n = function (e, t) { const s = F(e); K(t) && (s.search = ""); return s }(function (e, t) { const s = "string" == typeof e.action ? e.action : null; return t?.hasAttribute("formaction") ? t.getAttribute("formaction") || "" : e.getAttribute("action") || s || "" }(t, s), i), o = function (e, t) { const s = new FormData(e), r = t?.getAttribute("name"), i = t?.getAttribute("value"); r && s.append(r, i || ""); return s }(t, s), a = function (e, t) { return G(t?.getAttribute("formenctype") || e.enctype) }(t, s); this.delegate = e, this.formElement = t, this.submitter = s, this.fetchRequest = new X(this, i, n, o, t, a), this.mustRedirect = r } get method() { return this.fetchRequest.method } set method(e) { this.fetchRequest.method = e } get action() { return this.fetchRequest.url.toString() } set action(e) { this.fetchRequest.url = F(e) } get body() { return this.fetchRequest.body } get enctype() { return this.fetchRequest.enctype } get isSafe() { return this.fetchRequest.isSafe } get location() { return this.fetchRequest.url } async start() { const { initialized: e, requesting: t } = re, s = p("data-turbo-confirm", this.submitter, this.formElement); if ("string" == typeof s) { const e = "function" == typeof I.forms.confirm ? I.forms.confirm : ie.confirmMethod; if (!await e(s, this.formElement, this.submitter)) return } if (this.state == e) return this.state = t, this.fetchRequest.perform() } stop() { const { stopping: e, stopped: t } = re; if (this.state != e && this.state != t) return this.state = e, this.fetchRequest.cancel(), !0 } prepareRequest(e) { if (!e.isSafe) { const t = function (e) { if (null != e) { const t = (document.cookie ? document.cookie.split("; ") : []).find((t => t.startsWith(e))); if (t) { const e = t.split("=").slice(1).join("="); return e ? decodeURIComponent(e) : void 0 } } }(y("csrf-param")) || y("csrf-token"); t && (e.headers["X-CSRF-Token"] = t) } this.requestAcceptsTurboStreamResponse(e) && e.acceptResponseType(te.contentType) } requestStarted(e) { this.state = re.waiting, this.submitter && I.forms.submitter.beforeSubmit(this.submitter), this.setSubmitsWith(), f(this.formElement), o("turbo:submit-start", { target: this.formElement, detail: { formSubmission: this } }), this.delegate.formSubmissionStarted(this) } requestPreventedHandlingResponse(e, t) { se.clear(), this.result = { success: t.succeeded, fetchResponse: t } } requestSucceededWithResponse(e, t) { if (t.clientError || t.serverError) this.delegate.formSubmissionFailedWithResponse(this, t); else if (se.clear(), this.requestMustRedirect(e) && function (e) { return 200 == e.statusCode && !e.redirected }(t)) { const e = new Error("Form responses must redirect to another location"); this.delegate.formSubmissionErrored(this, e) } else this.state = re.receiving, this.result = { success: !0, fetchResponse: t }, this.delegate.formSubmissionSucceededWithResponse(this, t) } requestFailedWithResponse(e, t) { this.result = { success: !1, fetchResponse: t }, this.delegate.formSubmissionFailedWithResponse(this, t) } requestErrored(e, t) { this.result = { success: !1, error: t }, this.delegate.formSubmissionErrored(this, t) } requestFinished(e) { this.state = re.stopped, this.submitter && I.forms.submitter.afterSubmit(this.submitter), this.resetSubmitterText(), g(this.formElement), o("turbo:submit-end", { target: this.formElement, detail: { formSubmission: this, ...this.result } }), this.delegate.formSubmissionFinished(this) } setSubmitsWith() { if (this.submitter && this.submitsWith) if (this.submitter.matches("button")) this.originalSubmitText = this.submitter.innerHTML, this.submitter.innerHTML = this.submitsWith; else if (this.submitter.matches("input")) { const e = this.submitter; this.originalSubmitText = e.value, e.value = this.submitsWith } } resetSubmitterText() { if (this.submitter && this.originalSubmitText) if (this.submitter.matches("button")) this.submitter.innerHTML = this.originalSubmitText; else if (this.submitter.matches("input")) { this.submitter.value = this.originalSubmitText } } requestMustRedirect(e) { return !e.isSafe && this.mustRedirect } requestAcceptsTurboStreamResponse(e) { return !e.isSafe || function (e, ...t) { return t.some((t => t && t.hasAttribute(e))) }("data-turbo-stream", this.submitter, this.formElement) } get submitsWith() { return this.submitter?.getAttribute("data-turbo-submits-with") } } class ne { constructor(e) { this.element = e } get activeElement() { return this.element.ownerDocument.activeElement } get children() { return [...this.element.children] } hasAnchor(e) { return null != this.getElementForAnchor(e) } getElementForAnchor(e) { return e ? this.element.querySelector(`[id='${e}'], a[name='${e}']`) : null } get isConnected() { return this.element.isConnected } get firstAutofocusableElement() { return T(this.element) } get permanentElements() { return ae(this.element) } getPermanentElementById(e) { return oe(this.element, e) } getPermanentElementMapForSnapshot(e) { const t = {}; for (const s of this.permanentElements) { const { id: r } = s, i = e.getPermanentElementById(r); i && (t[r] = [s, i]) } return t } } function oe(e, t) { return e.querySelector(`#${t}[data-turbo-permanent]`) } function ae(e) { return e.querySelectorAll("[id][data-turbo-permanent]") } class ce { started = !1; constructor(e, t) { this.delegate = e, this.eventTarget = t } start() { this.started || (this.eventTarget.addEventListener("submit", this.submitCaptured, !0), this.started = !0) } stop() { this.started && (this.eventTarget.removeEventListener("submit", this.submitCaptured, !0), this.started = !1) } submitCaptured = () => { this.eventTarget.removeEventListener("submit", this.submitBubbled, !1), this.eventTarget.addEventListener("submit", this.submitBubbled, !1) }; submitBubbled = e => { if (!e.defaultPrevented) { const t = e.target instanceof HTMLFormElement ? e.target : void 0, s = e.submitter || void 0; t && function (e, t) { const s = t?.getAttribute("formmethod") || e.getAttribute("method"); return "dialog" != s }(t, s) && function (e, t) { const s = t?.getAttribute("formtarget") || e.getAttribute("target"); return L(s) }(t, s) && this.delegate.willSubmitForm(t, s) && (e.preventDefault(), e.stopImmediatePropagation(), this.delegate.formSubmitted(t, s)) } } } class le { #o = e => { }; #a = e => { }; constructor(e, t) { this.delegate = e, this.element = t } scrollToAnchor(e) { const t = this.snapshot.getElementForAnchor(e); t ? (this.scrollToElement(t), this.focusElement(t)) : this.scrollToPosition({ x: 0, y: 0 }) } scrollToAnchorFromLocation(e) { this.scrollToAnchor(q(e)) } scrollToElement(e) { e.scrollIntoView() } focusElement(e) { e instanceof HTMLElement && (e.hasAttribute("tabindex") ? e.focus() : (e.setAttribute("tabindex", "-1"), e.focus(), e.removeAttribute("tabindex"))) } scrollToPosition({ x: e, y: t }) { this.scrollRoot.scrollTo(e, t) } scrollToTop() { this.scrollToPosition({ x: 0, y: 0 }) } get scrollRoot() { return window } async render(e) { const { isPreview: t, shouldRender: s, willRender: r, newSnapshot: i } = e, n = r; if (s) try { this.renderPromise = new Promise((e => this.#o = e)), this.renderer = e, await this.prepareToRenderSnapshot(e); const s = new Promise((e => this.#a = e)), r = { resume: this.#a, render: this.renderer.renderElement, renderMethod: this.renderer.renderMethod }; this.delegate.allowsImmediateRender(i, r) || await s, await this.renderSnapshot(e), this.delegate.viewRenderedSnapshot(i, t, this.renderer.renderMethod), this.delegate.preloadOnLoadLinksForView(this.element), this.finishRenderingSnapshot(e) } finally { delete this.renderer, this.#o(void 0), delete this.renderPromise } else n && this.invalidate(e.reloadReason) } invalidate(e) { this.delegate.viewInvalidated(e) } async prepareToRenderSnapshot(e) { this.markAsPreview(e.isPreview), await e.prepareToRender() } markAsPreview(e) { e ? this.element.setAttribute("data-turbo-preview", "") : this.element.removeAttribute("data-turbo-preview") } markVisitDirection(e) { this.element.setAttribute("data-turbo-visit-direction", e) } unmarkVisitDirection() { this.element.removeAttribute("data-turbo-visit-direction") } async renderSnapshot(e) { await e.render() } finishRenderingSnapshot(e) { e.finishRendering() } } class he extends le { missing() { this.element.innerHTML = 'Content missing' } get snapshot() { return new ne(this.element) } } class de { constructor(e, t) { this.delegate = e, this.element = t } start() { this.element.addEventListener("click", this.clickBubbled), document.addEventListener("turbo:click", this.linkClicked), document.addEventListener("turbo:before-visit", this.willVisit) } stop() { this.element.removeEventListener("click", this.clickBubbled), document.removeEventListener("turbo:click", this.linkClicked), document.removeEventListener("turbo:before-visit", this.willVisit) } clickBubbled = e => { this.clickEventIsSignificant(e) ? this.clickEvent = e : delete this.clickEvent }; linkClicked = e => { this.clickEvent && this.clickEventIsSignificant(e) && this.delegate.shouldInterceptLinkClick(e.target, e.detail.url, e.detail.originalEvent) && (this.clickEvent.preventDefault(), e.preventDefault(), this.delegate.linkClickIntercepted(e.target, e.detail.url, e.detail.originalEvent)), delete this.clickEvent }; willVisit = e => { delete this.clickEvent }; clickEventIsSignificant(e) { const t = e.composed ? e.target?.parentElement : e.target, s = C(t) || t; return s instanceof Element && s.closest("turbo-frame, html") == this.element } } class ue { started = !1; constructor(e, t) { this.delegate = e, this.eventTarget = t } start() { this.started || (this.eventTarget.addEventListener("click", this.clickCaptured, !0), this.started = !0) } stop() { this.started && (this.eventTarget.removeEventListener("click", this.clickCaptured, !0), this.started = !1) } clickCaptured = () => { this.eventTarget.removeEventListener("click", this.clickBubbled, !1), this.eventTarget.addEventListener("click", this.clickBubbled, !1) }; clickBubbled = e => { if (e instanceof MouseEvent && this.clickEventIsSignificant(e)) { const t = C(e.composedPath && e.composedPath()[0] || e.target); if (t && L(t.target)) { const s = P(t); this.delegate.willFollowLinkToLocation(t, s, e) && (e.preventDefault(), this.delegate.followedLinkToLocation(t, s)) } } }; clickEventIsSignificant(e) { return !(e.target && e.target.isContentEditable || e.defaultPrevented || e.which > 1 || e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) } } class me { constructor(e, t) { this.delegate = e, this.linkInterceptor = new ue(this, t) } start() { this.linkInterceptor.start() } stop() { this.linkInterceptor.stop() } canPrefetchRequestToLocation(e, t) { return !1 } prefetchAndCacheRequestToLocation(e, t) { } willFollowLinkToLocation(e, t, s) { return this.delegate.willSubmitFormLinkToLocation(e, t, s) && (e.hasAttribute("data-turbo-method") || e.hasAttribute("data-turbo-stream")) } followedLinkToLocation(e, t) { const s = document.createElement("form"); for (const [e, r] of t.searchParams) s.append(Object.assign(document.createElement("input"), { type: "hidden", name: e, value: r })); const r = Object.assign(t, { search: "" }); s.setAttribute("data-turbo", "true"), s.setAttribute("action", r.href), s.setAttribute("hidden", ""); const i = e.getAttribute("data-turbo-method"); i && s.setAttribute("method", i); const n = e.getAttribute("data-turbo-frame"); n && s.setAttribute("data-turbo-frame", n); const o = S(e); o && s.setAttribute("data-turbo-action", o); const a = e.getAttribute("data-turbo-confirm"); a && s.setAttribute("data-turbo-confirm", a); e.hasAttribute("data-turbo-stream") && s.setAttribute("data-turbo-stream", ""), this.delegate.submittedFormLinkToLocation(e, t, s), document.body.appendChild(s), s.addEventListener("turbo:submit-end", (() => s.remove()), { once: !0 }), requestAnimationFrame((() => s.requestSubmit())) } } class pe { static async preservingPermanentElements(e, t, s) { const r = new this(e, t); r.enter(), await s(), r.leave() } constructor(e, t) { this.delegate = e, this.permanentElementMap = t } enter() { for (const e in this.permanentElementMap) { const [t, s] = this.permanentElementMap[e]; this.delegate.enteringBardo(t, s), this.replaceNewPermanentElementWithPlaceholder(s) } } leave() { for (const e in this.permanentElementMap) { const [t] = this.permanentElementMap[e]; this.replaceCurrentPermanentElementWithClone(t), this.replacePlaceholderWithPermanentElement(t), this.delegate.leavingBardo(t) } } replaceNewPermanentElementWithPlaceholder(e) { const t = function (e) { const t = document.createElement("meta"); return t.setAttribute("name", "turbo-permanent-placeholder"), t.setAttribute("content", e.id), t }(e); e.replaceWith(t) } replaceCurrentPermanentElementWithClone(e) { const t = e.cloneNode(!0); e.replaceWith(t) } replacePlaceholderWithPermanentElement(e) { const t = this.getPlaceholderById(e.id); t?.replaceWith(e) } getPlaceholderById(e) { return this.placeholders.find((t => t.content == e)) } get placeholders() { return [...document.querySelectorAll("meta[name=turbo-permanent-placeholder][content]")] } } class fe { #c = null; static renderElement(e, t) { } constructor(e, t, s, r = !0) { this.currentSnapshot = e, this.newSnapshot = t, this.isPreview = s, this.willRender = r, this.renderElement = this.constructor.renderElement, this.promise = new Promise(((e, t) => this.resolvingFunctions = { resolve: e, reject: t })) } get shouldRender() { return !0 } get shouldAutofocus() { return !0 } get reloadReason() { } prepareToRender() { } render() { } finishRendering() { this.resolvingFunctions && (this.resolvingFunctions.resolve(), delete this.resolvingFunctions) } async preservingPermanentElements(e) { await pe.preservingPermanentElements(this, this.permanentElementMap, e) } focusFirstAutofocusableElement() { if (this.shouldAutofocus) { const e = this.connectedSnapshot.firstAutofocusableElement; e && e.focus() } } enteringBardo(e) { this.#c || e.contains(this.currentSnapshot.activeElement) && (this.#c = this.currentSnapshot.activeElement) } leavingBardo(e) { e.contains(this.#c) && this.#c instanceof HTMLElement && (this.#c.focus(), this.#c = null) } get connectedSnapshot() { return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot } get currentElement() { return this.currentSnapshot.element } get newElement() { return this.newSnapshot.element } get permanentElementMap() { return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot) } get renderMethod() { return "replace" } } class ge extends fe { static renderElement(e, t) { const s = document.createRange(); s.selectNodeContents(e), s.deleteContents(); const r = t, i = r.ownerDocument?.createRange(); i && (i.selectNodeContents(r), e.appendChild(i.extractContents())) } constructor(e, t, s, r, i, n = !0) { super(t, s, r, i, n), this.delegate = e } get shouldRender() { return !0 } async render() { await c(), this.preservingPermanentElements((() => { this.loadFrameElement() })), this.scrollFrameIntoView(), await c(), this.focusFirstAutofocusableElement(), await c(), this.activateScriptElements() } loadFrameElement() { this.delegate.willRenderFrame(this.currentElement, this.newElement), this.renderElement(this.currentElement, this.newElement) } scrollFrameIntoView() { if (this.currentElement.autoscroll || this.newElement.autoscroll) { const s = this.currentElement.firstElementChild, r = (e = this.currentElement.getAttribute("data-autoscroll-block"), t = "end", "end" == e || "start" == e || "center" == e || "nearest" == e ? e : t), i = function (e, t) { return "auto" == e || "smooth" == e ? e : t }(this.currentElement.getAttribute("data-autoscroll-behavior"), "auto"); if (s) return s.scrollIntoView({ block: r, behavior: i }), !0 } var e, t; return !1 } activateScriptElements() { for (const e of this.newScriptElements) { const t = n(e); e.replaceWith(t) } } get newScriptElements() { return this.currentElement.querySelectorAll("script") } } var be = function () { let e = new Set, t = { morphStyle: "outerHTML", callbacks: { beforeNodeAdded: l, afterNodeAdded: l, beforeNodeMorphed: l, afterNodeMorphed: l, beforeNodeRemoved: l, afterNodeRemoved: l, beforeAttributeUpdated: l }, head: { style: "merge", shouldPreserve: function (e) { return "true" === e.getAttribute("im-preserve") }, shouldReAppend: function (e) { return "true" === e.getAttribute("im-re-append") }, shouldRemove: l, afterHeadMorphed: l } }; function s(e, t, r) { if (r.head.block) { let i = e.querySelector("head"), n = t.querySelector("head"); if (i && n) { let o = c(n, i, r); return void Promise.all(o).then((function () { s(e, t, Object.assign(r, { head: { block: !1, ignore: !0 } })) })) } } if ("innerHTML" === r.morphStyle) return n(t, e, r), e.children; if ("outerHTML" === r.morphStyle || null == r.morphStyle) { let s = function (e, t, s) { let r; r = e.firstChild; let i = r, n = 0; for (; r;) { let e = f(r, t, s); e > n && (i = r, n = e), r = r.nextSibling } return i }(t, e, r), n = s?.previousSibling, o = s?.nextSibling, a = i(e, s, r); return s ? function (e, t, s) { let r = [], i = []; for (; null != e;)r.push(e), e = e.previousSibling; for (; r.length > 0;) { let e = r.pop(); i.push(e), t.parentElement.insertBefore(e, t) } i.push(t); for (; null != s;)r.push(s), i.push(s), s = s.nextSibling; for (; r.length > 0;)t.parentElement.insertBefore(r.pop(), t.nextSibling); return i }(n, a, o) : [] } throw "Do not understand how to morph style " + r.morphStyle } function r(e, t) { return t.ignoreActiveValue && e === document.activeElement && e !== document.body } function i(e, t, s) { if (!s.ignoreActive || e !== document.activeElement) return null == t ? !1 === s.callbacks.beforeNodeRemoved(e) ? e : (e.remove(), s.callbacks.afterNodeRemoved(e), null) : d(e, t) ? (!1 === s.callbacks.beforeNodeMorphed(e, t) || (e instanceof HTMLHeadElement && s.head.ignore || (e instanceof HTMLHeadElement && "morph" !== s.head.style ? c(t, e, s) : (!function (e, t, s) { let i = e.nodeType; if (1 === i) { const r = e.attributes, i = t.attributes; for (const e of r) o(e.name, t, "update", s) || t.getAttribute(e.name) !== e.value && t.setAttribute(e.name, e.value); for (let r = i.length - 1; 0 <= r; r--) { const n = i[r]; o(n.name, t, "remove", s) || (e.hasAttribute(n.name) || t.removeAttribute(n.name)) } } 8 !== i && 3 !== i || t.nodeValue !== e.nodeValue && (t.nodeValue = e.nodeValue); r(t, s) || function (e, t, s) { if (e instanceof HTMLInputElement && t instanceof HTMLInputElement && "file" !== e.type) { let r = e.value, i = t.value; a(e, t, "checked", s), a(e, t, "disabled", s), e.hasAttribute("value") ? r !== i && (o("value", t, "update", s) || (t.setAttribute("value", r), t.value = r)) : o("value", t, "remove", s) || (t.value = "", t.removeAttribute("value")) } else if (e instanceof HTMLOptionElement) a(e, t, "selected", s); else if (e instanceof HTMLTextAreaElement && t instanceof HTMLTextAreaElement) { let r = e.value, i = t.value; if (o("value", t, "update", s)) return; r !== i && (t.value = r), t.firstChild && t.firstChild.nodeValue !== r && (t.firstChild.nodeValue = r) } }(e, t, s) }(t, e, s), r(e, s) || n(t, e, s))), s.callbacks.afterNodeMorphed(e, t)), e) : !1 === s.callbacks.beforeNodeRemoved(e) || !1 === s.callbacks.beforeNodeAdded(t) ? e : (e.parentElement.replaceChild(t, e), s.callbacks.afterNodeAdded(t), s.callbacks.afterNodeRemoved(e), t) } function n(e, t, s) { let r, n = e.firstChild, o = t.firstChild; for (; n;) { if (r = n, n = r.nextSibling, null == o) { if (!1 === s.callbacks.beforeNodeAdded(r)) return; t.appendChild(r), s.callbacks.afterNodeAdded(r), S(s, r); continue } if (h(r, o, s)) { i(o, r, s), o = o.nextSibling, S(s, r); continue } let a = m(e, t, r, o, s); if (a) { o = u(o, a, s), i(a, r, s), S(s, r); continue } let c = p(e, t, r, o, s); if (c) o = u(o, c, s), i(c, r, s), S(s, r); else { if (!1 === s.callbacks.beforeNodeAdded(r)) return; t.insertBefore(r, o), s.callbacks.afterNodeAdded(r), S(s, r) } } for (; null !== o;) { let e = o; o = o.nextSibling, g(e, s) } } function o(e, t, s, r) { return !("value" !== e || !r.ignoreActiveValue || t !== document.activeElement) || !1 === r.callbacks.beforeAttributeUpdated(e, t, s) } function a(e, t, s, r) { if (e[s] !== t[s]) { let i = o(s, t, "update", r); i || (t[s] = e[s]), e[s] ? i || t.setAttribute(s, e[s]) : o(s, t, "remove", r) || t.removeAttribute(s) } } function c(e, t, s) { let r = [], i = [], n = [], o = [], a = s.head.style, c = new Map; for (const t of e.children) c.set(t.outerHTML, t); for (const e of t.children) { let t = c.has(e.outerHTML), r = s.head.shouldReAppend(e), l = s.head.shouldPreserve(e); t || l ? r ? i.push(e) : (c.delete(e.outerHTML), n.push(e)) : "append" === a ? r && (i.push(e), o.push(e)) : !1 !== s.head.shouldRemove(e) && i.push(e) } o.push(...c.values()); let l = []; for (const e of o) { let i = document.createRange().createContextualFragment(e.outerHTML).firstChild; if (!1 !== s.callbacks.beforeNodeAdded(i)) { if (i.href || i.src) { let e = null, t = new Promise((function (t) { e = t })); i.addEventListener("load", (function () { e() })), l.push(t) } t.appendChild(i), s.callbacks.afterNodeAdded(i), r.push(i) } } for (const e of i) !1 !== s.callbacks.beforeNodeRemoved(e) && (t.removeChild(e), s.callbacks.afterNodeRemoved(e)); return s.head.afterHeadMorphed(t, { added: r, kept: n, removed: i }), l } function l() { } function h(e, t, s) { return null != e && null != t && (e.nodeType === t.nodeType && e.tagName === t.tagName && ("" !== e.id && e.id === t.id || w(s, e, t) > 0)) } function d(e, t) { return null != e && null != t && (e.nodeType === t.nodeType && e.tagName === t.tagName) } function u(e, t, s) { for (; e !== t;) { let t = e; e = e.nextSibling, g(t, s) } return S(s, t), t.nextSibling } function m(e, t, s, r, i) { let n = w(i, s, t); if (n > 0) { let t = r, o = 0; for (; null != t;) { if (h(s, t, i)) return t; if (o += w(i, t, e), o > n) return null; t = t.nextSibling } } return null } function p(e, t, s, r, i) { let n = r, o = s.nextSibling, a = 0; for (; null != n;) { if (w(i, n, e) > 0) return null; if (d(s, n)) return n; if (d(o, n) && (a++, o = o.nextSibling, a >= 2)) return null; n = n.nextSibling } return n } function f(e, t, s) { return d(e, t) ? .5 + w(s, e, t) : 0 } function g(e, t) { S(t, e), !1 !== t.callbacks.beforeNodeRemoved(e) && (e.remove(), t.callbacks.afterNodeRemoved(e)) } function b(e, t) { return !e.deadIds.has(t) } function v(t, s, r) { return (t.idMap.get(r) || e).has(s) } function S(t, s) { let r = t.idMap.get(s) || e; for (const e of r) t.deadIds.add(e) } function w(t, s, r) { let i = t.idMap.get(s) || e, n = 0; for (const e of i) b(t, e) && v(t, e, r) && ++n; return n } function y(e, t) { let s = e.parentElement, r = e.querySelectorAll("[id]"); for (const e of r) { let r = e; for (; r !== s && null != r;) { let s = t.get(r); null == s && (s = new Set, t.set(r, s)), s.add(e.id), r = r.parentElement } } } function E(e, t) { let s = new Map; return y(e, s), y(t, s), s } return { morph: function (e, r, i = {}) { e instanceof Document && (e = e.documentElement), "string" == typeof r && (r = function (e) { let t = new DOMParser, s = e.replace(/]*>|>)([\s\S]*?)<\/svg>/gim, ""); if (s.match(/<\/html>/) || s.match(/<\/head>/) || s.match(/<\/body>/)) { let r = t.parseFromString(e, "text/html"); if (s.match(/<\/html>/)) return r.generatedByIdiomorph = !0, r; { let e = r.firstChild; return e ? (e.generatedByIdiomorph = !0, e) : null } } { let s = t.parseFromString("", "text/html").body.querySelector("template").content; return s.generatedByIdiomorph = !0, s } }(r)); let n = function (e) { if (null == e) { return document.createElement("div") } if (e.generatedByIdiomorph) return e; if (e instanceof Node) { const t = document.createElement("div"); return t.append(e), t } { const t = document.createElement("div"); for (const s of [...e]) t.append(s); return t } }(r), o = function (e, s, r) { return r = function (e) { let s = {}; return Object.assign(s, t), Object.assign(s, e), s.callbacks = {}, Object.assign(s.callbacks, t.callbacks), Object.assign(s.callbacks, e.callbacks), s.head = {}, Object.assign(s.head, t.head), Object.assign(s.head, e.head), s }(r), { target: e, newContent: s, config: r, morphStyle: r.morphStyle, ignoreActive: r.ignoreActive, ignoreActiveValue: r.ignoreActiveValue, idMap: E(e, s), deadIds: new Set, callbacks: r.callbacks, head: r.head } }(e, n, i); return s(e, n, o) }, defaults: t } }(); function ve(e, t, { callbacks: s, ...r } = {}) { be.morph(e, t, { ...r, callbacks: new we(s) }) } function Se(e, t) { ve(e, t.children, { morphStyle: "innerHTML" }) } class we { #l; constructor({ beforeNodeMorphed: e } = {}) { this.#l = e || (() => !0) } beforeNodeAdded = e => !(e.id && e.hasAttribute("data-turbo-permanent") && document.getElementById(e.id)); beforeNodeMorphed = (e, t) => { if (e instanceof Element) { if (!e.hasAttribute("data-turbo-permanent") && this.#l(e, t)) { return !o("turbo:before-morph-element", { cancelable: !0, target: e, detail: { currentElement: e, newElement: t } }).defaultPrevented } return !1 } }; beforeAttributeUpdated = (e, t, s) => !o("turbo:before-morph-attribute", { cancelable: !0, target: t, detail: { attributeName: e, mutationType: s } }).defaultPrevented; beforeNodeRemoved = e => this.beforeNodeMorphed(e); afterNodeMorphed = (e, t) => { e instanceof Element && o("turbo:morph-element", { target: e, detail: { currentElement: e, newElement: t } }) } } class ye extends ge { static renderElement(e, t) { o("turbo:before-frame-morph", { target: e, detail: { currentElement: e, newElement: t } }), Se(e, t) } async preservingPermanentElements(e) { return await e() } } class Ee { static animationDuration = 300; static get defaultCSS() { return u` .turbo-progress-bar { position: fixed; display: block; top: 0; left: 0; height: 3px; background: #0076ff; z-index: 2147483647; transition: width ${Ee.animationDuration}ms ease-out, opacity ${Ee.animationDuration / 2}ms ${Ee.animationDuration / 2}ms ease-in; transform: translate3d(0, 0, 0); } `} hiding = !1; value = 0; visible = !1; constructor() { this.stylesheetElement = this.createStylesheetElement(), this.progressElement = this.createProgressElement(), this.installStylesheetElement(), this.setValue(0) } show() { this.visible || (this.visible = !0, this.installProgressElement(), this.startTrickling()) } hide() { this.visible && !this.hiding && (this.hiding = !0, this.fadeProgressElement((() => { this.uninstallProgressElement(), this.stopTrickling(), this.visible = !1, this.hiding = !1 }))) } setValue(e) { this.value = e, this.refresh() } installStylesheetElement() { document.head.insertBefore(this.stylesheetElement, document.head.firstChild) } installProgressElement() { this.progressElement.style.width = "0", this.progressElement.style.opacity = "1", document.documentElement.insertBefore(this.progressElement, document.body), this.refresh() } fadeProgressElement(e) { this.progressElement.style.opacity = "0", setTimeout(e, 1.5 * Ee.animationDuration) } uninstallProgressElement() { this.progressElement.parentNode && document.documentElement.removeChild(this.progressElement) } startTrickling() { this.trickleInterval || (this.trickleInterval = window.setInterval(this.trickle, Ee.animationDuration)) } stopTrickling() { window.clearInterval(this.trickleInterval), delete this.trickleInterval } trickle = () => { this.setValue(this.value + Math.random() / 100) }; refresh() { requestAnimationFrame((() => { this.progressElement.style.width = 10 + 90 * this.value + "%" })) } createStylesheetElement() { const e = document.createElement("style"); e.type = "text/css", e.textContent = Ee.defaultCSS; const t = E(); return t && (e.nonce = t), e } createProgressElement() { const e = document.createElement("div"); return e.className = "turbo-progress-bar", e } } class Ae extends ne { detailsByOuterHTML = this.children.filter((e => !function (e) { const t = e.localName; return "noscript" == t }(e))).map((e => function (e) { e.hasAttribute("nonce") && e.setAttribute("nonce", ""); return e }(e))).reduce(((e, t) => { const { outerHTML: s } = t, r = s in e ? e[s] : { type: Re(t), tracked: Te(t), elements: [] }; return { ...e, [s]: { ...r, elements: [...r.elements, t] } } }), {}); get trackedElementSignature() { return Object.keys(this.detailsByOuterHTML).filter((e => this.detailsByOuterHTML[e].tracked)).join("") } getScriptElementsNotInSnapshot(e) { return this.getElementsMatchingTypeNotInSnapshot("script", e) } getStylesheetElementsNotInSnapshot(e) { return this.getElementsMatchingTypeNotInSnapshot("stylesheet", e) } getElementsMatchingTypeNotInSnapshot(e, t) { return Object.keys(this.detailsByOuterHTML).filter((e => !(e in t.detailsByOuterHTML))).map((e => this.detailsByOuterHTML[e])).filter((({ type: t }) => t == e)).map((({ elements: [e] }) => e)) } get provisionalElements() { return Object.keys(this.detailsByOuterHTML).reduce(((e, t) => { const { type: s, tracked: r, elements: i } = this.detailsByOuterHTML[t]; return null != s || r ? i.length > 1 ? [...e, ...i.slice(1)] : e : [...e, ...i] }), []) } getMetaValue(e) { const t = this.findMetaElementByName(e); return t ? t.getAttribute("content") : null } findMetaElementByName(e) { return Object.keys(this.detailsByOuterHTML).reduce(((t, s) => { const { elements: [r] } = this.detailsByOuterHTML[s]; return function (e, t) { const s = e.localName; return "meta" == s && e.getAttribute("name") == t }(r, e) ? r : t }), 0) } } function Re(e) { return function (e) { const t = e.localName; return "script" == t }(e) ? "script" : function (e) { const t = e.localName; return "style" == t || "link" == t && "stylesheet" == e.getAttribute("rel") }(e) ? "stylesheet" : void 0 } function Te(e) { return "reload" == e.getAttribute("data-turbo-track") } class Le extends ne { static fromHTMLString(e = "") { return this.fromDocument(d(e)) } static fromElement(e) { return this.fromDocument(e.ownerDocument) } static fromDocument({ documentElement: e, body: t, head: s }) { return new this(e, t, new Ae(s)) } constructor(e, t, s) { super(t), this.documentElement = e, this.headSnapshot = s } clone() { const e = this.element.cloneNode(!0), t = this.element.querySelectorAll("select"), s = e.querySelectorAll("select"); for (const [e, r] of t.entries()) { const t = s[e]; for (const e of t.selectedOptions) e.selected = !1; for (const e of r.selectedOptions) t.options[e.index].selected = !0 } for (const t of e.querySelectorAll('input[type="password"]')) t.value = ""; return new Le(this.documentElement, e, this.headSnapshot) } get lang() { return this.documentElement.getAttribute("lang") } get headElement() { return this.headSnapshot.element } get rootLocation() { return F(this.getSetting("root") ?? "/") } get cacheControlValue() { return this.getSetting("cache-control") } get isPreviewable() { return "no-preview" != this.cacheControlValue } get isCacheable() { return "no-cache" != this.cacheControlValue } get isVisitable() { return "reload" != this.getSetting("visit-control") } get prefersViewTransitions() { return "same-origin" === this.headSnapshot.getMetaValue("view-transition") } get shouldMorphPage() { return "morph" === this.getSetting("refresh-method") } get shouldPreserveScrollPosition() { return "preserve" === this.getSetting("refresh-scroll") } getSetting(e) { return this.headSnapshot.getMetaValue(`turbo-${e}`) } } class Ce { #h = !1; #d = Promise.resolve(); renderChange(e, t) { return e && this.viewTransitionsAvailable && !this.#h ? (this.#h = !0, this.#d = this.#d.then((async () => { await document.startViewTransition(t).finished }))) : this.#d = this.#d.then(t), this.#d } get viewTransitionsAvailable() { return document.startViewTransition } } const Pe = { action: "advance", historyChanged: !1, visitCachedSnapshot: () => { }, willRender: !0, updateHistory: !0, shouldCacheSnapshot: !0, acceptsStreamResponse: !1 }, ke = "visitStart", Me = "requestStart", Ie = "requestEnd", Fe = "visitEnd", qe = "initialized", He = "started", Oe = "canceled", Be = "failed", Ne = "completed", De = 0, xe = -1, Ve = -2, We = { advance: "forward", restore: "back", replace: "none" }; class Ue { identifier = m(); timingMetrics = {}; followedRedirect = !1; historyChanged = !1; scrolled = !1; shouldCacheSnapshot = !0; acceptsStreamResponse = !1; snapshotCached = !1; state = qe; viewTransitioner = new Ce; constructor(e, t, s, r = {}) { this.delegate = e, this.location = t, this.restorationIdentifier = s || m(); const { action: i, historyChanged: n, referrer: o, snapshot: a, snapshotHTML: c, response: l, visitCachedSnapshot: h, willRender: d, updateHistory: u, shouldCacheSnapshot: p, acceptsStreamResponse: f, direction: g } = { ...Pe, ...r }; this.action = i, this.historyChanged = n, this.referrer = o, this.snapshot = a, this.snapshotHTML = c, this.response = l, this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action), this.isPageRefresh = this.view.isPageRefresh(this), this.visitCachedSnapshot = h, this.willRender = d, this.updateHistory = u, this.scrolled = !d, this.shouldCacheSnapshot = p, this.acceptsStreamResponse = f, this.direction = g || We[i] } get adapter() { return this.delegate.adapter } get view() { return this.delegate.view } get history() { return this.delegate.history } get restorationData() { return this.history.getRestorationDataForIdentifier(this.restorationIdentifier) } get silent() { return this.isSamePage } start() { this.state == qe && (this.recordTimingMetric(ke), this.state = He, this.adapter.visitStarted(this), this.delegate.visitStarted(this)) } cancel() { this.state == He && (this.request && this.request.cancel(), this.cancelRender(), this.state = Oe) } complete() { this.state == He && (this.recordTimingMetric(Fe), this.adapter.visitCompleted(this), this.state = Ne, this.followRedirect(), this.followedRedirect || this.delegate.visitCompleted(this)) } fail() { this.state == He && (this.state = Be, this.adapter.visitFailed(this), this.delegate.visitCompleted(this)) } changeHistory() { if (!this.historyChanged && this.updateHistory) { const e = v(this.location.href === this.referrer?.href ? "replace" : this.action); this.history.update(e, this.location, this.restorationIdentifier), this.historyChanged = !0 } } issueRequest() { this.hasPreloadedResponse() ? this.simulateRequest() : this.shouldIssueRequest() && !this.request && (this.request = new X(this, z.get, this.location), this.request.perform()) } simulateRequest() { this.response && (this.startRequest(), this.recordResponse(), this.finishRequest()) } startRequest() { this.recordTimingMetric(Me), this.adapter.visitRequestStarted(this) } recordResponse(e = this.response) { if (this.response = e, e) { const { statusCode: t } = e; _e(t) ? this.adapter.visitRequestCompleted(this) : this.adapter.visitRequestFailedWithStatusCode(this, t) } } finishRequest() { this.recordTimingMetric(Ie), this.adapter.visitRequestFinished(this) } loadResponse() { if (this.response) { const { statusCode: e, responseHTML: t } = this.response; this.render((async () => { if (this.shouldCacheSnapshot && this.cacheSnapshot(), this.view.renderPromise && await this.view.renderPromise, _e(e) && null != t) { const e = Le.fromHTMLString(t); await this.renderPageSnapshot(e, !1), this.adapter.visitRendered(this), this.complete() } else await this.view.renderError(Le.fromHTMLString(t), this), this.adapter.visitRendered(this), this.fail() })) } } getCachedSnapshot() { const e = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot(); if (e && (!q(this.location) || e.hasAnchor(q(this.location))) && ("restore" == this.action || e.isPreviewable)) return e } getPreloadedSnapshot() { if (this.snapshotHTML) return Le.fromHTMLString(this.snapshotHTML) } hasCachedSnapshot() { return null != this.getCachedSnapshot() } loadCachedSnapshot() { const e = this.getCachedSnapshot(); if (e) { const t = this.shouldIssueRequest(); this.render((async () => { this.cacheSnapshot(), this.isSamePage || this.isPageRefresh ? this.adapter.visitRendered(this) : (this.view.renderPromise && await this.view.renderPromise, await this.renderPageSnapshot(e, t), this.adapter.visitRendered(this), t || this.complete()) })) } } followRedirect() { this.redirectedToLocation && !this.followedRedirect && this.response?.redirected && (this.adapter.visitProposedToLocation(this.redirectedToLocation, { action: "replace", response: this.response, shouldCacheSnapshot: !1, willRender: !1 }), this.followedRedirect = !0) } goToSamePageAnchor() { this.isSamePage && this.render((async () => { this.cacheSnapshot(), this.performScroll(), this.changeHistory(), this.adapter.visitRendered(this) })) } prepareRequest(e) { this.acceptsStreamResponse && e.acceptResponseType(te.contentType) } requestStarted() { this.startRequest() } requestPreventedHandlingResponse(e, t) { } async requestSucceededWithResponse(e, t) { const s = await t.responseHTML, { redirected: r, statusCode: i } = t; null == s ? this.recordResponse({ statusCode: Ve, redirected: r }) : (this.redirectedToLocation = t.redirected ? t.location : void 0, this.recordResponse({ statusCode: i, responseHTML: s, redirected: r })) } async requestFailedWithResponse(e, t) { const s = await t.responseHTML, { redirected: r, statusCode: i } = t; null == s ? this.recordResponse({ statusCode: Ve, redirected: r }) : this.recordResponse({ statusCode: i, responseHTML: s, redirected: r }) } requestErrored(e, t) { this.recordResponse({ statusCode: De, redirected: !1 }) } requestFinished() { this.finishRequest() } performScroll() { this.scrolled || this.view.forceReloaded || this.view.shouldPreserveScrollPosition(this) || ("restore" == this.action ? this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop() : this.scrollToAnchor() || this.view.scrollToTop(), this.isSamePage && this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation, this.location), this.scrolled = !0) } scrollToRestoredPosition() { const { scrollPosition: e } = this.restorationData; if (e) return this.view.scrollToPosition(e), !0 } scrollToAnchor() { const e = q(this.location); if (null != e) return this.view.scrollToAnchor(e), !0 } recordTimingMetric(e) { this.timingMetrics[e] = (new Date).getTime() } getTimingMetrics() { return { ...this.timingMetrics } } getHistoryMethodForAction(e) { switch (e) { case "replace": return history.replaceState; case "advance": case "restore": return history.pushState } } hasPreloadedResponse() { return "object" == typeof this.response } shouldIssueRequest() { return !this.isSamePage && ("restore" == this.action ? !this.hasCachedSnapshot() : this.willRender) } cacheSnapshot() { this.snapshotCached || (this.view.cacheSnapshot(this.snapshot).then((e => e && this.visitCachedSnapshot(e))), this.snapshotCached = !0) } async render(e) { this.cancelRender(), await new Promise((e => { this.frame = "hidden" === document.visibilityState ? setTimeout((() => e()), 0) : requestAnimationFrame((() => e())) })), await e(), delete this.frame } async renderPageSnapshot(e, t) { await this.viewTransitioner.renderChange(this.view.shouldTransitionTo(e), (async () => { await this.view.renderPage(e, t, this.willRender, this), this.performScroll() })) } cancelRender() { this.frame && (cancelAnimationFrame(this.frame), delete this.frame) } } function _e(e) { return e >= 200 && e < 300 } class $e { progressBar = new Ee; constructor(e) { this.session = e } visitProposedToLocation(e, t) { N(e, this.navigator.rootLocation) ? this.navigator.startVisit(e, t?.restorationIdentifier || m(), t) : window.location.href = e.toString() } visitStarted(e) { this.location = e.location, e.loadCachedSnapshot(), e.issueRequest(), e.goToSamePageAnchor() } visitRequestStarted(e) { this.progressBar.setValue(0), e.hasCachedSnapshot() || "restore" != e.action ? this.showVisitProgressBarAfterDelay() : this.showProgressBar() } visitRequestCompleted(e) { e.loadResponse() } visitRequestFailedWithStatusCode(e, t) { switch (t) { case De: case xe: case Ve: return this.reload({ reason: "request_failed", context: { statusCode: t } }); default: return e.loadResponse() } } visitRequestFinished(e) { } visitCompleted(e) { this.progressBar.setValue(1), this.hideVisitProgressBar() } pageInvalidated(e) { this.reload(e) } visitFailed(e) { this.progressBar.setValue(1), this.hideVisitProgressBar() } visitRendered(e) { } formSubmissionStarted(e) { this.progressBar.setValue(0), this.showFormProgressBarAfterDelay() } formSubmissionFinished(e) { this.progressBar.setValue(1), this.hideFormProgressBar() } showVisitProgressBarAfterDelay() { this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay) } hideVisitProgressBar() { this.progressBar.hide(), null != this.visitProgressBarTimeout && (window.clearTimeout(this.visitProgressBarTimeout), delete this.visitProgressBarTimeout) } showFormProgressBarAfterDelay() { null == this.formProgressBarTimeout && (this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay)) } hideFormProgressBar() { this.progressBar.hide(), null != this.formProgressBarTimeout && (window.clearTimeout(this.formProgressBarTimeout), delete this.formProgressBarTimeout) } showProgressBar = () => { this.progressBar.show() }; reload(e) { o("turbo:reload", { detail: e }), window.location.href = this.location?.toString() || window.location.href } get navigator() { return this.session.navigator } } class je { selector = "[data-turbo-temporary]"; deprecatedSelector = "[data-turbo-cache=false]"; started = !1; start() { this.started || (this.started = !0, addEventListener("turbo:before-cache", this.removeTemporaryElements, !1)) } stop() { this.started && (this.started = !1, removeEventListener("turbo:before-cache", this.removeTemporaryElements, !1)) } removeTemporaryElements = e => { for (const e of this.temporaryElements) e.remove() }; get temporaryElements() { return [...document.querySelectorAll(this.selector), ...this.temporaryElementsWithDeprecation] } get temporaryElementsWithDeprecation() { const e = document.querySelectorAll(this.deprecatedSelector); return e.length && console.warn(`The ${this.deprecatedSelector} selector is deprecated and will be removed in a future version. Use ${this.selector} instead.`), [...e] } } class ze { constructor(e, t) { this.session = e, this.element = t, this.linkInterceptor = new de(this, t), this.formSubmitObserver = new ce(this, t) } start() { this.linkInterceptor.start(), this.formSubmitObserver.start() } stop() { this.linkInterceptor.stop(), this.formSubmitObserver.stop() } shouldInterceptLinkClick(e, t, s) { return this.#u(e) } linkClickIntercepted(e, t, s) { const r = this.#m(e); r && r.delegate.linkClickIntercepted(e, t, s) } willSubmitForm(e, t) { return null == e.closest("turbo-frame") && this.#p(e, t) && this.#u(e, t) } formSubmitted(e, t) { const s = this.#m(e, t); s && s.delegate.formSubmitted(e, t) } #p(e, t) { const s = H(e, t), r = this.element.ownerDocument.querySelector('meta[name="turbo-root"]'), i = F(r?.content ?? "/"); return this.#u(e, t) && N(s, i) } #u(e, t) { if (e instanceof HTMLFormElement ? this.session.submissionIsNavigatable(e, t) : this.session.elementIsNavigatable(e)) { const s = this.#m(e, t); return !!s && s != e.closest("turbo-frame") } return !1 } #m(e, t) { const s = t?.getAttribute("data-turbo-frame") || e.getAttribute("data-turbo-frame"); if (s && "_top" != s) { const e = this.element.querySelector(`#${s}:not([disabled])`); if (e instanceof r) return e } } } class Ge { location; restorationIdentifier = m(); restorationData = {}; started = !1; pageLoaded = !1; currentIndex = 0; constructor(e) { this.delegate = e } start() { this.started || (addEventListener("popstate", this.onPopState, !1), addEventListener("load", this.onPageLoad, !1), this.currentIndex = history.state?.turbo?.restorationIndex || 0, this.started = !0, this.replace(new URL(window.location.href))) } stop() { this.started && (removeEventListener("popstate", this.onPopState, !1), removeEventListener("load", this.onPageLoad, !1), this.started = !1) } push(e, t) { this.update(history.pushState, e, t) } replace(e, t) { this.update(history.replaceState, e, t) } update(e, t, s = m()) { e === history.pushState && ++this.currentIndex; const r = { turbo: { restorationIdentifier: s, restorationIndex: this.currentIndex } }; e.call(history, r, "", t.href), this.location = t, this.restorationIdentifier = s } getRestorationDataForIdentifier(e) { return this.restorationData[e] || {} } updateRestorationData(e) { const { restorationIdentifier: t } = this, s = this.restorationData[t]; this.restorationData[t] = { ...s, ...e } } assumeControlOfScrollRestoration() { this.previousScrollRestoration || (this.previousScrollRestoration = history.scrollRestoration ?? "auto", history.scrollRestoration = "manual") } relinquishControlOfScrollRestoration() { this.previousScrollRestoration && (history.scrollRestoration = this.previousScrollRestoration, delete this.previousScrollRestoration) } onPopState = e => { if (this.shouldHandlePopState()) { const { turbo: t } = e.state || {}; if (t) { this.location = new URL(window.location.href); const { restorationIdentifier: e, restorationIndex: s } = t; this.restorationIdentifier = e; const r = s > this.currentIndex ? "forward" : "back"; this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, e, r), this.currentIndex = s } } }; onPageLoad = async e => { await Promise.resolve(), this.pageLoaded = !0 }; shouldHandlePopState() { return this.pageIsLoaded() } pageIsLoaded() { return this.pageLoaded || "complete" == document.readyState } } class Je { started = !1; #f = null; constructor(e, t) { this.delegate = e, this.eventTarget = t } start() { this.started || ("loading" === this.eventTarget.readyState ? this.eventTarget.addEventListener("DOMContentLoaded", this.#g, { once: !0 }) : this.#g()) } stop() { this.started && (this.eventTarget.removeEventListener("mouseenter", this.#b, { capture: !0, passive: !0 }), this.eventTarget.removeEventListener("mouseleave", this.#v, { capture: !0, passive: !0 }), this.eventTarget.removeEventListener("turbo:before-fetch-request", this.#S, !0), this.started = !1) } #g = () => { this.eventTarget.addEventListener("mouseenter", this.#b, { capture: !0, passive: !0 }), this.eventTarget.addEventListener("mouseleave", this.#v, { capture: !0, passive: !0 }), this.eventTarget.addEventListener("turbo:before-fetch-request", this.#S, !0), this.started = !0 }; #b = e => { if ("false" === y("turbo-prefetch")) return; const t = e.target; if (t.matches && t.matches("a[href]:not([target^=_]):not([download])") && this.#w(t)) { const e = t, s = P(e); if (this.delegate.canPrefetchRequestToLocation(e, s)) { this.#f = e; const r = new X(this, z.get, s, new URLSearchParams, t); se.setLater(s.toString(), r, this.#y) } } }; #v = e => { e.target === this.#f && this.#E() }; #E = () => { se.clear(), this.#f = null }; #S = e => { if ("FORM" !== e.target.tagName && "GET" === e.detail.fetchOptions.method) { const t = se.get(e.detail.url.toString()); t && (e.detail.fetchRequest = t), se.clear() } }; prepareRequest(e) { const t = e.target; e.headers["X-Sec-Purpose"] = "prefetch"; const s = t.closest("turbo-frame"), r = t.getAttribute("data-turbo-frame") || s?.getAttribute("target") || s?.id; r && "_top" !== r && (e.headers["Turbo-Frame"] = r) } requestSucceededWithResponse() { } requestStarted(e) { } requestErrored(e) { } requestFinished(e) { } requestPreventedHandlingResponse(e, t) { } requestFailedWithResponse(e, t) { } get #y() { return Number(y("turbo-prefetch-cache-time")) || 1e4 } #w(e) { return !!e.getAttribute("href") && (!Xe(e) && (!Ke(e) && (!Qe(e) && (!Ye(e) && !et(e))))) } } const Xe = e => e.origin !== document.location.origin || !["http:", "https:"].includes(e.protocol) || e.hasAttribute("target"), Ke = e => e.pathname + e.search === document.location.pathname + document.location.search || e.href.startsWith("#"), Qe = e => { if ("false" === e.getAttribute("data-turbo-prefetch")) return !0; if ("false" === e.getAttribute("data-turbo")) return !0; const t = A(e, "[data-turbo-prefetch]"); return !(!t || "false" !== t.getAttribute("data-turbo-prefetch")) }, Ye = e => { const t = e.getAttribute("data-turbo-method"); return !(!t || "get" === t.toLowerCase()) || (!!Ze(e) || (!!e.hasAttribute("data-turbo-confirm") || !!e.hasAttribute("data-turbo-stream"))) }, Ze = e => e.hasAttribute("data-remote") || e.hasAttribute("data-behavior") || e.hasAttribute("data-confirm") || e.hasAttribute("data-method"), et = e => o("turbo:before-prefetch", { target: e, cancelable: !0 }).defaultPrevented; class tt { constructor(e) { this.delegate = e } proposeVisit(e, t = {}) { this.delegate.allowsVisitingLocationWithAction(e, t.action) && this.delegate.visitProposedToLocation(e, t) } startVisit(e, t, s = {}) { this.stop(), this.currentVisit = new Ue(this, F(e), t, { referrer: this.location, ...s }), this.currentVisit.start() } submitForm(e, t) { this.stop(), this.formSubmission = new ie(this, e, t, !0), this.formSubmission.start() } stop() { this.formSubmission && (this.formSubmission.stop(), delete this.formSubmission), this.currentVisit && (this.currentVisit.cancel(), delete this.currentVisit) } get adapter() { return this.delegate.adapter } get view() { return this.delegate.view } get rootLocation() { return this.view.snapshot.rootLocation } get history() { return this.delegate.history } formSubmissionStarted(e) { "function" == typeof this.adapter.formSubmissionStarted && this.adapter.formSubmissionStarted(e) } async formSubmissionSucceededWithResponse(e, t) { if (e == this.formSubmission) { const s = await t.responseHTML; if (s) { const r = e.isSafe; r || this.view.clearSnapshotCache(); const { statusCode: i, redirected: n } = t, o = { action: this.#A(e, t), shouldCacheSnapshot: r, response: { statusCode: i, responseHTML: s, redirected: n } }; this.proposeVisit(t.location, o) } } } async formSubmissionFailedWithResponse(e, t) { const s = await t.responseHTML; if (s) { const e = Le.fromHTMLString(s); t.serverError ? await this.view.renderError(e, this.currentVisit) : await this.view.renderPage(e, !1, !0, this.currentVisit), e.shouldPreserveScrollPosition || this.view.scrollToTop(), this.view.clearSnapshotCache() } } formSubmissionErrored(e, t) { console.error(t) } formSubmissionFinished(e) { "function" == typeof this.adapter.formSubmissionFinished && this.adapter.formSubmissionFinished(e) } visitStarted(e) { this.delegate.visitStarted(e) } visitCompleted(e) { this.delegate.visitCompleted(e), delete this.currentVisit } locationWithActionIsSamePage(e, t) { const s = q(e), r = q(this.view.lastRenderedLocation), i = "restore" === t && void 0 === s; return "replace" !== t && D(e) === D(this.view.lastRenderedLocation) && (i || null != s && s !== r) } visitScrolledToSamePageLocation(e, t) { this.delegate.visitScrolledToSamePageLocation(e, t) } get location() { return this.history.location } get restorationIdentifier() { return this.history.restorationIdentifier } #A(e, t) { const { submitter: s, formElement: r } = e; return S(s, r) || this.#R(t) } #R(e) { return e.redirected && e.location.href === this.location?.href ? "replace" : "advance" } } const st = 0, rt = 1, it = 2, nt = 3; class ot { stage = st; started = !1; constructor(e) { this.delegate = e } start() { this.started || (this.stage == st && (this.stage = rt), document.addEventListener("readystatechange", this.interpretReadyState, !1), addEventListener("pagehide", this.pageWillUnload, !1), this.started = !0) } stop() { this.started && (document.removeEventListener("readystatechange", this.interpretReadyState, !1), removeEventListener("pagehide", this.pageWillUnload, !1), this.started = !1) } interpretReadyState = () => { const { readyState: e } = this; "interactive" == e ? this.pageIsInteractive() : "complete" == e && this.pageIsComplete() }; pageIsInteractive() { this.stage == rt && (this.stage = it, this.delegate.pageBecameInteractive()) } pageIsComplete() { this.pageIsInteractive(), this.stage == it && (this.stage = nt, this.delegate.pageLoaded()) } pageWillUnload = () => { this.delegate.pageWillUnload() }; get readyState() { return document.readyState } } class at { started = !1; constructor(e) { this.delegate = e } start() { this.started || (addEventListener("scroll", this.onScroll, !1), this.onScroll(), this.started = !0) } stop() { this.started && (removeEventListener("scroll", this.onScroll, !1), this.started = !1) } onScroll = () => { this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset }) }; updatePosition(e) { this.delegate.scrollPositionChanged(e) } } class ct { render({ fragment: e }) { pe.preservingPermanentElements(this, function (e) { const t = ae(document.documentElement), s = {}; for (const r of t) { const { id: t } = r; for (const i of e.querySelectorAll("turbo-stream")) { const e = oe(i.templateElement.content, t); e && (s[t] = [r, e]) } } return s }(e), (() => { !async function (e, t) { const s = `turbo-stream-autofocus-${m()}`, r = e.querySelectorAll("turbo-stream"), i = function (e) { for (const t of e) { const e = T(t.templateElement.content); if (e) return e } return null }(r); let n = null; i && (n = i.id ? i.id : s, i.id = n); t(), await c(); if ((null == document.activeElement || document.activeElement == document.body) && n) { const e = document.getElementById(n); R(e) && e.focus(), e && e.id == s && e.removeAttribute("id") } }(e, (() => { !async function (e) { const [t, s] = await async function (e, t) { const s = t(); return e(), await l(), [s, t()] }(e, (() => document.activeElement)), r = t && t.id; if (r) { const e = document.getElementById(r); R(e) && e != s && e.focus() } }((() => { document.documentElement.appendChild(e) })) })) })) } enteringBardo(e, t) { t.replaceWith(e.cloneNode(!0)) } leavingBardo() { } } class lt { sources = new Set; #T = !1; constructor(e) { this.delegate = e } start() { this.#T || (this.#T = !0, addEventListener("turbo:before-fetch-response", this.inspectFetchResponse, !1)) } stop() { this.#T && (this.#T = !1, removeEventListener("turbo:before-fetch-response", this.inspectFetchResponse, !1)) } connectStreamSource(e) { this.streamSourceIsConnected(e) || (this.sources.add(e), e.addEventListener("message", this.receiveMessageEvent, !1)) } disconnectStreamSource(e) { this.streamSourceIsConnected(e) && (this.sources.delete(e), e.removeEventListener("message", this.receiveMessageEvent, !1)) } streamSourceIsConnected(e) { return this.sources.has(e) } inspectFetchResponse = e => { const t = function (e) { const t = e.detail?.fetchResponse; if (t instanceof V) return t }(e); t && function (e) { const t = e.contentType ?? ""; return t.startsWith(te.contentType) }(t) && (e.preventDefault(), this.receiveMessageResponse(t)) }; receiveMessageEvent = e => { this.#T && "string" == typeof e.data && this.receiveMessageHTML(e.data) }; async receiveMessageResponse(e) { const t = await e.responseHTML; t && this.receiveMessageHTML(t) } receiveMessageHTML(e) { this.delegate.receivedMessageFromStream(te.wrap(e)) } } class ht extends fe { static renderElement(e, t) { const { documentElement: s, body: r } = document; s.replaceChild(t, r) } async render() { this.replaceHeadAndBody(), this.activateScriptElements() } replaceHeadAndBody() { const { documentElement: e, head: t } = document; e.replaceChild(this.newHead, t), this.renderElement(this.currentElement, this.newElement) } activateScriptElements() { for (const e of this.scriptElements) { const t = e.parentNode; if (t) { const s = n(e); t.replaceChild(s, e) } } } get newHead() { return this.newSnapshot.headSnapshot.element } get scriptElements() { return document.documentElement.querySelectorAll("script") } } class dt extends fe { static renderElement(e, t) { document.body && t instanceof HTMLBodyElement ? document.body.replaceWith(t) : document.documentElement.appendChild(t) } get shouldRender() { return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical } get reloadReason() { return this.newSnapshot.isVisitable ? this.trackedElementsAreIdentical ? void 0 : { reason: "tracked_element_mismatch" } : { reason: "turbo_visit_control_is_reload" } } async prepareToRender() { this.#L(), await this.mergeHead() } async render() { this.willRender && await this.replaceBody() } finishRendering() { super.finishRendering(), this.isPreview || this.focusFirstAutofocusableElement() } get currentHeadSnapshot() { return this.currentSnapshot.headSnapshot } get newHeadSnapshot() { return this.newSnapshot.headSnapshot } get newElement() { return this.newSnapshot.element } #L() { const { documentElement: e } = this.currentSnapshot, { lang: t } = this.newSnapshot; t ? e.setAttribute("lang", t) : e.removeAttribute("lang") } async mergeHead() { const e = this.mergeProvisionalElements(), t = this.copyNewHeadStylesheetElements(); this.copyNewHeadScriptElements(), await e, await t, this.willRender && this.removeUnusedDynamicStylesheetElements() } async replaceBody() { await this.preservingPermanentElements((async () => { this.activateNewBody(), await this.assignNewBody() })) } get trackedElementsAreIdentical() { return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature } async copyNewHeadStylesheetElements() { const e = []; for (const t of this.newHeadStylesheetElements) e.push(b(t)), document.head.appendChild(t); await Promise.all(e) } copyNewHeadScriptElements() { for (const e of this.newHeadScriptElements) document.head.appendChild(n(e)) } removeUnusedDynamicStylesheetElements() { for (const e of this.unusedDynamicStylesheetElements) document.head.removeChild(e) } async mergeProvisionalElements() { const e = [...this.newHeadProvisionalElements]; for (const t of this.currentHeadProvisionalElements) this.isCurrentElementInElementList(t, e) || document.head.removeChild(t); for (const t of e) document.head.appendChild(t) } isCurrentElementInElementList(e, t) { for (const [s, r] of t.entries()) { if ("TITLE" == e.tagName) { if ("TITLE" != r.tagName) continue; if (e.innerHTML == r.innerHTML) return t.splice(s, 1), !0 } if (r.isEqualNode(e)) return t.splice(s, 1), !0 } return !1 } removeCurrentHeadProvisionalElements() { for (const e of this.currentHeadProvisionalElements) document.head.removeChild(e) } copyNewHeadProvisionalElements() { for (const e of this.newHeadProvisionalElements) document.head.appendChild(e) } activateNewBody() { document.adoptNode(this.newElement), this.activateNewBodyScriptElements() } activateNewBodyScriptElements() { for (const e of this.newBodyScriptElements) { const t = n(e); e.replaceWith(t) } } async assignNewBody() { await this.renderElement(this.currentElement, this.newElement) } get unusedDynamicStylesheetElements() { return this.oldHeadStylesheetElements.filter((e => "dynamic" === e.getAttribute("data-turbo-track"))) } get oldHeadStylesheetElements() { return this.currentHeadSnapshot.getStylesheetElementsNotInSnapshot(this.newHeadSnapshot) } get newHeadStylesheetElements() { return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot) } get newHeadScriptElements() { return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot) } get currentHeadProvisionalElements() { return this.currentHeadSnapshot.provisionalElements } get newHeadProvisionalElements() { return this.newHeadSnapshot.provisionalElements } get newBodyScriptElements() { return this.newElement.querySelectorAll("script") } } class ut extends dt { static renderElement(e, t) { ve(e, t, { callbacks: { beforeNodeMorphed: e => !mt(e) } }); for (const t of e.querySelectorAll("turbo-frame")) mt(t) && t.reload(); o("turbo:morph", { detail: { currentElement: e, newElement: t } }) } async preservingPermanentElements(e) { return await e() } get renderMethod() { return "morph" } get shouldAutofocus() { return !1 } } function mt(e) { return e instanceof r && e.src && "morph" === e.refresh && !e.closest("[data-turbo-permanent]") } class pt { keys = []; snapshots = {}; constructor(e) { this.size = e } has(e) { return x(e) in this.snapshots } get(e) { if (this.has(e)) { const t = this.read(e); return this.touch(e), t } } put(e, t) { return this.write(e, t), this.touch(e), t } clear() { this.snapshots = {} } read(e) { return this.snapshots[x(e)] } write(e, t) { this.snapshots[x(e)] = t } touch(e) { const t = x(e), s = this.keys.indexOf(t); s > -1 && this.keys.splice(s, 1), this.keys.unshift(t), this.trim() } trim() { for (const e of this.keys.splice(this.size)) delete this.snapshots[e] } } class ft extends le { snapshotCache = new pt(10); lastRenderedLocation = new URL(location.href); forceReloaded = !1; shouldTransitionTo(e) { return this.snapshot.prefersViewTransitions && e.prefersViewTransitions } renderPage(e, t = !1, s = !0, r) { const i = new (this.isPageRefresh(r) && this.snapshot.shouldMorphPage ? ut : dt)(this.snapshot, e, t, s); return i.shouldRender ? r?.changeHistory() : this.forceReloaded = !0, this.render(i) } renderError(e, t) { t?.changeHistory(); const s = new ht(this.snapshot, e, !1); return this.render(s) } clearSnapshotCache() { this.snapshotCache.clear() } async cacheSnapshot(e = this.snapshot) { if (e.isCacheable) { this.delegate.viewWillCacheSnapshot(); const { lastRenderedLocation: t } = this; await h(); const s = e.clone(); return this.snapshotCache.put(t, s), s } } getCachedSnapshotForLocation(e) { return this.snapshotCache.get(e) } isPageRefresh(e) { return !e || this.lastRenderedLocation.pathname === e.location.pathname && "replace" === e.action } shouldPreserveScrollPosition(e) { return this.isPageRefresh(e) && this.snapshot.shouldPreserveScrollPosition } get snapshot() { return Le.fromElement(this.element) } } class gt { selector = "a[data-turbo-preload]"; constructor(e, t) { this.delegate = e, this.snapshotCache = t } start() { "loading" === document.readyState ? document.addEventListener("DOMContentLoaded", this.#C) : this.preloadOnLoadLinksForView(document.body) } stop() { document.removeEventListener("DOMContentLoaded", this.#C) } preloadOnLoadLinksForView(e) { for (const t of e.querySelectorAll(this.selector)) this.delegate.shouldPreloadLink(t) && this.preloadURL(t) } async preloadURL(e) { const t = new URL(e.href); if (this.snapshotCache.has(t)) return; const s = new X(this, z.get, t, new URLSearchParams, e); await s.perform() } prepareRequest(e) { e.headers["X-Sec-Purpose"] = "prefetch" } async requestSucceededWithResponse(e, t) { try { const s = await t.responseHTML, r = Le.fromHTMLString(s); this.snapshotCache.put(e.url, r) } catch (e) { } } requestStarted(e) { } requestErrored(e) { } requestFinished(e) { } requestPreventedHandlingResponse(e, t) { } requestFailedWithResponse(e, t) { } #C = () => { this.preloadOnLoadLinksForView(document.body) } } class bt { constructor(e) { this.session = e } clear() { this.session.clearCache() } resetCacheControl() { this.#P("") } exemptPageFromCache() { this.#P("no-cache") } exemptPageFromPreview() { this.#P("no-preview") } #P(e) { !function (e, t) { let s = w(e); s || (s = document.createElement("meta"), s.setAttribute("name", e), document.head.appendChild(s)), s.setAttribute("content", t) }("turbo-cache-control", e) } } function vt(e) { Object.defineProperties(e, St) } const St = { absoluteURL: { get() { return this.toString() } } }, wt = new class { navigator = new tt(this); history = new Ge(this); view = new ft(this, document.documentElement); adapter = new $e(this); pageObserver = new ot(this); cacheObserver = new je; linkPrefetchObserver = new Je(this, document); linkClickObserver = new ue(this, window); formSubmitObserver = new ce(this, document); scrollObserver = new at(this); streamObserver = new lt(this); formLinkClickObserver = new me(this, document.documentElement); frameRedirector = new ze(this, document.documentElement); streamMessageRenderer = new ct; cache = new bt(this); enabled = !0; started = !1; #k = 150; constructor(e) { this.recentRequests = e, this.preloader = new gt(this, this.view.snapshotCache), this.debouncedRefresh = this.refresh, this.pageRefreshDebouncePeriod = this.pageRefreshDebouncePeriod } start() { this.started || (this.pageObserver.start(), this.cacheObserver.start(), this.linkPrefetchObserver.start(), this.formLinkClickObserver.start(), this.linkClickObserver.start(), this.formSubmitObserver.start(), this.scrollObserver.start(), this.streamObserver.start(), this.frameRedirector.start(), this.history.start(), this.preloader.start(), this.started = !0, this.enabled = !0) } disable() { this.enabled = !1 } stop() { this.started && (this.pageObserver.stop(), this.cacheObserver.stop(), this.linkPrefetchObserver.stop(), this.formLinkClickObserver.stop(), this.linkClickObserver.stop(), this.formSubmitObserver.stop(), this.scrollObserver.stop(), this.streamObserver.stop(), this.frameRedirector.stop(), this.history.stop(), this.preloader.stop(), this.started = !1) } registerAdapter(e) { this.adapter = e } visit(e, t = {}) { const s = t.frame ? document.getElementById(t.frame) : null; if (s instanceof r) { const r = t.action || S(s); s.delegate.proposeVisitIfNavigatedWithAction(s, r), s.src = e.toString() } else this.navigator.proposeVisit(F(e), t) } refresh(e, t) { t && this.recentRequests.has(t) || this.navigator.currentVisit || this.visit(e, { action: "replace", shouldCacheSnapshot: !1 }) } connectStreamSource(e) { this.streamObserver.connectStreamSource(e) } disconnectStreamSource(e) { this.streamObserver.disconnectStreamSource(e) } renderStreamMessage(e) { this.streamMessageRenderer.render(te.wrap(e)) } clearCache() { this.view.clearSnapshotCache() } setProgressBarDelay(e) { console.warn("Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`"), this.progressBarDelay = e } set progressBarDelay(e) { I.drive.progressBarDelay = e } get progressBarDelay() { return I.drive.progressBarDelay } set drive(e) { I.drive.enabled = e } get drive() { return I.drive.enabled } set formMode(e) { I.forms.mode = e } get formMode() { return I.forms.mode } get location() { return this.history.location } get restorationIdentifier() { return this.history.restorationIdentifier } get pageRefreshDebouncePeriod() { return this.#k } set pageRefreshDebouncePeriod(e) { this.refresh = function (e, t) { let s = null; return (...r) => { clearTimeout(s), s = setTimeout((() => e.apply(this, r)), t) } }(this.debouncedRefresh.bind(this), e), this.#k = e } shouldPreloadLink(e) { const t = e.hasAttribute("data-turbo-method"), s = e.hasAttribute("data-turbo-stream"), i = e.getAttribute("data-turbo-frame"), n = "_top" == i ? null : document.getElementById(i) || A(e, "turbo-frame:not([disabled])"); if (t || s || n instanceof r) return !1; { const t = new URL(e.href); return this.elementIsNavigatable(e) && N(t, this.snapshot.rootLocation) } } historyPoppedToLocationWithRestorationIdentifierAndDirection(e, t, s) { this.enabled ? this.navigator.startVisit(e, t, { action: "restore", historyChanged: !0, direction: s }) : this.adapter.pageInvalidated({ reason: "turbo_disabled" }) } scrollPositionChanged(e) { this.history.updateRestorationData({ scrollPosition: e }) } willSubmitFormLinkToLocation(e, t) { return this.elementIsNavigatable(e) && N(t, this.snapshot.rootLocation) } submittedFormLinkToLocation() { } canPrefetchRequestToLocation(e, t) { return this.elementIsNavigatable(e) && N(t, this.snapshot.rootLocation) } willFollowLinkToLocation(e, t, s) { return this.elementIsNavigatable(e) && N(t, this.snapshot.rootLocation) && this.applicationAllowsFollowingLinkToLocation(e, t, s) } followedLinkToLocation(e, t) { const s = this.getActionForLink(e), r = e.hasAttribute("data-turbo-stream"); this.visit(t.href, { action: s, acceptsStreamResponse: r }) } allowsVisitingLocationWithAction(e, t) { return this.locationWithActionIsSamePage(e, t) || this.applicationAllowsVisitingLocation(e) } visitProposedToLocation(e, t) { vt(e), this.adapter.visitProposedToLocation(e, t) } visitStarted(e) { e.acceptsStreamResponse || (f(document.documentElement), this.view.markVisitDirection(e.direction)), vt(e.location), e.silent || this.notifyApplicationAfterVisitingLocation(e.location, e.action) } visitCompleted(e) { this.view.unmarkVisitDirection(), g(document.documentElement), this.notifyApplicationAfterPageLoad(e.getTimingMetrics()) } locationWithActionIsSamePage(e, t) { return this.navigator.locationWithActionIsSamePage(e, t) } visitScrolledToSamePageLocation(e, t) { this.notifyApplicationAfterVisitingSamePageLocation(e, t) } willSubmitForm(e, t) { const s = H(e, t); return this.submissionIsNavigatable(e, t) && N(F(s), this.snapshot.rootLocation) } formSubmitted(e, t) { this.navigator.submitForm(e, t) } pageBecameInteractive() { this.view.lastRenderedLocation = this.location, this.notifyApplicationAfterPageLoad() } pageLoaded() { this.history.assumeControlOfScrollRestoration() } pageWillUnload() { this.history.relinquishControlOfScrollRestoration() } receivedMessageFromStream(e) { this.renderStreamMessage(e) } viewWillCacheSnapshot() { this.navigator.currentVisit?.silent || this.notifyApplicationBeforeCachingSnapshot() } allowsImmediateRender({ element: e }, t) { const s = this.notifyApplicationBeforeRender(e, t), { defaultPrevented: r, detail: { render: i } } = s; return this.view.renderer && i && (this.view.renderer.renderElement = i), !r } viewRenderedSnapshot(e, t, s) { this.view.lastRenderedLocation = this.history.location, this.notifyApplicationAfterRender(s) } preloadOnLoadLinksForView(e) { this.preloader.preloadOnLoadLinksForView(e) } viewInvalidated(e) { this.adapter.pageInvalidated(e) } frameLoaded(e) { this.notifyApplicationAfterFrameLoad(e) } frameRendered(e, t) { this.notifyApplicationAfterFrameRender(e, t) } applicationAllowsFollowingLinkToLocation(e, t, s) { return !this.notifyApplicationAfterClickingLinkToLocation(e, t, s).defaultPrevented } applicationAllowsVisitingLocation(e) { return !this.notifyApplicationBeforeVisitingLocation(e).defaultPrevented } notifyApplicationAfterClickingLinkToLocation(e, t, s) { return o("turbo:click", { target: e, detail: { url: t.href, originalEvent: s }, cancelable: !0 }) } notifyApplicationBeforeVisitingLocation(e) { return o("turbo:before-visit", { detail: { url: e.href }, cancelable: !0 }) } notifyApplicationAfterVisitingLocation(e, t) { return o("turbo:visit", { detail: { url: e.href, action: t } }) } notifyApplicationBeforeCachingSnapshot() { return o("turbo:before-cache") } notifyApplicationBeforeRender(e, t) { return o("turbo:before-render", { detail: { newBody: e, ...t }, cancelable: !0 }) } notifyApplicationAfterRender(e) { return o("turbo:render", { detail: { renderMethod: e } }) } notifyApplicationAfterPageLoad(e = {}) { return o("turbo:load", { detail: { url: this.location.href, timing: e } }) } notifyApplicationAfterVisitingSamePageLocation(e, t) { dispatchEvent(new HashChangeEvent("hashchange", { oldURL: e.toString(), newURL: t.toString() })) } notifyApplicationAfterFrameLoad(e) { return o("turbo:frame-load", { target: e }) } notifyApplicationAfterFrameRender(e, t) { return o("turbo:frame-render", { detail: { fetchResponse: e }, target: t, cancelable: !0 }) } submissionIsNavigatable(e, t) { if ("off" == I.forms.mode) return !1; { const s = !t || this.elementIsNavigatable(t); return "optin" == I.forms.mode ? s && null != e.closest('[data-turbo="true"]') : s && this.elementIsNavigatable(e) } } elementIsNavigatable(e) { const t = A(e, "[data-turbo]"), s = A(e, "turbo-frame"); return I.drive.enabled || s ? !t || "false" != t.getAttribute("data-turbo") : !!t && "true" == t.getAttribute("data-turbo") } getActionForLink(e) { return S(e) || "advance" } get snapshot() { return this.view.snapshot } }(U), { cache: yt, navigator: Et } = wt; function At() { wt.start() } function Rt(e) { wt.registerAdapter(e) } function Tt(e, t) { wt.visit(e, t) } function Lt(e) { wt.connectStreamSource(e) } function Ct(e) { wt.disconnectStreamSource(e) } function Pt(e) { wt.renderStreamMessage(e) } function kt() { console.warn("Please replace `Turbo.clearCache()` with `Turbo.cache.clear()`. The top-level function is deprecated and will be removed in a future version of Turbo.`"), wt.clearCache() } function Mt(e) { console.warn("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.`"), I.drive.progressBarDelay = e } function It(e) { console.warn("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.`"), I.forms.confirm = e } function Ft(e) { console.warn("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.`"), I.forms.mode = e } var qt = Object.freeze({ __proto__: null, navigator: Et, session: wt, cache: yt, PageRenderer: dt, PageSnapshot: Le, FrameRenderer: ge, fetch: $, config: I, start: At, registerAdapter: Rt, visit: Tt, connectStreamSource: Lt, disconnectStreamSource: Ct, renderStreamMessage: Pt, clearCache: kt, setProgressBarDelay: Mt, setConfirmMethod: It, setFormMode: Ft }); class Ht extends Error { } function Ot(e) { if (null != e) { const t = document.getElementById(e); if (t instanceof r) return t } } function Bt(e, t) { if (e) { const i = e.getAttribute("src"); if (null != i && null != t && (s = t, F(i).href == F(s).href)) throw new Error(`Matching element has a source URL which references itself`); if (e.ownerDocument !== document && (e = document.importNode(e, !0)), e instanceof r) return e.connectedCallback(), e.disconnectedCallback(), e } var s } const Nt = { after() { this.targetElements.forEach((e => e.parentElement?.insertBefore(this.templateContent, e.nextSibling))) }, append() { this.removeDuplicateTargetChildren(), this.targetElements.forEach((e => e.append(this.templateContent))) }, before() { this.targetElements.forEach((e => e.parentElement?.insertBefore(this.templateContent, e))) }, prepend() { this.removeDuplicateTargetChildren(), this.targetElements.forEach((e => e.prepend(this.templateContent))) }, remove() { this.targetElements.forEach((e => e.remove())) }, replace() { const e = this.getAttribute("method"); this.targetElements.forEach((t => { "morph" === e ? ve(t, this.templateContent) : t.replaceWith(this.templateContent) })) }, update() { const e = this.getAttribute("method"); this.targetElements.forEach((t => { "morph" === e ? Se(t, this.templateContent) : (t.innerHTML = "", t.append(this.templateContent)) })) }, refresh() { wt.refresh(this.baseURI, this.requestId) } }; class Dt extends HTMLElement { static async renderElement(e) { await e.performAction() } async connectedCallback() { try { await this.render() } catch (e) { console.error(e) } finally { this.disconnect() } } async render() { return this.renderPromise ??= (async () => { const e = this.beforeRenderEvent; this.dispatchEvent(e) && (await c(), await e.detail.render(this)) })() } disconnect() { try { this.remove() } catch { } } removeDuplicateTargetChildren() { this.duplicateChildren.forEach((e => e.remove())) } get duplicateChildren() { const e = this.targetElements.flatMap((e => [...e.children])).filter((e => !!e.id)), t = [...this.templateContent?.children || []].filter((e => !!e.id)).map((e => e.id)); return e.filter((e => t.includes(e.id))) } get performAction() { if (this.action) { const e = Nt[this.action]; if (e) return e; this.#M("unknown action") } this.#M("action attribute is missing") } get targetElements() { return this.target ? this.targetElementsById : this.targets ? this.targetElementsByQuery : void this.#M("target or targets attribute is missing") } get templateContent() { return this.templateElement.content.cloneNode(!0) } get templateElement() { if (null === this.firstElementChild) { const e = this.ownerDocument.createElement("template"); return this.appendChild(e), e } if (this.firstElementChild instanceof HTMLTemplateElement) return this.firstElementChild; this.#M("first child element must be a